객체지향 프로그래밍 기술 - 상속, 은닉, 다형성
> 다형성 polymorphism
객체가 여러 형태를 가짐 - 하나의 객체가 여러가지 유형으로 사용됨
상속을 전제조건으로 함
부모 타입에 모든 자식 객체가 대입될 수 있음 (자바는 자식클래스가 부모클래스의 타입을 가질 수 있게 허용)
부모클래스 변수 = new 자식클래스()
- 부모클래스에 있는 기능만 사용 가능
- 오버라이딩된 메소드는 먼저 실행됨
class A {}
class B extends A {} //부모클래스A 자식클래스B
public class Basic {
B b = new B();
A a = b;
// B -> A 자동형변환
// A a = new B();
//자바 최상위 부모클래스 Object _ 모든 객체가 저장될 수 있음
Object o1 = new A();
Object o2 = new B();
Object o3 = "a";
public class Parent {
public void method1() {
System.out.println("부모의 1번 메소드");
}
public void method2() {
System.out.println("부모의 2번 메소드");
}
}
public class Child extends Parent {
public void method2() {
System.out.println("오버라이딩 2번 메소드");
}
public void method3() {
System.out.println("자식의 메소드 3번");
}
}
public class MainClass {
public static void main(String[] args) {
Child c = new Child();
c.method1(); //상속받은 메소드
c.method2(); //오버라이딩된 메소드
c.method3(); //자식클래스의 고유한 메소드
Parent p = c; //다형성
//Parent p = new Child();
System.out.println(p == c); //true
p.method1(); //부모클래스의 메소드
p.method2(); //자식클래스에서 오버라이딩 된 메소드
//p.method3(); //자식클래스의 고유한 메소드이므로 사용 불가
}
}
> 클래스 캐스팅 class casting
강제 타입 변환 (type casting) : 부모클래스 타입 → 자식클래스 타입
조건: 자식클래스 타입 → 부모클래스 타입 변환(promotion)이 한번 됐던 객체만 가능
이로써 자식클래스의 고유한 메소드를 사용하지 못했던 문제가 해결됨
자식클래스 변수 = (자식클래스) new 부모클래스();
ex. Child c = (Child) new Parent();
ex. Parent p = new Child(); → Child c = (Child)p;
public class Parent {
public void method1() {
System.out.println("부모의 1번 메소드");
}
public void method2() {
System.out.println("부모의 2번 메소드");
}
}
public class Child extends Parent {
public void method2() {
System.out.println("오버라이딩 2번 메소드");
}
public void method3() {
System.out.println("자식의 메소드 3번");
}
}
public class MainClass {
public static void main(String[] args) {
Child c = new Child();
c.method1(); //상속받은 메소드
c.method2(); //오버라이딩된 메소드
c.method3(); //자식클래스의 고유한 메소드
Parent p = c; //다형성
//Parent p = new Child();
System.out.println(p == c); //true
p.method1(); //부모클래스의 메소드
p.method2(); //자식클래스에서 오버라이딩 된 메소드
//p.method3(); //자식클래스의 고유한 메소드이므로 사용 불가
Child cc = (Child)p; //class 형변환
System.out.println(cc == p); //true
cc.method1();
cc.method2();
cc.mehtod3(); //자식클래스의 고유한 메소드 사용가능
}
}
> instanceof
객체가 지정한 클래스의 인스턴스인지 아닌지 검사할 때 사용하는 연산자
왼쪽 항의 객체가 오른쪽 항의 클래스의 인스턴스라면 true 반환
ex.
Parent p = new Parent();
Child c = new Child();
p instanceof Parent → true
p instanceof Child → false
c instanceof Parent → true
c instanceof Child → true
Parent p = new Child();
p instanceof Child → true
p instanceof Parent → true
*다형성의 적용
배열에 다형성이 적용되면 부모 타입 배열에 자식 객체가 저장될 수 있다
매개변수에 다형성이 적용되면 자식 객체를 전달할 수 있다
'course 2021 > JAVA' 카테고리의 다른 글
day15 - final, abstract (0) | 2021.09.08 |
---|---|
day14 - static (0) | 2021.09.07 |
day12 - access modifier, encapsulation (0) | 2021.09.02 |
day11 - this, super (0) | 2021.08.31 |
day10 - inheritance, overriding, overloading (0) | 2021.08.31 |