상속
자식 클래스는 부모 클래스의 필드와 메소드를 이용 가능하다.
but 부모 클래스에 private 필드나 메소드는 상속대상에서 제외 된다.
또한 부모 클래스와 자식클래스나 다른 패키지에 존재한다면 default 필드나 메소드는 상속대상에서 제외된다.
1. 부모 생성자 호출
부모 클래스에 기본 생성자가 없고 매개변수가 있는 생성자만 있다면 자식 클래스에서 반드시 부모 생성자 호출을 위해
super(매개값, ...)을 호출해야한다.
2. 메소드 재정의(@Override)
부모 클래스의 메소드 중 자식 메소드에 적합하지 않는 메소드가 있을 수도 있다.
이때, 메소드 오버라이딩을 통해 자식 클래스에서 재정의하여 사용한다.
2.1 메소드 재정의 시 주의사항
- 부모의 메서드와 동일한 리턴타입, 매소드 이름, 매개변수 리스트를 가져야한다.
- 접근 제한을 더 강하게 오버라이딩 할 수 없다.
- 새로운 예외를 throw할 수 없다.
3. final 클래스와 final 메소드
3.1 상속할 수 없는 final 클래스
클래스 선언시 final을 붙이면 상속할 수 없다.
3.2 오버라이딩 할 수 없는 final 메소드
메소드 선언시 final을 붙이면 자식 클래스에서 재정의할 수 없다.
4. 타입 변환과 다형성
자바는 부모 클래스로 타입변환을 허용함으로써 다형성을 제공한다. -> 부모 타입에 모든 자식 객체가 대입될 수 있다.
4.1 자동 타입 변환 (Promotion)
자동 타입 변환은 프로그램 실행 중에 자동적으로 타입 변환이 일어나는 것을 말한다.
부모클래스 변수 = 자식클래스타입;
Dog dog = new Dog();
Animal animal = dog;
이때 dog == animal이다.
dog과 animal 변수는 같은 객체를 참조하고있다.
바로 위의 부모가 아니더라도 상속 계층에서 상위 타입이라면 자동 타입 변환이 일어날 수 있다.
부모 타입으로 자동 타입 변환된 이후엔 부모 클래스에 선언된 필드와 메소드만 접근이 가능하다.
4.2 필드의 다형성
실행 도중에 어떤 객체를 별도로 저장하느냐에 따라 실행 결과가 달라질 수 있다.
4.3 매개변수의 다형성
매개변수에 자식 객체를 집어넣음으로써 실행 결과가 달라질 수 있다.
public class Driver {
void drive(Vehicle vehicle){
vehicle.run();
}
}
Driver driver = new Driver();
Vehicle vehicle = new Bus();
driver.drive(bus);
5. 강제 타입 변환 (Casting)
부모타입을 자식타입으로 변환하는 것을 말한다.
하지만 모든 부모 타입을 자식타입으로 강제 변환할 수 있는건 아니며,
자식 타입이 부모타입으로 자동 타입 변환한 후, 다시 자식 타입으로 변환하고자 할때만 강제 타입 변환을 사용할 수 있다.
5.1 언제 사용할까?
자식타입이 부모타입으로 자동변환하면 부모타입의 필드와 메소드만 사용가능하기에,
자식 타입에 선언된 필드와 메소드를 사용해야 한다면 강제 타입 변환을 이용하자.
5.2 객체 타입 확인(instanceOf)를 사용하자
public void convertParent(Parent parent){
if(parent instanceOf Child){
Child child = (Child) parent;
}
}
5. 추상 클래스
추샹은 실체 간에 공통되는 특성을 추출한 것이다.
실제 클래스의 공통되는 필드와 메소드를 추출해서 만들었기에 객체를 직접 생성해서 사용할 수 없다.
새로운 실체 클래스를 만들기 위해 부모 클래스로만 사용된다.
5.1 추상 클래스의 용도
- 실체 클래스들의 공통된 필드와 메소드의 이름을 통일하기 위해
- 실체 클래스를 작성할 때 시간을 절약하기 위해
5.2 추상 클래스 선언
- abstract 키워드를 붙인다.
- new로 직접 생성자를 호출할 수 없지만 자식 객체가 생성될 때 super()를 호출하므로 추상클래스도 생성자가 반드시 있어야 한다.
public abstract class Phone{
public String owner;
public Phone(String owner){
this.owner = owner;
}
public void turnOn(){
System.out.println("켠다");
}
public void turnOff(){
System.out.println("끈다");
}
}
5.3 추상 메소드와 오버라이딩
추상 클래스는 실제 클래스가 공통적으로 가져야할 필드와 메소드들을 정의해놓은 추상적인 클래스이다.
but 메소드의 선언만 통일화하고, 실행 내용은 실체 클래스마다 달라야하는 경우도 있다.
-> 추상 메소드!
5.3.1 추상메소드
[public | protected] abstract 리턴타입 메소드명(매개변수, ...);
- 추상메소드는 추상 클래스에서만 선언할 수 있고, 메소드의 선언부만 있고 실행 내용은 없는 메소드이다.
- 하위 클래스가 반드시 실행 내용을 채우도록 강요하고 싶은 메소드가 있는 경우, 해당 메소드를 추상메소드로 선언하면 된다.
- 이때 자식 클래스는 반드시 추상 메소드를 오버라이딩하여 작성해야한다.
public abastract class Animal{
public String kind;
public void breathe(){
System.out.println("숨을 쉰다");
}
public abstract void sound();
}
public class Dog extends Animal {
public Dog(){
this.kind="포유류";
}
@Override
public void sound(){
System.out.println("멍멍");
}
}
'JAVA' 카테고리의 다른 글
[JAVA/개념] 11장 기본 API 클래스 (1) | 2023.07.08 |
---|---|
[JAVA/개념] 인터페이스 (0) | 2023.07.02 |
[JAVA/개념] 클래스 (0) | 2023.07.02 |
Lambda (0) | 2023.06.19 |
private, private static, private static final (0) | 2022.07.14 |