[Java] Object Class, Immutable Object
π‘ μ΄ κ²μκΈμ κΉμν κ°μ¬λμ μλ° κ°μλ₯Ό μκ°νλ©° νμ΅ν λ΄μ©μ μ€μν ν€μλ μ€μ¬μΌλ‘ μ 리ν κ°μΈ νμ΅ κΈ°λ‘μ λλ€. μ€μ§ κΈ°μ΅ λ³΅κΈ°λ₯Ό μν λͺ©μ μΌλ‘ μμ±λμμΌλ©°, λͺ¨λ λ΄μ©μ ν¬ν¨νμ§ μμΌλ―λ‘ νμ΅ μλ£λ‘λ μ ν©νμ§ μμ΅λλ€.
μμ μ μ₯λ³Έμ΄ λ μκ°λ κ²½μ°κ° μμ΄ demoλ‘ μ λ‘λ
Section2 (Object Class)
Object Class
μλ°μμ λͺ¨λ ν΄λμ€μ μ΅μμ λΆλͺ¨ ν΄λμ€λ νμ Object ν΄λμ€μ΄λ€.
ν΄λμ€μ μμ λ°μ λΆλͺ¨ ν΄λμ€λ₯Ό λͺ
μμ μΌλ‘ μ§μ νλ©΄ Object λ₯Ό μμ λ°μ§ μλλ€.
1
2
3
4
5
6
7
8
9
10
11
12
13
package lang.object;
public class ObjectMain {
public static void main(String[] args) {
Child child = new Child();
child.childMethod();
child.parentMethod();
// toString()μ Object ν΄λμ€μ λ©μλ
String string = child.toString();
System.out.println(string);
}
}
child.toString()μ νΈμΆνλ€.- λ¨Όμ λ³ΈμΈμ νμ
μΈ
ChildμμtoString()μ μ°Ύλλ€. μμΌλ―λ‘ λΆλͺ¨ νμ μΌλ‘ μ¬λΌκ°μ μ°Ύλλ€. - λΆλͺ¨ νμ
μΈ
Parentμμ μ°Ύλλ€. μμΌλ―λ‘ λΆλͺ¨ νμ μΌλ‘ μ¬λΌκ°μ μ°Ύλλ€. - λΆλͺ¨ νμ
μΈ
Objectμμ μ°Ύλλ€.ObjectμtoString()μ΄ μμΌλ―λ‘ μ΄ λ©μλλ₯Ό νΈμΆνλ€.
μλ°μμ λͺ¨λ κ°μ²΄μ μ΅μ’
λΆλͺ¨λ Object λ€
λͺ¨λ ν΄λμ€κ° Object ν΄λμ€λ₯Ό μμ λ°λ μ΄μ λ λ€μκ³Ό κ°λ€.
- κ³΅ν΅ κΈ°λ₯ μ 곡
- λ€νμ±μ κΈ°λ³Έ ꡬν
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package lang.object.poly;
public class ObjectPolyExample1 {
public static void main(String[] args) {
Dog dog = new Dog();
Car car = new Car();
action(dog);
action(car);
}
private static void action(Object obj) {
// obj.sound(); // μ»΄νμΌ μ€λ₯, Objectλ sound()κ° μλ€.
// obj.move(); // μ»΄νμΌ μ€λ₯, Objectλ move()κ° μλ€.
// κ°μ²΄μ λ§λ λ€μ΄μΊμ€ν
νμ
if (obj instanceof Dog dog) {
dog.sound();
} else if (obj instanceof Car car) {
car.move();
}
}
}
Object λ°°μ΄
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package lang.object.poly;
public class ObjectPolyExample2 {
public static void main(String[] args) {
Dog dog = new Dog();
Car car = new Car();
Object object = new Object(); // Object μΈμ€ν΄μ€λ λ§λ€ μ μλ€.
Object[] objects = {dog, car, object}; // λ€μν κ°μ²΄λ₯Ό Object λ°°μ΄μ μ μ₯
size(objects);
}
private static void size(Object[] objects) {
System.out.println("μ λ¬λ κ°μ²΄μ μλ: " + objects.length);
}
}
toString()
Object.toString() λ©μλλ κ°μ²΄μ μ 보λ₯Ό λ¬Έμμ΄ ννλ‘ μ 곡νλ€.
Object κ° μ 곡νλ toString() λ©μλλ κΈ°λ³Έμ μΌλ‘ ν¨ν€μ§λ₯Ό ν¬ν¨ν κ°μ²΄μ μ΄λ¦κ³Ό κ°μ²΄μ μ°Έμ‘°κ°(ν΄μ
μ½λ)λ₯Ό 16μ§μλ‘ μ 곡νλ€.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
package lang.object.tostring;
public class ToStringMain1 {
public static void main(String[] args) {
Object object = new Object();
String string = object.toString();
// toString() λ°νκ° μΆλ ₯
System.out.println(string);
// object μ§μ μΆλ ₯
System.out.println(object);
}
}
1
2
java.lang.Object@a09ee92
java.lang.Object@a09ee92
1
2
3
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
System.out.println() λ©μλλ μ¬μ€ λ΄λΆμμ toString() μ νΈμΆνλ€.
Object νμ
(μμ ν¬ν¨)μ΄ println() μ μΈμλ‘ μ λ¬λλ©΄ λ΄λΆμμ obj.toString() λ©μλλ₯Ό νΈμΆν΄μ κ²°κ³Ό
λ₯Ό μΆλ ₯νλ€.
toString() μ€λ²λΌμ΄λ©
Object.toString() λ©μλκ° ν΄λμ€ μ 보μ μ°Έμ‘°κ°μ μ 곡νμ§λ§ μ΄ μ 보λ§μΌλ‘λ κ°μ²΄μ μνλ₯Ό μ μ ν λνλ΄μ§ λͺ»νλ€. κ·Έλμ λ³΄ν΅ toString() μ μ¬μ μ(μ€λ²λΌμ΄λ©)ν΄μ λ³΄λ€ μ μ©ν μ 보λ₯Ό μ 곡νλ κ²μ΄ μΌλ°μ μ΄λ€.
1
2
3
4
5
6
7
@Override
public String toString() {
return "Dog{" +
"dogName='" + dogName + '\'' +
", age=" + age +
'}';
}
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
package lang.object.tostring;
public class ToStringMain2 {
public static void main(String[] args) {
Car car = new Car("Car1");
Dog dog1 = new Dog("Dog1", 5);
Dog dog2 = new Dog("Dog2", 10);
System.out.println(car.toString());
System.out.println(dog1.toString());
System.out.println(dog2.toString());
System.out.println(car);
System.out.println(dog1);
System.out.println(dog2);
ObjectPrinter.print(car);
ObjectPrinter.print(dog1);
ObjectPrinter.print(dog2);
String refValue1 = Integer.toHexString(System.identityHashCode(dog1));
System.out.println(refValue1);
String refValue2 = Integer.toHexString(System.identityHashCode(dog2));
System.out.println(refValue2);
}
}
1
2
3
4
5
6
7
8
9
10
11
lang.object.tostring.Car@5f184fc6
Dog{dogName='Dog1', age=5}
Dog{dogName='Dog2', age=10}
lang.object.tostring.Car@5f184fc6
Dog{dogName='Dog1', age=5}
Dog{dogName='Dog2', age=10}
κ°μ²΄ μ 보 μΆλ ₯: lang.object.tostring.Car@5f184fc6
κ°μ²΄ μ 보 μΆλ ₯: Dog{dogName='Dog1', age=5}
κ°μ²΄ μ 보 μΆλ ₯: Dog{dogName='Dog2', age=10}
506e1b77
4fca772d
Objectμ OCP
ꡬ체μ μΈ κ²μ μμ‘΄ Β«< μΆμμ μΈ κ²μ μμ‘΄π
1
2
3
4
5
6
public class ObjectPrinter {
public static void print(Object obj) {
String string = "κ°μ²΄ μ 보 μΆλ ₯: " + obj.toString();
System.out.println(string);
}
}
equals() - λμΌμ±κ³Ό λλ±μ±
λμΌμ±(Identity): ==μ°μ°μλ₯Ό μ¬μ©ν΄μ λ κ°μ²΄μ μ°Έμ‘°κ° λμΌν κ°μ²΄λ₯Ό κ°λ¦¬ν€κ³ μλμ§ νμΈ
λλ±μ±(Equality): equals() λ©μλλ₯Ό μ¬μ©νμ¬ λ κ°μ²΄κ° λ
Όλ¦¬μ μΌλ‘ λλ±νμ§ νμΈ
1
2
3
4
5
6
7
8
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
UserV2 userV2 = (UserV2) o;
return Objects.equals(id, userV2.id);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
package lang.object.equals;
public class EqualsMainV2 {
public static void main(String[] args) {
UserV2 user1 = new UserV2("id-100");
UserV2 user2 = new UserV2("id-100");
System.out.println("identity " + (user1 == user2));
System.out.println("equality " + user1.equals(user2));
}
}
//identity false
//equality true
Section3 (Immutable Object)
Side Effectμ°Έμ‘°κ°μ λ€λ₯Έ λ³μμ λμ
νλ μκ° μ¬λ¬ λ³μκ° νλμ κ°μ²΄λ₯Ό 곡μ νκ² λλ€. μ½κ² μ΄μΌκΈ°ν΄μ κ°μ²΄μ 곡μ λ₯Ό λ§μμ μλ λ°©λ²μ΄ μλ€.
λΆλ³μ΄λΌλ λ¨μν μ μ½μ μ¬μ©ν΄μ μ¬μ΄λ μ΄ννΈλΌλ ν° λ¬Έμ λ₯Ό λ§μ μ μλ€.
κ°μ²΄μ 곡μ μ°Έμ‘°λ λ§μ μ μλ€. κ·Έλμ κ°μ²΄μ κ°μ λ³κ²½νλ©΄ λ€λ₯Έ κ³³μμ μ°Έμ‘°νλ λ³μμ κ°λ ν¨κ» λ³κ²½λλ μ¬μ΄λ μ΄ννΈκ° λ°μνλ€.
μ¬μ΄λ μ΄ννΈκ° λ°μνλ©΄ μλλ μν©μ΄λΌλ©΄ λΆλ³ κ°μ²΄λ₯Ό λ§λ€μ΄μ μ¬μ©νλ©΄ λλ€.
λΆλ³ κ°μ²΄λ κ°μ λ³κ²½ν μ μκΈ° λλ¬Έμ μ¬μ΄λ μ΄ννΈκ° μμ² μ°¨λ¨λλ€.