반응형
다형성이란?
여러 가지 형태를 가질 수 있는 능력을 의미하며, 자바에서는 한 타입의 참조변수로 여러 타입의 객체를 참조할 수 있도록 함으로써 다형성을 프로그램적으로 구현
조상클래스 타입의 참조변수로 자손클래스의 인스턴스를 참조할 수 있다.
참조변수가 사용할 수 있는 멤버의 개수는 인스턴스의 멤버 개수보다 같거나 적어야 한다.
class Car {
String brand;
String engine;
int door;
...
}
class SportCar extends Car {
SportCar(String brand, int door) {
super(brand, "sport", door);
}
}
Car car = new SportCar("Kia", 4); // 조상클래스 타입의 참조변수로 자손클래스 인스턴스 참조
// 컴파일 에러 발생, 자손타입의 참조변수로 조상타입의 인스턴스를 참조할 수 없다.
// (실제 인스턴스의 멤버보다 참조변수의 멤버가 더 많기 때문에)
SportCar sportCar = new Car("Kia", "sport", 4);
참조변수의 형변환
기본형 변수와 같이 참조변수도 서로 상속관계에 있는 클래스에한해서 형변환이 가능하다.
조상타입 참조변수 ↔ 자손타입 참조변수 양방향으로 형변환이 가능하다.
- 자손타입 → 조상타입에 형변환 경우(Up-casting) 형변환 생략가능
- 조상타입 → 자손타입에 형변환 경우(Down-casting) 형변환 생략불가
Car car = null;
SportCar sportCar = new SportCar();
car = sportCar; // 자손타입 -> 조상타입 형변환(생략가능)
car = (SportCar)sportCar; // 조상타입 -> 자손타입 형변환(생략불가)
instanceof 연산자
참조변수가 사용하고 있는 인스턴스의 실제 타입을 알아보기 위해 instanceof 연산자를 사용한다.
연산의 결과는 Boolean 타입이다.
instanceof 연산의 결과가 true라는 것은 검사한 타입으로 형변환이 가능하다는 것을 의미한다.
void doWork(Car c) {
if (c instanceof SportCar) {
...
} else if (c instanceof ElectricCar) {
...
}
}
참조변수와 인스턴스의 연결
조상클래스에 선언된 멤버변수와 같은 이름의 인스턴스 변수를 자손클래스에 중복으로 정의한 경우,
- 조상타입의 참조변수를 사용 → 조상클래스에 선언된 멤버변수 사용
- 자손타입의 참조변수를 사용 → 자손클래스에 선언된 멤버변수 사용
이렇게 참조변수에 따라 다른 결과를 얻는다.
중복되지 않는 경우는 같은 멤버변수를 사용한다.
중복된 메서드는 참조변수의 타입과 상관없이 오버라이딩(overriding)된 메서드가 호출된다.
class Car {
String brand;
String engine = "Normal";
int door;
Car (String brand, int door) {
this.brand = brand;
this.door = door;
}
void printInfo() {
System.out.println("Car - " + brand + ", " + engine + ", " + door);
}
}
class SportCar extends Car {
String engine = "Sport"; // 조상클래스에 선언된 멤버변수와 같은 이름의 멤버변수
SportCar (String brand, int door) {
super.brand = brand;
super.door = door;
}
void printInfo() { // 오버라이딩
System.out.println("SportCar - " + brand + ", " + engine + ", " + door);
}
}
Car car = new SportCar("Kia", 4);
SportCar sportCar = new SportCar("Kia", 4);
car.printInfo(); // "Car - Kia, Normal, 4"
sportCar.printInfo(); // "SportCar - Kia, Sport, 4"
매개변수의 다형성
참조변수의 다형적인 특징은 메서드의 매개변수에도 적용된다.
자손클래스를 매개변수로 가지는 메서드를 사용할 경우 자손클래스가 늘어날 시 메서드도 늘어나게 된다.
조상클래스를 매개변수로 가지게 되면 자손클래스가 늘어날 시에도 메서드는 늘어나지 않고 재사용이 가능하다.
class Product { // 상품
String name; // 상품명
int price; // 가격
}
class Tv extends Product { ... } // Tv상품
class Compouter extends Product { ... } // Computer상품
class User { // 사용자
// 자손클래스를 매개변수로 가지게 되면 Product를 참조하는 클래스가 늘어날수록 메서드도 늘어나게 된다.
// void buy(Tv tv) { ... }
// void buy(Compouter compouter) { ... }
// 조상클래스를 매개변수로 가지는 메서드
void buy(Product p) { // 상품 구매 메서드
System.out.println(p.name + " 상품을 " + p.price + "원에 구매");
}
}
Product p = new Tv("벽걸이TV", 1000000);
User user = new User();
user.buy(p); // "벽걸이TV 상품을 1000000원에 구매"
여러 종류의 객체를 배열로 다루기
조상타입의 참조변수로 자손타입의 객체를 참조하는 것이 가능하므로 배열(array)로 함께 다룰수 있다.
Product p1 = new Tv();
Product p2 = new Computer();
Product[] pArr = new Product[2];
pArr[0] = p1;
pArr[1] = p2;
User.batchBuy(pArr); // 묶음 구매
반응형
'Java' 카테고리의 다른 글
인터페이스(Interface) (0) | 2021.09.20 |
---|---|
추상클래스(Abstract class) (0) | 2021.09.19 |
그 외 제어자(otherwise modifier) (0) | 2021.09.16 |
접근 제어자(access modifier) (0) | 2021.09.16 |
오버라이딩(overriding) (0) | 2021.09.14 |