다형성(polymorphism)
-> 다형성은 다양한 형태 또는 특성을 가진다는 의미입니다.
자바와 같은 객체 지향 언어에서 의미는 부모 클래스를 상속받은 자식 클래스의 인스턴스가 부모의 객체로 사용되고, 자식 클래스의 객체로도 사용될 수 있는 다양한 상황을 의미합니다.
<예시 1>
예를 들어, "앵무새가 말을 하네"라는 문장은 "새가 말을 하네"라는 문장으로 사용하여도 어색하지 않습니다. 앵무새가 새의 한 종류이기 때문에 같은 의미로 사용 가능합니다.
class Bird {}
class Parrot extends Bird {}
public class Main {
public static void main(String[] args) {
Bird b1 = new Bird();
Parrot p1 = new Parrot();
Bird b2 = new Parrot();
//Parrot p2 = new Bird(); //모든 새는 앵무새가 아니기에 오류!
}
}
즉, 하위 클래스의 인스턴스는 보다 위의 상위 클래스의 인스턴스로 사용할 수 있습니다. 하지만 그 반대는 불가합니다. (모든 새는 앵무새가 아니기 때문...)
<예시 2>
class Person { // 부모클래스
String st1 = "super class";
void method1() {
System.out.println("AAA");
}
void ppp() {
System.out.println("PPP");
}
}
class Student extends Person{ //자식클래스
String st2 = "surve class";
void method1() {
System.out.println("overriding - aaa");
}
void sss() {
System.out.println("SSS");
}
//자식클래스에서 오버라이딩된 부모클래스의 원본 메소드를 호출하고 싶다면? -> super 사용
void x() {
super.method1(); //AAA 출력됨
}
}
public class day3_ex02 {
public static void main(String[] args) {
//**객체를 어느 클래스 타입으로 선언 하냐에 따라 자원을 쓸 수 있는 범위가 달라진다!!**
//[1]
Student s1 = new Student();
System.out.println(s1.st1); //super class
System.out.println(s1.st2); //surve class
s1.method1(); //overriding - aaa
s1.x(); //AAA
System.out.println("------------------------");
//[2]
Person s2 = new Student(); //부모의 자원만을 쓸 수 있다.(자식의 자원을 쓸 수 없다.)
s2.method1(); //overriding - aaa => **이건 자식의 자원(재정의 되었기 때문)**
System.out.println(s2.st1); //super class (부모의 자원)
s2.ppp(); // PPP (부모의 자원)
//자식클래스의 메소드를 바로 호출하고 싶다면? -> 캐스트 사용!!
((Student)s2).sss(); //SSS(자식의 자원)
System.out.println("------------------------");
//[3]
Person p1 = new Person();
System.out.println(p1.st1); //super class
p1.method1(); //AAA
p1.ppp(); //PPP
//[4]
//Student p2 = new Person(); //Error 발생!(모든 사람은 학생이 아니기 때문)
}
}
- super 키워드
-> super 키워드의 사용으로 자식 클래스의 객체는 부모 클래스의 자원을 사용할 수 있습니다.
즉, super 키워드는 자식 클래스에서 오버 라이딩된 부모 클래스의 원본 메서드를 호출하는 방법입니다.
//자식 클래스의 메소드 부분
void x() {
super.method1(); // 부모 클래스의 method1
}
- 캐스트 사용
-> 다형성의 특성으로 부모 클래스 타입으로 선언된 생성된 객체의 경우 부모 클래스의 자원만 사용할 수 있습니다.
여기서 자식의 자원을 사용하기 위해서는 캐스트를 사용하는 방법이 있습니다.
Person s2 = new Student();
//s2.sss(); //바로 자식 클래스의 메소드를 호출할 수 없음.
((Student)s2).sss(); // SSS 출력됨! -> 캐스트 사용
<예시 2 - 콘솔>



감사합니다!
2022.08.31
'JAVA' 카테고리의 다른 글
스레드(Thread) (1) | 2024.01.27 |
---|---|
소수 찾기, 구하기 (0) | 2023.02.01 |
[Java] 추상 클래스(abstract) (0) | 2022.08.19 |
[Java] 오름차순, 내림차순 정렬 (0) | 2022.08.17 |
[자바] 싱글톤 패턴(Singleton pattern) (0) | 2021.07.14 |