๋๋ฑ์ฑ / ๋์ผ์ฑ ์ธ์ (๊ฐ์ฒด์ ๋ฐ์ดํฐ ๋น๊ต)
11/21 15:00 ~ 16:00 (์ฝ 1์๊ฐ ์งํ)
์๋๋ฆฌ์ค
- ์ฑ 3๊ฐ๊ฐ ์ฃผ์ด์ง๋๋ค. ์ด ์ค์์ ๊ฐ์ ์ฑ ์ด ๋ฌด์์ธ์ง ์ฐพ์๋ด์ผ ํ๋ค.
- ์๋๋ฆฌ์ค๋ฅผ ํตํด์ ์๋ฐ์์ ๋น๊ต๋ ๊ฐ๋ ์ด ๋ฌด์์ด๊ณ ๋ ๋์๊ฐ์ ๋๋ฑ์ฑ๊ณผ ๋์ผ์ฑ์ ์ฐจ์ด์ ์ ์์๋ณด์.
์ค์ต
Book.java
public class Book {
private String name;
private String author;
public Book(String name, String author) {
this.name = name;
this.author = author;
}
}
Main.java
public class Main {
public static void main(String[] args) {
int a = 1;
int b = 1;
int c = 2;
Book bookA = new Book("์๋
์ด์จ๋ค", "ํ๊ฐ");
Book bookB = new Book("์๋
์ด์จ๋ค", "ํ๊ฐ");
Book bookC = new Book("์ฑ์์ฃผ์์", "ํ๊ฐ");
}
}
๋ฌธ์ ์ํฉ
public class Main {
public static void main(String[] args) {
...
boolean ret = (bookA == bookB);
System.out.println("ret = " + ret); // false ์ถ๋ ฅ
}
}
๋น๊ต์ฐ์ฐ์(==)๋ฅผ ์ฌ์ฉํด์ ๋น๊ต๋ฅผ ํด๋ณด๋ฉด ๊ฐ์ ์ฑ ์ด์ง๋ง ๋ค๋ฅธ ์ฑ ์ด๋ผ๊ณ false๊ฐ ์ถ๋ ฅ๋๋ค.
public class Main {
public static void main(String[] args) {
int a = 1;
int b = 1;
int c = 2;
...
boolean ret2 = (a == b);
System.out.println("ret2 = " + ret2); // true ์ถ๋ ฅ
}
}
๋ณ์ a์ b๋ฅผ ๋น๊ตํด ๋ณด๋ฉด true๊ฐ ์ ์ถ๋ ฅ๋๋ ๋ชจ์ต์ ํ์ธํ ์ ์๋ค.
์ด์ ๊ฐ ๋ฌด์์ผ๊น..?
๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ์ ๋ณ์
- Method Area
- .class ํ์ผ์ ์ ๋ณด๊ฐ ์ฌ๋ผ๊ฐ๋ ๊ณณ์ด๋ค.
- ์๋ฐ ํ๋ก๊ทธ๋จ์ด ์คํ๋ ๋ ๋ชจ๋ ํด๋์ค์ ๋ฉ์๋ ์ ๋ณด(ํด๋์ค ๊ตฌ์กฐ, ๋ฉ์๋ ์ ๋ณด, ์์ ๋ฑ)๊ฐ ์ ์ฅ๋๋ ๊ณณ์ด๋ค.
- Stack Area
- FILO(First In Last Out, ์ ์ ํ์ถ) ๊ตฌ์กฐ์ด๋ค.
- ๋ฉ์๋๊ฐ ํธ์ถ๋ ๋๋ง๋ค ๋ฉ์๋์ ์ ๋ณด๋ฅผ ๊ฐ์ง ์๋ก์ด ์คํ ํ๋ ์์ด ์์ธ๋ค.
- ๊ฐ์ฅ ์์ ์๋ ์ ์๋ฅผ ๋จผ์ ๊บผ๋ด์ ์ฌ์ฉํ๋ฏ์ด ๋ง์ง๋ง์ ํธ์ถ๋ ๋ฉ์๋๊ฐ ๋จผ์ ์คํ๋๋ค.
- Heap Area
- ํ์์ ๋ฐ๋ผ ํฌ๊ธฐ๊ฐ ๋ณํ๋ ๊ฐ์ฒด๊ฐ ์ ์ฅ๋๋ ๊ณต๊ฐ์ด๋ค.
๊ทธ๋์ ์ ์ธํ book ๊ฐ์ฒด๋ค์ด ๊ฐ๊ฐ ๋ค๋ฅธ ์ฃผ์๊ฐ์ผ๋ก ์ ์ฅ๋์ด ์๋ค.
โ๏ธ ์ฐธ๊ณ - ์ฐธ์กฐ ๋ณ์ (referenceType)
๋ฉ๋ชจ๋ฆฌ ์์์ ์ค์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ์ง ์๊ณ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ์๋ ๊ฐ์ฒด์ ์์น ์ฃผ์๋ฅผ ์ ์ฅํ๊ณ ์๋ ๋ณ์๋ฅผ ์ฐธ์กฐ๋ณ์( referenceType)๋ผ๊ณ ํ๋ค.
public static void main(String[] args) {
int a = 1;
int b = 1;
int c = 2;
Book bookA = new Book("์๋
์ด์จ๋ค", "ํ๊ฐ");
Book bookB = new Book("์๋
์ด์จ๋ค", "ํ๊ฐ");
Book bookC = new Book("์ฑ์์ฃผ์์", "ํ๊ฐ");
System.out.println(a); // 1
System.out.println(b); // 1
System.out.println(c); // 2
System.out.println(bookA); // equal.Book@4517d9a3
System.out.println(bookB); // equal.Book@372f7a8d
System.out.println(bookC); // equal.Book@2f92e0f4
}
== ์ฐ์ฐ์๋ ๊ธฐ๋ณธ ํ์ ์์๋ ๊ฐ์ ๋น๊ตํ๊ณ , ์ฐธ์กฐ ํ์ ์์๋ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์(์ฐธ์กฐ)๋ฅผ ๋น๊ตํ๋ค.
๋๋ฑ์ฑ๊ณผ ๋์ผ์ฑ
๋๋ฑ์ฑ(Equality)
๋๋ฑ์ฑ์ .equals( ) ๋ฉ์๋๋ก ๊ตฌํ์ด ๊ฐ๋ฅํ๋ค.
๋์ผ์ฑ(Identity)
๋์ผ์ฑ์ == ์ฐ์ฐ์ ์ฌ์ฉํด์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์ ๊ฐ์ผ๋ก ํ๋จํ๋ค.
Equals ์ฌ์ฉ
boolean ret = (bookA.equals(bookB));
System.out.println("ret = " + ret); // false
.equals( ) ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋๋ฐ ์ false๊ฐ ์ถ๋ ฅ๋๋ ๊ฒ์ธ๊ฐ........
Equals์ ๋น๋ฐ
public boolean equals(Object obj) {
return (this == obj)
}
โ๏ธ ์ฐธ๊ณ - equals( )๋ฅผ ์ธ์ ๋ ์ง ์ฌ์ฉํ ์ ์๋ ์ด์
Object ํด๋์ค์ ๋ฉ์๋์ด๋ค.
๋ชจ๋ ๊ฐ์ฒด๋ Object ๊ฐ์ฒด์ ์์์ด๊ธฐ ๋๋ฌธ์ ๋ชจ๋ ๊ฐ์ฒด๋ ๋ถ๋ชจ์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ ์๋ค!
โญโญโญํด์ฆ - ๋ฉด์ ์์ ๋์ค๋ ์ง๋ฌธ
๋ถ๋ชจ ํด๋์ค์ ๋ฉ์๋๋ฅผ ์์ ํด๋์ค์์ ์ฌ์ ์ํ๋ ๊ฒ → overriding
์ค๋ฒ๋ผ์ด๋ฉ์ ์ด์ฉํ ์ง์ ๊ตฌํ (๋น์ถ์ฒ)
@Override
public boolean equals(Object object) {
Book book = (Book) object;
if (this.name == book.getName() && this.author == book.getAuthor()) {
return true;
} else {
return false;
}
}
์ง์ ๋ง๋ค ๊ฒฝ์ฐ ์ ์ฌ์ ์ค๋ฅ ๋ฐ์ ๊ฐ๋ฅ์ฑ์ด ์๊ฒจ์ ์๊ธฐ์น ๋ชปํ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์๋ค.
์ธํ ๋ฆฌ์ ์ด๋ฅผ ํตํด ์ง์ ๊ตฌํ (์ถ์ฒ)
@Override
public boolean equals(Object object) {
if (this == object) return true;
if (object == null || getClass() != object.getClass()) return false;
Book book = (Book) object;
return Objects.equals(name, book.name) && Objects.equals(author, book.author);
}
ํด์ฆ
hashCode( )์ ์ ์ฒด๋ ๋ฌด์์ผ๊น?
equals( ) ๋ฉ์๋์๊ฒ๋ ๋จ์ง์น๊ตฌ hashCode( )๊ฐ ์์ต๋๋ค. ์ฐ๋ฆฌ๊ฐ equals( ) ๋ฉ์๋๋ฅผ ์ ์ํ๋ฉด ํญ์ hashCode( )์ ํจ๊ป ์ ์ํด ์ค์ผ ํ๋๋ฐ ๊ทธ ์ด์ ๊ฐ ๋ฌด์์ผ๊น์?!
1. Java์ ๊ฐ์ฒด ๋น๊ต์ ํด์ ๊ธฐ๋ฐ ์ปฌ๋ ์
Java์๋ ๊ฐ์ฒด์ ๋์ผ์ฑ์ ํ๋จํ๋ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์๋ค.
- ๋์ผ์ฑ(Identity) : == ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ ๊ฐ์ฒด๊ฐ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ๊ฐ์ง๋์ง ๋น๊ตํ๋ค.
- ๋๋ฑ์ฑ(Equality) : equals( ) ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ ๊ฐ์ฒด๊ฐ ๋ ผ๋ฆฌ์ ์ผ๋ก ๋์ผํ์ง๋ฅผ ํ๋จํ๋ค.
equals( ) ๋ฉ์๋๋ฅผ override ํ๋ฉด, ๊ฐ์ฒด๊ฐ ๋ ผ๋ฆฌ์ ์ผ๋ก ๋์ผํ์ง๋ฅผ ์ฐ๋ฆฌ์ ๊ธฐ์ค๋๋ก ์ ์ํ๊ฒ ๋๋ค.
ํด์ ๊ธฐ๋ฐ ์ปฌ๋ ์
(ex: HashSet, HashMap)์ ๋์ ๋ฐฉ์์ ๋ํด ์๊ฐํด ๋ณด์.
์ปฌ๋ ์
๋ค์ ํด์ ์ฝ๋๋ฅผ ์ฌ์ฉํด์ ๊ฐ์ฒด๋ค์ ์ ์ฅํ๊ณ ๋น ๋ฅด๊ฒ ๊ฒ์ํ๋ค. Java์์ ํด์ ์ฝ๋๋ฅผ ๋ฐํํ๋ ๋ฉ์๋๊ฐ ๋ฐ๋ก hashCode( )์ด๋ค.
2. equals( )์ hashCode( )์ ๊ณ์ฝ
equals( )์ hashCode( )๋ ํน๋ณํ ๊ณ์ฝ์ ๋งบ๊ณ ์๋ค.
- ๋๋ฑํ ๋ ๊ฐ์ฒด๋ ๋์ผํ ํด์์ฝ๋ ๊ฐ์ ๊ฐ์ ธ์ผ ํ๋ค.
- x.equals(y) == true๋ผ๋ฉด, ๋ฐ๋์ x.hashCode( ) == y.hashCode( )์ฌ์ผ ํ๋ค.
์ด ๊ณ์ฝ์ด ์ค์ํ ์ด์ ๋ ํด์ ๊ธฐ๋ฐ ์ปฌ๋ ์
์ด ํด์ ์ฝ๋๋ฅผ ์ฌ์ฉํด ๊ฐ์ฒด์ ์ ์ฅ ์์น๋ฅผ ๊ฒฐ์ ํ๊ธฐ ๋๋ฌธ์ด๋ค.
์๋ฅผ ๋ค์ด, HashMap์ด๋ HashSet ๊ฐ์ ์๋ฃ๊ตฌ์กฐ์์๋ ๋ค์๊ณผ ๊ฐ์ ๊ณผ์ ์ ํตํด ๊ฐ์ฒด๋ฅผ ์ ์ฅํ๊ฑฐ๋ ๊ฒ์ํ๋ค.
- ๊ฐ์ฒด์ ํด์์ฝ๋๋ฅผ ๊ณ์ฐํ์ฌ ์ด๋ ๋ฒํท์ ์ ์ฅํ ์ง ๊ฒฐ์ ํ๋ค.
- ๊ทธ ๋ฒํท์ ์ ์ฅ๋ ๊ฐ์ฒด๋ค๊ณผ equals( )๋ก ๋น๊ตํ์ฌ ๋์ผํ ๊ฐ์ฒด๊ฐ ์๋์ง ํ์ธํ๋ค.
๋ง์ฝ equals( )๋ฅผoverride ํ๋ฉด์ hashCode( )๋ฅผ override ํ์ง ์์ผ๋ฉด, ๋ ผ๋ฆฌ์ ์ผ๋ก ๊ฐ์ ๋ ๊ฐ์ฒด๋ผ๋ ๋ค๋ฅธ ํด์์ฝ๋๋ฅผ ๊ฐ์ง ์ ์๋ค. ์ด๋ ๊ฒ ๋๋ฉด ํด์ ๊ธฐ๋ฐ ์ปฌ๋ ์ ์์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ฒ ๋๋ค.
3. ์ HashCode( )๋ฅผ override ํด์ผ ํ๋์?
equals( )๋ฅผ override ํ๊ฒ ๋๋ฉด ๋ ๊ฐ์ฒด๊ฐ ๋ ผ๋ฆฌ์ ์ผ๋ก ๋์ผํ๋ค๊ณ ํ๋จ๋๋ ๊ธฐ์ค์ ์ฐ๋ฆฌ๊ฐ ์ ์ํ๊ฒ ๋๋๋ฐ, ํด์ ๊ธฐ๋ฐ ์ปฌ๋ ์ ๋ค์ ์ด ๋ ผ๋ฆฌ์ ๋์ผ์ฑ์ ๋ง์ถฐ์ ๋์ํด์ผ ํ๋ค. ๋ฐ๋ผ์ ๋๋ฑํ ๊ฐ์ฒด๋ ๋ฐ๋์ ๋์ผํ ํด์์ฝ๋๋ฅผ ๊ฐ์ ธ์ผ ํ๋ค๋ ๊ท์น์ ์งํค๊ธฐ ์ํด hashCode( )๋ ํจ๊ป override ํด์ผ ํ๋ค.
๊ฐ๋จํ ์์
public class Person {
private String name;
private int age;
// equals() ์ค๋ฒ๋ผ์ด๋
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
Person person = (Person) obj;
return age == person.age && Objects.equals(name, person.name);
}
// hashCode() ์ค๋ฒ๋ผ์ด๋
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}
equals( )๋ name๊ณผ age๊ฐ ๊ฐ์ผ๋ฉด ๋์ผํ๋ค๊ณ ํ๋จํ๊ณ , hashCode( )๋ name๊ณผ age๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํด์์ฝ๋๋ฅผ ์์ฑํ๋ค. ์ด๋ ๊ฒ ํ๋ฉด HashSet์ ๊ฐ์ฒด๋ฅผ ๋ฃ๊ฑฐ๋ ๊ฒ์ํ ๋, ๊ฐ์ ๋ ผ๋ฆฌ์ ๊ฐ์ ๊ฐ์ง ๊ฐ์ฒด๋ ํญ์ ๊ฐ์ ํด์์ฝ๋๋ฅผ ๊ฐ์ง๋ฏ๋ก HashSet์ ์ค๋ณต๋ ๊ฐ์ฒด๋ฅผ ํ์ฉํ์ง ์๋๋ค.
4. hashCode( )๋ฅผ ์ ์ํ์ง ์์์ ๋์ ๋ฌธ์ ์
hashCode( )๋ฅผ ์ ์ํ์ง ์์ผ๋ฉด, ๊ธฐ๋ณธ์ ์ผ๋ก Object ํด๋์ค์์ ์ ๊ณตํ๋ ํด์์ฝ๋๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋๋ฐ, ์ด๋ ๊ฐ์ฒด์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํด์์ฝ๋๋ฅผ ์์ฑํ๋ค. ๋ฐ๋ผ์ ๋ ผ๋ฆฌ์ ์ผ๋ก ๊ฐ์ ๊ฐ์ฒด๋ผ๋ ์๋ก ๋ค๋ฅธ ํด์์ฝ๋๋ฅผ ๊ฐ์ง๊ฒ ๋ ๊ฐ๋ฅ์ฑ์ด ๋๋ค. ์ด๋ก ์ธํด ํด์ ๊ธฐ๋ฐ ์ปฌ๋ ์ ์์๋ ๊ฐ์ฒด๋ฅผ ์ ๋๋ก ๊ด๋ฆฌํ์ง ๋ชปํ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ฒ ๋๋ค.
์์ฝ
- equals( )๋ฅผ override ํ๋ฉด ๋ ผ๋ฆฌ์ ๋์ผ์ฑ์ ์ ์ํ๊ฒ ๋๋ค.
- hashCode( )๋ฅผ ํจ๊ป override ํ์ง ์์ผ๋ฉด, ๋ ผ๋ฆฌ์ ์ผ๋ก ๊ฐ์ ๊ฐ์ฒด๊ฐ ์๋ก ๋ค๋ฅธ ํด์์ฝ๋๋ฅผ ๊ฐ์ ธ์ ํด์ ๊ธฐ๋ฐ ์ปฌ๋ ์ ์์ ์๋ํ ๋๋ก ๋์ํ์ง ์๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
- ๋ฐ๋ผ์ equals( )์ hashCode( )๋ ํญ์ ํจ๊ป override ํด์ผ ํ๋ฉฐ, ์ด๋ฅผ ํตํด ํด์ ๊ธฐ๋ฐ ์ปฌ๋ ์ ๋ค์ด ์ ๋๋ก ๋์ํ ์ ์๊ฒ ํด์ค์ผ ํ๋ค.
'Today I Learned(TIL) > ์ธ์ ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Java ์ถ๊ฐ ๋ฏธ๋ ๊ณผ์ _๋คํ์ฑ, DI ์ฐ์ต (1) | 2024.12.02 |
---|---|
Java ์ธ์ _๊ฐ์ฒด ๊ฐ์ ๊ฒฐํฉ๋์ ๋คํ์ฑ (1) | 2024.11.30 |
Java ์ธ์ _๊ฐ์ฒด ํ์ฉ (1) | 2024.11.19 |
Java ํด๋์ค_์ดํดํ์ง ๋ชปํ๋ฉด ๋๊ฐ ์ ์๋ ๋ฐฉ.. (0) | 2024.11.19 |
๊น์ง QnA ์ธ์ (7) | 2024.11.16 |