Language/Java

β˜• μžλ°” Object ν΄λž˜μŠ€μ™€ λ©”μ„œλ“œ μ˜€λ²„λΌμ΄λ”©

인파_ 2022. 11. 15. 07:17

java-object-class

Object ν΄λž˜μŠ€

λͺ¨λ“  μžλ°”μ˜ ν΄λž˜μŠ€λŠ” Object 클래슀둜 λΆ€ν„° μ‹œμž‘λœλ‹€.

즉, Object ν΄λž˜μŠ€κ°€ λͺ¨λ“  클래슀의 쑰상 ν˜Ήμ€ base 라고 ν•  수 μžˆλ‹€.

java-object-class

사싀 μš°λ¦¬κ°€ 클래슀 νŒŒμΌμ„ λ§Œλ“€μ–΄ 클래슀λͺ…을 μž‘μ„±ν•˜λ©΄ μžλ™μ μœΌλ‘œ 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 μ—¬λΆ€, κ°μ²΄ λ¬Έμžμ—΄ λ¦¬ν„΄ λ“±μ˜ μ—°μ‚°μ„ μˆ˜ν–‰ν•˜λŠ” μ •μ  λ©”μ†Œλ“œλ“€λ‘œ κ΅¬μ„±λ˜μ–΄ μžˆμœΌλ©°, κ°œλ°œμžκ°€ κ°€μ Έκ°€ μ“°κΈ° νŽΈν•˜κ²Œ ν•˜κΈ° μœ„ν•΄μ„œ κ΅¬ν˜„λ˜μ—ˆλ‹€κ³  보면 λœλ‹€. 

Objects 클래슀


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μ„Έ
    }
}
 

[JAVA] β˜• toString λ©”μ„œλ“œ μž¬μ •μ˜ - μ™„λ²½ μ΄ν•΄ν•˜κΈ°

toString λ©”μ†Œλ“œ 기본적으둜 Object 클래슀의 toString() λ©”μ†Œλ“œλŠ” ν•΄λ‹Ή μΈμŠ€ν„΄μŠ€μ— λŒ€ν•œ 정보λ₯Ό λ¬Έμžμ—΄λ‘œ λ°˜ν™˜ν•œλ‹€. 이 λ©”μ„œλ“œλŠ” μΈμŠ€ν„΄μŠ€μ— λŒ€ν•œ 정보λ₯Ό λ¬Έμžμ—΄λ‘œ μ œκ³΅ν•  λͺ©μ μœΌλ‘œ μ •μ˜λ˜μ–΄ μžˆλŠ” 것

inpa.tistory.com


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
    }
}
 

[JAVA] β˜• equals / hashCode μ˜€λ²„λΌμ΄λ”© - μ™„λ²½ μ΄ν•΄ν•˜κΈ°

equals λ©”μ†Œλ“œ μ–΄λ–€ 두 μ°Έμ‘° λ³€μˆ˜μ˜ 값이 같은지 λ‹€λ₯Έμ§€ 동등 μ—¬λΆ€λ₯Ό 비ꡐ해야 ν• λ•Œ μ‚¬μš©ν•˜λŠ” 것이 equals() λ©”μ„œλ“œμ΄λ‹€. λŒ€ν‘œμ μœΌλ‘œ String νƒ€μž…μ˜ λ³€μˆ˜λ₯Ό λΉ„κ΅ν• λ•Œ κ°€μž₯ 많이 κ±°λ‘ λ˜λŠ” λ©”μ„œλ“œμΌ 것

inpa.tistory.com


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();
        }
    }
}
 

[JAVA] β˜• clone λ©”μ„œλ“œ μž¬μ •μ˜ (얕은 볡사 & κΉŠμ€ 볡사)

clone λ©”μ†Œλ“œ Object.clone() λ©”μ†Œλ“œλŠ” μΈμŠ€ν„΄μŠ€ 객체의 볡제λ₯Ό μœ„ν•œ λ©”μ†Œλ“œλ‘œ, ν•΄λ‹Ή μΈμŠ€ν„΄μŠ€λ₯Ό λ³΅μ œν•˜μ—¬ μƒˆλ‘œμš΄ μΈμŠ€ν„΄μŠ€λ₯Ό 생성해 κ·Έ 참쑰값을 λ°˜ν™˜ν•œλ‹€. μ΄λŸ¬ν•œ clone() λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„œ

inpa.tistory.com


getClass λ©”μ†Œλ“œ

  • μ–΄λ– ν•œ 클래슀 파일의 클래슀 정보λ₯Ό κ°–κ³  μžˆλŠ” Class 클래슀 객체λ₯Ό λ°˜ν™˜ν•˜λŠ” λ©”μ„œλ“œμ΄λ‹€.
  • μ—¬κΈ°μ„œ Class ν΄λž˜μŠ€λž€, 클래슀 이름이 Class인 클래슀λ₯Ό λ§ν•˜λŠ” 것이닀.
  • 이 Class 클래슀 객체λ₯Ό μ΄μš©ν•˜μ—¬ Reflection API 기법을 톡해, ꡬ체적인 클래슀 νƒ€μž…μ„ λͺ¨λ₯΄λ”라도 κ·Έ 클래슀의 정보(λ©”μ†Œλ“œ, νƒ€μž…, λ³€μˆ˜, ...)에 μ ‘κ·Όν• μˆ˜ 있게 λœλ‹€.

getClass λ©”μ†Œλ“œ

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