이 글은 백기선님의 라이브 스터디 참여 및 학습 내용에 관한 정리한 글입니다.
자바에서 상속이란 클래스가 다른 클래스에서 파생 될 수 있어 해당 클래스의 필드 및 메소드를 상속받아 사용이 가능한 것이다. 예로 들어 과일에 종류로는 사과, 오렌지, 포도 등등이 있다. 여기서 사과, 오렌지, 포도 모두 '과일'이라는 공통의 관심사가 있다. 자바는 이러한 공통의 관심사를 다른 클래스에서 사용이 가능하고 이를 클래스의 '상속'이라고 표현한다.
오라클 java 공식 문서에서는 다음과 같이 표현한다.
In the Java language, classes can be derived from other classes, thereby inheriting fields and methods from those classes. (Java 에서 클래스는 다른 클래스에서 파생될 수 있으므로 해당 클래스의 필드와 메소드를 상속할 수 있다.)
super 키워드를 통해서 부모 클래스의 생성자나 메소드를 호출할 수 있다. 부모 생성자를 호출하는 경우에는 Constructor chanining 이라 명칭한다. 또한 자식 클래스의 생성자에서 super()
(부모 클래스의 기본 생성자) 를 기술하지 않으면 컴파일러가 실행 시 부모 클래스의 기본 생성자를 호출하도록 코드를 자동으로 삽입해준다. 이 때, 주의할 점은 부모 클래스의 기본 생성자가 없을 경우 컴파일 에러가 발생하게 된다.
오버라이딩이란 상속 관계에 있는 부모 클래스의 메소드를 자식 클래스에서 다시 재정의하는 것을 말한다. 자식 클래스는 부모 클래스의 private 메소드를 제외한 모든 메소드를 상속 받을 수 있다.
재정의 된 메소드에 대한 호출을 컴파일 시점이 아닌 런타임시점으로 미루는 것을 말한다. 이 말이 무슨 뜻인가하면 자바의 다형성을 위해서 컴파일 시점에서 객체가 실제 실행할 메소드를 알 수 없기 때문에 런타임 시점에서 Dynamic하게 호출할 메소드를 결정하는 것을 말하는 것이다.
class A {
public void run() {
System.out.println("A 클래스 run");
}
}
class B extends A {
@Override
public void run() {
System.out.println("B 클래스 run");
}
}
class Test {
public static void main(String[] args) {
A parent = new A();
A child = new B();
parent.run(); // A 클래스 run 출력
child.run(); // B 클래스 run 출력
}
}
이것이 가능한 이유는 다이나믹 메소드 디스패치가 적용되었기 때문이며, 참조변수 child의 타입은 A 타입이지만 실제 객체는 B 객체를 대입해주고 A의 자식 클래스이기 때문에 다형성이 적용되어 A 타입으로 감추는 것이 가능하다.
추상 클래스는 추상적인 클래스를 말한다. 하나 이상의 추상 메소드를 포함하는 클래스는 추상 클래스가 되는 것이며, 이 추상 클래스를 상속받는 모든 자식 클래스들에서는 이 추상 메소드를 반드시 재정의가 필요하다.
abstract class A {
abstract void run(); // 메소드의 구현부가 없다.
public void running(int x) { // 이와 같이 일반 메소드 구현 또한 가능하다
System.out.println(x + " 이건 일반 메소드");
}
특징
final 키워드는 클래스, 메소드, 변수에 적용이 가능하며 각각 다른 효과를 낸다.
모든 클래스들의 암묵적인 부모 클래스. 자바의 모든 클래스는 별도로 extends 키워드를 통해 Object 클래스를 상속 명시를 하지 않아도 이미 암묵적으로 상속이 된 것이며 Object 클래스의 모든 멤버를 자유롭게 어느 곳에서든 사용이 가능하다. 자바 모든 객체에서 toString(), equals(), clone() 같은 메소드를 사용할 수 있는 이유가 바로 Object의 멤버 메소드이기 때문이다.