[작성일: 2023. 01. 29]
목차
다형성(Polymorphism)
- 여러 가지 형태를 가질 수 있는 능력
- 조상 타입 참조변수로 자손 타입 객체를 다루는 것
- 자손 타입의 참조변수로 조상 타입의 객체를 가리킬 수는 없음.
int i = 10; double d = i; double b = 10.34; int j = b; // (X) 넓은 곳에서 좁은 곳으로 갈 수 없음. INT J = (int)b; // 가능.
class Tv { boolean power; int channel; void power() { power = !power; } void channelUp() { ++channel; } void channelDown() { --channel; } } class SmartTv extends Tv { // String text; void caption() { /*내용생략*/ } } Tv t = new Tv(); SmartTv s = new SmartTv(); // 일반적으로는 타입이 일치하게 해줘야 하지만, Tv t = new SmartTv(); // 타입 불일치해도 괜찮은 게 다형성. // SmartTv의 멤버가 더 많기 때문에 객체로 사용 가능해짐.(일부만 사용) // 조상 타입 참조변수로 자손 타입 인스턴스 참조 SmartTv s = new Tv(); // 에러. 허용 안 됨.
Q&A
Q. 참조변수의 타입은 인스턴스의 타입과 반드시 일치해야 하나요?
A. NO. 일치하는 것이 보통이지만 일치하지 않을 수도 있음. (다형성)
SmartTv s = new SmartTv(); // 참조 변수와 인스턴스의 타입 일치 Tv t = new SmartTV(); // 조상 타입 참조변수로 자손 타입 인스턴스 참조
Q. 참조변수가 조상타입일 때와 자손타입일 때의 차이?
A. 참조변수로 사용할 수 있는 멤버의 개수가 달라짐.
Q. 자손 타입의 참조변수로 조상 타입의 객체를 가리킬 수 있는가?
A. NO. 허용되지 않음.
Tv t = new SmartTv(); // 허용 SmartTv s = new Tv(); // 에러
매개변수의 다형성
- 참조형 매개변수는 메서드 호출 시, 자신과 같은 타입 또는 자손타입의 인스턴스를 넘겨줄 수 있음.
- 다형적 매개변수
class Product { int price; // 제품 가격 int bonusPoint; // 보너스 점수 } class Tv extends Product {} class computer extends Product {} class Audio extends Product {} // 자손들 class Buyer { // 물건 사는 사람 int money = 1000; // 소유 금액 int bonusPoint = 0; // 보너스 점수 } // 메서드 추가 void buy(Tv t) { money -= t.price; bonusPoint += t.bonusPoint; } // 오버로딩1 void buy(Computer c) { money -= t.price; bonusPoint += t.bonusPoint; } // 오버로딩2 void buy(Audio a) { money -= t.price; bonusPoint += t.bonusPoint; } // 오버로딩이 많아지면 불편하므로 아래와 같이 메서드를 변경함. // 조상타입 사용, 메서드 하나로 여러 물건을 살 수 있음.(다형성) void buy(Product p) { money -= p.price; bonusPoint += p.bonusPoint; }
여러 종류의 객체 배열로 다루기
- 조상타입의 배열에 자손들의 객체를 담을 수 있음.
Product p1 = new Tv(); Product p2 = new Computer(); Product p3 = new Audio(); // 배열로 바꾸기 -> 다형성으로 자손들이 들어올 수 있음 Product p[] = new Product[3]; p[0] = new Tv(); p[1] = new Computer(); p[2] = new Audio(); // 예시 class Buyer { int money = 1000; int bonusPoint = 0; Product[] cart = new Product[10]; int i=0; void buy(Product p) { if(money < p.price) { System.out.println("잔액 부족"); return; } money -= p.price; bonusPoint += p.bonusPoint; cart[i++] = p; } }
🐣 해당 게시글은 자바의 정석(남궁성 님) 영상으로 함께 공부하며 요약/정리한 글입니다.
🐣 입문 개발자가 작성한 글이므로 틀린 내용이나 오타가 있을 수 있습니다.