나의개발일지
다형성 본문
다형성이란 하나의 객체가 많은 형(타입)을 가질 수 있는 성질, 하나의 클래스를 다양하게 활용하는 방법
기법
- 메소드 오버로딩
- 메소드 오버라이딩
오버로딩/오버라이딩
오버로딩(Overloading) 같은 이름의 메서드를 여러개 정의 하는것 오버로딩 조건 메서드 이름이 동일해야 한다. 매개변수 타입, 개수, 순서가 달라야 한다. 반환 타입은 오버로딩에 영향을 주지 않
cacaodotori.tistory.com
- 추상 클래스
- 인터페이스
업캐스팅
업캐스팅이란 자식 타입을 부모 타입으로 형변환 하는 것을 의미한다
<업 캐스팅 예시>
class Parent {
String office;
void work() {...}
}
class Child extends Parent {
String school;
void study(){...}
}
<인스턴스 생성>
Parent p = new Parent();
Child c = new Child();
-----------------------------------------------
//업 캐스팅
Parent p = new Child();
Child c = new Child();
자식 인스턴스를 만들어 부모 타입의 참조 변수에 할당했다. 자식 타입의 참조 변수 c는 당연히 자식 인스턴스를 가리킨다. 그런데 부모 타입의 참조 변수 p도 자식 인스턴스를 참조하지만 참조의 범위가 다르다.
참조범위 | Child 인스턴스 |
p로 참조할 수 있음 | office |
work() | |
p로 참조할 수 없음 | school |
study() |
참조 범위 | Child 인스턴스 |
c로 모두 참조 할 수 있음 | office |
work() | |
school | |
study |
부모 타입의 참조 변수가 자식 인스턴스를 참조하는 경우, 그 참조 변수로는 자신이 상속해준 멤버 변수와 메소드만 사용할 수 있는 것이다.
다운캐스팅
업 캐스팅의 반대의 경우 성립 하지 않는다.
Parent p = new Parent();
Child c = new Parent(); // 에러 발생
자식 타입의 참조 변수가 부모 인스턴스를 가리킬 수 없다.
자식 클래스는 부모 클래스보다 멤버 변수나 메소드가 많기 때문에 이렇게 멤버 변수나 메소드가 적은 부모 인스턴스를 참조하는 경우 c를 잘못 사용할 수 있어 금지한 것이다.
※ 다운 캐스팅의 경우 형변환 연산자르 ㄹ반드시 기술해야 한다.
Parent p = null;
Child c = new Child();
Child c1 = null;
p = c;
c1 = (child)p;
"p = c" 를 통해 부모 타입 참조 변수에 자식 타입의 참조 변수를 할당했기 때문에 다운캐스팅이 가능한 것이다.
instanceof 연산자
참조 변수 형변환을 사용하다 보면 특정 참조 변수가 실제로 어떤 인스턴스를 참조하는 것인지 검사해야할 필요가 생길 수 있다. 이경우 다음과 같이 "instanceof" 연산자를 사용한다.
if( c instanceof Parent ) {
...
} else if ( c instanceof Child ) {
...
}
'언어 > Java' 카테고리의 다른 글
컬렉션(Map, Queue, Deque) (0) | 2024.01.29 |
---|---|
컬렉션(List, Set) (1) | 2024.01.29 |
오버로딩/오버라이딩 (0) | 2024.01.25 |
상속 (0) | 2024.01.23 |
변수 (0) | 2024.01.21 |