관리 메뉴

제뉴어리의 모든것

[Section1][Java] 객체지향 프로그래밍 심화 - 다형성에 대하여 본문

코드스테이츠/정리 블로깅

[Section1][Java] 객체지향 프로그래밍 심화 - 다형성에 대하여

제뉴어리맨 2022. 7. 13. 11:30

다형성이란

원론적인 의미는하나의 객체가 여러가지의 형태를 가질 수 있는 성질.

 

JAVA에서의 다형성이란

한가지 타입의 참조변수가 여러 타입의 객체를 참조하여 핸들링 할 수 있는것.

 

한가지 예로,

상위클래스 타입 변수에 하위 클래스의 객체라면 어떤 것이든 할당하여 사용 할 수 있는것.

 

[JAVA 다형성의 예] 상위클래스 타입의 참조변수 사용

상위클래스 타입의 참조변수에 하위클래스의 객체를 할당하면, 해당 참조변수가 접근 할수 있는 것은 상위클래스의 멤버수만큼이다. (명시적 형변환 생략 가능)

EX :

ParentClass pc = new ChildClass(); //가능, 명시적 형변환 생략가능

[JAVA 다형성의 예] 하위클래스 타입의 참조변수 사용

위와 반대로 하위클래스 타입의 참조변수를 선언하고 그 변수에 상위클래스 객체를 할당하면, 에러가 발생한다.
왜냐하면 참조변수가 참조하려는 멤버 갯수(멤버변수, 멤버 메소드)가 할당된 실제 인스턴스 객체의 멤버수보다 많기 때문이다.

EX :

ChildClass cc = new ParentClass(); //에러

 

 

객체의 타입변환이란

사용할 수 있는 멤버의 갯수를 조절하는 것

 

 

왜 객체를 타입변환 하여 사용하는가

상위 클래스가 하나 존재하고 그 상위클래스를 상속(확장)하는 하위 클래스가 100개가 있을 경우,그리고 이 하위클래스 1개당 수백개의 객체가 생성될지도 모른다.이러한 경우, 생성된 하위클래스의 객체들을 관리 하기가 어려워진다.각 하위클래스마다 참조변수들을 따로 만들어줘야하며 여러 불편한 상황이 생긴다.이럴때, 상위클래스 참조변수로 배열이든 Collection을 만들어서이 배열 또는 Collection 같은 집합에 모든 하위 클래스 객체들을 담아 관리 할 수 있다.

 

타입 변환의 조건

1. 형변환하는 하는 두가지의 객체는 상속 관계에 있어야 한다2. 하위객체를 상위클래스 타입으로 형변환시에는 명시적 형변환 생략 가능
3. 하위 객체가 할당되어 있는 상위클래스 타입 변수를 하위클래스 타입 변수에 저장하려면 필수적으로 명시적형변환이 필요하다.
EX :ParentClass pc = new ChildClass(); //명시적 형변환 생략 가능ChildClass cc = (ChildClass) pc; //명시적 형변환 필수.

 

 

instanceof

타입 변환 가능 여부를 확인해 볼수 있는 키워드이다.
EX : 
SuperClass instanceof ChildClass -> false
ChildeClass instanceof SuperClass -> true
SuperClass instanceof Object -> true