반응형
자동 타입변환
- 자식 클래스는 부모의 특징과 기능을 상속받기 때문에 부모 클래스와 동일하게 취급될 수 있음
- 바로 위의 부모가 아니더라도 상속 계층에서 상위 타입이라면 자동 타입 변환이 일어날 수 있음
- 부모 타입으로 자동 타입 변환된 이후에는 부모 클래스에 선언된 필드와 메소드만 접근이 가능
(비록 변수는 자식 객체를 참조하지만 변수로 접근 가능한 멤버는 부모 클래스 멤버로 한정됨) - 그러나 자식 클래스에서 오버라이딩 된 메소드가 있다면 부모 메소드 대신 오버라이딩된 메소드가 호출됨
부모타입 변수 = 자식타입객체;
class Cat extends Animal {
}
Cat cat = new Cat();
Animal animal = cat;
cat == animal // true
강제 타입 변환 (casting)
- 부모 타입을 자식 타입으로 변환하는 것
- 자식 타입이 부모 타입으로 자동 타입 변환한 후 다시 자식 타입으로 변환할 때 강제 타입 변환을 사용할 수 있음
- 자식타입 > 부모타입변환 > 자식 타입 강제타입변환
- 자식 클래스에 선언된 필드와 메소드를 꼭 사용해야 한다면 강제 타입 변환을 이용하여 사용
Parent parent = new Child(); // 자동 타입 변환
Child child = (Child) parent; // 강제 타입 변환
다형성
사용 방법은 동일하지만 실행 결과가 다양하게 나오는 성질
필드의 다형성 (재정의 + 타입변환)
필드 타입은 동일하지만(사용 방법은 동일하지만), 대입되는 객체가 달라져서 실행 결과가 다양하게 나올 수 있는 것을 말함
매개변수의 다형성
- 다형성은 필드보다는 메소드 호출할 때 많이 발생
- 메소드가 클래스 타입의 매개변수를 가지고 있을 경우, 호출할 때 동일한 타입 대신 자식 객체를 제공 할 수도 있음
객체 타입 확인
- instanceof 연산자를 사용
boolean result = 객체 instanceof 타입;
추상(abstract) 클래스
- 추상 : 실체 간에 공통되는 특성을 추출한 것
- 추상 클래스 : 실체 클래스들의 공통적인 필드나 메소드를 추출해서 선언한 클래스
- 실체 클래스의 공통되는 필드와 메소드를 추출해서 만들었기 때문에 new연산자를 사용해서 객체를 직접 생성 할 수 없고, 상속을 통해 자식 클래스만 만들 수 있음
- 새로운 실체 클래스를 만들기 위한 부모 클래스로만 사용됨
추상 클래스 선언
public abstract class 클래스명 {
//필드
//생성자
//메소드
}
추상 메소드와 재정의
- 자식 클래스의 공통 메소드라는 것만 정의할 뿐, 실행 내용을 가지지 않음(중괄호가 없음)
- 자식 클래스에서 반드시 재정의 하여 사용해야함
abstract 리턴타입 메소드명(매개변수,...);
봉인된 클래스
무분별한 자식 클래스의 생성을 막기위해 사용함
public sealed class Person permits Employee, Manager {...}
// Person 클래스는 Employee 와 Manager 만 상속하겠다
sealed~permits를 이용하여 생성한 부모 클래스를 상속받은 자식 클래스는 세가지중 한가지를 선택하여 생성할 수 있음
public sealed class Manger extends Person {...} // 똑같이 봉인시킴
public final class Employee extends Person {...} // 더이상 상속할 수 없게함
public non-sealed class Manger extends Person {...} // Manager의 자식클래스는 제한없이 만들 수 있음
확인문제
호출되는 각 클래스의 생성자의 순서
super(); 와 this();는 같이 사용 할 수 없음
public class ChildExample {
Child child = new Child(); // 1
}
public class Child extends Parent {
public String name;
public Child() { //2
this("홍길동"); //3
System.out.println("Child() call"); //14
}
public Child(String name) { //4
// super(); 컴파일러 자동 생성 //5
this.name = name; //12
System.out.println("Child(String name) call"); //13
}
}
public class Parent {
public String nation;
public Parent() { //6
this("대한민국"); //7
System.out.println("Parent() call"); //11
}
public Parent(String nation) { //8
this.nation = nation; //9
System.out.println("Parent(String nation) call"); //10
}
}
반응형
'Back-End > Java' 카테고리의 다른 글
인터페이스 - 01 (0) | 2023.01.05 |
---|---|
상속 - 01 (0) | 2022.12.21 |
클래스 - 02 (0) | 2022.12.16 |
댓글