선장님과 함께하는 자바 스터디입니다.
자바 스터디 Github
github.com/whiteship/live-study
나의 Github
github.com/cmg1411/whiteShip_live_study
- 자바 상속의 특징
- super 키워드
- 메소드 오버라이딩
- 다이나믹 메소드 디스패치 (Dynamic Method Dispatch)
- 추상 클래스
- final 키워드
- Object 클래스
자바 상속
- 상속은 두 클래스간의 상위 클래스, 하위 클래스라는 계층관계를 만드는 OOP 의 방법이다.
- extends 키워드를 사용하여 상속을 지정할 수 있다.
- 아래는 A 클래스가 B 클래스를 상속한다. A 클래스가 하위 클래스이고, B 클래스가 상위 클래스이다.
class A extends B {
}
- 상속은 is-a 관계로 설명할 수 있다.
- 위의 예시에서는 A is a B. 인 것이다. B 를 상속한 A 는 B의 하위 클래스이므로 B 는 A 이다라는 관계가 성립한다.
- 더 정확하게는 is-kind-of 를 쓰면 좋다.
- A is kind of B. A 는 B 의 종류인 것이다.
- sparrow is kind of Bird 라고 하면, 참새는 새의 종류이고, 새가 상위 클래스, 참새가 하위 클래스가 된다.
class Sparrow extends Bird {
}
상속의 특징
- 상위 클래스를 상속한 하위 클래스는 상위 클래스의 필드와 메서드를 모두 상속받는다.
- 생성자는 상속받지 않는다.
- private 멤버는 상속받지 않는다.
- 다중상속(한 클래스에 여러 부모) 는 할 수 없다.
- 상위 클래스에서 정의한 메서드를 같은 시그니처로 하위 클래스에서 재정의할 수 있는데, 이를 오버라이딩이라 한다.
- 오버라이딩 시 @Override 에노테이션을 붙이면 컴파일타임에서 재대로 오버라이딩 됬는지 체크가 가능하다.
class A {
public void print() {
System.out.println("Im super Class");
}
}
class B extends A {
@Override
public void print() {
System.out.println("Im extending A Class");
}
}
- 상속은 계층구조를 가지게 하는데, 최상위에는 Object 클래스가 있고 모든 클래스는 이를 상속받는다. (자동으로)
- 모든 클래스가 Object 를 상속하고 있으므로, equals, clone, toString 같은 메서드를 오버라이딩 할 수 있는 것이다.
상속의 목적
- 상속은 상위 클래스 내용을 재사용하고, 하위 클래스로 확장하기 위해 사용한다.
상속과 super, super()
super()
- 생성자는 상속되지 않는다.
- 따리서 상위 클래스에 정의된 필드를 초기화하기 위해서는 상위 클래스의 생성자를 사용해야 한다.
- 이 때 자식클래스의 생성자에서 super() 를 호출하면 상위 클래스의 생성자를 실행할 수 있다.
- super() 의 매개변수를 어떻게 넣느냐애 따라 상위 클래스의 어떤 생성자를 호출하는지는 달라진다. 같은 시그니쳐의 생성자를 가져온다.
- 모든 클래스의 최상위 클래스는 Object 클래스이므로 모든 클래스 생성자가 super() 를 호출하여 Object 클래스까지 호출을 이어나가야 한다.
- 따라서 자바 컴파일러는 자식클래스의 생성자에서 부모 클래스의 생성자를 super() 로 명시적으로 호출하지 않으면, 자동으로 super() 을 추가하여 부모클래스의 멤버를 초기화 할 수 있게 해준다. (기본 생성자만 가능)
class A {
public A {
// super() 를 컴파일러가 자동으로 추가해줌
}
}
- 하지만 자바는 아무 생성자가 정의되어 있지 않는 상태에서만 기본 생성자를 자동으로 추가해준다.
- 만약 다음과 같이 기본 생성자가 없다면?
class A {
private final int number;
public A(int number) {
this.number = number;
}
}
- 이 때에는 기본 생성자가 없으므로 이를 상속한는 클래스에서는 super() 을 자동으로 추가할 수 없다.
- 따라서 super(num) 을 명시적으로 작성해야 한다.
- (위의 경우는 final 이므로 무조건 호출해야 하지만) 상위 클래스의 멤버변수의 초기화가 굳이 필요하지 않으면 상위 클래스에 기본 생성자를 추가해주는 방법으로 문제를 해결할 수 도 있다.
super
- super 은 상위 클래스에서 상속받은 필드나 메서드를 선택할 수 있는 참조자다.
- 상위 클래스의 멤버 이름과 하위 클래스의 멤버 이름이 같으면 super 키워드를 통해 구별할 수 있다.
추상 클래스
- 추상 클래스는 abstract 키워드를 이용하여 만들 수 있다.
abstract class A {
}
- 추상 클래스는 전 장에서 살펴보았던 클래스의 구성요소에서 추상 메서드라는 것이 하나 더 추가된다.
abstract class A {
public abstract void print(); // 추상 메서드, 정해지진 않았지만 컨벤션상 접근지정자 뒤에 abstract 를 넣는다
}
- 위처럼 메서드의 구현부가 없는 메서드를 선언할 수 있다.
- 이 메서드는 하위 클래스에서 오버라이딩하여 사용하게 된다.
- 또한 추상클래스를 구현하는 모든 하위클래스는 이 추상 메서드를 구현하지 않으면 컴파일타임에 오류를 발생시킨다.
- 따라서 이 추상메서드가 가지는 의미는, 추상 클래스를 구현하는 모든 하위 클래스들이 공통적으로 재정의하여 사용해야하는 메서드 즉 공통 행위이다.
추상 클래스의 특징
- 추상 클래스로는 인스턴스를 만들 수 없다. 따라서 util 성 클래스에 abstract 를 사용하기도 한다.
- 이건 옛날의 인터페이스와의 차이 이야기지만, 인터페이스에는 구현부를 작성할 수 없었고, 추상 클래스에는 구현부를 작성할 수 있다는 차이가 있었다. Java 8 부터는 interface 에 default 메서드가 생기면서 이러한 차이점이 없어졌다. Java 9 이후에는 private 메서드 구현을 할 수 있는 등 계속 진화하고 있는 Java 이다.
- 추상클래스를 추상 클래스가 상속하는 경우에는 추상 메서드를 구현하지 않아도 된다. 하지만 이런식으로 계속 내려가면 결국 상위에 연결된 모든 추상 클래스들의 추상 메서드를 구현하는 커다란 클래스가 생기게 된다.
final
- final 키워드는 그 대상의 값을 한번 초기화한 후 변경을 불가능하게 만드는 키워드다.
- 변경하지 못한다는 것은 확장을 막는 것도 포함한다.
class 의 final
- class 를 final 로 만든 다는 것은, 상속을 하지 못하게 하는 의미이다.
- 상속을 불가하게 하는 방법으로는 모든 생성자를 Private 으로 숨기는 방법도 있다. (하위 클래스에서 super() 를 통해 상위 생성자를 호출해야 하므로)
필드의 final
- 생성자, 초기화 블럭 등 한번 값을 초기화하면 이후 값의 변경이 불가능하다.
메서드의 final
- final 로 지정된 메서드는 하위 클래스에서 재정의 할 수 없다.
- 클래스의 계층구도에서 final 메서드만 사용하게 된다.
final 키워드는 불변 클래스를 만들기 위한 중요한 방법이다. 이에 대해 정리했으니 아래를 참고하세요 !!!!
github.com/cmg1411/effectiveJava/blob/master/src/main/java/Day17/item17.md
Object 클래스
- JDK 기본 라이브러리 java.lang.Object 클래스를 말한다.
- 모든 클래스는 이 클래스를 상속하고 있으므로 모든 클래스에서 Object 클래스의 메서드를 사용 가능하고, 재정의 가능하다.
- 대표적인 메서드로는 equasl(), hashCode(), clone() 등이 있다.
effective java 3장 모든 객체의 공통 메서드에서 이 메서드들을 재정의할 때 주의점과 팁을 알려준다. 나는 이 공부를 한 지 얼마 되지 않아 Object 클래스의 상세 내용은 그 공부흔적으로 대체한다. 3장은 Day10 ~ 14 부분이다.
'WhiteShip Java Study : 자바 처음부터 멀리까지' 카테고리의 다른 글
패키지 (0) | 2021.02.02 |
---|---|
디스패치, 다이나믹 디스패치, 더블 디스패치 (2) | 2021.02.01 |
클래스 (0) | 2021.01.30 |
4주차) 과제 (0) | 2021.01.30 |
제어문 (0) | 2021.01.28 |