일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 상속
- 백준
- Encapsulation
- 최소신장트리
- 인터페이스
- polymorphism
- 프림알고리즘
- this
- 열거형
- enum
- 17472
- 생성자
- nextInt
- inheritance
- java
- 객체 지향
- 추상 클래스
- 캡슐화
- 추상화
- 내부 클래스
- 제네릭
- 객체지향
- 다형성
- 버퍼비우기
- abstract
- Final
- 와일드카드
- python
- Scanner
- Today
- Total
쫑쫑이의 블로그
객체지향 4대 특성 - 다형성 (Polymorphism) 본문
다형성은 다양한 형태를 갖는 것이고, 장점으로는 재사용성이 있다고 알고 있다
다형성의 예시로 메서드 오버로딩과 오버라이딩이 있다고 알고 있다
=============================================================
하위 클래스는 상위 클래스의 멤버의 수와 같거나 많은 멤버를 갖는다
상위 클래스에서 하위 클래스를 참조할 수 있다
하위 클래스 내에 상위 클래스 멤버들을 모두 가지고 있기 때문이다
반대로 하위 클래스에서 상위 클래스 참조할 수 없다
상위 클래스 내에 하위 클래스 멤버들을 모두 가지고 있지 않을 수 있기 때문이다
class Person {
void status() {
system.out.println("아는 사람");
}
}
class Friend extends Person {
void status() {
system.out.println("친구");
}
}
class Honey extends Person {
void status() {
system.out.println("애인");
}
void call() {
system.out.println("전화");
}
}
public class Test {
public static void main(String[] args) {
Person p = new Person();
Friend f = new Friend();
Person h = new Honey(); // <----
}
}
다음과 같은 클래스들이 있을 때 화살표로 표시한 부분이 상위 클래스에서 하위 클래스를 참조하는 것이다
Honey 클래스는 상위 클래스보다 많은 멤버(call 메서드)를 가지고 있지만 인스턴스 h는 call 메서드를 사용할 수 없다
하지만 status 메서드를 사용하면 Honey 클래스에 메서드 오버라이딩된 메서드를 사용한다
즉, 클래스의 멤버는 그대로 가지고 가고 싶은데
특정 메서드만 하위 클래스에서 오버라이딩된 메서드를 사용하고 싶을 때 이 방식을 사용하면 될 것이다
업캐스팅과 다운캐스팅
업 캐스팅
하위 클래스 타입에서 상위 클래스 타입으로 변경한다 (형변환 연산자 생략가능)
-> 하위 클래스 객체 참조 변수를 상위 클래스 객체 주소값으로 변경한다
위에서 다룬 예제가 업 캐스팅이다
public static void main(String[] args) {
Honey h = new Honey();
Person p = (Honey) h; // <---- 업캐스팅, (Honey) 생략 가능
// Person p = new Honey();
}
다운 캐스팅
상위 클래스 타입에서 하위 클래스 타입으로 변경한다 (형변환 연산자 생략불가)
-> 상위 클래스 객체 참조 변수를 하위 클래스 객체 참조 주소값으로 변경한다
public static void main(String[] args) {
Person p = new Person();
Friend f = (Friend) p; // 에러 발생!
}
다운 캐스팅이 단순하게 업 캐스팅의 반대라고 생각하고 다음과 같이 사용하면 에러가 발생한다
다운 캐스팅은 업 캐스팅된 것을 원상복구하는 것이다
public static void main(String[] args) {
Person p = new Honey();
Honey h = (Honey) p; // <---- 다운 캐스팅, (Honey) 생략 불가
}
instanceof 연산자는 `A(참조변수) instanceof B(클래스)` A가 B의 인스턴스인지 true/false로 리턴해준다
예를 들어 모든 클래스는 Object 클래스의 하위 클래스이므로 A instanceof Object라고 입력하면 true값을 리턴한다
'공부 > JAVA' 카테고리의 다른 글
버퍼 비우기(Scanner nextInt) (0) | 2022.09.09 |
---|---|
객체지향 4대 특성 - 추상화 (Abstract) (0) | 2022.09.07 |
객체지향 4대 특성 - 캡슐화 (Encapsulation) (0) | 2022.09.06 |
객체지향 4대 특성 - 상속 (Inheritance) (0) | 2022.09.06 |
생성자와 this & this(), 내부 클래스 (0) | 2022.09.05 |