자바 스터디 6주차 : 상속

hwanse·2021년 2월 9일
0

Java

목록 보기
7/14

이 글은 백기선님의 라이브 스터디 참여 및 학습 내용에 관한 정리한 글입니다.





학습 목표

  1. 자바 상속의 특징
  2. super 키워드
  3. 메소드 오버라이딩
  4. 다이나믹 메소드 디스 패치(Dynamic Method Dispatch)
  5. 추상 클래스
  6. final 키워드
  7. Object 클래스



자바 상속의 특징

자바에서 상속이란 클래스가 다른 클래스에서 파생 될 수 있어 해당 클래스의 필드 및 메소드를 상속받아 사용이 가능한 것이다. 예로 들어 과일에 종류로는 사과, 오렌지, 포도 등등이 있다. 여기서 사과, 오렌지, 포도 모두 '과일'이라는 공통의 관심사가 있다. 자바는 이러한 공통의 관심사를 다른 클래스에서 사용이 가능하고 이를 클래스의 '상속'이라고 표현한다.
오라클 java 공식 문서에서는 다음과 같이 표현한다.

In the Java language, classes can be derived from other classes, thereby inheriting fields and methods from those classes. (Java 에서 클래스는 다른 클래스에서 파생될 수 있으므로 해당 클래스의 필드와 메소드를 상속할 수 있다.)

  • 상속은 하나만 가능하다
  • Object를 제외한 모든 클래스들은 암묵적으로 Object의 자식 클래스다
  • Multi-Level에 상속이 가능하다 ( A클래스 -> B클래스(A를 상속) -> C클래스(B를 상속) )

Super 키워드

super 키워드를 통해서 부모 클래스의 생성자나 메소드를 호출할 수 있다. 부모 생성자를 호출하는 경우에는 Constructor chanining 이라 명칭한다. 또한 자식 클래스의 생성자에서 super()(부모 클래스의 기본 생성자) 를 기술하지 않으면 컴파일러가 실행 시 부모 클래스의 기본 생성자를 호출하도록 코드를 자동으로 삽입해준다. 이 때, 주의할 점은 부모 클래스의 기본 생성자가 없을 경우 컴파일 에러가 발생하게 된다.


메소드 오버라이딩

오버라이딩이란 상속 관계에 있는 부모 클래스의 메소드를 자식 클래스에서 다시 재정의하는 것을 말한다. 자식 클래스는 부모 클래스의 private 메소드를 제외한 모든 메소드를 상속 받을 수 있다.

  • 부모 클래스의 메소드의 선언부를 재정의할 수 없다.
  • 부모 클래스의 메소드보다 더 큰 범위의 Exception 선언은 불가하다.
  • 부모 클래스의 접근 제어자보다 더 좁은 범위의 접근 제어자로 변경이 불가하다.


다이나믹 메소드 디스패치

재정의 된 메소드에 대한 호출을 컴파일 시점이 아닌 런타임시점으로 미루는 것을 말한다. 이 말이 무슨 뜻인가하면 자바의 다형성을 위해서 컴파일 시점에서 객체가 실제 실행할 메소드를 알 수 없기 때문에 런타임 시점에서 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 + " 이건 일반 메소드"); 
  }

특징

  • 추상 클래스는 new 연산자를 사용해 객체 생성이 불가하다.
  • 추상 클래스(부모)는 다른 클래스들(자식)과의 상속 관계로 놓이게 된다.
  • 일반 클래스의 필드와 메소드를 통일하는 기준이 되어 클래스 작성에 대한 시간이 절약이 가능하고 중복 코드를 생산할 필요가 없어진다.

final 키워드

final 키워드는 클래스, 메소드, 변수에 적용이 가능하며 각각 다른 효과를 낸다.

  • final class
    • 이 클래스는 상속이 불가하다
  • final method
    • 오버라이딩이 불가하다
  • final 변수
    • 값이 변할 수 없다. 즉, 상수 값
    • 인스턴스 변수, static으로 선언된 전역 변수와 같은 클래스 변수들은 선언과 함께 값을 지정해야한다.
    • 반드시 초기화를 해주어야 한다.

Object 클래스

모든 클래스들의 암묵적인 부모 클래스. 자바의 모든 클래스는 별도로 extends 키워드를 통해 Object 클래스를 상속 명시를 하지 않아도 이미 암묵적으로 상속이 된 것이며 Object 클래스의 모든 멤버를 자유롭게 어느 곳에서든 사용이 가능하다. 자바 모든 객체에서 toString(), equals(), clone() 같은 메소드를 사용할 수 있는 이유가 바로 Object의 멤버 메소드이기 때문이다.




참고

profile
만사가 귀찮은 ISFP가 쓰는 학습 블로그

0개의 댓글