[Java] equals() ์ hashCode() ๋ฅผ ์ฌ์ ์ํ๋ ์ด์
ํ๊ทธ: Java
์นดํ ๊ณ ๋ฆฌ: Java
- 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 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 ๋ก ์ ๋ ๊ฒ ๋ฃ์ ๊ฒฝ์ฐ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ์์์๋ ์๋ก ๋ค๋ฅธ ๊ฐ์ฒด๋ก ๋ฐ์๋ค์ฌ ์ ์ฅ๋์ง ์์ ๊ฒ์ด๋ค.
HashMap ํด๋์ค์ put()์ hashCode()๋ฅผ ํตํด ๋น๊ตํ๋ค.
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));
}
๋๊ธ๋จ๊ธฐ๊ธฐ