다형성의 기본 개념
정의
다형성이란 '많은 형태를 가질 수 있는 능력'을 의미한다. Java에서 다형성은 한 객체가 여러 타입의 인스턴스로 행동할 수 있게 하는 특성을 말한다. 이는 주로 상속과 인터페이스를 통해 구현된다. (+현업에서는 상속보다는 인터페이스를 통해서 다형성을 구현하는 경우가 더 많다.)
타입의 호환성
Java에서 하위 클래스의 객체는 상위 클래스 타입으로 선언될 수 있다. 이는 상위 클래스 타입의 참조 변수가 하위 클래스의 인스턴스를 참조할 수 있음을 의미한다.
다형성의 장점
코드의 유연성
같은 코드 라인이 여러 타입의 객체에 대해 다른 동작을 수행할 수 있으므로, 객체를 다양한 상황에서 더 유연하게 사용할 수 있다. (제네릭, 형변환도 다형성이 확장된 개념이다.)
다형성의 구현
다형성을 구현하기 위해서는 자동 타입 변환과 메소드 재정의(오버라이딩)가 필요하다.
예를 들어, '타이어' 라는 메서드가 있고 '한국 타이어' 와 '금호 타이어' 라는 메서드가 있을 때, 만약 '한국 타이어' 와 '일본 타이어' 가 '타이어'를 오버라이딩 하고 있다면 '타이어' 메서드 호출 시 오버라이딩된 메서드가 호출된다.
public class Car {
// 필드 선언
public Tire tire;
// 메서드 선언
public void run() {
tire.roll();
}
}
Car 클래스에는 Tire 필드가 선언되어 있다. 먼저 Car 객체를 생성한 후 타이어를 장착하기 위해 다음과 같이 Tire 클래스를 상속하는 HankookTire 또는 KumhoTire 객체를 Tire 필드에 대입할 수 있다. 왜냐하면 자동 타입 변환이 되기 때문이다.
//Car 객체 생성
Car myCar = new Car();
//HankookTire 장착
myCar.tire = new HankookTire();
//KumhoTire
myCar.tire = new KumhoTire();
Car 클래스의 run() 메소드는 tire 필드에 대입된 객체의 roll() 메소드를 호출한다. 만약 HankookTire와 KumhoTire가 roll() 메소드를 재정의하고 있다면, 재정의된 roll() 메소드가 호출된다.
myCar.run() // 대입된(장착된) 타이어의 roll() 메소드 호출
따라서 어떤 타이어를 장착했는지에 따라 roll() 메소드의 실행 결과는 달라지게 된다. 이것이 다형성 중 하나인 필드의 다형성이다.
'이론 > OOP' 카테고리의 다른 글
[객체 지향] 상속(inheritance) (0) | 2024.01.02 |
---|---|
[객체 지향] 캡슐화(encapsulation) (0) | 2024.01.02 |
[객체 지향] 객체 지향 프로그래밍이란? (1) | 2024.01.02 |