β μλ° Object ν΄λμ€μ λ©μλ μ€λ²λΌμ΄λ©
Object ν΄λμ€
λͺ¨λ μλ°μ ν΄λμ€λ Object ν΄λμ€λ‘ λΆν° μμλλ€.
μ¦, Object ν΄λμ€κ° λͺ¨λ ν΄λμ€μ μ‘°μ νΉμ base λΌκ³ ν μ μλ€.
μ¬μ€ μ°λ¦¬κ° ν΄λμ€ νμΌμ λ§λ€μ΄ ν΄λμ€λͺ
μ μμ±νλ©΄ μλμ μΌλ‘ Object ν΄λμ€κ° extends κ° λλ€.
μ°λ¦¬κ° ν΄λμ€λ₯Ό λ§λ€λ κ΅³μ΄ Object ν΄λμ€λ₯Ό μμμν€μ§ μμλ μλμΌλ‘ μμν΄μ€μ Object ν΄λμ€κ° μ§μνλ λ©μλλ₯Ό μμ λ‘κ² μ¬μ©μ΄ κ°λ₯ν μ΄μ μ΄λ€.
λ§μΌ λ€λ₯Έ ν΄λμ€λ₯Ό μμμν€λ©΄ λΉμ°ν ν΄λμ€λ νκ°λ°μ μμν μ μκΈ°μ extends Objectλ μ¬λΌμ§μ§λ§, λΆλͺ¨ ν΄λμ€μμ Objectλ₯Ό μμνκ³ μκΈ°μ κ²°κ΅ λͺ¨λ ν΄λμ€λ Object ν΄λμ€λ₯Ό μμ λ°κ³ μλ ννκ° λλ€.
// extends Object λ₯Ό μμ¨μ€λ μ»΄νμΌλ¬κ° μμμ μμμμΌμ£Όκ³ μ»΄νμΌ ν΄μ€λ€.
class MyObject {
// μ무κ²λ μμ΄λ€.
}
public class Main {
public static void main(String args[]) {
MyObject o = new MyObject();
// MyObject ν΄λμ€μ μλμ λ©μλλ₯Ό λͺ
μνμ§ μμλ λμνλ μ΄μ λ κΈ°λ³Έμ μΌλ‘ Object ν΄λμ€λ₯Ό μμνκ³ μκΈ°μ λΆλͺ¨μ λ©μλλ₯Ό κ°λ€ μ°λ κ²μ΄λ€.
o.toString();
o.hashCode();
}
}
Object ν΄λμ€ λ©μλ μ’ λ₯
Object ν΄λμ€μ μν μ μ£Όλ‘ μ΄μ체μ μ μλ°κ°μλ¨Έμ μ μ¬μ΄μ κ΄λ¦¬λ₯Ό λ΄λΉνλ€.
μ΄λ¬ν Object ν΄λμ€λ νλλ₯Ό κ°μ§μ§ μμΌλ©°, μ΄ 11κ°μ λ©μλλ§μΌλ‘ ꡬμ±λμ΄ μλ€.
Object ν΄λμ€μ λ©μλ | μ€ λͺ |
protected Object clone( ) | κ°μ²΄ μμ μ 볡μ¬λ³Έμ λ°ννλ€. |
public boolean equals(Object obj) | κ°μ²΄ μμ κ³Ό κ°μ²΄ objκ° κ°μ κ°μ²΄μΈμ§ μλ €μ€λ€ (κ°μΌλ©΄ true) |
protected void finalize( ) | κ°μ²΄κ° μλ©Έλ λ κ°λΉμ§ 컬λ ν°μ μν΄ μλμ μΌλ‘ νΈμΆλμ΄ κ°μ²΄κ° μλ©ΈλκΈ° μ§μ μ λ°μ΄ν°λ€μ λ°λ©νλ€. κ·Έλμ μ΄ λ©μλλ₯Ό μ€λ²λΌμ΄λ© ν΄μ λ°μ΄ν°λ₯Ό μ²μν΄ μ£Όμ΄μΌ κ² μ§λ§ νμ§λ§ μμ¦μ λ€λ₯Έλ°©λ²μΌλ‘ μ²μνμ¬ μμ°μΈλ€ (deprecated) |
public Class getClass( ) | κ°μ²΄ μμ μ ν΄λμ€ μ 보(μ€κ³λ)λ₯Ό λ΄κ³ μλ Class μΈμ€ν΄μ€λ₯Ό λ°ν λ€λ₯Έ κ³³μμ ν΄λΉ κ°μ²΄μ μ 보λ₯Ό κ°μ§κ³ κ°μ²΄λ₯Ό μ¬μμ± ν΄μΌ ν λ μ΄μ©λ¨ |
public int hashCode( ) | κ°μ²΄ μμ μ ν΄μμ½λλ₯Ό λ°ν β» ν΄μμ½λλ λ©λͺ¨λ¦¬ μ£Όμλ₯Ό intνμΌλ‘ λ³νν κ° |
public String toString( ) | κ°μ²΄ μμ μ μ 보λ₯Ό λ¬Έμμ΄λ‘ λ°ν |
public void notify( ) | (μ°λ λμ© λ©μλ) κ°μ²΄ μμ μ μ¬μ©νλ €κ³ κΈ°λ€λ¦¬λ μ°λ λλ₯Ό νλλ§ κΉ¨μ΄λ€. |
public void notifyAll( ) | (μ°λ λμ© λ©μλ) κ°μ²΄ μμ μ μ¬μ©νλ €κ³ κΈ°λ€λ¦¬λ λͺ¨λ μ°λ λλ₯Ό κΉ¨μ΄λ€. |
public void wait( ) public void wait(long timout) public void wait(long timeout, int nanos) |
(μ°λ λμ© λ©μλ) λ₯Έ μ°λ λκ° notify() λ notifyAll() μ νΈμΆν λκΉμ§ νμ¬ μ°λ λλ₯Ό 무νν λλ μ§μ λ μκ°(timeout, nanos)λμ κΈ°λ€λ¦¬κ² νλ€.(timeoutμ 1/1000μ΄, nanosλ 1/(10^9)μ΄) |
μ΄μ€μμ λ°λ‘ μ¬μ μνμ¬ λΉλ²νκ² μ°μ΄λ λ©μλλ clone() , equals() , hashCode() , toString() 4κ°μ§ μ λκ° λκ² λ€.
Objects ν΄λμ€
Object ν΄λμ€κ° μλ, Objects ν΄λμ€μμ μ‘°μ¬νμ.
Objects ν΄λμ€λ java.util ν¨ν€μ§μ μλ λλ€λ₯Έ ν΄λμ€μ΄λ€. (Object ν΄λμ€λ java.lang ν¨ν€μ§μ ν¬ν¨)
Array λ°°μ΄ ν΄λμ€κ° μκ³ λ Arrays ν΄λμ€κ° μλ―μ΄ λκ°μ΄ μκ°νλ©΄ λλ€.
Objects ν΄λμ€λ κ°μ²΄ λΉκ΅, ν΄μ μ½λ μμ±, null μ¬λΆ, κ°μ²΄ λ¬Έμμ΄ λ¦¬ν΄ λ±μ μ°μ°μ μννλ μ μ λ©μλλ€λ‘ ꡬμ±λμ΄ μμΌλ©°, κ°λ°μκ° κ°μ Έκ° μ°κΈ° νΈνκ² νκΈ° μν΄μ ꡬνλμλ€κ³ 보면 λλ€.
Object ν΄λμ€ λ©μλ μ¬μ μ
μ΄μ λΆν° μμμ μκ°ν λͺλͺ Object ν΄λμ€μ λ©μλμ λν΄ κΉμ΄ μ΅ν보λ μκ°μ κ°μ Έλ³Ό κ²μ΄λ€.
μλ°μμ μλμΌλ‘ Object ν΄λμ€λ₯Ό extends νκΈ° λλ¬Έμ λ¬Έμ μμ΄ Objectμ λ©μλλ₯Ό μ¬μ©ν μ μλλ° κ΅³μ΄ μ€λ²λΌμ΄λ©μ μμΌ μ¬μ©νλ κ°μ λν΄ μλ§ μμν¨μ κ°μ§ κ²μ΄λ€.
μ¬μ€ μλ°μμ 미리 λ§λ€μ΄ μ 곡νλ ArrayList, Map, String ν΄λμ€λ§ μ¬μ©νλ€λ©΄ κ΅³μ΄ Object ν΄λμ€ λ©μλμ λν΄μ κΉμ΄ 곡λΆν νμλ μμμ§λ λͺ¨λ₯Έλ€.
νμ§λ§ Object ν΄λμ€λ₯Ό νμ©ν΄μΌ ν λλ μμ λ§μ λ°μ΄ν° μλ£νμ ꡬμ±ν λ νμνλ€.
μλ₯Όλ€μ΄ μ μ νλ‘ν κ°μ²΄λ₯Ό μ μ₯νκ³ μ¬μ©νκΈ°μν΄ λ©€λ²λ‘ name, age, phone λ± λ€μν μ 보λ₯Ό κ°μ§κ³ μλ User ν΄λμ€λ₯Ό λ§λ€κ³ , μ΄ ν΄λμ€λ₯Ό μ΄μ©ν΄ λ°μ΄ν°λ₯Ό λ€λ£¨κ² λ λ, λ°λμ Object ν΄λμ€μ λ©μλλ₯Ό μ¬μ μνμ¬ νμ©ν΄μΌ νλ κ²½μ°κ° μκΈ°κΈ° λλ¬Έμ΄λ€.
toString λ©μλ
- κΈ°λ³Έμ μΌλ‘ Object ν΄λμ€μ
toString()λ©μλλ ν΄λΉ μΈμ€ν΄μ€μ λν μ 보μ μ£Όμ(ν΄μμ½λ)λ₯Ό λ¬Έμμ΄λ‘ λ°ννλ€.Object@251a69d7 - λ°λΌμ κ°μ²΄μ μ΄λ¦μ΄λ μ£Όμκ°μ΄ μλ κ°μ²΄μ κ³ μ μ 보λ₯Ό μΆλ ₯νκ³ μΆμ λ toString λ©μλλ₯Ό μ¬μ μνμ¬ λ°νκ°μ λ€λ₯΄κ² μ€μ ν΄μ£Όλ©΄ λλ€.
- κΈ°λ³Έμ μΌλ‘ κ°μ²΄λ₯Ό μΆλ ₯(println) ν λ λ³μμ
toString()μ νΈμΆνμ§ μμλ μλμΌλ‘ λΆμ¬ νΈμΆνλ€. - μ΄ λ©μλλ μΈμ€ν΄μ€μ λν μ 보λ₯Ό λ¬Έμμ΄λ‘ μ 곡ν λͺ©μ μΌλ‘ μ μλμ΄ μλ κ²μ΄λ€.
- μ΄λ λ°νλλ λ¬Έμμ΄μ ν΄λμ€ μ΄λ¦κ³Ό ν¨κ» ꡬλΆμλ‘ @κ° μ¬μ©λλ©°, κ·Έ λ€λ‘ 16μ§μ ν΄μ μ½λ(hash code)κ° μΆκ°λλ€. ν΄μ μ½λ κ°μ μΈμ€ν΄μ€μ μ£Όμλ₯Ό ν΄μ±νμ¬ λ³νν κ°μΌλ‘, κ³ μ μ«μλ‘μ μΈμ€ν΄μ€λ§λ€ λͺ¨λ λ€λ₯΄κ² λ°νλλ€.
- μ€μ λ‘
toString()λ©μλ λ΄λΆλ₯Ό λ³Έλ€λ©΄ λ€μκ³Ό κ°μ΄ ꡬνλμ΄μλ€.
class Person {
String name;
int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// @Overriding : μ€λ²λΌμ΄λ©μ λ©μλ μκ·Έλμ²κ° μΌμΉν΄μΌ νλ€. λΈλ‘ μμ λ΄μ©λ§ μ¬μ μ νλ κ²μ΄λ€.
public String toString() {
return String.format("μ΄λ¦ : %s, λμ΄ : %dμΈ", this.name, this.age);
}
}
public class Main {
public static void main(String[] args) {
Person p1 = new Person("νκΈΈλ", 54);
// p1 κ°μ²΄λ₯Ό μΆλ ₯νλ©΄ μ΄λ¦κ³Ό λμ΄κ° μΆλ ₯
System.out.println(p1); // μ΄λ¦ : νκΈΈλ, λμ΄ : 54μΈ
}
}
equals / hashCode λ©μλ
- μμ
toString()λ©μλ λ€μμΌλ‘ κ°μ₯ λ§μ΄ μ€λ²λΌμ΄λ© λμ΄ μ°μ΄λ λλ€μ΄λ€. equalsλ©μλλStringνμ μ λ°μ΄ν° λΉκ΅μμ νλ² λ³Έ κ² μ²λΌ, λ κ°μ²΄ κ°μ λλ± λΉκ΅ν λ μ°μΈλ€.- λ€λ§ λν΄νΈλ‘λ κ°μ²΄μ μ£Όμκ°μΌλ‘ λλ± λΉκ΅λ₯Ό νκΈ° λλ¬Έμ, κ°μ²΄μ λλ± λΉκ΅ κΈ°μ€μ λ³κ²½νκΈ° μν΄μλ
equalsλ©μλλ₯Ό μ€λ²λΌμ΄λ© νμ¬ λλ± λΉκ΅ λ‘μ§μ μ¬μ μ ν νμκ° μλ€. - λν
hashCodeλ λν΄νΈλ‘λ κ°μ²΄μ μ£Όμκ°μ ν΄μμ½λλ‘ λ°νν΄μ£Όλλ°, κ°μ²΄μ μ£Όμκ° μλ λ€λ₯Έ λ°μ΄ν°μ μ£Όμλ₯Ό λ°ννκΈ° μν΄μ μμ μ€λ²λΌμ΄λ© νμ¬ μ¬μ μ ν΄μ£Όμ΄μΌ νλ€.
class Person {
public String name;
public Person(String name) {
this.name = name;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person p = (Person) o;
return Objects.equals(name, p.name);
}
@Override
public int hashCode() {
return Objects.hash(name); // name νλμ ν΄μμ½λλ₯Ό λ°ννλ€.
}
}
public class ClassTest {
public static void main(String[] args) throws Exception {
Person p1 = new Person("νκΈΈλ");
Person p2 = new Person("νκΈΈλ");
// λ κ°μ²΄μ ν΄μ μ½λ
System.out.println(p1.hashCode()); // 54150093
System.out.println(p2.hashCode()); // 54150093
// ν΄μμ½λκ° λ¬λΌλ, equalsλ₯Ό μ¬μ μ νκΈ° λλ¬Έμ λλ±ν¨
System.out.println(p1.equals(p2)); // true
// SETλ₯Ό μμ±νκ³ λ κ°μ²΄ λ°μ΄ν°λ₯Ό μΆκ°νλ€.
Set<Person> people = new HashSet<>();
people.add(p1);
people.add(p2);
// κ·Έλ¦¬κ³ SETμ κΈΈμ΄λ₯Ό μΆλ ₯νλ€.
System.out.println(people.size()); // 1
}
}
clone λ©μλ
- κ°μ²΄λ₯Ό κΉμ 볡μ¬ν λ μ¬μ©λλ λ©μλμ΄λ€.
- Object ν΄λμ€μ
clone()λ©μλλ κΈ°λ³ΈμΌλ‘ protected μ κ·Ό κΆνμ κ°κ³ μκΈ° λλ¬Έμ, λ°λμ λ©μλλ₯Ό public μ κ·Όμ μ΄μλ‘ μ€λ²λΌμ΄λ©νμ¬ μ΄λμλ 볡μ κ° κ°λ₯νλλ‘ ν΄μΌ νλ€.
// κ°μ²΄ λ³΅μ¬ λ©μλλ₯Ό μ¬μ©νκΈ° μν΄μλ Cloneable μΈν°νμ΄μ€λ₯Ό ꡬνν΄μ cloneμ μ¬μ μ ν΄μΌν¨
class User implements Cloneable {
private String name;
public void setName(String name) {
this.name = name;
}
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
public class Main {
public static void main(String[] args) {
try {
// μμ 볡μ¬(shallow copy)
User user = new User();
user.setName("Edward");
User copy = user;
System.out.println(user.hashCode()); // 622488023
System.out.println(copy.hashCode()); // 622488023
System.out.println(user.equals(copy)); // true - λμ΄ λμΈν νλ°μ΄ν°λ₯Ό λ°λΌλ³΄κ³ μκΈ° λλ¬Έμ
// κΉμ 볡μ¬(deep copy)
User user2 = new User();
user2.setName("Edward");
User copy2 = (User) user2.clone();
System.out.println(user2.hashCode()); // 1933863327
System.out.println(copy2.hashCode()); // 112810359
System.out.println(user2.equals(copy2)); // false - λμ 볡μ¬λμ΄ μκΉμλ§ κ°μ§ λ€λ₯Έ νλ°μ΄ν°λ₯Ό λ°λΌλ³΄κ³ μκΈ° λλ¬Έμ
} catch(CloneNotSupportedException e) {
e.printStackTrace();
}
}
}
getClass λ©μλ
- μ΄λ ν ν΄λμ€ νμΌμ ν΄λμ€ μ 보λ₯Ό κ°κ³ μλ Class ν΄λμ€ κ°μ²΄λ₯Ό λ°ννλ λ©μλμ΄λ€.
- μ¬κΈ°μ Class ν΄λμ€λ, ν΄λμ€ μ΄λ¦μ΄ ClassμΈ ν΄λμ€λ₯Ό λ§νλ κ²μ΄λ€.
- μ΄ Class ν΄λμ€ κ°μ²΄λ₯Ό μ΄μ©νμ¬ Reflection API κΈ°λ²μ ν΅ν΄, ꡬ체μ μΈ ν΄λμ€ νμ μ λͺ¨λ₯΄λλΌλ κ·Έ ν΄λμ€μ μ 보(λ©μλ, νμ , λ³μ, ...)μ μ κ·Όν μ μκ² λλ€.
public class Main {
public static void main(String[] args) throws NoSuchFieldException, SecurityException, ClassNotFoundException {
String str = "Classν΄λμ€ ν
μ€νΈ"; // String ν΄λμ€
Class<? extends String> cls = str.getClass(); // String κ°μ²΄λ‘λΆν° ν΄λμ€ μ 보λ₯Ό μ»λλ€
// ν΄λμ€μ μ΄λ¦λ§ νΈμΆνλ€.
System.out.println("1. " + cls.getSimpleName()); // 1. String
// ν¨ν€μ§μ μ΄λ¦μ νΈμΆνλ€.
System.out.println("2. " + cls.getPackage()); // 2. package java.lang
// ν¨ν€μ§μ μ΄λ¦μ νΈμΆνλ€.
System.out.println("3. " + cls.getName()); // 3. java.lang.String
// ν΄λμ€μ ν¨ν€μ§ μ΄λ¦μ νΈμΆνλ€.
System.out.println("4. " + cls.toString()); // 4. class java.lang.String
// μ μ΄μλΆν° ν¨ν€μ§ μ΄λ¦ λͺ¨λλ€ νΈμΆνλ€.
System.out.println("5. " + cls.toGenericString()); // 5. public final class java.lang.String
}
}
# μ°Έκ³ μλ£
https://www.youtube.com/watch?v=Mc6OaicCZVA
https://www.youtube.com/watch?v=NI6QZy6juc8