
- Java에서의 상속이란 부모 클래스의 필드와 메서드를 자식 클래스에 물려주는것을 말한다.
- 상속은 적은 양의 코드로 새로운 클래스를 작성할 수 있다.
- 상속은 공통적인 코드를 관리하여 코드의 추가와 변경에 용이하다.
- 상속을 사용하면 중복성을 낮추고 재사용성을 높여 생산성과 유지보수에 유리하다.
상속은 Override를 제공한다. 오버라이드는 아래에서 자세히 다루지만 일단은 부모 클래스에서 상속받은 메서드를 자식 클래스에서 재정의 하는 것을 오버라이딩이라고 한다.
- 부모 클래스를 상속 받은 자식 클래스에서 필드와 메서드가 추가되어도 부모 클래스는 영향을 받지 않는다.
- 자바는 다중 상속을 허용하지 않는다.
-> 프로그램이 커질수록 다중 상속을 허용할 경우 클래스간의 관계가 복잡해지기 때문이다.
상속의 의의는 결국 확장인데 final을 지정하면 더 이상 수정을 할 수 없게 된다.
-> 결국은 final 키워드는 아무리 상속이 부모에 영향을 주지 않는다 해도 나는 이게 변하는걸 원하지 않을때 사용하는 키워드다.
메서드나 내가 따로 정리한 부분을 보면 final은 변경이나 오버라이드를 금지하는 것이지 호출에는 문제가 없다.
즉, 중요한 역할을 하는 클래스와 메서드의 안정성과 불변성을 보장하는 키워드다.
부모 클래스로부터 상속받은 메서드의 내용을 재정의 하는 것을 말한다.
- 부모 클래스의 메서드와 일치해야 한다.
- 접근 제어자를 부모 클래스의 메서드보다 좁은 범위로 변경할 수 없다.
- 부모 클래스의 메서드 보다 많이 선언할 수 없다.
일단 여기서 2번을 보면 접근 제어자를 좁은 범위로 변경할 수 없다.
라는 게 나오는데 자세히 보면
public class Parent {
public void method() {}
}
public class Child extends Parent {
@Override
private void method() {} // 컴파일 에러
}
메서드의 접근 제어자가 다를 경우 컴파일 에러가 발생한다.
반대로 부모가 private이고 자식이 public일 경우는 같은 클래스 내부에서의 참조가 아니기 때문에 만약 자식 클래스에서 똑같은 이름의 메서드를 적었다면 상속받아 사용하는 메서드가 아닌 자식 클래스에서 새로 정의한 메서드이다.
super 는 부모 클래스의 멤버를 참조할 수 있는 키워드. (멤버: 필드와 메서드)
객체 내부 생성자 및 메서드에서 부모 클래스의 멤버에 접근하기 위해 사용되며, 자식 클래스 내부에서 선언한 멤버와 부모 클래스에서 상속받은 멤버와 이름이 같을 경우 구분하기 위해서 사용한다.
super() 부모 클래스의 생성자를 호출할 수 있는 키워드.
객체 내부 생성자 및 메서드에서 부모 클래스의 생성자를 호출하기 위해 사용되며, 자식클래스의 객체가 생성될 때 부모 클래스들이 모두 합쳐져 하나의 인스턴스가 생성된다.
하나의 타입에 실행 결과가 다양한 여러 객체를 대입함으로써 다양한 기능을 이용할 수 있도록 해준다.
부모 타입 변수 = 자식 타입 객체 는 자동으로 부모 타입으로 변환이 일어난다.
자식 객체는 부모 객체의 멤버를 상속받기 때문에 부모와 동일한 취급을 받을 수 있다.
주의점
부모 타입 변수로 자식 객체의 멤버에 접근할 때는 부모 클래스로 부터 상속된 멤버에만 접근할 수 있다.
자식 타입 변수 = (자식 타입) 부모 타입 객체;
부모 타입 객체는 자식 타입 변수로 자동으로 타입 변환이 되지 않는다.
타입 변환 연산자를 통해 강제로 자식 타입으로 변경이 가능하다.
주의점
강제 타입 변환은 항상 가능한 것이 아니고 자식 타입이 부모 타입으로 자동 변환한 후, 다시 자식 타입으로 변환할 때 강제 타입 변환을 사용할 수 있다.
다형성 기능으로 인해 해당 클래스 객체의 원래 클래스 명을 체크하기 위해 사용하는 병령어
미완성된 설계도 (Swift의 관점으로 Protocol과 비슷하다..)
- abstract 키워드를 사용하여 추상 클래스를 선언한다.
- extends 키워드를 통해 클래스에 상속한다.
- 추상 클래스는 추상 메서드를 포함할 수 있다.
- 추상 클래스는 자식 클래스에 상속되어 자식 클래스에서만 완성할 수 있다.
- 추상 클래스는 여려개의 자식 클래스들에서 공통적인 필드나 메서드를 추출해서 만들 수 있다.
- abstract 키워드를 통해 추상 메서드를 선언한다.
- 추상 메서드는 정의만 할 뿐 내용 블럭을 포함하지 않는다.
후기 1. 다형성 부분이 많이 어려워서 나중에 복습해야겠다.
후기 2. protocol 비슷한거 봐서 반갑고~
다음에는 인터페이스다