**자바의 정석(남궁성 저)를 읽고 정리한 글입니다.
상속이란?
상속은 기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것으로, 코드의 재사용성과 유지보수가 쉬워짐
클래스는 상속 관계에 따라서 조상 클래스, 자손 클래스로 나눌 수 있는데,
상속해주는 클래스가 조상클래스, 상속받는 클래스가 자손클래스임
이 때 조상클래스의 생성자와 초기화 블럭은 상속되지 않고, 멤버만 자손클래스에게 상속됨
따라서 자손클래스는 부모에게서 물려받은 멤버+자신의 멤버 의 구성으로 클래스를 사용하게 됨
인스턴스 또한 조상 클래스의 멤버+자손 클래스의 멤버인 하나의 인스턴스가 생성됨
private 또는 default여도 자손 클래스에게 상속될까?
상속됩니다. 정확하게 말하면 상속되지만, 자손 클래스에서 접근할 수 없습니다.
상속관계 vs 포함관계
상속과 포함은 언뜻 보면 기능이 비슷하지만 그 의미에 따라 적절한 것으로 사용해야 함
ex. 자동차-바퀴의 관계에서 바퀴는 자동차의 부품이므로 포함관계(멤버변수로 바퀴를 넣어줌). 자동차-탈것의 관계는 자동차의 상위 범위가 탈것이므로 상속관계가 적절함
단일상속
자바는 둘 이상의 클래스로부터 상속을 받을 수 없게 하는 단일 상속을 사용함
Object 클래스
모든 클래스의 상속 관계에 따라 조상 클래스를 쭉 따라가면 나오는 최상위 조상클래스
명시하지 않아도, 컴파일러가 자동적으로 extends Object를 추가하여 Object 클래스를 상속받도록 함
toString(), equals()와 같이 모든 인스턴스의 기본적인 메소드들이 바로 Object 클래스에 정의되어 있음
오버라이딩
조상 클래스로부터 상속받은 메소드의 내용을 자손 클래스가 새로 작성하여 고쳐 쓰는 것
따라서 메소드의 이름, 매개변수, 반환 타입이 같아야 함
오버라이딩의 규칙
1. 접근 제어자는 조상 클래스의 메소드보다 더 좁은 범위일 수 없음
2. 조상 클래스의 메소드보다 더 범위가 넓고, 많은 수의 예외를 선언할 수 없음
3. +) 조상 클래스에 있는 static 메소드와 자손 클래스에 있는 static 메소드는 이름과 꼴이 같더라도 서로 다른 메소드 (오버라이딩이 아님)
오버라이딩 vs 오버로딩
오버라이딩: 조상클래스로부터 상속받은 메소드를 고쳐 쓰는 것
오버로딩: 같은 이름의 메소드를 반환 형태와 매개변수를 다르게 하여 다른 메소드를 만드는 것
super와 super()
super
super은 조상 클래스에게서 상속받은 멤버를 참조하기 위해서 사용하는 변수 (ex.super.parentTemp, 같은 변수명이 있으면 자손클래스의 변수 this.x, 조상의 변수는 super.x 로 접근)
super()
super()은 조상 클래스의 생성자를 의미
Object 클래스를 제외한 모든 클래스는 생성자 첫 줄에 생성자.this()나 super()를 호출 해야 함
만약에 생략되어있다면 컴파일러가 자동으로 super()을 넣어줌
제어자
접근제어자: public, proteceted, dafault, private
제어자 | 같은 클래스 | 같은 패키지 | 자손클래스 | 전체 |
public | O | O | O | O |
protected | O | O | O | |
(default) | O | O | ||
private | O |
다형성(Polymorphism)
다형성은 여러가지 형태를 가질 수 있는 능력으로, 자바에서는 조상클래스 타입의 참조변수로 자손클래스의 인스턴스를 참조함으로써 가능
위의 그림처럼, 조상타입의 참조변수로 자손타입의 인스턴스를 참조하는 것은 가능하지만 그 반대는 안됨.
추상클래스(abstract class)
추상 메소드를 포함하고 있는 클래스는 추상 클래스임
추상클래스는 인스턴스를 생성할 수 없기 때문에 자손클래스가 상속받아야 사용 가능
추상메소드(abstract method)
선언부만 작성하고 구현부는 작성을 하지 않은 것
abstract를 메소드에 붙여서 추상메소드로 만들면 자손클래스에서 반드시 이 메소드를 구현해야 함
인터페이스
일종의 추상클래스로, 추상클래스보다 추상화 정도가 높아 모든 메소드가 다 추상메소드이며 상수만을 멤버로 가질 수 있음
따라서 모든 멤버변수는 public static final, 메소드는 public abstract여야 하는데 이를 생략하는 것도 가능함
클래스와는 다르게 여러 개의 인터페이스로부터 상속받음으로써 다중상속이 가능함
'한권떼기 > 자바의 정석' 카테고리의 다른 글
[한권떼기] 자바의정석 챕터12. 제네릭스, 열거형, 어노테이션 (0) | 2022.03.28 |
---|---|
[한권떼기] 자바의정석 챕터11. 컬렉션 프레임워크 (0) | 2022.03.27 |
[한권떼기] 자바의정석 챕터06. 객체지향프로그래밍 기본개념 (0) | 2022.03.24 |
[한권떼기] 자바의정석 챕터05. 배열(Array) (0) | 2022.03.23 |
[한권떼기] 자바의정석 챕터02. 변수(Variable) (0) | 2022.03.22 |