Publish:

ํƒœ๊ทธ:

์นดํ…Œ๊ณ ๋ฆฌ:

  • equals() ์™€ hashCode() ์˜ ์ฐจ์ด์ ์„ ์•Œ์•„๋ณธ๋‹ค.
  • equals() ์™€ hashCode() ๋ฅผ ์žฌ์ •์˜ํ•˜๋Š” ์ด์œ ์— ๋Œ€ํ•ด ์•Œ์•„๋ณธ๋‹ค.

Object ํด๋ž˜์Šค์˜ equals()

โ€œequals() ์™€ == ๋Š” ๋‘˜๋‹ค ๋™์ผํ•˜๊ฒŒ ๋™์ž‘ํ•œ๋‹ค.โ€
๋ชจ๋“  java ํด๋ž˜์Šค์˜ ๋ถ€๋ชจ ํด๋ž˜์Šค์ธ Object ํด๋ž˜์Šค์—๋Š” equals() ๋ฉ”์†Œ๋“œ๊ฐ€ ์ •์˜ ๋˜์–ด ์žˆ๋‹ค.

Object ํด๋ž˜์Šค์˜ equals()

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

๋ณดํ†ต ๋™๋“ฑ์„ฑ/๋™์ผ์„ฑ ํ‚ค์›Œ๋“œ๋กœ ๊ฒ€์ƒ‰์„ ํ•˜๊ฒŒ๋˜๋ฉด == ๋Š” ๋™์ผ์„ฑ(identity), equals() ๋Š” ๋™๋“ฑ์„ฑ(equality) ์ด๋ผ๊ณ  ๊ฒฐ๋ก ์„ ๋‚ด๋ฆฌ๊ณ  ๋๋‚˜๋Š” ๊ธ€์ด ๋งŽ์•„์„œ ๋งˆ์น˜ ์•”๊ธฐ์˜ ์˜์—ญ๊ฐ™์•„ ๋ณด์ด์ง€๋งŒ, ์‹ค์ œ๋กœ equals() ๋กœ ๋™๋“ฑ์„ฑ์ด ๋ณด์žฅ๋  ์ˆ˜ ์žˆ๋Š” ์ด์œ ๊ฐ€ ๋ฐ”๋กœ ์žฌ์ •์˜(override)๋ฅผ ํ†ตํ•ด ๊ฐ’ ๋น„๊ต๋ฅผ ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๊ทธ๋Ÿผ ๊ฐ์ฒด๊ฐ„์˜ ๋น„๊ต๋ฅผ ํ•˜๋ ค๋ฉด equals() ๋ฉ”์†Œ๋“œ๋งŒ ์žฌ์ •์˜ํ•ด์„œ ์“ฐ๋ฉด ๋˜๋Š”๊ฑธ๊นŒ?

Object ํด๋ž˜์Šค์˜ hashCode()

Object ํด๋ž˜์Šค์˜ hashCode()

Object ํด๋ž˜์Šค์˜ hashCode() ๋ฉ”์†Œ๋“œ ๋˜ํ•œ JNI(Java Native Interface) ๋กœ ์ •์˜๋˜์–ด ์žˆ๋‹ค. ํ•ด๋‹น ๋ฉ”์†Œ๋“œ๋Š” ํŠน์ •ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ†ตํ•ด ์ผ์ • ๊ธธ์ด์˜ ๊ฐ’์„ ๋ฝ‘์•„๋‚ด๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. ์ด๋Š” equals() ์žฌ์ •์˜๋ฅผ ํ†ตํ•œ ํ•„๋“œ๊ฐ’์„ ์ผ์ผ์ด ํ™•์ธํ•˜๋Š” ๋ฐฉ์‹๊ณผ๋Š” ๋ณ„๊ฐœ๋กœ ํ•ด์‹œํ•จ์ˆ˜์˜ ๊ฒฐ๊ณผ๊ฐ’์ด ์„œ๋กœ ๊ฐ™์€์ง€๋ฅผ ์•Œ์•„๋ณด๊ธฐ ์œ„ํ•จ์ด๋‹ค. ์ผ์ข…์˜ ์ธ์ฆ(authentication) ์— ๋ชฉ์ ์ด ์žˆ๋Š” ๊ฒƒ์ด๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์ผ์ƒ์—์„œ ๋‚ด๊ฐ€ ๋‚˜๋ผ๋Š” ์‹ ์›์„ ์ฆ๋ช…ํ•˜๊ธฐ์œ„ํ•ด ์ฃผ๋ฏผ๋“ฑ๋ก์ฆ ๊ฐ™์€ ์‹ ๋ถ„์ฆ์„ ์ œ์‹œํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™๋‹ค. ๋‚ด๊ฐ€ ๋‚˜ ์ž„์„ ์ฆ๋ช…ํ•˜๊ธฐ ์œ„ํ•ด ์ž๋ผ์˜จ ์ผ์ƒ์„ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€ ๋‚˜์—ดํ•˜๋Š” ์‚ฌ๋žŒ์€ ์—†์„ ๊ฒƒ์ด๋‹ค.

hash.png hash function

๋งŒ์•ฝ hashCode() ๋ผ๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•œ ๋น„๊ต๋ฅผ ํ•˜์ง€์•Š๊ณ , ์ผ์ผ์ด ๋ฐ์ดํ„ฐ ๊ฐ’์„ ๋น„๊ตํ•œ๋‹ค๋ฉด ๋น„ํšจ์œจ์ ์ผ ๊ฒƒ์ด๋‹ค. ๋ฐ”์ดํŠธ ๊ฐ’์„ ๋ชจ๋‘ ๋น„๊ตํ•˜๋ฉด์„œ ๋‘ ๊ฐ์ฒด๊ฐ€ ์„œ๋กœ ๊ฐ™์€์ง€ ํ™•์ธํ•ด์•ผ ํ•  ๊ฒƒ์ด๋‹ค. ๊ฐ™์Œ์„ ์ฆ๋ช…ํ•˜๊ธฐ ์œ„ํ•ด ๋ชจ๋“  ๊ฐ’์„ ๋น„๊ตํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ ํ•ด์‹œ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๋ชฉ์ ์ด๋‹ค. ์•ฝ๊ฐ„์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ํฌ์ƒํ•˜๋”๋ผ๋„ ์‹œ๊ฐ„์  ์ด๋“์„ ๋ณด๊ฒ ๋‹ค๋Š” ๊ฒƒ์— ๊ฐ€์žฅ ํฐ ์˜๋ฏธ๊ฐ€ ์žˆ๋‹ค.(Space-Time trade-off)

๋งŒ์•ฝ equals() ๋งŒ ์žฌ์ •์˜ํ•˜๊ณ  hashCode() ๋Š” ์žฌ์ •์˜ ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
public class Test {

  public static void main(String[] args) {
    My obj1 = new My();
    obj1.name = "ํ™๊ธธ๋™";
    obj1.age = 20;

    My obj2 = new My();
    obj2.name = "ํ™๊ธธ๋™";
    obj2.age = 20;

    System.out.println(obj1 == obj2); // false
    System.out.println(obj1.equals(obj2)); // true

    System.out.println(Integer.toHexString(obj1.hashCode())); // 7ad041f3
    System.out.println(Integer.toHexString(obj2.hashCode())); // 251a69d7
  }

  static class My {
    String name;
    int age;

    @Override
    public boolean equals(Object obj) {
      if (this == obj)
        return true;
      if (obj == null)
        return false;
      if (getClass() != obj.getClass())
        return false;
      My other = (My) obj;
      return age == other.age && Objects.equals(name, other.name);
    }
  }
}

equals() ๋น„๊ต๋Š” true ๊ฐ€ ๋‚˜์˜ค์ง€๋งŒ hash code ๊ฐ’์€ ๋‹ค๋ฅด๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. Object ์— ์ •์˜๋œ hashCode() ๋Š” ๊ฐ ์ธ์Šคํ„ด์Šค๋งˆ๋‹ค ๊ณ ์œ ํ•œ ๊ฐ’์„ ๋ฆฌํ„ดํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋งŒ์•ฝ HashMap ๊ฐ™์€ ๊ณณ์— key ๋กœ ์ €๋ ‡๊ฒŒ ๋„ฃ์„ ๊ฒฝ์šฐ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Œ์—๋„ ์„œ๋กœ ๋‹ค๋ฅธ ๊ฐ์ฒด๋กœ ๋ฐ›์•„๋“ค์—ฌ ์ €์žฅ๋˜์ง€ ์•Š์„ ๊ฒƒ์ด๋‹ค. img.png HashMap ํด๋ž˜์Šค์˜ put()์€ hashCode()๋ฅผ ํ†ตํ•ด ๋น„๊ตํ•œ๋‹ค. img_1.png

java ๊ณต์‹ api ๋ฌธ์„œ์—์„œ๋Š” ๋‘ ๊ฐœ์ฒด๊ฐ€ ๋™์ผํ•˜๋ฉด ํ•ด๋‹น ํ•ด์‹œ ๊ฐ’๋„ ๋™์ผํ•ด์•ผ ํ•จ์„ ๊ฐ•์กฐํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐ์ฒด์˜ ๋‚ด์šฉ์„ ๋น„๊ตํ•˜๊ธฐ ์œ„ํ•ด equals() ๋ฉ”์„œ๋“œ๋ฅผ ์žฌ์ •์˜ํ•˜๋Š” ๊ฒฝ์šฐ ์ผ๊ด€์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด hashCode() ๋ฉ”์„œ๋“œ๋„ ์žฌ์ •์˜ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค.

equals() ์žฌ์ •์˜ ์‹œ hashCode() ๋„ ๋ฐ˜๋“œ์‹œ ์žฌ์ •์˜ ํ•ด์•ผํ•œ๋‹ค.

์ •๋ฆฌํ•˜์ž๋ฉด equals() ๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๋น„๊ตํ•˜๊ณ , hashCode()๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ์˜ ๋ฌด๊ฒฐ์„ฑ์„ ๋ณด์žฅํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๋”ฐ๋ผ์„œ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋‹ค๋ฅด๋”๋ผ๋„ ๋ฐ์ดํ„ฐ๊ฐ€ ๊ฐ™์œผ๋ฉด ๊ฐ™์€ ํ•ด์‹œ ๊ฐ’์„ ๋ฆฌํ„ดํ•˜๋„๋ก ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ•ด์•ผ ํ•œ๋‹ค. ์ด์ œ์•ผ ๋น„๋กœ์†Œ equals() ๋Š” ๋™๋“ฑ์„ฑ(equality), hashCode()๋Š” ๋™์ผ์„ฑ(identity)์„ ๋ณด์žฅํ•œ๋‹ค๋Š” ์˜๋ฏธ๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

String ์ด๋‚˜ wrapper ํด๋ž˜์Šค๊ฐ€ key ๋กœ ์“ฐ์ด๋Š” ์ด์œ 

HashMap ์ด๋‚˜ HashSet์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ๋•Œ key - value ํ˜•์‹์œผ๋กœ ์ €์žฅํ•˜๋Š”๋ฐ ์ด๋•Œ key ๋Š” ์ค‘๋ณต์ด ๋˜๋ฉด ์•ˆ๋˜๊ณ  ๊ณ ์œ ํ•œ ๊ฐ’์ด์–ด์•ผ ํ•œ๋‹ค. ์ด๋ฅผ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด hashCode() ๋ฅผ ์žฌ์ •์˜ํ•œ ๊ฐ์ฒด๋ฅผ ์ฃผ๋กœ key ๋กœ ์‚ฌ์šฉํ•˜๋Š”๋ฐ ๋Œ€ํ‘œ์ ์ธ๊ฒŒ Integer, String ์ด๋‹ค. Integer๋Š” ๋‚ด๋ถ€์— hashCode() ๋ฅผ ์žฌ์ •์˜ ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ๋ฐ›์€ ์ •์ˆ˜ ๊ฐ’ ๊ทธ๋Œ€๋กœ ๋ฆฌํ„ดํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐ™์€ ์ˆ˜๋ฅผ ๋„ฃ์ง€ ์•Š๋Š” ํ•œ ์ค‘๋ณต ๋  ์ผ์ด ์—†๋‹ค. String ํด๋ž˜์Šค๋Š” ๋ถˆ๋ณ€(Immutable)๊ฐ์ฒด ์ด๊ธฐ ๋•Œ๋ฌธ์— key ๊ฐ’์œผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค.

String ์˜ ๊ฒฝ์šฐ ๋ณ€์ˆ˜ ํ• ๋‹น ๋ฐฉ์‹์ด ๋‘๊ฐ€์ง€ ์ธ๋ฐ new String() ์œผ๋กœ ๋งŒ๋“ค๊ฑฐ๋‚˜ "" ๋ฆฌํ„ฐ๋Ÿด ํ˜•์‹์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

new String()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Test {
  public static void main(String[] args) {
    
    String s1; // s1์€ String ์ธ์Šคํ„ด์Šค ์ฃผ์†Œ๋ฅผ ๋‹ด๋Š” ๋ ˆํผ๋Ÿฐ์Šค์ด๋‹ค.

    // String ์ธ์Šคํ„ด์Šค
    // - ํž™์— Hello ๋ฌธ์ž ์ฝ”๋“œ๋ฅผ ์ €์žฅํ•  ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋งŒ๋“ค๊ณ  ๊ทธ ์ฃผ์†Œ๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค.
    // - ๋‚ด์šฉ๋ฌผ์˜ ๋™์ผ ์—ฌ๋ถ€๋ฅผ ๊ฒ€์‚ฌํ•˜์ง€ ์•Š๊ณ  ๋ฌด์กฐ๊ฑด ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
    // - ๊ฐ€๋น„์ง€๊ฐ€ ๋˜๋ฉด ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ์— ์˜ํ•ด ์ œ๊ฑฐ๋œ๋‹ค.
    s1 = new String("Hello");
    String s2 = new String("Hello");

    // ์ธ์Šคํ„ด์Šค๊ฐ€ ๊ฐ™์€์ง€๋ฅผ ๋น„๊ตํ•ด๋ณด๋ฉด,
    System.out.println(s1 == s2); // false => ์„œ๋กœ ๋‹ค๋ฅธ ์ธ์Šคํ„ด์Šค์ด๋‹ค.
  }
}

๋ฌธ์ž์—ด ๋ฆฌํ„ฐ๋Ÿด ๋ฐฉ์‹

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Exam0111 {
  public static void main(String[] args) {

    // ๋ฌธ์ž์—ด ๋ฆฌํ„ฐ๋Ÿด
    // - string constant pool ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์— String ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
    // - ์ƒ์ˆ˜ํ’€์— ์ด๋ฏธ ๊ฐ™์€ ๋ฌธ์ž์—ด์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ์žˆ๋‹ค๋ฉด, ๊ทธ ์ฃผ์†Œ๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค.
    // - ์™œ? ๋ฉ”๋ชจ๋ฆฌ ์ ˆ์•ฝ์„ ์œ„ํ•ด ์ค‘๋ณต ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ–๋Š” ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๋Š”๋‹ค.
    // - JVM์ด ๋๋‚  ๋•Œ๊นŒ์ง€ ๋ฉ”๋ชจ๋ฆฌ์— ์œ ์ง€๋œ๋‹ค.
    //
    String x1 = "Hello"; // ์ƒˆ String ์ธ์Šคํ„ด์Šค์˜ ์ฃผ์†Œ๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค.
    String x2 = "Hello"; // ๊ธฐ์กด์˜ String ์ธ์Šคํ„ด์Šค ์ฃผ์†Œ๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค.

    // ์ธ์Šคํ„ด์Šค์˜ ์ฃผ์†Œ๋ฅผ ๋น„๊ตํ•ด ๋ณด๋ฉด,
    System.out.println(x1 == x2); // true => ๋‘ String ๊ฐ์ฒด๋Š” ๊ฐ™๋‹ค.
  }
}

์ฃผ๋กœ String ๋ฌธ์ž์—ด์„ ๋งŒ๋“ค๋• ๋ฆฌํ„ฐ๋Ÿด ๋ฐฉ์‹์œผ๋กœ ๋งŒ๋“ค๊ณ  ํ• ๋‹นํ•˜๋Š”๋ฐ ์ด๋ ‡๊ฒŒ ๋งŒ๋“ค์–ด์ง„ String ์€ ๋ถˆ๋ณ€๊ฐ์ฒด๊ฐ€ ๋œ๋‹ค. ๋ฌธ์ž์—ด์„ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ์ž‘์—…(replace(),concat() ๋“ฑ)์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ์‚ฌ์‹ค์€ ์ƒˆ๋กœ์šด ๋ฌธ์ž์—ด ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ์ด๋‹ค. ๊ฐ™์€ ๋ณ€์ˆ˜์— ์žฌํ• ๋‹นํ•˜๋”๋ผ๋„ ๊ธฐ์กด ๋ฐ์ดํ„ฐ๋ฅผ ๋ฎ์–ด์“ฐ๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ String constant pool ์— ์ €์žฅ๋˜๊ณ , ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค ์ฃผ์†Œ๋ฅผ ๊ฐ–๊ฒŒ ๋œ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
13
public class ImmutableString {
  public static void main(String[] args) {
    
    String s1 = new String("Hello");
    
    String s2 = s1.replace('l', 'x');
    System.out.println(s1 == s2); // false
    System.out.printf("%s : %s\n", s1, s2); // Hello : Hexxo

    String s3 = s1.concat(", world!");
    System.out.printf("%s : %s\n", s1, s3); // Hello : Hello, world!
  }
}

์ž๋ฐ” ๋ฌธ์ž์—ด์˜ ๋ถˆ๋ณ€์„ฑ์€ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์ค‘์š”ํ•œ ์ด์ ์„ ๊ฐ–๋Š”๋‹ค.

  • ์Šค๋ ˆ๋“œ ์•ˆ์ •์„ฑ(Thread-safe): ๋ฌธ์ž์—ด์ด ๋ถˆ๋ณ€์ด๊ธฐ ๋•Œ๋ฌธ์— ์ค‘๊ฐ„์— ๋ฐ”๋€” ์œ„ํ—˜์ด ์—†์–ด ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ ๊ฐ„์— ์•ˆ์ „ํ•˜๊ฒŒ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋™์‹œ ์ˆ˜์ •์œผ๋กœ ์ธํ•œ ๋ฐ์ดํ„ฐ ์†์ƒ์˜ ์œ„ํ—˜์ด ์—†๋‹ค. ์Šค๋ ˆ๋“œ๊ฐ€ ๋ฌธ์ž์—ด์„ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด ์›๋ž˜ ๋ฌธ์ž์—ด์„ ๊ทธ๋Œ€๋กœ ๋‘๊ณ  ์ƒˆ๋กœ์šด ๋ฌธ์ž์—ด์„ ์ƒ์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

  • ์บ์‹ฑ(Caching): ๋ฌธ์ž์—ด์ด ๋ถˆ๋ณ€์ด๊ธฐ ๋•Œ๋ฌธ์— ์ž๋ฐ”๋Š” ์ด๋“ค์„ ์บ์‹œํ•  ์ˆ˜ ์žˆ๋‹ค. ํŠน์ • ๊ฐ’์˜ ๋ฌธ์ž์—ด์„ ๋งŒ๋“ค ๋•Œ, ์ž๋ฐ”๋Š” ๋ฌธ์ž์—ด ์ƒ์ˆ˜ ํ’€(string constant pool)์—์„œ ๋™์ผํ•œ ๊ฐ’์„ ๊ฐ–๋Š” ๊ธฐ์กด์˜ ๋ฌธ์ž์—ด์„ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ์ค„์ด๊ณ  ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

  • ๋ณด์•ˆ(Security): ๋ฌธ์ž์—ด์€ ์ข…์ข… ์•”ํ˜ธ๋‚˜ API ํ‚ค์™€ ๊ฐ™์€ ๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. ๋ถˆ๋ณ€์„ฑ์€ ์ด๋Ÿฌํ•œ ๋ฌธ์ž์—ด์ด ์ƒ์„ฑ๋œ ํ›„์— ๊ฐ’์ด ์‹ค์ˆ˜๋‚˜ ์•…์˜์ ์œผ๋กœ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋„๋ก ๋ณด์žฅํ•œ๋‹ค.

  • ์ตœ์ ํ™”(Optimization): ๋ถˆ๋ณ€์„ฑ์€ ํ•œ๋ฒˆ๋” ์ตœ์ ํ™” ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐํšŒ๋ฅผ ์ œ๊ณตํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋ฌธ์ž์—ด์˜ hashCode()๋Š” ํ•œ ๋ฒˆ ๊ณ„์‚ฐํ•˜๊ณ  ์บ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๊ฐ’์ด ๋ณ€ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ธด ๋ฌธ์ž์—ด์˜ ๊ฒฝ์šฐ ์งง์€ ํ•ด์‹œ๊ฐ’์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ์ฝ”๋“œ ๋‹จ์ˆœํ™”: ๋ถˆ๋ณ€ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์˜ˆ์ƒ์น˜ ์•Š์€ ๋ณ€๊ฒฝ์„ ๊ฑฑ์ •ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. ์ด๋กœ ์ธํ•ด ์ฝ”๋“œ๊ฐ€ ๋‹จ์ˆœํ™”๋˜๊ณ  ๋” ์˜ˆ์ธก ๊ฐ€๋Šฅํ•ด์ง„๋‹ค.

@EqualsAndHashCode ํ™œ์šฉ ์˜ˆ์‹œ

lombok ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์“ฐ๋ฉด equals() ์™€ hashCode() ๋ฅผ ์‰ฝ๊ฒŒ ์žฌ์ •์˜ ํ•ด์ฃผ๋Š” ์–ด๋…ธํ…Œ์ด์…˜์„ ์ œ๊ณตํ•œ๋‹ค.
https://jojoldu.tistory.com/134

@Data ์‚ฌ์šฉ์‹œ ์ฃผ์˜์ 

lombok ์—๋Š” @Data ๋ผ๋Š” ๊ฐ•๋ ฅํ•œ ์–ด๋…ธํ…Œ์ด์…˜์„ ์ง€์›ํ•˜๋Š”๋ฐ ์ด๋Š” constructor, getter, setter, toString, equals, hashcode ๋ฉ”์†Œ๋“œ๋ฅผ ์ž๋™์œผ๋กœ ์žฌ์ •์˜ ํ•ด์ค€๋‹ค. ์ฃผ๋กœ dto ๊ฐ์ฒด์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋“ค์ธ๋ฐ ๊ตฌํ˜„์˜ ๊ท€์ฐฎ์Œ์„ ํ•œ๋ฒˆ์— ํ•ด๊ฒฐํ•ด ์ค€๋‹ค๋Š” ํŽธ๋ฆฌํ•จ์ด ์žˆ์ง€๋งŒ ์žฌ์ •์˜๋˜๋Š” ๋ฉ”์†Œ๋“œ๋“ค ์ค‘์— equals, hashCode ๋„ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์ถฉ๋ถ„ํžˆ ์ธ์ง€ํ•œ ํ›„์— ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
  @Test
  public void name() {
    Set fruits = new HashSet<>();

    Fruit fruit = new Fruit("apple", "banana");
    fruit.add(fruit);
    assertTrue(fruits.contains(fruit));

    fruit.setLastName("melon");
    assertFalse(fruits.contains(fruit));
  }

reference

๋ฐฉ๋ฌธํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ๋Œ“๊ธ€,์ง€์ ,ํ”ผ๋“œ๋ฐฑ ์–ธ์ œ๋‚˜ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค๐Ÿ˜Š

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ