728x90
다형성
다형성은 하나의 객체가 여러 가지 타입을 가질 수 있는 것을 말합니다.
부모 클래스 타입의 참조 변수로 자식 클래스 타입의 인스턴스를 참조할 수 있도록 할 수 있습니다.
부모 타입 형태로 자식 객체의 행위를 하는 것이죠.
오버라이드랑 매우 비슷한 특징을 가지고 있습니다.
다형성의 특징은 다음과 같습니다.
1. 부모의 타입으로 자식 생성
Parent p = new Child();
2. 부모의 이름으로 자식 대입
Child c = new Child();
Parent p = c;
3. 부모의 매소드를 통해 자식의 매소드 호출
같은 부모를 상속받은 자식 클래스는, 컴파일 시 형 변환 가능한 것처럼 작성되지만,
실행시(runtime)시 ClassCastException을 발생시킴.
다형성은 이와 같은 특징을 가지고 있습니다.
다형성에 관한 간단한 코드를 보겠습니다.
Animal 클래스
package com.test02;
public class Animal {
public Animal() {
System.out.println("동물");
}
public void bark() {
System.out.print("울음 소리 : ");
}
}
Cat 클래스
package com.test02;
public class Cat extends Animal {
public Cat() {
System.out.println("야옹이");
}
public void bark() {
super.bark();
System.out.println("야옹");
}
}
Dog 클래스
package com.test02;
public class Dog extends Animal {
public Dog() {
System.out.println("멍멍이");
}
public void bark() {
super.bark();
System.out.println("멍멍");
}
}
MTest 클래스
package com.test02;
public class MTest {
public static void main(String[] args) {
//타입 객체
Animal animal = new Dog();
animal.bark();
animal = new Cat();
animal.bark();
// instanceof : 해당 타입의 객체인지 아닌지 판별
if(animal instanceof Dog) {
System.out.println("멍멍이다!");
}else if(animal instanceof Cat) {
System.out.println("야옹이다!");
}
}
}
MTest 출력 결과
이 코드는 main메소드에서 코드 그대로만 설명해드리겠습니다!
혹시 어떻게 출력되는지 예상가 시나요?
Animal animal = new Dog();
Animal 타입의 Dog 객체를 만들었네요.
animal.bark();
그러고는 bark()메소드를 호출했습니다.
animal = new Cat();
animal을 Cat 객체로 다시 대입하였습니다.
animal.bark();
그러고 다시 bark()메소드를 호출합니다.
if(animal instanceof Dog) {
System.out.println("멍멍이다!");
}else if(animal instanceof Cat) {
System.out.println("야옹이다!");
}
이 코드는 animal이 어떤 객체인지 판별해 주는 명령인데 객체를 만들 때는 Dog 객체로 만들었지만 이후에 Cat 객체로 바꾸었습니다.
다음번 포스팅에서 다른 코드를 보며 다시 한번 상속과 다형성을 보겠습니다.
728x90
'Java 관련 > Java' 카테고리의 다른 글
[Java] 추상클래스(abstract class) (0) | 2021.11.06 |
---|---|
[Java] 상속과 다형성 (0) | 2021.11.05 |
[Java] 상속(inheritance) (0) | 2021.11.03 |
[Java] 오버로딩(Overloading), 오버라이딩(Overriding) (0) | 2021.11.02 |
[Java] 클래스(class) (0) | 2021.11.01 |