다형성
다형성(Polymorphism)은 이름 그대로 "다양한 형태", "여러 형태"를 를 뜻한다. 프로그래밍에서 다형성은 한 객체가 여러 타입의 객체로 취급될 수 있는 능력을 뜻한다. 보통 하나의 객체는 하나의 타 입으로 고정되어 있다. 그런데 다형성을 사용하면 하나의 객체가 다른 타입으로 사용될 수 있다는 뜻이다.
- 다형적 참조
- 메서드 오버라이딩
다형적 참조
부모 타입의 변수가 자식 인스턴스를 참조한다.
Parent poly = new Child() Child 인스턴스를 만들었다.
이 경우 자식 타입인 Child 를 생성했기 때문에 메모리 상에 Child 와 Parent 가 모두 생성된다.
생성된 참조값을 Parent 타입의 변수인 poly 에 담아둔다. 부모는 자식을 담을 수 있다.
부모 타입은 자식 타입을 담을 수 있다. Parent poly 는 부모 타입이다. new Child() 를 통해 생성된 결과는 Child 타입이다. 자바에서 부모 타 입은 자식 타입을 담을 수 있다!
Parent poly = new Child() : 성공 반대로 자식 타입은 부모 타입을 담을 수 없다.
Child child1 = new Parent() : 컴파일 오류 발생
즉, 부모 타입의 변수가 자식 인스턴스를 참조할 수 있는것이 다형성 참조이다.
다만, 부모타입에 없는 매서드는 호출이 불가능하다. 이것을 해결할 수 있는 방법은
바로 캐스팅이 필요하다.
Parent poly = new Child();
Child child = (Child) poly;
child.childMethod();
참고로 캐스팅을 한다고 해서 Parent 타입이 변하는것은 아니고 해당 참조값을 꺼내서 꺼낸 참조값이 Child 타입이 된다.
따라서 poly 는 Parent 타입이다.
- 업 캐스팅 : 부모 타입으로 변경
- 다운 캐스팅 : 자식 타입으로 변경
다운 캐스팅의 주의 사항
public static void main(String[] args) {
Parent parent1 = new Child();
Child child1 = (Child) parent1;
child1.childMethod(); //문제 없음
Parent parent2 = new Parent();
Child child2 = (Child) parent2; //런타임 오류 - ClassCastException
child2.childMethod(); //실행 불가
}
업캐스팅이 안전하고 다운캐스팅이 위험한 이유
업캐스팅의 경우 이런 문제가 절대로 발생하지 않는다.
왜냐하면 객체를 생성하면 해당 타입의 상위 부모 타입은 모두 함께 생성된다!
따라서 위로만 타입을 변경하는 업캐스팅은 메모리 상에 인스턴스가 모두 존재하기 때문에 항상 안전하다.
따라서 캐스팅을 생략할 수 있다.
반면에 다운캐스팅의 경우 인스턴스에 존재하지 않는 하위 타입으로 캐스팅하는 문제가 발생할 수 있다.
왜냐하면 객체 를 생성하면 부모 타입은 모두 함께 생성되지만 자식 타입은 생성되지 않는다.
따라서 개발자가 이런 문제를 인지하고 사용해야 한다는 의미로 명시적으로 캐스팅을 해주어야 한다.
다형성과 메서드 오버라이딩
오버라이딩 된 메서드가 항상 우선권을 가진다는 점이 중요하다. 그래서 이름도 기존 기능을 덮어 새로운 기능을 재정의 한다는 뜻의 오버라이딩이다.
'Java' 카테고리의 다른 글
스택과 큐 자료 구조 (0) | 2023.12.18 |
---|---|
자바 메모리 구조 (0) | 2023.12.18 |
객체지향, 절차 지향 (2) | 2023.12.18 |
기본형(int)과 참조형(Student) 매서드 호출 -2 (0) | 2023.12.18 |
기본형(int)과 참조형(Student) 개념, 변수 대입 -1 (0) | 2023.12.18 |