다형성(polymorphism)
하나의 객체가 여러가지 형태를 가질 수 있는 성질
한 타입의 참조변수를 통해 여러 타입의 객체를 참조할 수 있도록 만든 것
상위 클래스 타입의 참조변수를 통해서 하위 클래스의 객체를 참조할 수 있도록 허용한 것
// 참조 변수의 다형성 예시
class Friend {
public void friendInfo() {
System.out.println("나는 당신의 친구입니다.");
}
}
class BoyFriend extends Friend {
public void friendInfo() {
System.out.println("나는 당신의 남자친구입니다.");
}
}
class GirlFriend extends Friend {
public void friendInfo() {
System.out.println("나는 당신의 여자친구입니다.");
}
}
public class FriendTest {
public static void main(String[] args) {
Friend friend = new Friend(); //객체 타입과 참조변수 타입의 일치
BoyFriend boyFriend = new BoyFriend();
Friend girlfriend = new GirlFriend(); // 객체타입과 참조변수 타입의 불일치
// GirlFriend friend1 = new Friend(); 하위클래스타입으로 상위 클래스 객체 참조 불가능
friend.friendInfo();
boyFriend.friendInfo();
girlfriend.friendInfo();
}
}
// 출력값
나는 당신의 친구입니다.
나는 당신의 남자친구입니다.
나는 당신의 여자친구입니다.
GirlFriend 클래스의 인스턴스를 생성하고 그것을 Friend타입의 참조변수 girlfriend에 할당
원래라면 타입을 일치시키기 위해 Girlfriend를 참조변수의 타입으로 지정해주어야 하지만
상위클래스 Friend를 참조변수 타입으로 지정했기때문에
참조변수가 사용할 수 있는 멤버의 개수는 상위클래스의 멤버의 수가 됨
상위 클래스 타입의 참조변수로 하위클래스의 객체를 참조하는 것 = 다형성
사용할 수 있는 멤버가 줄어들었는데 왜 장점일까? (다형성 , 추상화 내용)
상위클래스의 타입으로 하위클래스타입의 객체를 참조는 가능하지만 그 반대는 xxx
(하위클래스타입으로 상위클래스타입의 객체 참조 xx)
- 실제 객체인 Friend의 멤버개수보다 참조변수 friend1 이 사용할 수 있는 개수가 더 많기때문에 안된다
사용하는 기능을 줄이기는 허용 / 반대의 경우는 실제로 구현된 기능이 없어서 사용이 불가능
참조변수의 타입변환
사용할 수 있는 멤버의 개수를 조절하는 것
1. 서로 상속 관계에 있는 상위 클래스 - 하위클래스 사이에만 타입 변환이 가능
2. 하위 클래스 타입에서 상위 클래스 타입으로의 타입 변환(업캐스팅)은 형변환연산자(괄호)를 생략할 수 있다
3. 반대로 상위클래스에서 하위클래스 타입으로 변환(다운캐스팅)은 형변환연산자(괄호)를 반드시 명시해야함
- 다운 캐스팅은 업 캐스팅이 되어있는 참조변수에 한해서만 가능
public class VehicleTest {
public static void main(String[] args) {
Car car = new Car();
Vehicle vehicle = (Vehicle) car; // 상위 클래스 Vehicle 타입으로 변환(생략가능)
Car car2 = (Car) vehicle; // 하위 클래스 Car타입으로 변환(생략 불가능)
MotorBike motorBike = (MotorBike) car; // 상속 관계가 아니므로 타입 변환 불가 -> 에러
}
}
class Vehicle {
String model;
String color;
int wheels;
void starEngine() {
System.out.println("시동걸기");
}
void accelerate() {
System.out.println("속도 올리기");
}
void brake() {
System.out.println("브레이크!");
}
}
class Car extends Vehicle {
void giveRide() {
System.out.println("다른 사람 태우기");
}
}
class MotorBike extends Vehicle {
void performance() {
System.out.println("묘기 부리기");
}
}
Car클래스의 객체 car를 생성후 참조변수 vehicle의 타입을 Vehicle로 지정해서 참조변수타입변환실행
그 후 vehicle을 하위클래스 타입인 Car로 타입변환해서 참조변수 car2에 할당
상속관계에 있는 클래스 간에는 상호타입 변환이 수행될 수 있다
하위클래스를 상위클래스타입으로 변환하는 경우 타입변환연산자(괄호)를 생략할 수 있지만
그 반대 업 캐스팅이 되어있다는 전제 하에 다운 캐스팅을 할 수 있으며 타입변환연산자를 생략할 수 없다.
Car클래스와 MotorBike클래스는 상속관계x 타입변환불가능
실제 객체의 멤버 개수보다 적거나 같으면 되지만 멤버개수를 넘을 수 없다
instanceof 연산자
참조변수의 타입변화, 캐스팅이 가능한지 여부를 boolean 타입으로 확인 할 수 있는 자바의 문법요소
객체를 어떤 생성자로 만들었는가 , 클래스 사이에 상속관계가 존재하는가를 판단해야 함
참조_변수 instanceof 타입
리턴값이 true: 참조변수가 검사한 타입으로 변환가능
false: 타입변환 불가능 / 참조변수가 null 인경우 false 반환
'개발공부🌷 > JAVA' 카테고리의 다른 글
JAVA 기초 11 객체지향프로그래밍 심화 (0) | 2023.10.25 |
---|---|
JAVA기초 10-1 객체지향프로그래밍 심화 (0) | 2023.10.24 |
JAVA 기초9 객체지향프로그래밍 심화 (0) | 2023.10.23 |
JAVA 기초8 객체지향프로그래밍 심화 (0) | 2023.10.22 |
JAVA 기초 7-1 객체지향프로그래밍 기초 (0) | 2023.10.19 |