자바/자바

(자바) 자바 상속, 다형성, 추상화 *널널한 개발자

불광동 물주먹 2025. 9. 8. 23:13

자바 상속, 다형성, 추상화에서 꼭 알아야 할 핵심

1. 오버라이딩(Overriding) vs 오버로딩(Overloading)

  • 오버라이딩: 상속 관계에서 부모 메서드를 자식이 재정의하는 것.
    • 실제 실행 시점에는 인스턴스의 타입이 우선된다.
    • 즉, 부모 타입으로 참조해도 자식 객체라면 자식의 메서드가 실행된다.
    • 필요하면 super.메서드명() 으로 부모의 메서드도 명시적으로 호출 가능하다.

📌 예시

 
class Parent {
    void hello() { System.out.println("부모"); }
}
class Child extends Parent {
    @Override
    void hello() { System.out.println("자식"); }
}
Parent p = new Child();
p.hello(); // "자식"
  • 오버로딩: 같은 이름의 메서드를 여러 개 정의하되, 매개변수 타입이나 개수(시그니처)가 달라야 한다.

📌 예시

 
void print(int x) { ... }
void print(String s) { ... }

2. 관점: 사용자 vs 작성자

  • 클래스 작성자: 미래의 확장을 고려해, 재정의될 수 있는 메서드를 설계해야 한다.
  • 클래스 사용자(자식 개발자): 부모의 메서드를 재정의해 필요에 맞게 확장한다.

➡️ 이것이 바로 Called by Framework 패턴의 기본 아이디어.
프레임워크 작성자가 “나중에 여길 재정의해 쓰세요”라고 만들어둔 추상/가상 메서드를
사용자가 오버라이딩하여 자신의 요구에 맞게 활용한다.

📌 예시: setData() 같은 메서드를 부모에서 선언해두면, 자식이 재정의해서 자신만의 동작을 구현할 수 있음.


3. 바인딩과 실행 시점

  • 정적 바인딩(Static Binding): 컴파일 시점에 호출이 확정되는 것. (예: private 메서드, static 메서드, final 메서드)
  • 동적 바인딩(Dynamic Binding): 런타임 시점에 실제 객체 타입을 기준으로 호출되는 것. (일반적인 인스턴스 메서드, 오버라이딩 대상)

자바는 가상 함수 테이블(Virtual Method Table, V-Table) 로 메서드를 관리한다.

  • 부모 생성자가 먼저 호출되어 부모의 메서드가 V-Table에 올라감
  • 자식 생성자가 호출되면서 오버라이딩한 메서드로 갱신

4. 다형성(Polymorphism)과 추상화

  • 다형성: 같은 메서드 호출이더라도 실제 객체 타입에 따라 다르게 동작하는 것.
  • 추상화: 공통점을 뽑아내어 단순화/일반화하는 것.
    • 반대 개념은 구체화
    • 추상화는 설계를 단순하게 하고, 상속과 다형성의 기반이 된다.

📌 예시

 
Animal a1 = new Dog();
Animal a2 = new Cat();
a1.sound(); // 멍멍
a2.sound(); // 야옹

5. 업캐스팅 vs 다운캐스팅

  • 업캐스팅 (항상 안전): 자식 객체를 부모 타입 참조에 담는 것.
    • 다형성의 핵심. 항상 가능하고 안정적이다.
  • 다운캐스팅 (가급적 지양): 부모 타입 참조를 다시 자식 타입으로 변환하는 것.
    • 잘못 사용하면 ClassCastException 발생.
    • 꼭 필요하다면 instanceof 로 타입을 먼저 확인해야 한다.

📌 예시

 
Parent p = new Child(); // 업캐스팅
Child c = (Child) p;    // 다운캐스팅 (instanceof 확인 권장)

6. 추상 클래스

  • abstract 키워드로 정의, new 연산자로 직접 인스턴스 생성 불가
  • 공통 기능은 구현해두고, 필수로 구현해야 할 메서드는 추상 메서드로 선언 → 자식 클래스가 재정의

7. 인터페이스

  • 자바 8 이전: 필드 없음, 메서드 선언만 가능
  • 자바 8 이후: default, static 메서드 추가 가능
  • 다중 구현이 가능하므로, 상속의 한계를 보완

8. 이넘(Enum) 클래스

  • 심볼릭 상수 집합을 정의할 수 있는 문법
  • 단순한 상수가 아니라 타입 안정성(type safety) 보장
  • 코드 가독성 향상, switch-case 문에서도 유용

📌 예시

 
enum Direction { NORTH, SOUTH, EAST, WEST }

Direction d = Direction.NORTH;

 


핵심 요약

  1. 오버라이딩은 동적 바인딩, 오버로딩은 정적 바인딩.
  2. 사용자 vs 작성자 관점을 의식해야 OOP 설계를 잘할 수 있다.
  3. 바인딩 시점과 V-Table 구조를 이해해야 재정의 동작 원리를 알 수 있다.
  4. 다형성과 추상화는 코드 확장성과 단순화를 위한 핵심 개념이다.
  5. 업캐스팅은 안전, 다운캐스팅은 지양. 필요 시 instanceof 활용.
  6. 추상 클래스, 인터페이스, 이넘은 각각 목적이 분명한 언어 도구.