728x90
반응형
📌 상속과 다형성
실제 일상에서도 비슷한 일을 하는 여러 형태의 도구가 있습니다. 이들을 활용하여 필요한 곳에 모아서 사용하거나, 같은 기능을 하는 것끼리 모아서 보관을 편히 할 수도 있습니다. 자바에서도 상속받은 객체들끼리 모아서 배열로 만들거나 매개변수로 사용할 수 있습니다. 오늘은 객체 지향언어의 특징인 다형성을 배워봅시다.
다양한 형태가 존재하는 다형성이라는 객체 지향 언어의 특징을 배워봅시다. 이러한 다형성의 활용 방법을 배워보며 업캐스팅과 다운 캐스팅의 용어도 배워봅니다. 또한 각 객체가 명시된 클래스로부터 생성되었는지를 확인하는 instanceof 연산자도 배워봅시다.
📌 I. 상속과 다형성
📚 1. 다형성 (Polymorphism)
- 다양한 형태가 존재한다는 의미
- 프로그래밍을 유연하게 만들어주는 메커니즘
- 실행 때 조건문으로 객체를 식별할 필요 없이, 구분하지 않고 같은 코드를 사용하도록 함
- 프로그래밍을 단순하고도 직관적으로 만들어주는 효과
📚 02. 참조 변수에 객체를 할당하는 기본적인 방법
- 기본적으로 참조 변수의 자료형과 할당 하고자 하는 객체의 자료형이 일치해야합니다.
UnivStudent s;
s = new UnivStudent();
UnivStudent s = new UnivStudent();
📚 03. 업 캐스팅
- 참조 변수의 타입과 참조 변수에 할당하는 객체의 타입이 다르도록 할 수 있음
- super 클래스형 참조 변수로 sub 클래스 객체를 가리키는데 사용 가능
- 자동 형변환이 일어남
- sub 클래스 객체의 성질은 그대로 유지됨
- Object 클래스는 모든 클래스의 super 클래스이므로 모든 객체를 가리키는데 사용할 수 있음
Person p = new UnivStudent();
Person p = (Person) (new UnivStudent());
📚 04. 업 캐스팅의 예
Person p = new UnivStudent();
- 자식 객체를 부모 타입의 참조 변수로 가리킴
- age, name 멤버 변수나 WhatYourName(). HowOldAreYou() 메서드는 부모 객체에도 있었으므로 참조 변수 p로 접근
- 자식 객체에서 새로 상속된 major 멤버 변수나, WhoAreYou() 메서드는 참조 변수 p로 접근 불가
- 컴파일러가 찾아갈 수 없음
📚 05. 다운 캐스팅
- 기본적으로는 sub 클래스형 참조 변수는 super 클래스 객체를 가리킬 수 없음
- 명시적 형변환으로 컴파일 오류는 피할 수 있더라도 실행 시간에 오류 발생
UnivStudent s = new Person(); //오류
- 업 캐스팅 된 참조 변수를 명시적 형변환을 통해 다운 캐스팅하는 것은 가능
Person p = new UnivStudent();
UnivStudent s = (UnivStudent) p; //정상
📚 06. 다운 캐스팅의 예
(1) 잘못된 다운 캐스팅의 예
UnivStudent s = new Person();
UnivStudent s = (UnivStudent) new Person();
- 여전히 실행 때 오류 발생 가능성 존재
(2) 유효한 다운 캐스팅의 예
Person p = new UnivStudent();
UnivStudent s = (UnivStudent) p;
📌 II. 다형성의 활용
📚 01. 다형성의 활용
대학생과 고등학생을 하나의 묶음으로 만들어야할 때 공통적인 Person으로 묶을 수 있을 것입니다.
(1) 객체 배열로의 활용
Person[] pList = new Person[2];
pList[0] = new Person();
pList[1] = new UnivStudent();
- super 클래스형의 객체 배열은 다양한 종류의 sub 클래스의 객체를 포함할 수 있음
(2) 매개 변수로의 활용
void fn(Person p);
- super 클래스형의 캐개변수는 다양한 종류의 sub 클래스 객체를 넘겨 받을 수 있음
📚 02. 업 캐스팅된 참조변수의 성질 (1)
- sub 클래스의 멤버 중 super 클래스로부터 상속 받은 멤버에만 직접 접근이 가능
- sub 클래스에서 추가된 멤버에는 접근 불가
- 컴파일시 참조 변수의 자료형을 가지고 메서드의 올바른 사용 여부를 확인하기 때문
p.WhatYourName(); //정상
p.WhoAreYou(); //컴파일 오류
- 오버라이딩 된 멤버에 접근시 접근시 자동으로 sub 클래스에서 정의한 멤버로 접근됨
- JVM이 메서드 호출시 참조 변수의 자료형이 아니라 실제 객체의 자료형을 중심으로 동작하기 때문
📚 03. 업 캐스팅된 참조변수의 성질 (2)
- 상속 받지 않은 멤버에 접근하기 위해선 반드시 다운 캐스팅 후 조작
UnviStudent s = (UnviStudent) p;
s.WhoAreYou();
((UnviStudent) p).WhoAreYou();
- 반드시 객체의 실제 자료형으로만 다운 캐스팅이 가능
- 자식에게 새로 추가된 멤버가 있는 경우 다운 캐스팅이 필요한 것
📚 04. instanceof 연산자
참조변수 instanceof <class명>
- 다운 캐스팅시 사용
- 참조 변수가 참조하고 있는 객체가 명시한 클래스로부터 생성되었는지를 검사
- boolean 결과값을 반환
if (pList[i] instanceof Univ())
- super 클래스의 배열/매개변수를 통해 접근되는 객체의 실제 자료형을 확인 가능
- sub 클래스에서 추가된 멤버 접근시에만 확인 필요
반응형
'코딩언어 > JAVA' 카테고리의 다른 글
[JAVA] 12. 예외처리 (0) | 2022.11.04 |
---|---|
[JAVA] 11 추상 클래스와 인터페이스 (0) | 2022.11.03 |
[JAVA] 09. 클래스 상속 (0) | 2022.10.24 |
[JAVA] 08. 배열 (0) | 2022.10.22 |
[JAVA] 07-2 자바 기본 API (0) | 2022.10.20 |