728x90
상속
@2024.03.26
상속
💡
부모 클래스로부터 필드와 메서드를 물려받아, 새로운 클래스를 만드는 것
@기본형식
[접근제한자] [abstract | final] class 클래스명 extends 부모클래스명{
}
@기본형식
[접근제한자] [abstract | final] class 클래스명 extends 부모클래스명{
}
A는 B이다
라고 표현할 수 있다면 상속관계- A는 B의 종류 중 하나다 → 일반화 시킨 것
- 상속 = 일반화 + 확장
[abstract | final]
→ 클래스가 추상 클래스인지 또는 클래스가 더 이상 상속될 수 없는지
- 단일 상속만 가능
- 부모가 가지고 있는 것은 자식은 자유롭게 사용이 가능
- 아무것도 상속을 받지 않으면 자동으로
java.lang.Object
를 상속
→
모든 클래스는 Object의 자손!
- 필드는 타입을 따라가고, 메서드는 오버라이딩된 자식의 메서드가 실행
객체 묵시적 타입 변환
💡
부모 타입은 자손 타입을 참조할 수 있다
⇒ 조상은 자손을 가리킬 수 있다.
@기본 형식
부모타입 부모참조변수 = new 자식생성자(); ⇒ 다형성
Parent parent = new Chlid();
⇒ 조상은 자손을 가리킬 수 있다.
@기본 형식
부모타입 부모참조변수 = new 자식생성자(); ⇒ 다형성
Parent parent = new Chlid();
- 부모타입이 자식을 가리킨것 → 자식안에 부모가 물려준 것만 접근 가능!
- 부모 타입에 선언된 필드와 메소드만 사용 가능
- 자식이 선언한 메소드, 필드는 사용 불가능
⇒ 사용하려면
강제 형변환
이 필요!
객체 강제 타입 변환
💡
부모 타입을 자식 타입으로 변환하는 것으로, 자식 타입에 선언된 필드와 메서드를 다시 사용해야 하는 경우에 수행
- 강제 형 반드시
instanceof 연산자
를 사용하여 어느 객체 타입인지 확인해야 한다!- ClassCastException 예외 발생 가능
- 이 매개변수가 참조하는 객체가 자식 클래스냐?
- 위에 그림을 참고하여 instanceof 결과 추측
Object obj = new Chlid(); //obj가 Child의 인스턴스인가? System.out.println(obj instanceof Chlid); // true : Chlid로 형 변환 가능 System.out.println(obj instanceof Parent);// true : Parent로 형 변환 가능 System.out.println(obj instanceof Object);// true : Object로 형 변환 가능 //Child안에 본인, Parent, Object가 존재하기 때문
생성자 오버 로딩
this() 생성자
: 자기 자신의 생성자를 말하며, 생성자 안에서만 사용 가능하다.- 코드 중복을 피하고 재 사용성이 높음
- super() 생성자를 호출하는 코드 다음이나, 첫 번째에 위치해야 한다.
- 방법 1
public class Car { private String brand; //브랜드 private String model; //모델 private int year; //연식 //한개의 인자를 받는 생성자 public Car(String brand){ this.brand = brand; } // 3개의 인자를 받는 생성자 public Car(String brand, String model, int year){ this(brand); // 하나의 String타입을 인자로 받는 첫번째 생성자 호출후 값 초기화 this.model = model; this.year = year; } }
- 방법 2
public class Car { private String brand; //브랜드 private String model; //모델 private int year; //연식 // 3개의 인자를 받는 생성자 public Car(String brand, String model, int year){ this.year = year; this.model = model; this.year = year; } //한개의 인자를 받는 생성자 public Car(String brand){ // 다른 생성자를 호출하여 첫번째 인자에만 값을 설정 this(brand,"현대",2024); } }
super() 생성자
: 부모 클래스가 기본 생성자를 가지고 있지 않다면, 사용자는 반드시 직접 super() 생성자를 호출하는 코드를 작성해야 한다!!- 자식은 부모을 상속받기 때문에, 부모가 먼저 있어야 자식도 있다.
- 따라서 자식 객체를 생성할 때는 부모 클래스의 생성자가 호출되어 초기화되고, 그 후에 자식 클래스의 생성자가 호출되어 초기화된다.
public class Car{ private String name; private String year; //기본생성자 존재 x public Car(String name, String year){ this.name = name; this.year = year; } } public class Bus extends Car{ private String name; private String year; private String color; //테스트 해보기 public Bus(String name, String year, String color){ //부모클래스에 기본 생성자가 없으므로, 오버로딩된 생성자 호출 // 부모 클래스의 생성자를 전달받은 매개변수로 초기화 super(name, year); // 아래 코드부터 자식 필드 초기화 this.name = name; this.year = year; this.color = color; } }
728x90