Back-End/Java

07. 상속과 다형성

Yerin Thea Yoo 2026. 2. 11. 23:32

Java는 객체지향 언어다.

객체지향의 핵심 개념 중 가장 중요한 두 가지가 상속(Inheritance)과 다형성(Polymorphism)이다.

이 두 개념은 함께 이해해야 한다.

 

1. 상속(Inheritance)

상속은 기존 클래스의 속성과 기능을 물려 받아 새로운 클래스를 만드는 것이다.

class Animal {
	void sound() {
    	System.out.printIn("소리를 낸다");
    }
}

class Dog extends Animal{
}
  • Animal → 부모 클래스(Super Class)
  • Dog → 자식 클래스(Sub Class)
  • extends → 상속 키워드

Dog는 Animal의 메서드를 그대로 사용할 수 있다.

 

1) 상속의 목적

  • 코드 재사용
  • 계층 구조 표현
  • 유지보수 용이

 

2. 메서드 오버라이딩(Overriding)

자식 클래스에서 부모의 메서드를 재정의하는 것

class Dog extends Animal {
	@Override
    void sound() {
    	System.out.printIn("멍멍");
    }
}

조건

  • 메서드 이름 동일
  • 매개 변수 동일
  • 반환 타입 동일

 

3. 다형성(Polymorphism)

다형성은 하나의 타입으로 여러 객체를 다룰 수 있는 성질이다.

Animal a = new Dog();
  • 참조 타입 → Animal
  • 실제 객체 → Dog

이게 다형성의 핵심이다.

 

4. 업캐스팅(Upcasting)

자식 객체를 부모 타입으로 참조하는 것

Animal a = new Dog();

자동으로 이루어진다.

 

특징

  • 부모 타입의 메서드만 접근 가능
  • 실제 실행은 자식 메서드

 

5. 동적 바인딩(Dynamic Binding)

메서드 호출은 참조 타입이 아니라 실제 객체 기준으로 결정된다.

Animal a = new Dog();
a.sound(); //"멍멍" 출력

컴파일 시점 → Animal 타입

실행 시점 → Dog 객체

 

이것이 다형성의 핵심 원리다.

 

6. 다운캐스팅(Downcasting)

부모 타입을 다시 자식 타입으로 변환하는 것

Dog a = (Dog) a;

명시적 형변환이 필요하다.

실제 객체가 해당 타입이 아닐 경우 예외가 발생한다.

if (a instanceof Dog) {
	Dog d = (Dog) a;
}

 

7. 상속과 다형성의 관계

상속이 있어야 다형성이 가능하다.

  • 상속 → 타입 계층 형성
  • 다형성 → 부모 타입으로 자식 객체를 다룸
  • 오버라이딩 → 동적 바인딩 발생

 

8. 왜 중요한가?

실무에서 가장 많이 쓰이는 구조

List<Animal> animals = new ArrayList<>();

부모 타입으로 컬렉션을 만들고, 여러 자식 객체를 넣는다.

이게 객체 지향 설계의 기본 패턴이다.