** 자기 공부용 및 암기용으로 포스팅하는 글 입니다.
** 정확한 정보는 보장 할 수 없으니, 참고용으로만 봐주시면 감사하겠습니다.
** 제 개인적인 생각 및 자기 암시목적으로 작성되기에 이점 양해 부탁드립니다.
들어가기에 앞서..
객체지향 프로그래밍 설계를 지탱하는 핵심적인 4가지의 기둥이 존재한다.
그것은 상속/캡슐화/추상화/다형성 이다.
이제 마지막으로 다형성에 관해서 배워보자.
★ 알아볼 내용
1. 다형성 개념
2. 참조 변수의 타입 변환 + instanceof 연산자
내용 설명
1. 다형성 개념
일반적으로 다형상이란 여러개를 의미하는 poly와, 어떤 형태 또는 실체를 의미하는 morphism의 결합어로 하나의 객체가 여러가지의 형태를 가질 수 있는 성질을 의미.
자바 프로그래밍에서 다형성은 한 타입의 참조 변수를 통해 여러 타입의 객체를 참조할 수 있도록 만든 것을 의미하며, 상위 클래스 타입의 참조 변수를 통해서 하위 클래스의 객체를 참조할 수 있도록 허용한 것이다.
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(); // 객체 타입과 참조 변수 타입의 불일치
friend.friendInfo();
boyfriend.friendInfo();
girlfriend.friendInfo();
// GirlFriend friend1 = new Friend(); ->
// 하위클래스 타입으로 상위클래스 객체 참조 -> 불가능
}
}
// 출력값
// 나는 당신의 친구입니다.
// 나는 당신의 남자친구입니다.
// 나는 당신의 여자친구입니다.
위 예시에서는 GirlFriend friend1 = new Friend(); 를 실행하게 되면 오류가 나타나게 되는데 그 이유는 실제 객체인"Firiend"의 맴버 개수 보다 참조 변수 "Friend1"이 사용할 수 있는 맴버 개수가 더 많기 때문에 에러가 나타나는 것이다.
2. 참조 변수의 타입 변환 + instanceof 연산자
참조 변수또한 앞서 배웠던 기본 자료형의 형 변환처럼 가능하다.
그러나 의미가 다른데, 참조 변수의 타입 변환은 사용할 수 있는 맴버의 개수를 조절하는 것을 의미한다.
참조 변수의 타입 변환에는 세 가지 조건이 충족되어야 가능하다.
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 startEngine() {
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("묘기 부리기");
}
}
또한 우리는 해당 참조 변수가 업캐스팅이나 다운 캐스팅이 가능한지 여부를 파악할 수 있다.
알 수 있는 방법으로는 instanceof 연산자를 사용하는 것으로
가능 여부를 boolean타입으로 반환해 준다.
public class InstanceOfExample {
public static void main(String[] args) {
Animal animal = new Animal();
System.out.println(animal instanceof Object); //true
System.out.println(animal instanceof Animal); //true
System.out.println(animal instanceof Bat); //false
Animal cat = new Cat();
System.out.println(cat instanceof Object); //true
System.out.println(cat instanceof Animal); //true
System.out.println(cat instanceof Cat); //true
System.out.println(cat instanceof Bat); //false
}
}
class Animal {};
class Bat extends Animal{};
class Cat extends Animal{};
'JAVA 지식 및 공부' 카테고리의 다른 글
[JAVA] Collection - Map (0) | 2024.06.16 |
---|---|
[JAVA] Collection : Iterator (0) | 2024.06.15 |
[JAVA] 객체지향 프로그래밍 : 추상화 (0) | 2024.06.10 |
[JAVA] 객체지향 프로그래밍 : 캡슐화 (0) | 2024.06.09 |
[JAVA] 객체지향 프로그래밍 : 상속 (1) | 2024.06.07 |