나의개발일지

다형성 본문

언어/Java

다형성

아. 이렇게 하면 될거 같은데.. 2024. 1. 28. 17:06
728x90


다형성이란 하나의 객체가 많은 형(타입)을 가질 수 있는 성질, 하나의 클래스를 다양하게 활용하는 방법

 

기법

  • 메소드 오버로딩
  • 메소드 오버라이딩
 

오버로딩/오버라이딩

오버로딩(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 ) {
	...
}

 

728x90
반응형

'언어 > 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