Published 2022. 10. 3. 21:12
반응형
다형성(Polymorphism) 이란?
- 하나의 객체가 여러가지 타입을 가질 수 있는 것을 의미
- 객체들의 타입이 다르면 똑같은 메세지(같은 메소드명)가 전달되더라도 서로 다른 동작을 함
- ex) cat.speak() => 야옹, dog.speak() => 멍멍
- 다형성은 객체 지향 프로그래밍을 구성하는 중요한 특징 중 하나임
다형성 예제
public class Test {
public static void main(String[] args) {
Dog dog = new Dog();
Animal animal = new Dog();
// Animal animal = (Animal) new Dog(); 와 동일
animal.speak();
animal.speak2(); // 에러 발생
Dog dog2 = new Animal(); // 에러 발생
}
static class Dog extends Animal {
@Override
void speak() {
System.out.println("멍멍");
}
void speak2() {
System.out.println("왈왈");
}
}
static class Animal {
void speak() {
System.out.println("동물이 웁니다.");
}
}
}
- 위 코드로 알 수 있는 정보
- Animal = 부모클래스, Dog = 자식클래스
- Dog 객체는 Dog Type, Animal Type 둘 다 가질 수 있음
- Animal animal = new Dog() 실행 가능 원인 : 자식은 부모부터 메모리에 올리기 때문에 가능
- new Dog() 실행 시, Animal class도 메모리에 같이 올라감
- Dog dog = new Animal() 에러 발생 원인 : new Animal() 실행 시, Dog은 메모리에 없음
- 자식 -> 부모 형변환은 가능하지만, 부모 -> 자식 형변환은 불가능
- "자식 = 부모", "오버라이딩은 자식이"
- speak2() 에러 발생 원인 : animal이 Dog객체이지만 Animal Type이므로 speak2 메소드는 Animal 클래스에 없음
다형성의 활용 옞 (UpCating, DownCasting)
public static void main(String[] args) {
Animal animal = (Animal) new Dog(); // UpCasting
Dog dog = (Dog) animal; // DownCasting
}
- 위에서 부모 -> 자식 형변환은 불가능하다고 했지만, 이를 가능하게 해주는 것이 DownCasting
- 단, 미리 자식으로 메모리에 올라가 있는 경우에만 가능함
- 따라서 Dog dog = (Dog) new Animal(); 은 안되지만 Dog dog = (Dog) animal; 은 가능
instanceof 연산자
- 변수명 instanceof 클래스타입 => 해당 변수가 해당 클래스타입인지 확인
- 객체의 실제 타입 확인을 위해 사용, 이 때 클래스타입은 참조형만 가능
public class Test {
public static void main(String[] args) {
String str = "hi";
System.out.println(str instanceof String); // true 출력
int x = 10;
System.out.println(x instanceof int); // 에러 발생
Animal animal = (Animal) new Dog();
Dog dog = (Dog) animal;
animal.speak(); // 멍멍 출력
if(animal instanceof Animal) System.out.println("animal은 Animal Type 입니다.");
else if(animal instanceof Dog) System.out.println("animal은 Dog Type 입니다.");
// animal은 Animal Type 입니다. 출력
dog.speak(); // 멍멍 출력
if(dog instanceof Animal) System.out.println("dog은 Animal Type 입니다.");
else if(dog instanceof Dog) System.out.println("dog은 Dog Type 입니다.");
// dog은 Animal Type 입니다. 출력
}
static class Dog extends Animal {
@Override
void speak() {
System.out.println("멍멍");
}
}
static class Animal {
void speak() {
System.out.println("동물이 웁니다.");
}
}
}
반응형
'JAVA > 기본 문법' 카테고리의 다른 글
[JAVA] String Builder, String Buffer (1) | 2022.10.03 |
---|---|
[JAVA] 추상 클래스(Abstract Class)와 인터페이스(interface), 인터페이스의 default method (0) | 2022.10.03 |
[JAVA] 우선순위 큐 (Priority Queue), 정렬 전략 설정법 (0) | 2022.05.28 |
[JAVA] BufferedReader, BufferedWriter, StringBuilder (0) | 2022.05.24 |
[JAVA] 파일 입출력(BufferedReader, PrintWriter) , 파일 경로 (0) | 2022.04.18 |