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

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

2023. 1. 6. 23:49

  ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” ์ง€๊ธˆ๊นŒ์ง€์˜ ๋‚ด์šฉ์„ ์ข…ํ•ฉํ•ด์„œ ์–‘์งˆ์˜ equals ๋ฉ”์„œ๋“œ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•๊ณผ ์ฃผ์˜ ์‚ฌํ•ญ์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๊ณ ์ž ํ•œ๋‹ค.

 

1. equals ๊ตฌํ˜„ ๋ฐฉ๋ฒ•

  1. == ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•ด ์ž…๋ ฅ์ด ์ž๊ธฐ ์ž์‹ ์˜ ์ฐธ์กฐ์ธ์ง€ ํ™•์ธํ•œ๋‹ค.
  2. instanceof ์—ฐ์‚ฐ์ž๋กœ ์ž…๋ ฅ์ด ์˜ฌ๋ฐ”๋ฅธ ํƒ€์ž…์ธ์ง€ ํ™•์ธํ•œ๋‹ค.
  3. ์ž…๋ ฅ์„ ์˜ฌ๋ฐ”๋ฅธ ํƒ€์ž…์œผ๋กœ ํ˜•๋ณ€ํ™˜ํ•œ๋‹ค.
  4. ์ž…๋ ฅ ๊ฐ์ฒด์™€ ์ž๊ธฐ ์ž์‹ ์˜ ๋Œ€์‘๋˜๋Š” 'ํ•ต์‹ฌ' ํ•„๋“œ๋“ค์ด ๋ชจ๋‘ ์ผ์น˜ํ•˜๋Š”์ง€ ํ•˜๋‚˜์”ฉ ๊ฒ€์‚ฌํ•œ๋‹ค.
    float์™€ double์„ ์ œ์™ธํ•œ ๊ธฐ๋ณธ ํƒ€์ž… ํ•„๋“œ๋Š” == ์—ฐ์‚ฐ์ž๋กœ ๋น„๊ตํ•˜๊ณ , ์ฐธ์กฐ ํƒ€์ž… ํ•„๋“œ๋Š” ๊ฐ๊ฐ์˜ equals ๋ฉ”์„œ๋“œ๋กœ, float๊ณผ double ํ•„๋“œ๋Š” ๊ฐ๊ฐ ์ •์  ๋ฉ”์„œ๋“œ์ธ Float.compare(float, float)์™€ Double.compare(double, double)๋กœ ๋น„๊ตํ•œ๋‹ค. (float์™€ double์„ ํŠน๋ณ„ ์ทจ๊ธ‰ํ•˜๋Š” ์ด์œ ๋Š” Float.NaN, -0.0f, ํŠน์ˆ˜ํ•œ ๋ถ€๋™์†Œ์ˆ˜ ๊ฐ’ ๋“ฑ์„ ๋‹ค๋ค„์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.)
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) {
        // 1. == ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•ด ์ž…๋ ฅ์ด ์ž๊ธฐ ์ž์‹ ์˜ ์ฐธ์กฐ์ธ์ง€ ํ™•์ธํ•œ๋‹ค. 
        if(this == o) {
            return true;
        }
        
        // 2. instanceof ์—ฐ์‚ฐ์ž๋กœ ์ž…๋ ฅ์ด ์˜ฌ๋ฐ”๋ฅธ ํƒ€์ž…์ธ์ง€ ํ™•์ธํ•œ๋‹ค.
        if(!(o.instanceof Point))
            return false;
        
        // 3. ์ž…๋ ฅ์„ ์˜ฌ๋ฐ”๋ฅธ ํƒ€์ž…์œผ๋กœ ํ˜•๋ณ€ํ™˜ํ•œ๋‹ค.
        Point p = (Point)o;
        
        // 4. ์ž…๋ ฅ ๊ฐ์ฒด์™€ ์ž๊ธฐ ์ž์‹ ์˜ ๋Œ€์‘๋œ๋А 'ํ•ต์‹ฌ' ํ•„๋“œ๋“ค์ด ๋ชจ๋‘ ์ผ์น˜ํ•˜๋Š”์ง€ ํ•˜๋‚˜์”ฉ ๊ฒ€์‚ฌํ•œ๋‹ค.
        return p.x == x && p.y == y;
    }
    
    // ์•„์ดํ…œ 11 ์ฐธ์กฐ
    @Override public int hashCode() {
        return 31 * x + y;
    }
}

  

  ๋ฌธ์ œ๋Š”... ์ด๋Ÿฐ ๊ทœ์•ฝ์„ ๋”ฐ๋ฅด๋ฉด์„œ ๊ตฌํ˜„ํ•˜๊ธฐ๊ฐ€ ๋งค์šฐ ์–ด๋ ต๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋ž˜์„œ ํˆด์„ ์“ด๋‹ค. 4๊ฐ€์ง€ ํˆด์„ ์†Œ๊ฐœํ•˜๊ฒ ๋‹ค.

1. @AutoValue

@AutoValue
abstract class Point {
    static Point create(int x, int y) {
        return new AutoValue_Point(x, y);
    }
    
    abstract int x();
    abstract int y();
}

 

2. Lombok์˜ @EqualsAndHashCode์™€ @ToString

@EqualsAndHashCode
@ToString
public class Point {
    private final int x;
    private final int y;
    
    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }
}

 

3. ์ž๋ฐ”์˜ Record

public record Point(int x, int y){ }

 

4. IntelliJ์—์„œ Generator์˜ 'equals() and hashCode()'

  ํ•ด๋‹น ๋ฐฉ๋ฒ•์—๋Š” 2๊ฐ€์ง€ ๋‹จ์ ์ด ์žˆ๋‹ค.

  1. ์ฝ”๋“œ๊ฐ€ ์ง€์ €๋ถ„ํ•ด์ง„๋‹ค.(์œ„์—์„œ ์–ด๋…ธํ…Œ์ด์…˜๊ณผ record๋กœ ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌํ˜„ํ•œ ๊ฒƒ๊ณผ ๋น„๊ตํ•ด๋ณด๋ฉด ์•Œ ์ˆ˜ ์žˆ๋‹ค.)
  2. ํ•„๋“œ๊ฐ€ ์ˆ˜์ •๋  ๋•Œ๋งˆ๋‹ค 'equals() and hashCode()'๋กœ ์ƒ์„ฑ๋œ ์ฝ”๋“œ๋ฅผ ์ง€์šฐ๊ณ  ๋‹ค์‹œ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค. (์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ ๊ตฌํ˜„ํ•œ ๊ฒฝ์šฐ ์ปดํŒŒ์ผํ•  ๋•Œ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌ๋˜๋Š”๋‹ค๋Š” ๊ฒƒ๊ณผ ๋น„๊ตํ•˜๋ฉด ์ถฉ๋ถ„ํžˆ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค.)

 

2. ์ฃผ์˜ ์‚ฌํ•ญ

  1. equals๋ฅผ ์žฌ์ •์˜ ํ•  ๋•Œ hashCode๋„ ๋ฐ˜๋“œ์‹œ ์žฌ์ •์˜ํ•˜์ž. (์•„์ดํ…œ 11์—์„œ ๋‹ค๋ฃฐ ์˜ˆ์ •)
  2. ๋„ˆ๋ฌด ๋ณต์žกํ•˜๊ฒŒ ํ•ด๊ฒฐํ•˜์ง€ ๋ง์ž (์ด์ „ ๊ธ€์—์„œ URL ์˜ˆ์‹œ๋ฅผ ๋– ์˜ฌ๋ ค ๋ณด์ž.)
  3. Object๊ฐ€ ์•„๋‹Œ ํƒ€์ž…์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ฐ›๋Š” equals ๋ฉ”์„œ๋“œ๋Š” ์„ ์–ธํ•˜์ง€ ๋ง์ž. (ํƒ€์ž…์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ฐ›๋Š” equals ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, ํ•ด๋‹น ํด๋ž˜์Šค๋ฅผ List๋‚˜ Set์— ๋„ฃ์„ ๊ฒฝ์šฐ Object์˜ equals๋กœ ๋น„๊ตํ•˜๊ฒŒ ๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.)
// ๋งž๋Š” ํ‘œํ˜„
@Override public boolean equals(Object o) {
    if(this == o) {
        return true;
    }
      
    if(!(o.instanceof Point))
        return false;
    Point p = (Point)o;
    return p.x == x && p.y == y;
}

// ํ‹€๋ฆฐ ํ‘œํ˜„
// ์ด๊ฒƒ์€ '์˜ค๋ฒ„๋ผ์ด๋”ฉ'ํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ '์˜ค๋ฒ„๋กœ๋”ฉ'ํ•œ ๊ฒƒ์ด๋‹ค.
public boolean equals(Point o) {
    if(this == o) {
        return true;
    }
      
    if(!(o.instanceof Point))
        return false;
    Point p = (Point)o;
    return p.x == x && p.y == y;
}

 

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

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

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

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