mallin 2025. 9. 1. 23:45

β˜•οΈ  κΉ€μ˜ν•œμ˜ μ‹€μ „ μžλ°” - 쀑급 1편 μ„ λ“£κ³  μž‘μ„±ν•˜λŠ” λ³΅μŠ΅ λΈ”λ‘œκ·Έ μž…λ‹ˆλ‹€.

 

1. java.lang νŒ¨ν‚€μ§€

  • java.lang νŒ¨ν‚€μ§€λŠ” μžλ°”κ°€ 기본으둜 μ œκ³΅ν•˜λŠ” 라이브러리의 κ°€μž₯ κΈ°λ³Έ
  • μžλ°” μ–Έμ–΄λ₯Ό μ΄λ£¨λŠ” κ°€μž₯ 기본이 λ˜λŠ” ν΄λž˜μŠ€λ“€μ„ λ³΄κ΄€ν•˜λŠ” νŒ¨ν‚€μ§€
  • java.lang νŒ¨ν‚€μ§€μ˜ λŒ€ν‘œμ μΈ ν΄λž˜μŠ€λ“€λ‘œλŠ” Object (λͺ¨λ“  μžλ°” 객체의 λΆ€λͺ¨ 클래슀) , String (λ¬Έμžμ—΄), Integer (λž˜νΌνƒ€μž…), Class (클래슀 메타 정보) , System (μ‹œμŠ€ν…œ κ΄€λ ¨ κΈ°λ³Έ κΈ°λŠ₯) 듀이 μžˆλ‹€
  • java.lang νŒ¨ν‚€μ§€μ— μžˆλŠ” ν΄λž˜μŠ€λ“€μ€ λͺ¨λ‘ μžλ°” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ— μžλ™μœΌλ‘œ μž„ν¬νŠΈλ˜κΈ° λ•Œλ¬Έμ— μž„ν¬νŠΈ ꡬ문을 λ”°λ‘œ μ‚¬μš©ν•˜μ§€ μ•Šμ•„λ„ λœλ‹€
// import ꡬ문 λ―Έμ‚¬μš© κ°€λŠ₯
public class LangMain {
    public static void main(String[] args) {
        System.out.println("hello java");
    }
}

 


2. Object 클래슀

  • μžλ°”μ—μ„œ λͺ¨λ“  클래슀의 μ΅œμƒμœ„ λΆ€λͺ¨ ν΄λž˜μŠ€λŠ” 항상 Object
  • Object λŠ” λͺ¨λ“  ν΄λž˜μŠ€μ— λ¬΅μ‹œμ  μƒμ†λœλ‹€

 

2-1. λ¬΅μ‹œμ  상속

πŸ”₯ λ¬΅μ‹œμ  (Implicit)
κ°œλ°œμžκ°€ μ½”λ“œμ— 직접 κΈ°μˆ ν•˜μ§€ μ•Šμ•„λ„ μ‹œμŠ€ν…œ λ˜λŠ” μ»΄νŒŒμΌλŸ¬μ— μ˜ν•΄ μžλ™μœΌλ‘œ μˆ˜ν–‰λ˜λŠ” 것

 

class Test {

}

 

 

λ§Œμ•½ 이런 ν΄λž˜μŠ€κ°€ μ‘΄μž¬ν•˜κ³ , ν΄λž˜μŠ€μ— 상속 받을 λΆ€λͺ¨ ν΄λž˜μŠ€κ°€ μ—†λŠ” 경우 

class Test extends Object {

}

 

μœ„μ²˜λŸΌ μ»΄νŒŒμΌλŸ¬κ°€ 컴파일 μ‹œμ μ— extends Object λ₯Ό μ½”μŠ€μ— λ¬΅μ‹œμ μœΌλ‘œ μΆ”κ°€ν•΄μ€€λ‹€

κ·Έλ ‡κΈ° λ•Œλ¬Έμ— Test ν΄λž˜μŠ€λ“€μ€ μžλ™μœΌλ‘œ Object 의 λ©”μ„œλ“œλ“€μ„ 상속받고 μ‚¬μš©ν•  수 있게 λœλ‹€ (toString(), equals() λ“±)

 

2-2. λͺ…μ‹œμ  상속

πŸ”₯ λͺ…μ‹œμ  (Explicit)
κ°œλ°œμžκ°€ μ½”λ“œμ— 직접 κΈ°μˆ ν•΄μ„œ μž‘λ™ν•˜λŠ” 것

 

class Test extends Parent {

}

 

μœ„μ²˜λŸΌ ν΄λž˜μŠ€μ— 상속받을 λΆ€λͺ¨ 클래슀λ₯Ό λͺ…μ‹œμ μœΌλ‘œ μ§€μ •ν•˜λŠ” κ²½μš°μ—λŠ” Object λ₯Ό 상속받지 μ•ŠλŠ”λ‹€

이런 κ²½μš°μ—λŠ” Object 의 λ©”μ„œλ“œλ“€μ„ μ‚¬μš©ν•  수 μ—†λ‹€

 

2-3. μžλ°”μ—μ„œ Object ν΄λž˜μŠ€κ°€ μ΅œμƒμœ„ λΆ€λͺ¨ 클래슀인 이유

  1. 곡톡 κΈ°λŠ₯ 제곡
    • 객체λ₯Ό λ§Œλ“€λ•Œλ§ˆλ‹€ κΈ°λ³Έ κΈ°λŠ₯을 μ •μ˜ν•΄μ•Όν•˜λ©΄ μƒλ‹Ήνžˆ λ²ˆκ±°λ‘­λ‹€ 
    • λ§Œλ“ λ‹€κ³  해도 일관성이 μ—†λ‹€
    • κ·Έλ ‡κΈ° λ•Œλ¬Έμ— Object 클래슀λ₯Ό 톡해 λͺ¨λ“  객체에 ν•„μš”ν•œ 곡톡 κΈ°λŠ₯을 μ œκ³΅ν•œλ‹€
  2. λ‹€ν˜•μ„±μ˜ κΈ°λ³Έ κ΅¬ν˜„
    • ObjectλŠ” λͺ¨λ“  클래슀의 λΆ€λͺ¨ 클래슀이기 λ•Œλ¬Έμ— λͺ¨λ“  객체λ₯Ό μ°Έμ‘°ν•  수 μžˆλ‹€
    • λ‹€ν˜•μ„±μ„ μ§€μ›ν•˜λŠ” 기본적인 λ§€μ»€λ‹ˆμ¦˜μ„ μ§€μ›ν•œλ‹€
    • λͺ¨λ“  μžλ°” κ°μ²΄λŠ” Object νƒ€μž…μœΌλ‘œ 처리되고, λ‹€μ–‘ν•œ νƒ€μž…μ˜ 객체λ₯Ό ν†΅ν•©μ μœΌλ‘œ μ²˜λ¦¬ν•  수 μžˆλ‹€

3. Object λ‹€ν˜•μ„±

Object λŠ” λͺ¨λ“  클래슀의 λΆ€λͺ¨ 클래슀이기 λ•Œλ¬Έμ— λͺ¨λ“  객체λ₯Ό μ°Έμ‘°ν•  수 μžˆλ‹€

class Test {

}

 

Test ν΄λž˜μŠ€λŠ” λΆ€λͺ¨κ°€ μ—†κΈ° λ•Œλ¬Έμ— Object λ₯Ό μžλ™μœΌλ‘œ μƒμ†λ°›λŠ”λ‹€

void action(Object obj) {

}

 

Object λ₯Ό 상속받고 있기 λ•Œλ¬Έμ— action λ©”μ„œλ“œμ˜ λ§€κ°œλ³€μˆ˜λ‘œ Test 클래슀λ₯Ό λ„˜κΈΈ 수 μžˆλ‹€

이런 경우 μžλ™μœΌλ‘œ μ—…μΊμŠ€νŒ…λœλ‹€

 

3-1. Object λ‹€ν˜•μ„±μ˜ μž₯점

ObjectλŠ” λͺ¨λ“  객체의 λΆ€λͺ¨μ΄κΈ° λ•Œλ¬Έμ— μ–΄λ–€ 객체든지 인자둜 전달할 수 μžˆλ‹€

class Test { }

public class Main {
    public static void main(String[] args) {
        Test test = new Test();
        action(test);
    }

    static void action(Object obj) {
        System.out.println("λ§€κ°œλ³€μˆ˜ νƒ€μž…: " + obj.getClass().getName());
    }
}

 

3-2. Object λ‹€ν˜•μ„±μ˜ ν•œκ³„

μžμ‹μ— μžˆλŠ” λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜μ§€ λͺ»ν•œλ‹€.

만일, μžμ‹μ— μžˆλŠ” λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•΄μ•Ό ν•œλ‹€λ©΄ λ‹€μš΄μΊμŠ€νŒ…μ„ ν•΄μ•Όν•œλ‹€

if (obj instanceof Test test) {
	test.a();
}
  • instanceof 둜 Test ν΄λž˜μŠ€μΈμ§€ ν™•μΈν•˜κ³ , Test 클래슀둜 λ‹€μš΄μΊμŠ€νŒ…ν•˜λ©΄μ„œ μ „λ‹¬ν•œλ‹€
  • test.a() λ₯Ό ν˜ΈμΆœν•˜λ©΄ Test νƒ€μž„μ—μ„œ a() λ©”μ†Œλ“œλ₯Ό μ°Ύμ•„μ„œ ν˜ΈμΆœν•œλ‹€

4. toString()

  • 객체의 정보λ₯Ό λ¬Έμžμ—΄ ν˜•νƒœλ‘œ μ œκ³΅ν•œλ‹€
  • 디버깅과 λ‘œκΉ…μ— μœ μš©ν•˜κ²Œ μ‚¬μš©ν•  수 μžˆλ‹€
  • Object ν΄λž˜μŠ€μ— μ •μ˜λ˜λ―€λ‘œ λͺ¨λ“  ν΄λž˜μŠ€μ—μ„œ 상속받아 μ‚¬μš©κ°€λŠ₯ν•˜λ‹€
public String toString() {
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

 

 

4-1. println λ‚΄λΆ€ μ½”λ“œ

public void println(Object x) {
    String s = String.valueOf(x);
    if (getClass() == PrintStream.class) {
        // need to apply String.valueOf again since first invocation
        // might return null
        writeln(String.valueOf(s));
    } else {
        synchronized (this) {
            print(s);
            newLine();
        }
    }
}

public static String valueOf(Object obj) {
    return (obj == null) ? "null" : obj.toString();
}

 

println λ‚΄λΆ€ μ½”λ“œμ—μ„œλ„ λ„˜μ–΄μ˜¨ 객체(x) λ₯Ό κ³§λ°”λ‘œ 좜λ ₯ν•˜μ§€ μ•Šκ³ , String.valueOf(x) λ₯Ό ν˜ΈμΆœν•œλ‹€

  1. νŒŒλΌλ―Έν„°λ‘œ μ–΄λ–€ 객체든지 λ°›λŠ”λ‹€ (Object x)
  2. String.valueOf(x) λ₯Ό ν˜ΈμΆœν•΄μ„œ null 을 ν™•μΈν•˜κ³  toString() 을 μ‹€ν–‰ν•œλ‹€
  3. toString() 의 κ²°κ³Ό λ¬Έμžμ—΄μ„ μ‹€μ œλ‘œ 좜λ ₯ν•œλ‹€

객체의 좜λ ₯ ν˜•νƒœλ₯Ό μ œμ–΄ν•˜κ³  μ‹Άλ‹€λ©΄ toString() 을 μ˜€λ²„λΌμ΄λ”©ν•˜λ©΄ λœλ‹€

 

 

4-2. toString() μ˜€λ²„λΌμ΄λ”©

toString() λ©”μ„œλ“œλŠ” 클래슀의 정보와 μ°Έμ‘°κ°’λ§Œ μ œκ³΅ν•˜κΈ° λ•Œλ¬Έμ— 객체의 μƒνƒœλ₯Ό μ μ ˆν•˜κ²Œ λ‚˜νƒ€λ‚΄μ§€ λͺ»ν•œλ‹€

κ·Έλ ‡κΈ° λ•Œλ¬Έμ— 각 ν΄λž˜μŠ€μ—μ„œ toString() 을 μž¬μ •μ˜ (μ˜€λ²„λΌμ΄λ”©) ν•΄μ„œ μœ μš©ν•œ 정보λ₯Ό μ œκ³΅ν•΄μ•Ό ν•œλ‹€

public class Test {
    private String name;
    private int age;
    
    public Test(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Test{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
  }

 

 

Test test = new Test("λ°₯", 25);
System.out.println(test);

 

  1. println(Object obj) λ©”μ†Œλ“œλ‘œ test ν΄λž˜μŠ€κ°€ μ „λ‹¬λœλ‹€
  2. λ©”μ„œλ“œ λ‚΄λΆ€μ—μ„œ obj.toString() 을 ν˜ΈμΆœν•œλ‹€
  3. μžμ‹μ—μ„œ μž¬μ •μ˜λœ λ©”μ„œλ“œκ°€ μžˆλŠ”μ§€ μ—†λŠ”μ§€ μ°ΎλŠ”λ‹€
  4. Test ν΄λž˜μŠ€μ— μž¬μ •μ˜λœ λ©”μ„œλ“œκ°€ μžˆμœΌλ―€λ‘œ Test.toString() 을 μ‹€ν–‰ν•œλ‹€

5. Object 와 OCP

public class ObjectPrinter {
     public static void print(Object obj) {
          String string = "객체 정보 좜λ ₯: " + obj.toString();
          System.out.println(string);
     }
}

 

λͺ¨λ“  객체λ₯Ό 좜λ ₯ν•  수 μžˆλŠ” ObjectPrinter

좔상적인 Object 클래슀λ₯Ό μ‚¬μš©ν•΄ 좔상적인 것에 μ˜μ‘΄ν•œλ‹€

μœ„ μ½”λ“œλŠ” λ‹€ν˜•μ  참쑰와 λ©”μ„œλ“œ μ˜€λ²„λΌμ΄λ”©μ„ μ μ ˆν•˜κ²Œ μ‚¬μš©ν•˜λ―€λ‘œ λ‹€ν˜•μ„±μ„ 맀우 잘 ν™œμš©ν•˜κ³  μžˆλ‹€

  • λ‹€ν˜•μ  μ°Έμ‘° : Object νƒ€μž…μ„ λ§€κ°œλ³€μˆ˜λ‘œ μ‚¬μš©ν•΄μ„œ λ‹€ν˜•μ  μ°Έμ‘°λ₯Ό μ‚¬μš©ν•œλ‹€
  • λ©”μ„œλ“œ μ˜€λ²„λΌμ΄λ”© : Object λŠ” λͺ¨λ“  클래슀의 λΆ€λͺ¨μ΄κΈ° λ•Œλ¬Έμ— λͺ¨λ“  ν΄λž˜μŠ€κ°€ toString() λ©”μ„œλ“œλ₯Ό μ˜€λ²„λΌμ΄λ”© ν•  수 μžˆλ‹€

 

5-1. OCP 원칙

Open : μƒˆλ‘œμš΄ 클래슀λ₯Ό μΆ”κ°€ν•˜κ³ , toString() 을 μ˜€λ²„λΌμ΄λ”©ν•΄μ„œ κΈ°λŠ₯을 ν™•μž₯ν•  수 μžˆλ‹€

Closed : μƒˆλ‘œμš΄ 클래슀λ₯Ό 좔가해도 Object 와 toString() 을 μ‚¬μš©ν•˜λŠ” ν΄λΌμ΄μ–ΈνŠΈ μ½”λ“œλŠ” λ³€κ²½ν•˜μ§€ μ•Šμ•„λ„ λœλ‹€

 

 

5-2. System.out.println()

  • System.out.println() λ©”μ„œλ“œλ„ Object λ§€κ°œλ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜κ³ , λ‚΄λΆ€μ—μ„œ toString() 을 ν˜ΈμΆœν•œλ‹€
  • μžλ°”λŠ” 객체지ν–₯ μ–Έμ–΄λ‹΅κ²Œ μ–Έμ–΄ μŠ€μŠ€λ‘œλ„ 객체지ν–₯의 νŠΉμ§•μ„ 맀우 잘 ν™œμš©ν•œλ‹€
  • μžλ°” μ–Έμ–΄κ°€ 기본적으둜 μ œκ³΅ν•˜λŠ” λ‹€μ–‘ν•œ λ©”μ„œλ“œλ“€μ€ κ°œλ°œμžκ°€ ν•„μš”μ— 따라 μ˜€λ²„λΌμ΄λ”©ν•΄μ„œ μ‚¬μš©ν•  수 μžˆλ‹€

6. equals()

6-1. 동일성과 동등성

동일성 (Identity) : == μ—°μ‚°μž

  • 두 객체의 μ°Έμ‘°κ°€ λ™μΌν•œ 객체λ₯Ό 가리킀고 μžˆλŠ”μ§€λ₯Ό ν™•μΈν•œλ‹€
  • μ™„μ „νžˆ κ°™μŒμ„ 의미
  • 물리적으둜 같은 λ©”λͺ¨λ¦¬μ— μžˆλŠ” 객체 μΈμŠ€ν„΄μŠ€μΈμ§€ 참쑰값을 ν™•μΈν•œλ‹€

 

동등성 (Equality) : equals() λ©”μ„œλ“œ

  • 두 객체가 λ…Όλ¦¬μ μœΌλ‘œ λ™λ“±ν•œμ§€ ν™•μΈν•œλ‹€
  • 같은 κ°€μΉ˜λ‚˜ μˆ˜μ€€μ„ μ˜λ―Έν•˜μ§€λ§Œ, κ·Έ ν˜•νƒœλ‚˜ 외관이 μ™„μ „νžˆ κ°™μ§€ μ•Šμ„μˆ˜λ„ μžˆλ‹€
  • λ…Όλ¦¬μ μœΌλ‘œ 같은지 ν™•μΈν•œλ‹€
User a = new User("id-100"); // x001
User b = new User("id-100"); // x002

 

μœ„μ˜ μ½”λ“œμ˜ 경우 πŸ™…‍♀️ 동일성은 x001, x002 둜 λ‹€λ₯΄μ§€λ§Œ πŸ™†‍♀️ 동등성은 id-100, id-100 으둜 κ°™λ‹€

 

6-2. Object equals()

public boolean equals(Object obj) {
    return (this == obj);
}
  • Object 의 equals() λŠ” 기본적으둜 == 둜 μ œκ³΅ν•œλ‹€
  • 동등성 비ꡐλ₯Ό μ‚¬μš©ν•˜κ³  μ‹ΆμœΌλ©΄ equals() λ©”μ„œλ“œλ₯Ό μž¬μ •μ˜ν•˜λ©΄ λœλ‹€
@Override
public boolean equals(Object obj) {
    User user = (User) obj;
    return this.id.equals(user.id);
}

 

6-3. equals() λ©”μ„œλ“œλ₯Ό κ΅¬ν˜„ν•  λ•Œ μ§€μΌœμ•Ό ν•˜λŠ” κ·œμΉ™

  • λ°˜μ‚¬μ„± : κ°μ²΄λŠ” 자기 μžμ‹ κ³Ό 동등해야 ν•œλ‹€
  • λŒ€μΉ­μ„± : 두 객체가 μ„œλ‘œμ— λŒ€ν•΄ λ™μΌν•˜λ‹€κ³  νŒλ‹¨ν•˜λ©΄, μ΄λŠ” μ–‘λ°©ν–₯으둜 동일해야 ν•œλ‹€
  • 좔이성 : λ§Œμ•½ ν•œ 객체가 두 번째 객체와 λ™μΌν•˜κ³ , 두 번째 객체가 μ„Έλ²ˆμ§Έ 객체와 λ™μΌν•˜λ‹€λ©΄ 첫번째 κ°μ²΄λŠ” μ„Έλ²ˆμ§Έ 객체와도 동일해야 ν•œλ‹€
  • 일관성 : 두 객체의 μƒνƒœκ°€ λ³€κ²½λ˜μ§€ μ•ŠλŠ” ν•œ, equals() λ©”μ†Œλ“œλŠ” 항상 λ™μΌν•œ 값을 λ°˜ν™˜ν•΄μ•Ό ν•œλ‹€
  • null 에 λŒ€ν•œ 비ꡐ : λͺ¨λ“  κ°μ²΄λŠ” null κ³Ό λΉ„κ΅ν–ˆμ„ λ•Œ false λ₯Ό λ°˜ν™˜ν•΄μ•Ό ν•œλ‹€