본문 바로가기
Programming/Java

[whiteship 온라인 스터디] 6주차 과제 - 상속

by 읽고 쓰는 개발자 2020. 12. 26.

github.com/whiteship/live-study/issues/6

 

6주차 과제: 상속 · Issue #6 · whiteship/live-study

목표 자바의 상속에 대해 학습하세요. 학습할 것 (필수) 자바 상속의 특징 super 키워드 메소드 오버라이딩 다이나믹 메소드 디스패치 (Dynamic Method Dispatch) 추상 클래스 final 키워드 Object 클래스 마

github.com

목표

자바의 상속에 대해 학습하세요.

학습할 것 (필수)

  • 자바 상속의 특징
  • super 키워드
  • 메소드 오버라이딩
  • 다이나믹 메소드 디스패치 (Dynamic Method Dispatch)
  • 추상 클래스
  • final 키워드
  • Object 클래스

1. 자바 상속의 특징 

이미지 출처 : https://kephilab.tistory.com/56

자바에서도 객체 지향 프로그램의 상속의 기본 개념처럼, 부모 클래스(상위 클래스)의 필드와 메소드를 자식 클래스( 하위 클래스, 파생 클래스)에서 물려받는 것을 상속(Inheritance)이라고 한다.

extends 키워드를 사용하여 부모 클래스를 상속 받는다.

public class ChildClass extends ParentClass {

}
  • 부모 클래스의 필드와 메소드 중 private 접근 제한을 갖는 프로퍼티는 상속에서 제외된다.
  • 만약, 부모와 자식 클래스가 같은 패키지가 아니라면 private + default 접근 제한 갖는 프로퍼티가 상속에서 제외된다.
  • 자식 클래스는 하나의 부모 클래스만 상속받을 수 있다.
  • 상속은 클래스의 수정을 최소화 시키고 효율성을 높여준다. 

 

2. super 키워드란?

  • 자식 클래스에서 부모 클래스 object를 즉시 참조할 때 사용하는 참조변수이다.
  • 자식 클래스 인스턴스가 생성될 때, 부모 클래스의 인스턴스 또한 내부적으로 생성된다. 그렇게 생성된 내부적 인스턴스를 참조할 때 사용하는 키워드이다.
  • 생성자에 super() 키워드를 사용하면 부모의 기본 생성자를 호출한다. (명시적으로 선언하지 않았더라도, 컴파일러가 자동으로 생성해준다.) 만약 부모의 특정 생성자를 호출하고 싶다면, 적절한 인자를 넣어주면 된다.
  • 메소드 오버라이딩 등으로 동명의 프로퍼티가 부모, 자식 클래스에 존재한다면, 부모 클래스의 프로퍼티에 접근하기 위해 super 키워드를 사용한다.

3. 메소드 오버라이딩 (메소드 재정의)

부모 클래스에 이미 정의되어 있는 메소드의 경우, 자식 클래스에서 사용하기 적합하지 않거나 추가적인 작업이 필요할 수 있다. 

상속된 일부 메소드를 자식 클래스에서 수정하여 사용할 수 있는 기능인 메소드 오버라이딩을 자바에서 제공한다. 

메소드 오버라이딩시 주의할 점 

  • 부모의 메소드와 동일한 시그너처(리턴 타입, 메소드 이름, 매개 변수 리스트)를 가져야 한다.
  • 접근 제한을 더 강하게 오버라이딩할 수 없다.
  • 새로운 예외(Exception)을 throws할 수 없다.

오버라이딩한 메소드의 경우, @Override 어노테이션을 붙여주면 컴파일러가 정확히 오버라이딩 되었는지 체크해준다.

 

4. 다이나믹 메소드 디스패치

Runtime polymorphism. "같은 클래스를 상속하고 있는 여러 클래스 중 어느 서브클래스를 사용할 것인가"를 런타임 시점까지 미룸으로서, 클래스 재사용성을 높이는 테크닉.

 

메소드 호출 과정 

  - receiver parameter

  - method reference를 통해 자식 클래스의 메소드 실행시킴

 

반대 개념 : static dispatch ( 컴파일 시점에서, 어떠한 클래스를 사용할지 컴파일러가 알고 있는 것)

출처 :defacto-standard.tistory.com/413

 

5. 추상 클래스

실체 클래스의 공통적인 특성을 추출하여 선언한 클래스

직접 클래스 생성 불가능. 부모 클래스로만 사용된다. ( new 연산자로 직접 생성자 호출 불가능)

 

추상 클래스의 용도 

  • 실체 클래스들의 공통된 필드와 메소드의 이름을 통일 
  • 실체 클래스를 작성할 때 시간 절약

+ 추상 클래스는 추상 메소드를 선언할 수 있다. 하위 클래스가 내용을 채우도록 강요하고 싶다면 추상 메소드 선언 가능

 

abstract 키워드로 추상 클래스를 선언한다.

public abstract class TestClass {

	// 추상 메소드 선언 가능
	public abstract void testMethod(); 

}

 

 

6. final 키워드

해당 선언이 최종 상태이고, 결코 수정될 수 없음을 의미 

선언 시 final 키워드 사용 가능한 경우  final 키워드의 의미 상속과의 관련
필드 초기값 설정 후 더 이상 값 변경 불가  
메소드 오버라이딩할 수 없는 메소드  상속과 관련 o
클래스 상속할 수 없는 클래스 
자식 클래스 생성 불가
ex) String 클래스 
상속과 관련 o

 

7. Object 클래스

자바의 모든 클래스는 Object의 자식/자속 클래스이다. Object class는 자바의 최상위 부모 클래스에 해당.

(만약 어떠한 클래스도 상속받지 않았다면, 암시적으로 java.lang.Object 클래스를 상속받게 된다)

 

Object 클래스의 특징

  • 필드가 없고, 메소드로만 이루어져 있다.
  • equals() 메소드 : 논리적 비교
  • hashCode() 메소드 : 해시값(객체를 식별할 하나의 정수값) 리턴 ( cf. 해시코드 비교 -> equals 메소드 비교  = 둘다 true여야 논리적 동등)
  • toString() : 객체의 문자 정보 리턴 ( default :  클래스명@16진수해시코드) 
  • clone() : 객체 복제. 참조 타입일 경우 번지 복사. 기본 타입일 경우 값 복사.
  • finalize() : 객체 소멸시 호출되는 메소드. 만약 소멸 시점에 실행하고 싶은 로직이 있다면 finalize 메소드를 재정의하여 사용하면 된다.

 

 

출처 : 이것이 자바다 (신용권 저)

 

 

 

+ 라이브 내용 정리

Visitor Pattern  (DOM / SAX parser) 

 - DOM : 모든 내용 메모리에 적재 ( 메모리 과도하게 사용) 

 - SAX  : 해당 내용만 확인 / 적재 가능 ( visitor ) 

 

Bytecode

  - InvokeVirtual 

  - InvokeSpecial

 

더블 디스패치