이 글은 이것이 자바다를 참고하여 작성되었습니다.
- 부모 클래스에서 private 접근 제한을 갖는 필드와 메소드는 상속 대상에서 제외된다. 그리고 부모 클래스와 자식 클래스가 다른 패키지에 존재한다면 default 접근 제한을 갖는 필드와 메소드도 상속 대상에서 제외된다.
- 다중 상속을 허용하지 않는다.
class 자식클래스 extends 부모클래스 { // 필드 // 생성자 // 메소드 }
- 자식 객체를 생성하면, 부모 객체가 먼저 생성되고 그 후 자식 객체가 생성된다.
- 모든 객체는 클래스의 생성자를 호출해야만 생성되는데 부모 생성자는 자식 생성자의 맨 첫 줄에서 호출된다.
super();- 명시적으로 부모 생성자를 호출하고 싶다면
자식클래스(매개변수선언,...){ super(매개값,...); ... }
- 부모 클래스에 기본 생성자가 없고 매개 변수만 있는 생성자만 있다면 자식 생성자에서 반드시 명시적으로 호출해야 한다.
- 부모의 메소드와 동일한 시그너처(리턴 타입, 메소드 이름, 매개 변수 리스트)를 가져야 한다.
- 접근 제한을 더 강하게 오버라이딩 할 수 없다.
- 부모 메소드가 public 접근 제한을 가지고 있을 때 자식 메소드는 default나 private 접근 제한으로 수정할 수 없다. 반대는 가능.
- 새로운 예외(Exception)를 throws 할 수 없다.
- 자식 클래스에서 부모 클래스의 메소드를 오버라이딩 하면 오버라이딩 된 자식 메소드만 사용된다.
- 만약 자식 클래스 내부에서 오버라이딩된 부모 클래스의 메소드를 호출해야 한다면 super 키워드를 붙여서 호출 할 수 있다.
super.부모메소드();
- final 클래스 : 상속 할 수 없다.
- final 메소드 : 오버라이딩 할 수 없다.
- 같은 패키지에서는 default와 같이 접근 제한이 없지만 다른 패키지에서는 자식 클래스만 접근을 허용한다.
- 다른 패키지에 있는 경우 new 연산자를 사용해서 생성자를 직접 호출할 수는 없고, 자식 생성자에서 super()로 호출할 수 있다.
: 같은 타입이지만 실행 결과가 다양한 객체를 이용할 수 있는 성질.
- 하나의 타입에 여러 객체를 대입함으로써 다양한 기능을 이용
- 부모 클래스로 타입 변환을 허용한다.
- 클래스 타입도 타입 변환이 있다. 클래스 타입의 변환은 상속 관계에 있는 클래스 사이에서 발생한다. 자식 타입은 부모 타입으로 자동 타입 변환이 가능하다.
public class Car { Tire t1 = new Tire(); }public class Car { Tire t1 = new HankookTire(); }HankookTire가 Tire를 상속했다면 Tire 변수에 대입할 수 있다.
부모 클래스 변수 = 자식클래스타입;
- Cat이 Animal을 상속했다면
Cat cat = new Cat(); Animal animal = cat;Cat 클래스로부터 Cat 객체를 생성하고 이것은 Animal 변수에 대입하면 자동 타입 변환이 일어난다.
cat과 animal 변수는 타입만 다를 뿐, 동일한 Cat 객체를 참조한다.
(부모인 Animal 객체를 참조하는 것이 아니다.)
- 바로 위의 부모가 아니더라도 상속 계층에서 상위 타입이라면 자동 타입 변환이 가능하다.
- 부모 타입으로 자동 타입 변환된 이후에는 부모 클래스에 선언된 필드와 메소드만 접근이 가능하다. 변수는 자식 객체를 참조하지만 변수로 접근 가능한 멤버는 부모 클래스 멤버로만 한정된다.
예외) 메소드가 자식 클래스에서 오버라이딩되었다면 자식 클래스의 메소드가 대신 호출된다.
- 메소드를 호출할 때 매개값을 다양화하기 위해 매개 변수에 자식 타입 객체를 지정할 수도 있다.
class Driver { void drive(Vehicle vehicle) { vehicle.run(); } }Vehicle의 자식 클래스인 Bus 객체를 drive() 메소드의 매개값으로 넘겨준다면?
Driver driver = new Driver(); Bus bus = new Bus(); driver.drive(bus);자동 타입 변환 발생
Vehicle vehicle = bus;
→ 매개 변수의 타입이 클래스일 경우 해당 클래스의 객체뿐만 아니라 자식 객체까지도 매개값으로 사용할 수 있다.
→ 매개값으로 어떤 자식 객체가 제공되느냐에 따라 메소드의 실행 결과는 다양해질 수 있다. (매개변수의 다형성)
→ 자식 객체가 부모의 메소드를 재정의(오버라이딩) 했다면 메소드 내부에서 오버라이딩된 메소드를 호출함으로써 메소드의 실행 결과는 다양해진다.
: 부모 타입을 자식 타입으로 변환하는 것.
- 자식 타입이 부모 타입으로 자동 변환한 후, 다시 자식 타입으로 변환할 때 강제 타입 변환을 할 수 있다.
자식클래스 변수 = (자식클래스) 부모클래스타입;
객체 타입 확인(instanceof)
- 어떤 객체가 어떤 클래스의 인스턴스인지 확인하려면 instanceof 연산자를 사용할 수 있다.
boolean result = 좌항(객체) instanceof 우항(타입)- 좌항의 객체가 우항의 인스턴스이면 즉 우항의 타입으로 객체가 생성되었다면 true, 그렇지 않으면 false
- 좌항에 부모, 우항에 자식
- 안전하게 강제 타입 변환을 할 수 있다.
public void method(Parent parent){ if(parent instanceof Child) { Child child = (Child) parent; } }Parent 매개 변수가 참조하는 객체가 Child인지 조사
: 클래스들의 공통적인 특성을 추출해서 선언한 클래스.
cf) 실체 클래스 : 객체를 직접 생성할 수 있는 클래스.
- 추상 클래스와 실체 클래스는 상속의 관계를 가지고 있다.
- 추상 클래스는 객체를 직접 생성해서 사용할 수 없기 때문에 new 연산자를 사용해서 인스턴스를 생성시키지 못한다.
- 클래스 선언에 abstract 키워드를 붙여야 한다.
public abstract class 클래스 { // 필드 // 생성자 // 메소드 }new 연산자로 직접 생성자를 호출할 수는 없지만 자식 객체가 생성될 때 super(...)를 호출해서 추상 클래스 객체를 생성하므로 추상 클래스도 생성자가 반드시 있어야 한다.
추상 메소드
: 추상 클래스에서만 선언 가능.
- 메소드의 선언부만 있고 메소드 실행 내용인 중괄호 {}가 없는 메소드.
- 자식 클래스는 반드시 추상 메소드를 재정의(오버라이딩)해서 실행 내용을 작성해야 한다.
[public|protected] abstract 리턴타입 메소드명(매개변수,...);