archive
[이것이 자바다] 07 상속 - 2 본문
1. 자동 타입 변환 (Promotion)
- 자동적으로 타입 변환이 일어나는 것
- 자동 타입 변환이 일어날 조건
부모타입 변수 = 자식타입객체 ; 즉, 자식타입의 객체가 상위 타입인 부모타입의 변수에 대입되는 경우 자동 타입 변환이 일어남 |
- 자식은 부모의 특징과 기능을 상속받기 때문에 부모와 동일하게 취급될 수 있음, 예를들어 고양이가 동물의 특징과 기능을 상속받았다면 '고양이는 동물이다' 가 성립하게 된다.
- 따라서 Cat 객체를 Animal 타입의 변수에 대입하면 자동 타입 변환이 일어난다.
Cat cat= new Cat();
Animal animal=cat;
//cat은 자동 타입 변환이 일어나 Animal 타입의 변수 animal에 대입이 가능해진다.
- Animal animal=new Cat(); 의 코드와 같이 바로 new 연산자로 객체 생성을 하는 것도 오류 없이 작성 가능하다.
- 여기서 cat과 animal 변수는 타입만 다를 뿐이지 동일하게 Cat 객체를 참조한다.
-그렇기 때문에 두 참조 변수의 동등 비교 연산자 (==)의 결과는 true가 나온다.
cat == animal ;
//true
- 바로 위의 부모가 아니더라도 상속 계층에서 상위 타입이라면 자동 타입 변환이 일어날 수 있다.
-부모 타입으로 자동 타입 변환된 이후에는 부모 클래스에 선언된 필드와 메소드만 접근이 가능하다.
-비록 변수는 자식 객체를 참조하지만 변수로 접근 간으한 멤버는 부모 클래스 멤버로 한정한다
-그러나 자식 클래스에서 오버라이딩한 메소드가 있다면 부모 메소드 대신 오버라이딩 된 자식 메소드가 호출됨, 이는 다형성(Polymorphysm)과 관련이 있기 때문에 잘 알아두어야 한다.
2. 강제 타입 변환 (Casting)
- 자식 타입은 부모 타입을 자동 변환하지만 반대로 부모 타입은 자식 타입으로 자동 변환되지 않음
- 대신 다음과 같이 캐스팅 연산자로 강제 타입 변환이 가능함
자식타입 변수 = (자식타입) 부모타입객체 ; 캐스팅 연산자 |
- 그렇다고 해서 부모 타입 객체를 자식 타입으로 무조건 강제 변환을 할 수 있는 것은 아님, 자식 객체가 부모 타이브로 자동 변환이 된 후 다시 자식 타입으로 변환할 때 강제 타입 변환을 사용할 수 있음
Parant parant=new Child(); // 자동 타입 변환
Child child = (Child) parant; // 강제 타입 변환
-자식 객체가 부모 타입으로 자동 변환이 되면 부모 타입에 선언된 필드와 메소드만 사용가능하다는 제약 사항이 따름, 만약 자식 타입에 선언된 필드와 메소드를 꼭 다시 사용해야 한다면 강제 타입 변환을 해서 다시 자식 타입으로 반환해야 한다.
3. 다형성(Polymorphism)
- 다형성이란 사용 방법은 동일하지만 실행결과가 다양하게 나오는 것을 의미
- 객체의 사용 방법이 동일하다는 것은 동일한 메소드를 가지고 있다는 것, 예를 들면 한국타이어와 금호타이어는 모두 타이어를 상속하고 있음, 그렇다면 한국타이어와 금호타이어는 타이어의 메소드를 동일하게 가지고 있다는 것을 의미한다.
-만약 한국타이어와 금호타이어가 타이어의 메소드를 오버라이딩 하고 있다면, 타이어 메소드 호출 시 오버라이딩 된 메소드가 호출이 되게 되는데, 오버라이딩 된 두 타이어가 다르기 때문에 실행 결과가 다르게 나옴, 이것이 바로 다형성이다.
-다형성을 구현하기 위해서는 자동 타입 변환과 메소드 재정의가 필요하다
자동타입변환 | + | 메소드 오버라이딩 | → | 다형성 |
-필드 다형성
-필드 다형성은 필드 타입 (사용 방법)은 동일하지만, 대입되는 객체가 달라져서 실행 결과가 다양하게 나올 수 있음을 의미
-
4. 객체 타입 확인
- 매개변수의 다형성에서 실제로 어떤 객체가 매개값으로 제공되었는지 확인하는 방법 -> instanceof 연산자 활용
- instanceof 연산자의 좌항에는 객체가 오고 우항에는 타입이 오는데, 좌항의 객체가 우항의 타입이면 true, 그렇지 않으면 false를 산출
++ 얘 잘하면 if문 조건 부분 활용해서 서술하라는 문제 나오겠다
boolean result = 객체 instanceof 타입 ; |
-예를 들어 다음 코드는 Child 타입으로 강제 타입 변환하기 전에 매개값이 Child 타입인지 여부를 instanceof 연산자로 확인, Child 타입이 아니라면 강제 타입 변환을 할 수 없기 때문
-강제 타입 변환을 하는 이유는 Child 객체의 모든 멤버를 접근하기 위해서
public void method(Parant parant){
if(parant instanceof Child)
Child child = (Child) parant;
}
//parant 매개변수가 참조하는 객체가 Child인지 조사
-Java12부터는 instanceof의 결과가 true일 경우, 우측 타입 변수를 사용할 수 있기 때문에 강제 타입 변환이 필요가 없다
if(parant instanceof Child child){
//child 변수 사용
}
6. 봉인된 클래스 (sealed class)
-
// 와 이부분 미친 거 같은게 분명히 중간고사 시험 유형처럼 코드 개많이 주고 에러나는 코드 찾으라고 할 거 같음
대가리 터지겠다 진짜 확실히 알아두고 체화해서 시험 쳐야할 듯
진짜 기말고사는 미리미리 준비해야겠듬...
'Java > Java 개념 정리' 카테고리의 다른 글
[이것이 자바다] 08 인터페이스 -2 (0) | 2023.05.30 |
---|---|
[이것이 자바다] 08 인터페이스 -1 (0) | 2023.05.18 |
[이것이 자바다] 07 상속 - 1 (0) | 2023.04.28 |
[이것이 자바다] 06 클래스 - 2 (0) | 2023.04.13 |
[이것이 자바다] 06 클래스 - 1 (0) | 2023.04.07 |