Amenable
Amenable's Blog
Amenable
  • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (189)
    • ๐Ÿ“‚ JAVA (87)
      • ์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ” (65)
      • ์ฃผ์š” ๊ฐœ๋… (22)
    • ๐Ÿ“‚ ๊ฐœ๋ฐœ ์„œ์  (22)
      • ์‹ค์šฉ์ฃผ์˜ ํ”„๋กœ๊ทธ๋ž˜๋จธ (1)
      • ๊ฐ์ฒด์ง€ํ–ฅ์˜ ์‚ฌ์‹ค๊ณผ ์˜คํ•ด (2)
      • ํด๋ฆฐ ์ฝ”๋“œ (8)
      • ํ•จ๊ป˜ ์ž๋ผ๊ธฐ (1)
      • ๊ทธ๋ฆผ์œผ๋กœ ๋ฐฐ์šฐ๋Š” HTTP&Network Basic (10)
    • ๐Ÿ“‚ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค (8)
      • ๊ฐœ๋… (8)
      • ๋ฌธ์ œํ’€์ด (0)
    • ๐Ÿ“‚ ๋„คํŠธ์›Œํฌ (14)
      • ๊ฐœ๋… (6)
      • ์„ฑ๊ณต๊ณผ ์‹คํŒจ๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” 1%์˜ ๋„คํŠธ์›Œํฌ ์›๋ฆฌ (8)
    • ๐Ÿ“‚ ์Šคํ”„๋ง (13)
      • ๊ธฐ๋ณธ ๊ฐœ๋… (13)
    • ๐Ÿ“‚ WEB (5)
    • ๐Ÿ“‚ ์ž๋ฃŒ๊ตฌ์กฐ (12)
      • ๊ฐœ๋… (2)
      • ์ •๋ ฌ (8)
      • ํŠธ๋ฆฌ (2)
    • ๐Ÿ“‚ ์•Œ๊ณ ๋ฆฌ์ฆ˜ (10)
      • ์ตœ์†Œ์‹ ์žฅํŠธ๋ฆฌ (2)
      • ์ตœ๋‹จ ๊ฒฝ๋กœ (2)
      • ๋ฌธ์ž์—ด (2)
      • ETC (4)
    • ๐Ÿ“‚ ์•Œ๊ณ ๋ฆฌ์ฆ˜_๋ฌธ์ œํ’€์ด (4)
      • BOJ_๋ฐฑ์ค€ (4)
    • ๐Ÿ“‚ ํ”„๋กœ๊ทธ๋ž˜๋ฐ (3)
    • ๐Ÿ“‚ DevOps (2)
      • ๋ฐฐํฌ (2)
    • ๐Ÿ“‚ ํ›„๊ธฐ (8)
      • ์šฐ์•„ํ•œ ํ…Œํฌ์ฝ”์Šค(ํ”„๋ฆฌ์ฝ”์Šค) (4)
      • 2023๋…„ (3)
      • 2024๋…„ (1)
    • ๐Ÿ“‚ ํšŒ๊ณ  (1)
      • 2023๋…„ (1)

๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

  • ๐Ÿš€ GitHub

ํ‹ฐ์Šคํ† ๋ฆฌ

hELLO ยท Designed By ์ •์ƒ์šฐ.
Amenable

Amenable's Blog

equals๋Š” ์ผ๋ฐ˜ ๊ทœ์•ฝ์„ ์ง€์ผœ ์žฌ์ •์˜ํ•˜๋ผ(2) - [3์žฅ. ๋ชจ๋“  ๊ฐ์ฒด์˜ ๊ณตํ†ต ๋ฉ”์„œ๋“œ(์•„์ดํ…œ10)]
๐Ÿ“‚ JAVA/์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ”

equals๋Š” ์ผ๋ฐ˜ ๊ทœ์•ฝ์„ ์ง€์ผœ ์žฌ์ •์˜ํ•˜๋ผ(2) - [3์žฅ. ๋ชจ๋“  ๊ฐ์ฒด์˜ ๊ณตํ†ต ๋ฉ”์„œ๋“œ(์•„์ดํ…œ10)]

2023. 1. 6. 22:41

  ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” equals ๋ฉ”์„œ๋“œ๋ฅผ ์žฌ์ •์˜ํ•  ๋•Œ ๋ฐ˜๋“œ์‹œ ์ง€์ผœ์•ผ ํ•˜๋Š” ์ผ๋ฐ˜ ๊ทœ์•ฝ 5๊ฐ€์ง€๋ฅผ ์กฐ๊ธˆ ๋” ์ž์„ธํžˆ ์•Œ์•„๋ณด๊ณ ์ž ํ•œ๋‹ค.

 

1. ๋ฐ˜์‚ฌ์„ฑ(reflexivity)

  A.equals(A) == true

  ๋ฐ˜์‚ฌ์„ฑ์€ ๋‹จ์ˆœํžˆ ๋งํ•˜๋ฉด ๊ฐ์ฒด๋Š” ์ž๊ธฐ ์ž์‹ ๊ณผ ๊ฐ™์•„์•ผ ํ•œ๋‹ค๋Š” ๋œป์ด๋‹ค. ์ด ์š”๊ฑด์€ ์ผ๋ถ€๋Ÿฌ ์–ด๊ธฐ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ๋งŒ์กฑ์‹œํ‚ค์ง€ ๋ชปํ•˜๊ธฐ๊ฐ€ ๋” ์–ด๋ ค์›Œ ๋ณด์ธ๋‹ค.

 

2. ๋Œ€์นญ์„ฑ(symmetry)

  A.equals(B) = B.equals(A)

  ๋Œ€์นญ์„ฑ์€ ๋‘ ๊ฐ์ฒด๋Š” ์„œ๋กœ์— ๋Œ€ํ•œ ๋™์น˜ ์—ฌ๋ถ€์— ๋˜‘๊ฐ™์ด ๋‹ตํ•ด์•ผ ํ•œ๋‹ค๋Š” ๋œป์ด๋‹ค. 

  ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ณ„ํ•˜์ง€ ์•Š๋Š” ๋ฌธ์ž์—ด์„ ๊ตฌํ˜„ํ•œ ๋‹ค์Œ ํด๋ž˜์Šค๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•˜์ž.

public final class CaseInsensitiveString {
    private final String s;
    
    public CaseInsensitiveString(String s) {
        this.s = Objects.requireNonNull(s);
    }
    
    // ๋Œ€์นญ์„ฑ ์œ„๋ฐฐ!
    @Override public boolean equals(Object o) {
        if(o instanceof CaseInsensitiveString)
            return s.equalsIgnoreCase(
                    ((CaseInsensitiveString) o).s);
        if(o instanceof String) // ํ•œ ๋ฐฉํ–ฅ์œผ๋กœ๋งŒ ์ž‘๋™ํ•œ๋‹ค!
            return s.equalsIgnoreCase((String o);
        return false;
    }
}

 

  ์•„๋ž˜ ์ฝ”๋“œ์—์„œ cis.equals(s)๋Š” true๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์‰ฝ๊ฒŒ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

  ๊ทธ๋Ÿฌ๋ฉด s.equals(cis)๋Š” ์–ด๋–ค ๊ฒƒ์„ ๋ฐ˜ํ™˜ํ• ๊นŒ? CaseInsensitiveString์˜ equals๋Š” ์ผ๋ฐ˜ String์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ, String์˜ equals๋Š” CaseInsensitiveString์˜ ์กด์žฌ๋ฅผ ์•Œ์ง€ ๋ชปํ•œ๋‹ค. ๊ทธ ๊ฒฐ๊ณผ, s.equals(cis)๋Š” false๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ด๋Š” ๋Œ€์นญ์„ฑ์„ ๋ช…๋ฐฑํžˆ ์œ„๋ฐ˜ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. (์ฝ”๋“œ์—์„œ Polish์™€ polish์˜ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ์ž˜ ํ™•์ธํ•˜๊ธฐ ๋ฐ”๋ž€๋‹ค.)

CaseInsensitiveString cis = new CaseInsensitiveString("Polish");
String s = "polish";
System.out.println(cis.equals(s)); // true
System.out.println(s.equals(cis)); // false

 

  ๋‹ค๋ฅธ ํƒ€์ž…์„ ์ง€์›ํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ๋ณต์žกํ•ด์ง€๊ณ  ๋Œ€์นญ์„ฑ์ด ๊นจ์งˆ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ๋•Œ๋ฌธ์— ๋Œ€์นญ์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‹ค๋ฅธ ํƒ€์ž…์„ ์ง€์›ํ•˜์ง€ ๋ง์•„์•ผ ํ•œ๋‹ค.

@Override public boolean equals(Object o) {
    return o instanceof CaseInsensitiveString && 
            ((CaseInsenstiveString) o).s.equalsIsIgnoreCase(s));
}
CaseInsensitiveString cis = new CaseInsensitiveString("Polish");
String s = "polish";
System.out.println(cis.equals(s)); // false
System.out.println(s.equals(cis)); // false

 

3. ์ถ”์ด์„ฑ(transitivity)

  A.equals(B)&&B.equals(C), A.equals(C)

  ์ถ”์ด์„ฑ์€ ์ฒซ ๋ฒˆ์งธ ๊ฐ์ฒด์™€ ๋‘ ๋ฒˆ์งธ ๊ฐ์ฒด๊ฐ€ ๊ฐ™๊ณ , ๋‘ ๋ฒˆ์งธ ๊ฐ์ฒด์™€ ์„ธ ๋ฒˆ์งธ ๊ฐ์ฒด๊ฐ€ ๊ฐ™๋‹ค๋ฉด, ์ฒซ ๋ฒˆ์งธ ๊ฐ์ฒด์™€ ์„ธ ๋ฒˆ์งธ ๊ฐ์ฒด๋„ ๊ฐ™์•„์•ผ ํ•œ๋‹ค๋Š” ๋œป์ด๋‹ค. 

  ๊ฐ„๋‹จํžˆ 2์ฐจ์›์—์„œ์˜ ์ ์„ ํ‘œํ˜„ํ•˜๋Š” ํด๋ž˜์Šค๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•ด๋ณด์ž.

public class Point {
    private final int x;
    private final int y;
    
    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }
    
    @Override public boolean equals(Object o) {
        if(!(o instanceof Point))
            return false;
        Point p = (Point)o;
        return p.x == x && p.y == y;
    }
}

 

์ƒ๊ฐ์˜ ํ๋ฆ„ 1

  ์ด ํด๋ž˜์Šค๋ฅผ ํ™•์žฅํ•œ ์ƒ‰์ƒ์ด ์žˆ๋Š” ์ ์ด ์žˆ๋‹ค๊ณ  ํ•ด๋ณด์ž. ์ด์ „๊นŒ์ง€ ๋ฐฐ์šด ๊ฒƒ์„ ๋ฐ”ํƒ•์œผ๋กœ equals๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋Š” ๋‹ค์‹œ ๋Œ€์นญ์„ฑ์„ ์ง€ํ‚ค์ง€ ๋ชปํ•˜๋Š” ๊ฒฐ๊ณผ๋ฅผ ์ดˆ๋ž˜ํ•œ๋‹ค.

public class ColorPoint extends Point {
    private final Color color;
    
    public ColorPoint(int x, int y, Color color) {
        super(x, y);
        this.color = color;
    }
    
    // ๋Œ€์นญ์„ฑ ์œ„๋ฐฐ!
    @Override public boolean equals(Object o) {
        if(!(o instanceof ColorPoint))
            return false;
        return super.equals(o) && ((ColorPoint) o).color == color;
    }
}
Point p = new Point(1, 2);
ColorPoint cp = new ColorPoint(1, 2, Color.RED);

System.out.println(p.equals(cp)); // true
System.out.println(cp.equals(p)); // false

 

์ƒ๊ฐ์˜ ํ๋ฆ„ 2

  ๊ทธ๋Ÿฌ๋ฉด ํƒ€์ž…๊นŒ์ง€ ๊ณ ๋ คํ•˜์—ฌ ๋งŒ๋“  equals()๋Š” ์–ด๋–จ๊นŒ? ์•„๋ž˜ ๋ฐฉ์‹์€ ๋Œ€์นญ์„ฑ์€ ์ง€์ผœ์ฃผ์ง€๋งŒ, ์ถ”์ด์„ฑ์„ ๊นจ๋ฒ„๋ฆฐ๋‹ค. ๋˜ํ•œ, ์ด ๋ฐฉ์‹์€ ๋ฌดํ•œ ์žฌ๊ท€์— ๋น ์งˆ ์œ„ํ—˜๋„ ์žˆ๋‹ค. ColorPoint์™€ ๊ฐ™์€ ๋ ˆ๋ฒจ์— ์žˆ๋Š” Point์˜ ์„œ๋ธŒํด๋ž˜์Šค๊ฐ€ ์žˆ๋‹ค๋ฉด StackOverflowError๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒƒ์ด๋‹ค.

// ์ถ”์ด์„ฑ ์œ„๋ฐฐ!
@Override public boolean equals(Object o) {
    if(!(o instanceof Point))
        return false;
    
    // o๊ฐ€ ์ผ๋ฐ˜ Point๋ฉด ์ƒ‰์ƒ์„ ๋ฌด์‹œํ•˜๊ณ  ๋น„๊ตํ•œ๋‹ค.
    if(!(o instanceof ColorPoint))
        return o.equals(this); // ๋ฌดํ•œ ์žฌ๊ท€์— ๋น ์งˆ ์œ„ํ—˜์ด ์žˆ์Œ.
    
    // o๊ฐ€ ColorPoint๋ฉด ์ƒ‰์ƒ๊นŒ์ง€ ๋น„๊ตํ•œ๋‹ค.
    return super.equals(o) && ((ColorPoint) o).color == color;
}
ColorPoint p1 = new ColorPoint(1, 2, Color.RED);
Point p2 = new Point(1, 2);
ColorPoint p3 = new ColorPoint(1, 2, Color.BLUE);

System.out.println(p1.equals(p2)); // true
System.out.println(p2.equals(p1)); // true
System.out.println(p1.equals(p3)); // false (true๊ฐ€ ๋‚˜์™€์•ผ์ง€ ์ถ”์ด์„ฑ์ด ์ง€์ผœ์ง€๋Š” ๊ฒƒ)

 

์ƒ๊ฐ์˜ ํ๋ฆ„ 3

  ๊ทธ๋Ÿฌ๋ฉด ์ถ”์ด์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด์„œ Point์™€ ColorPoint๋ฅผ ๋น„๊ตํ•  ๋•Œ ๋‹ค๋ฅด๋‹ค๊ณ  ๋‚˜์˜ค๋ฉด ๋˜์ง€ ์•Š์„๊นŒ๋ผ๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค. (p2.equals(p1)์ด false๊ฐ€ ๋œ๋‹ค๋Š” ๋ง์ด๋‹ค.) ๊ทธ๋ฆฌ๊ณ  Point ํด๋ž˜์Šค์˜ ์ฝ”๋“œ๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด ๋ฐ”๊ฟ”๋ณผ ์ˆ˜๋„ ์žˆ๋‹ค. ์ฆ‰, Point๋Š” Point๋ผ๋ฆฌ, ColorPoint๋Š” ColorPoint๋ผ๋ฆฌ ๋น„๊ตํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฐœ๋…์ด๋‹ค.

public class Point {
    private final int x;
    private final int y;
    
    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }
    
    // ๋ฆฌ์Šค์ฝ”ํ”„ ์น˜ํ™˜ ์›์น™ ์œ„๋ฐฐ!
    @Override public boolean equals(Object o) {
        if(o == null || o.getClass() != getClass()) // ๋ฐ”๋€ ๋ถ€๋ถ„
            return false;
        Point p = (Point)o;
        return p.x == x && p.y == y;
    }
}

 

  ์•„์‰ฝ๊ฒŒ๋„ ์ด๋ ‡๊ฒŒ ์ƒ๊ฐํ•˜๋ฉด ์•ˆ ๋œ๋‹ค! ์ด์œ ๋Š” ๋ฆฌ์Šค์ฝ”ํ”„ ์น˜ํ™˜ ์›์น™์— ์œ„๋ฐฐ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋ฆฌ์Šค์ฝ”ํ”„ ์น˜ํ™˜ ์›์น™์„ ๊ฐ„๋‹จํ•˜๊ฒŒ ์„ค๋ช…ํ•˜์ž๋ฉด, ์ƒ์œ„ ํด๋ž˜์Šค ํƒ€์ž…์œผ๋กœ ๋™์ž‘ํ•˜๋Š” ์–ด๋–ค ์ฝ”๋“œ๊ฐ€ ์žˆ์„ ๋•Œ, ๊ทธ ์ƒ์œ„ ํด๋ž˜์Šค ๋Œ€์‹ ์— ์–ด๋–ค ํ•˜์œ„ ํด๋ž˜์Šค ํƒ€์ž…์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ฃผ๋”๋ผ๋„ ๊ทธ๋Œ€๋กœ ๋™์ผํ•˜๊ฒŒ ๋™์ž‘ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์•„๋ž˜ ์ฝ”๋“œ์—์„œ ๋ฆฌ์Šค์ฝ”ํ”„ ์น˜ํ™˜ ์›์น™์ด ์œ„๋ฐฐ๋œ๋‹ค๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

  ์ฆ‰, ๊ตฌ์ฒด ํด๋ž˜์Šค๋ฅผ ํ™•์žฅํ•ด ์ƒˆ๋กœ์šด ๊ฐ’์„ ์ถ”๊ฐ€ํ•˜๋ฉด์„œ equals ๊ทœ์•ฝ์„ ๋งŒ์กฑ์‹œํ‚ฌ ๋ฐฉ๋ฒ•์€ ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ด๋Ÿฌํ•œ ์ƒํ™ฉ์—์„œ ์ถ”์ด์„ฑ๊ณผ ๋Œ€์นญ์„ฑ์„ ์œ„๋ฐ˜ํ•˜์ง€ ์•Š๋„๋ก equals๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์—†๋‹ค. (๊ฐ์ฒด ์ง€ํ–ฅ์  ์ถ”์ƒํ™ฉ์˜ ์ด์ ์„ ํฌ๊ธฐํ•˜์ง€ ์•Š๋Š” ํ•œ์€ ๋ง์ด๋‹ค.)

public class CounterPoint extends Point {
    private static final AtomicInteger counter = new AtomicInteger();
    
    public CounterPoint(int x, int y) {
        super(x, y);
        counter.incrementAndGet();
    }
    
    public static int numberCreated() { return counter.get(); }
}
// CounterPoint๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ…Œ์ŠคํŠธ ํ”„๋กœ๊ทธ๋žจ
public class CounterPointTest {
    // ๋‹จ์œ„ ์› ์•ˆ์— ๋ชจ๋“  ์ ์„ ํฌํ•จํ•˜๋„๋ก unitCircle์„ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.
    private static final Set<Point> unitCircle = Set.of(
            new Point(1, 0), new Point(0, 1),
            new Point(-1, 0), new Point(0, -1));
    
    public static boolean onUnitCircle(Point p) {
        return unitCircle.contains(p);
    }
}
Point p1 = new Point(1, 0);
Point p2 = new CounterPoint(1, 0);

System.out.println(onUnitCircle(p1)); // true
System.out.println(onUnitCircle(p2)); // false (๋ฆฌ์Šค์ฝ”ํ”„์น˜ํ™˜์›์น™์„ ๋งŒ์กฑํ•œ๋‹ค๋ฉด true๊ฐ€ ๋‚˜์™€์•ผํ•œ๋‹ค.)

 

ํ•ด๊ฒฐ์ฑ… 

  ์ด์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์œผ๋กœ ์ปดํฌ์ง€์…˜์„ ๊ถŒ์žฅํ•˜๊ณ  ์žˆ๋‹ค. ์ƒ์†์„ ๋ฐ›์•„์„œ ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ์—๋Š” ์ƒ์† ๋Œ€์‹  ์ปดํฌ์ง€์…˜์„ ์‚ฌ์šฉํ•ด์„œ ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋„๋ก ํ•˜์ž. 

public class colorPoint {
    private final Point point;
    private final Color color;
    
    public ColorPoint(int x, int y, Color color) {
        point = new Point(x, y);
        this.color = Objects.requireNonNull(color);
    }
    
    /**
     * ์ด ColorPoint์˜ Point ๋ทฐ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
     */
    public Point asPoint() {
        return point;
    }
    
    @Override public boolean equals(Object o) {
        if(!(o instanceof ColorPoint))
            return false;
        ColorPoint cp = (ColorPoint) o;
        return cp.point.equals(point) && cp.color.equals(color);
    }
}
Point p1 = new Point(1, 0);
Point p2 = new ColorPoint(1, 0, Color.RED).asPoint(); // asPoint ์‚ฌ์šฉ๋ฒ•
// Point p2 = new ColorPoint(1, 0, Color.RED); // ์ด๋ ‡๊ฒŒ๋Š” ์•ˆ๋œ๋‹ค.

 

  ์ถ”์ด์„ฑ์— ๋Œ€ํ•œ ๋‚ด์šฉ์ด ๊ธธ์—ˆ๋Š”๋ฐ, ๊ฐ„๋‹จํžˆ ์ •๋ฆฌํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  • [์ƒ๊ฐ์˜ ํ๋ฆ„ 1] ๊ธฐ์กด ๋ฐฉ๋ฒ• ์‚ฌ์šฉ - ๋Œ€์นญ์„ฑ X
  • [์ƒ๊ฐ์˜ ํ๋ฆ„ 2] ํƒ€์ž…๊นŒ์ง€ ๊ณ ๋ คํ•˜์—ฌ ๋งŒ๋“  equals ์‚ฌ์šฉ - ๋Œ€์นญ์„ฑ O, ์ถ”์ด์„ฑ X
  • [์ƒ๊ฐ์˜ ํ๋ฆ„ 3] ๊ฐ๊ฐ์˜ ํƒ€์ž…๊นŒ์ง€ ๊ณ ๋ คํ•˜์—ฌ ๋งŒ๋“  equals ์‚ฌ์šฉ - ๋Œ€์นญ์„ฑ O, ์ถ”์ด์„ฑ O, ๋ฆฌ์Šค์ฝ”ํ”„ ์น˜ํ™˜ ์›์น™ X
  • [ํ•ด๊ฒฐ์ฑ…] ์ปดํฌ์ง€์…˜์„ ํ™œ์šฉํ•˜์—ฌ ์‚ฌ์šฉํ•˜์ž

 

4. ์ผ๊ด€์„ฑ(consistency)

  A.equals(B) == A.equals(B)

  ์ผ๊ด€์„ฑ์€ ๋‘ ๊ฐ์ฒด๊ฐ€ ๊ฐ™๋‹ค๋ฉด(์–ด๋А ํ•˜๋‚˜ ํ˜น์€ ๋‘ ๊ฐ์ฒด ๋ชจ๋‘๊ฐ€ ์ˆ˜์ •๋˜์ง€ ์•Š๋Š” ํ•œ) ์•ž์œผ๋กœ๋„ ์˜์›ํžˆ ๊ฐ™์•„์•ผ ํ•œ๋‹ค๋Š” ๋œป์ด๋‹ค. ๊ฐ€๋ณ€ ๊ฐ์ฒด๋Š” ๋น„๊ต ์‹œ์ ์— ๋”ฐ๋ผ ์„œ๋กœ ๋‹ค๋ฅผ ์ˆ˜๋„ ํ˜น์€ ๊ฐ™์„ ์ˆ˜๋„ ์žˆ๋Š” ๋ฐ˜๋ฉด, ๋ถˆ๋ณ€ ๊ฐ์ฒด๋Š” ํ•œ๋ฒˆ ๋‹ค๋ฅด๋ฉด ๋๊นŒ์ง€ ๋‹ฌ๋ผ์•ผ ํ•œ๋‹ค.

  ๋˜ํ•œ, ํด๋ž˜์Šค๊ฐ€ ๋ถˆ๋ณ€์ด๋“  ๊ฐ€๋ณ€์ด๋“  equals์˜ ํŒ๋‹จ์— ์‹ ๋ขฐํ•  ์ˆ˜ ์—†๋Š” ์ž์›์ด ๋ผ์–ด๋“ค๊ฒŒ ํ•ด์„œ๋Š” ์•ˆ ๋œ๋‹ค. (๋„ˆ๋ฌด ๋ณต์žกํ•˜๊ฒŒ ๊ตฌํ˜„ํ•˜๋ฉด ์•ˆ ๋œ๋‹ค.) ์ตœ์ข…์ ์œผ๋กœ ์–ด๋–ค ๊ฒƒ์„ ๊ฐ€๋ฆฌํ‚ค๋ƒ๋กœ ๋น„๊ตํ•˜๋ฉด ๋ณต์žกํ•œ ๊ฒƒ์ด๋‹ค. ์•„๋ž˜๋Š” ์ตœ์ข…์ ์ธ IP๋ฅผ ๋น„๊ตํ•˜์—ฌ ๋ณต์žกํ•˜๊ฒŒ ๊ตฌํ˜„ํ•œ ์˜ˆ์‹œ์ด๋‹ค.

URL google1 = new URL("https", "about.google", "/products/");
URL google2 = new URL("https", "about.google", "/products/");
System.out.println(google1.equals(google2)); // true์ผ ์ˆ˜๋„ ์žˆ๊ณ , false์ผ ์ˆ˜๋„ ์žˆ๋‹ค.

 

5. null-์•„๋‹˜

  ์ด๊ฒƒ์€ ๋ชจ๋“  ๊ฐ์ฒด๊ฐ€ null๊ณผ ๊ฐ™์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค๋Š” ๋œป์ด๋‹ค. ์ž…๋ ฅ์ด null์ด๋ฉด ํƒ€์ž… ํ™•์ธ ๋‹จ๊ณ„์—์„œ false๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— null ๊ฒ€์‚ฌ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

 

 

  ์ด์ƒ์œผ๋กœ equals ๋ฉ”์„œ๋“œ๋ฅผ ์žฌ์ •์˜ํ•  ๋•Œ ๋ฐ˜๋“œ์‹œ ์ง€์ผœ์•ผ ํ•˜๋Š” ์ผ๋ฐ˜ ๊ทœ์•ฝ 5๊ฐ€์ง€๋ฅผ ์ž์„ธํžˆ ์•Œ์•„๋ณด์•˜๋‹ค.

 

ํ•ด๋‹น ๊ธ€์€ ๋ฐฑ๊ธฐ์„  ๋‹˜์˜ '์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ” ์™„๋ฒฝ ๊ณต๋žต'์„ ์ˆ˜๊ฐ•ํ•˜๊ณ  ์ž‘์„ฑํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

'๐Ÿ“‚ JAVA > ์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ”' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

equals๋ฅผ ์žฌ์ •์˜ํ•˜๋ ค๊ฑฐ๋“  hashCode๋„ ์žฌ์ •์˜ํ•˜๋ผ(1) - [3์žฅ. ๋ชจ๋“  ๊ฐ์ฒด์˜ ๊ณตํ†ต ๋ฉ”์„œ๋“œ(์•„์ดํ…œ11)]  (0) 2023.01.07
equals๋Š” ์ผ๋ฐ˜ ๊ทœ์•ฝ์„ ์ง€์ผœ ์žฌ์ •์˜ํ•˜๋ผ(3) - [3์žฅ. ๋ชจ๋“  ๊ฐ์ฒด์˜ ๊ณตํ†ต ๋ฉ”์„œ๋“œ(์•„์ดํ…œ10)]  (2) 2023.01.06
equals๋Š” ์ผ๋ฐ˜ ๊ทœ์•ฝ์„ ์ง€์ผœ ์žฌ์ •์˜ํ•˜๋ผ(1) - [3์žฅ. ๋ชจ๋“  ๊ฐ์ฒด์˜ ๊ณตํ†ต ๋ฉ”์„œ๋“œ(์•„์ดํ…œ10)]  (0) 2023.01.05
try-finally ๋ณด๋‹ค๋Š” try-with-resources๋ฅผ ์‚ฌ์šฉํ•˜๋ผ - [2์žฅ ๊ฐ์ฒด ์ƒ์„ฑ๊ณผ ํŒŒ๊ดด(์•„์ดํ…œ9)]  (0) 2023.01.03
finalizer์™€ cleaner ์‚ฌ์šฉ์„ ํ”ผํ•˜๋ผ - [2์žฅ ๊ฐ์ฒด ์ƒ์„ฑ๊ณผ ํŒŒ๊ดด(์•„์ดํ…œ8)]  (0) 2023.01.03
    '๐Ÿ“‚ JAVA/์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ”' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
    • equals๋ฅผ ์žฌ์ •์˜ํ•˜๋ ค๊ฑฐ๋“  hashCode๋„ ์žฌ์ •์˜ํ•˜๋ผ(1) - [3์žฅ. ๋ชจ๋“  ๊ฐ์ฒด์˜ ๊ณตํ†ต ๋ฉ”์„œ๋“œ(์•„์ดํ…œ11)]
    • equals๋Š” ์ผ๋ฐ˜ ๊ทœ์•ฝ์„ ์ง€์ผœ ์žฌ์ •์˜ํ•˜๋ผ(3) - [3์žฅ. ๋ชจ๋“  ๊ฐ์ฒด์˜ ๊ณตํ†ต ๋ฉ”์„œ๋“œ(์•„์ดํ…œ10)]
    • equals๋Š” ์ผ๋ฐ˜ ๊ทœ์•ฝ์„ ์ง€์ผœ ์žฌ์ •์˜ํ•˜๋ผ(1) - [3์žฅ. ๋ชจ๋“  ๊ฐ์ฒด์˜ ๊ณตํ†ต ๋ฉ”์„œ๋“œ(์•„์ดํ…œ10)]
    • try-finally ๋ณด๋‹ค๋Š” try-with-resources๋ฅผ ์‚ฌ์šฉํ•˜๋ผ - [2์žฅ ๊ฐ์ฒด ์ƒ์„ฑ๊ณผ ํŒŒ๊ดด(์•„์ดํ…œ9)]
    Amenable
    Amenable
    CS, ์ž๋ฐ”, ์ž๋ฃŒ๊ตฌ์กฐ, ์•Œ๊ณ ๋ฆฌ์ฆ˜, ์Šคํ”„๋ง, ์Šคํ”„๋ง ๋ถ€ํŠธ์— ํ•ด๋‹นํ•˜๋Š” ๊ฐœ๋ฐœ์— ๊ด€ํ•œ ๋‚ด์šฉ์„ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค.

    ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”