2022. 3. 25. 08:00ใ๊ฐ๋ ์ ๋ฆฌ ์์ ์ค/Java
๐ Object Class
๐ฝ ๊ฐ์
Object Class๋ ๋ชจ๋ Class์ ์ต๊ณ ์กฐ์์ธ ๊ฒ์ด์์. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ Object Class์ Membe๋ค์ ๋ชจ๋ Class์์ ๋ฐ๋ก ์ฌ์ฉ์ด ๊ฐ๋ฅํ ๊ฒ์ด์์.
Object Class Method | explanation |
protected Object clone() | ๊ฐ์ฒด ์์ ์ ๋ณต์ฌ๋ณธ ๋ฐํ |
public boolean equals( Object obj ) | ๊ฐ์ฒด ์์ ๊ณผ ๊ฐ์ฒด obj๊ฐ ๊ฐ์ ๊ฐ์ฒด์ธ์ง ์๋ ค์ค ( ๊ฐ์ผ๋ฉด true ๋ฐํ) |
protected void finalize() | ๊ฐ์ฒด๊ฐ ์์ด์ง ๋, ๊ฐ๋น์ง ์ปฌ๋ ํฐ์ ์ํด ์๋ ํธ์ถ. ์ด ๋, ์ํ๋์ด์ผ ํ๋ Code๊ฐ ์์ผ๋ฉด Overriding ์ค์ (๊ฑฐ์ ์ฌ์ฉ ์ํจ) |
pugblic Class getClass() | ๊ฐ์ฒด ์์ ์ Class ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋ Class ์ธ์คํด์ค ๋ฐํ |
public int hashCode() | ๊ฐ์ฒด ์์ ์ Hash Code ๋ฐํ |
public String toString() | ๊ฐ์ฒด ์์ ์ ์ ๋ณด ๋ฌธ์์ด ๋ฐํ |
public void notify() | ๊ฐ์ฒด ์์ ์ ์ฌ์ฉํ๋ ค๊ณ ๊ธฐ๋ค๋ฆฌ๋ ์ฐ๋ ๋ ํ๋๋ง ๊นจ์ด๋ค. |
public void notifyAll() | ๊ฐ์ฒด ์์ ์ ์ฌ์ฉํ๋ ค๊ณ ๊ธฐ๋ค๋ฆฌ๋ ๋ชจ๋ ์ฐ๋ ๋๋ฅผ ๊นจ์ด๋ค. |
public void wait() public void wait( long timeout ) public void wait ( long timeout, int nanos ) |
๋ค๋ฅธ ์ฐ๋ ๋๊ฐ notify(), notifyAll()์ ํธ์ถํ ๋๊น์ง ํ์ฌ ์ฐ๋ ๋๋ฅผ ๋ฌดํํ ํน์ ์ง์ ๋ ์๊ฐ( timeout, nanos )๋์ ๊ธฐ๋ค๋ฆฌ๊ฒ ํ๋ค. (timout์ ์ฒ ๋ถ์ 1์ด ๊ธฐ์ค, nanos๋ 10์ 9์น ๋ถ์ 1์ด ๊ธฐ์ค) |
Object Class๋ Member ๋ณ์๋ ์๊ณ , ์ค์ง 11๊ฐ์ Method๋ง ๊ฐ์ง๊ณ ์๋ ์น๊ตฌ์ธ ๊ฒ์ด์์.
ํด๋น Method๋ค์ ๋ชจ๋ ์ธ์คํด์ค๊ฐ ๊ฐ์ ธ์ผ ํ ๊ธฐ๋ณธ์ ์ธ ๊ฒ๋ค์ด๋๋๋ค.
๐ฝ equals( Object obj )
๋งค๊ฐ ๋ณ์๋ก ๊ฐ์ฒด์ ์ฐธ์กฐ ๋ณ์๋ฅผ ๋ฐ์ ๋น๊ตํ์ฌ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ boolean ๊ฐ์ผ๋ก ์๋ ค์ฃผ๋ ์ญํ ์ ํ๋ Method์ธ ๊ฒ์ด์์.
์์ ์ฝ๋
public boolean equals( Object obj ) {
return ( this == obj);
} // equals() ๋
์์ ์์ ์ฝ๋์์ ๋ณด์ด๋ฏ ๋ ๊ฐ์ฒด์ ๊ฐ๊ณ ๋ค๋ฆ์ ์ฐธ์กฐ ๋ณ์์ ๊ฐ์ผ๋ก ํ๋จํ๋ ๊ฒ์ด์์.
๋๋ฌธ์ ์๋ก ๋ค๋ฅธ ๋ ๊ฐ์ฒด๋ฅผ equals()๋ก ๋น๊ตํ๋ฉด ํญ์ `false`์ ๊ฒฐ๊ณผ๋ฅผ ์ป๊ฒ ๋ ๊ฒ์ด์์.
์์ ์ฝ๋
class EqualsEx {
public static void main(String[] args) {
Value v1 = new Value(10);
Value v2 = new Value(10);
if (v1.equals(v2)) {
System.out.println(v1 + " ๊ณผ " + v2 " + ๋ ๊ฐ์ต๋๋ค!");
} else {
System.out.println(v1 + " ๊ณผ " + v2 " + ๋ ๋ค๋ฆ
๋๋ค!");
} // if (v1.equals(v2)) - else ๋
v2 = v1;
if (v1.equals(v2)) {
System.out.println(v1 + " ๊ณผ " + v2 " + ๋ ๊ฐ์ต๋๋ค!");
} else {
System.out.println(v1 + " ๊ณผ " + v2 " + ๋ ๋ค๋ฆ
๋๋ค!");
} // if (v1.equals(v2)) - else ๋
} // main ๋
} // class ๋
/** ์คํ ๊ฒฐ๊ณผ
* v1 ๊ณผ v2 ๋ ๋ค๋ฆ
๋๋ค!
* v1 ๊ณผ v2 ๋ ๊ฐ์ต๋๋ค!
*/
Value๋ผ๋ Member ๋ณ์๋ฅผ ๊ฐ๋ Value Class๋ฅผ ์ ์ํ๊ณ , ๋ ๊ฐ์ Value Class์ ์ธ์คํด์ค๋ฅผ ์์ฑ(Value v1 = new Value(10);) ํ ๋ค์ equals Method๋ฅผ ์ด์ฉํ์ฌ ๋ ์ธ์คํด์ค๋ฅผ ๋น๊ตํ๋๋ก ํ ๊ฒ์ด์์. equals Method๋ ์ฃผ์๊ฐ์ ๋น๊ตํ๋ ์น๊ตฌ์ด๊ธฐ ๋๋ฌธ์ ๋ Value ์ธ์คํด์ค์ Member ๋ณ์ value์ ๊ฐ์ด 10์ผ๋ก ์๋ก ๊ฐ์์ง๋ผ๋ equals Method๋ก ๋น๊ตํ ๊ฒฐ๊ณผ๋ `false`๊ฐ ๋์ค๋ ๊ฒ์ด์์.
ํ์ง๋ง ๋๋ฒ์งธ `v2 = v1;`์ ์ํํ์ ๋๋ ์ฐธ์กฐ ๋ณ์ v2๋ v1์ด ์ฐธ์กฐํ๊ณ ์๋ ์ธ์คํด์ค์ ์ฃผ์๊ฐ์ด ์ ์ฅ๋์ด ์๊ธฐ ๋๋ฌธ์ v2๋ v1๊ณผ ๊ฐ์ Memory ์ฃผ์๊ฐ์ด ์ ์ฅ๋๋ ๊ฒ์ด์์. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ `true`๋ผ๋ ๊ฒฐ๊ณผ๊ฐ ๋์จ ๊ฒ์ด๋๋๋ค.
๐ฝ hashCode()
์ด ์น๊ตฌ๋ Hashing(ํด์ฑ) ๊ธฐ๋ฒ์ ์ด์ฉ๋๋ `Hash Function(ํด์ฑ ํจ์)`๋ฅผ ๊ตฌํํ ๊ฒ์ด์์. ํด์ฑ์ Data ๊ด๋ฆฌ ๊ธฐ๋ฒ ์ค์ ํ๋์ธ๋ฐ, ๋ค๋์ Data๋ฅผ ์ ์ฅํ๊ณ , ๊ฒ์ํ๋๋ฐ ๋งค์ฐ ์ ์ฉํ ๊ฒ์ด์์.
ํด์ ํจ์๋ ์ฐพ๊ณ ์ ํ๋ ๊ฐ์ ์ ๋ ฅํ๋ฉด, ๊ทธ ๊ฐ์ด ์ ์ฅ๋ ์์น๋ฅผ ์๋ ค์ฃผ๋ `Hash Code`๋ฅผ ๋ฐํํด ์ฃผ๋ ์น๊ตฌ์ธ ๊ฒ์ด์์.
์ผ๋ฐ์ ์ผ๋ก ํด์์ฝ๋๊ฐ ๊ฐ์ ๋ ๊ฐ์ฒด๊ฐ ์กด์ฌํ๋ ๊ฒ์ด ๊ฐ๋ฅํ๋, Object Class์ ์ ์๋ ํด์ ์ฝ๋ Method๋ ๊ฐ์ฒด์ ์ฃผ์๊ฐ์ผ๋ก ํด์ ์ฝ๋๋ฅผ ๋ง๋ค์ด ๋ฐํํ๊ธฐ ๋๋ฌธ์ 32 Bit JVM์์ ์๋ก ๋ค๋ฅธ ๋ ๊ฐ์ฒด๋ ๊ฒฐ์ฝ ๊ฐ์ ํด์ ์ฝ๋๋ฅผ ๊ฐ์ง ์ ์๊ณ , 64Bit JVM์์๋ 8 Byte ์ฃผ์๊ฐ์ผ๋ก ํด์์ฝ๋(4 Byte)๋ฅผ ๋ง๋ค๊ธฐ ๋๋ฌธ์ ํด์์ฝ๋๊ฐ ์ค๋ณต์ด ๋ ์๋ ์๋ ๊ฒ์ด์์.
Class์ ์ธ์คํด์ค ๋ณ์ ๊ฐ์ผ๋ก ๊ฐ์ฒด์ ๊ฐ๊ณ ๋ค๋ฆ์ ํ๋จํด์ผ ํ๋ ๊ฒฝ์ฐ๋ผ๋ฉด `equals` Method ๋ฟ๋ง ์๋๋ผ, `hashCode` Method๋ ์ ์ ํ Overridingํด์ผ ํ๋ ๊ฒ์ด์์.
๊ฐ์ ๊ฐ์ฒด๋ผ๋ฉด `hashCode` Method๋ฅผ ํธ์ถ ํ์ ๋, ๊ฒฐ๊ณผ๊ฐ์ธ ํด์์ฝ๋๋ ๊ฐ์์ผ ํ๊ธฐ ๋๋ฌธ์ธ ๊ฒ์ด์์.
๐ก ์ฐธ๊ณ ์ฌํญ
ํด์ฑ ๊ธฐ๋ฒ์ ์ฌ์ฉํ๋ HashMap, HashSet๊ณผ ๊ฐ์ Class์ ์ ์ฅํ ๊ฐ์ฒด๋ผ๋ฉด ๋ฐ๋์ hashCode Method๋ฅผ Overridingํด์ผ ํ๋ค.
String Class๋ ๋ฌธ์์ด์ ๋ด์ฉ์ด ๊ฐ์ผ๋ฉด, ๋์ผํ ํด์์ฝ๋๋ฅผ ๋ฐํํ๋๋ก hashCode Method๊ฐ ์ค๋ฒ๋ผ์ด๋ฉ ๋์ด ์๊ธฐ ๋๋ฌธ์ ๋ฌธ์์ด์ ๋ด์ฉ์ด ๊ฐ์ str1๊ณผ str2์ ๋ํด hashCode()๋ฅผ ํธ์ถํ๋ฉด ํญ์ ๋์ผํ ํด์ ์ฝ๋ ๊ฐ์ ์ป๊ฒ ๋๋ ๊ฒ์ด์์.
๋ฐ๋ฉด `System.identityHashCode( Object x )`๋ Objcet Class์ hashCode Method์ฒ๋ผ ๊ฐ์ฒด์ ์ฃผ์๊ฐ์ผ๋ก ํด์ ์ฝ๋๋ฅผ ์์ฑํ๊ธฐ ๋๋ฌธ์ ๋ชจ๋ ๊ฐ์ฒด์ ๋ํด ํญ์ ๋ค๋ฅธ ํด์์ฝ๋๊ฐ์ด ๋ฐํ๋ ๊ฒ์ด๋ผ๋ ๊ฒ์ ๋ณด์ฅํ๋ ๊ฒ์ด์์. ๊ทธ๋์ str1๊ณผ str2๊ฐ ํด์ ์ฝ๋๋ ๊ฐ์ ์ ์์ด๋ ์๋ก ๋ค๋ฅธ ๊ฐ์ฒด๋ผ๋ ๊ฒ์ ์ ์ ์๋ ๊ฒ์ด์์.
์ฐธ๊ณ ๋ก `System.identityHashCode( Object x )`์ ํธ์ถ ๊ฒฐ๊ณผ๋ ์คํ ํ ๋๋ง๋ค ๋ฌ๋ผ์ง ์ ์๋ ๊ฒ์ด์์.
๐ฝ toString()
์ด ์น๊ตฌ๋ ์ธ์คํด์ค์ ๋ํ ์ ๋ณด๋ฅผ `๋ฌธ์์ด(String)`์ผ๋ก ์ ๊ณตํ ๋ชฉ์ ์ผ๋ก ๋ง๋ค์ด์ง Method์ธ ๊ฒ์ด์์.
์ธ์คํด์ค์ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ค๋ ๊ฒ์ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ์ธ์คํด์ค ๋ณ์์ ์ ์ฅ๋ ๊ฐ๋ค์ ๋ฌธ์์ด๋ก ํํํ๋ค๋ ๊ฒ์ด์์.
Object Class์ ์ ์๋ toString()์ ์ด๋ป๊ฒ ์๊ฒผ์๊น์?
Class๋ฅผ ๋ง๋ค ๋, toString()์ ์ค๋ฒ๋ผ์ด๋ฉํ์ง ์๋๋ค๋ฉด, ์์ ๊ฐ์ ๋ด์ฉ์ด ๊ทธ๋๋ก ์ฌ์ฉ์ด ๋ ๊ฒ์ด์์.
์ฆ, toString()์ ํธ์ถํ๋ฉด Class ์ด๋ฆ์ 16์ง์์ ํด์์ฝ๋(`Integer.toHexString(hashCode());)`๋ฅผ ์ป๊ฒ ๋ ๊ฒ์ด์์.
๐ก ์ฐธ๊ณ ์ฌํญ
getClass()์ hashCode() ์ญ์ Object Class์ ์ ์๋ Method๋ก ์ธ์คํด์ค ์์ฑ์์ด ๋ฐ๋ก ํธ์ถ ๊ฐ๋ฅ.
์์ ์ฝ๋
class Card {
String kind;
int number;
Card() {
this("SPADE", 1);
} // Card() ๋
Card(String kind, int number) {
this.kind = kind;
this.number = number;
} // Card(String kind, int number) ๋
} // class ๋
class CardToString {
public static void main(String[] args) {
Card c1 = new Card();
Card c2 = new Card();
System.out.println(c1.toString());
System.out.println(c2.toString());
} // main() ๋
} // class ๋
/** ์คํ ๊ฒฐ๊ณผ
* Card@34b0jdi
* Card@039ow2
*/
Card ์ธ์คํด์ค ๋ ๊ฐ๋ฅผ ์์ฑํ ๋ค์, ๊ฐ ์ธ์คํด์ค์ `toString()`์ ํธ์ถํ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ ๊ฒ์ด์์. Card Class์์ Object Class ๋ถํฐ ์์๋ฐ์ `toString()`์ ์ค๋ฒ๋ผ์ด๋ฉํ์ง ์์๊ธฐ ๋๋ฌธ์ Card ์ธ์คํด์ค์ `toString()`์ ํธ์ถํ๋ฉด Object Class์ `toString()`์ด ํธ์ถ๋์ด 16์ง์ ํด์ฌ ์ฝ๋์ Class ์ด๋ฆ์ด ํธ์ถ๋๊ฒ ๋ ๊ฒ์ด์์. ์๋ก ๋ค๋ฅธ ์ธ์คํด์ค์ ๋ํด์ `toString()`์ ํธ์ถํ์๊ธฐ ๋๋ฌธ์ Class์ ์ด๋ฆ์ด ๊ฐ์๋ ํด์ ์ฝ๋๊ฐ์ด ๋ค๋ฅด๋ค๋ ๊ฒ์ ํ์ธํ ์ ์๋ ๊ฒ์ด์์.
๋๋ถ๋ถ `toString()`์ ์ค๋ฒ๋ผ์ด๋ฉ์ ํ์ฌ ์ธ์คํด์ค ๋ณ์๋ค์ ๊ฐ์ ๋ฌธ์์ด๋ก ๋ณํํ์ฌ ๋ฐํํ๊ฒ ๋ง๋ค์ด ์ฃผ๋ ๊ฒ์ด์์.
๊ทธ๋์ผ ์ฌ๋์ด ์ดํด๋ฅผ ํ ์ ์์ํ
๋๊น์!
์์ ์ฝ๋
class Card {
String kind;
int number;
Card() {
this("SPADE", 1); // Card(String kind, int number) ํธ์ถ
} // Card() ๋
Card(String Kind, int number) {
this.kind = kind;
this.number = number;
} // Card(String Kind, int number) ๋
@Overriding
public String toString() {
return "kind : " + kind + ", number : " + number; // ์ธ์คํด์ค์ Kind์ Number ๋ฌธ์์ด๋ก ๋ฐํ
} // toString() ๋
} // class ๋
class CardToString2 {
public static void main(String[] args) {
Card c1 = new Card();
Card c2 = new Card("HEART", 10);
System.out.println(c1.toString());
System.out.println(c2.toString());
} // main() ๋
} // class ๋
ํด๋น ์๋ฃ๋ `์๋ฐ์ ์ ์`์ ํ ๋๋ก ์์ฑ ๋์์์ ์๋ ค ๋๋ฆฝ๋๋ค!
'๊ฐ๋ ์ ๋ฆฌ ์์ ์ค > Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Spring Boot] Discord Bot(๋์ค์ฝ๋ ๋ด) ๋ง๋ค๊ธฐ - JAVA๋ฅผ ์ด์ฉํ API ํธ์ถ (0) | 2023.03.17 |
---|---|
[Open Source Project] JitPack์ ๋ด๊ฐ ๋ง๋ Library & Framework ์ฌ๋ฆฌ๊ธฐ (0) | 2022.12.10 |
[JAVA] String Instance / Constant Pool์ด๋? (0) | 2022.03.24 |
[JAVA] getDeclaredFields ํ์ฉํ์ฌ VO ๊ฐ์ฒด์ ํ๋ฒ์ ์ด์ฉํ๊ธฐ (0) | 2022.03.11 |
[Java] ๋คํ์ฑ(polymorphism) (0) | 2021.09.18 |