[자바/Java]상속이란?

resilient

·

2020. 12. 23. 17:31

728x90
반응형

https://github.com/whiteship/live-study

 

whiteship/live-study

온라인 스터디. Contribute to whiteship/live-study development by creating an account on GitHub.

github.com

목표

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

학습할 것 (필수)

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

마감일시

2020년 12월 26일 토요일 오후 1시까지.


#자바 상속의 특징

 

상속이란 기존의 클래스를 재사용해서 새로운 클래스를 작성하는 것이다. 상속을 통해서 클래스를 작성하면 보다 적은 양의 코드로 새로운 클래스를 작성할 수 있고, 코드를 공통적으로 관리할 수 있기 때문에 코드의 추가 및 변경이 매우 편해진다. 

코드의 재사용성을 높이고 코드의 중복을 제거하여 프로그램의 생산성과 유지보수가 편리해진다. 

간단한 예시

이렇게  작성하고자 하는 클래스의 이름(Main) 뒤에 상속받고자 하는 클래스의 이름(Card)을  extends 키워드와 함께 써주면 상속을 구현할 수 있다. 상속해주는 클래스를 '부모클래스'라고 하고 상속을 받는 클래스를 '자식클래스'라고 한다. 

 

자식클래스는 부모클래스의 모든 '멤버' 를 상속 받으므로 항상 조상 클래스보다 같거나 많은 멤버를 갖는다.   

 

#super키워드     

 

this()와 마찬가지로 super() 역시 생성자이다. super()은 부모 클래스의 생성자를 호출하는데에 사용된다. 

자식 클래스의 인스턴스를 생성하면, 자식의 멤버와 부모의 멤버가 모두 합쳐진 하나의 인스턴스가 생성된다.

그래서 자식클래스의 인스턴스가 조상클래스의 멤버들을 사용할 수 있는 것이다.

생성자의 첫 줄에서 부모 클래스의 생성자를 호출해야하는 이유는 자식 클래스의 멤버가 부모 클래스의 멤버를 사용할 수도 있으므로 부모 클래스의 멤버들이 먼저 초기화되어 있어야 하기 때문이다.

 

최고 부모 클래스인 Object클래스를 제외한 모든 클래스의 생성자는 첫 줄에 반드시 자신의 다른 생성자 또는 조상의 생성자를 호출해야 한다.  그렇지 않으면 컴파일러는 super(); 를 자동적으로 추가한다. (과제#5에 있는 예시문 참고)

 

#메소드 오버라이딩

 

오버라이딩은 부모 클래스로부터 상속받은 메소드의 내용을 변경, 또는 덮어쓰는(Override) 하는 것을 의미한다. 

(새로운 메소드를  추가하는 작업은 오버로딩(Overloading)이라고 한다.)   

getLocation을 오버라이딩.

자식 클래스에서 오버라이딩의 조건은

1. 이름이 같아야하고

2. 매개변수가 같아야 하고

3. 반환타입이 같아야 한다.     

4. 접근 제어자를 부모 클래스의 메소드보다 좁은 범위로 변경할 수 없다.

5. 부모 클래스의 메소드보다 많이 선언할 수 없다.

6. 인스턴스메소드를 static메소드로 또는 그 반대로 변경할 수 없다.       

 

#다이나믹 메소드 디스패치 (Dynamic Method Dispatch)(..좀더공부..)

 

자바에서 디스패치(Dispatch) 는 '프로그램에서 어떤 메소드를 이용하여 호출할 것인가'를 결정하는 과정 이다.

디스패치 과정은 크게 두가지로 나뉜다.

  • Static Dispatch 프로그램이 컴파일 시점에 알 수 있다. (ex) 오버 로딩) 
  • Dynamic Dispatch 프로그램이 컴파일 시점에 알 수 없고, 특정 메소드나 함수 구현이 프로그램의 런타임에 결정된다. (ex) 오버라이딩)

#추상 클래스

 

추상 클래스의 장점은

  • 상속을 통해 중복되는 코드를 줄여 효율적인 프로그래밍이 가능하다.
  • 자식 클래스를 그룹화 해서 관리할 수 있다.
  • 실존하지 않는 객체의 직접 생성을 사전에 차단하여 실수를 방지할 수 있다. 

클래스를 틀에 비유한다면, 추상클래스는 미완성 틀에 비유할 수 있다.

추상클래스 자체로는 클래스로서의 역할을 다 못하지만, 새로운 클래스를 작성하는데 있어서 바탕이 되는 부모 클래스로서의 의미를 가질 수 있다.

추상클래스는 키워드 abstract 를 class앞에 붙여주기만 하면된다.

클래스의 선언부에서 abstract를 보고 '이 클래스는 추상메소드가 있으니까 상속을 통해 구현해줘야 한다' 고

생각할 수 있다.

 

추상(象)

여러 가지 사물이나 개념에서 공통되는 특성이나 속성 따위를 추출하여 일반적인 개념으로 파악하는 작용.

 

추상 클래스를 만드는 것은 기존 클래스의 공통부분을 뽑아내서 부모 클래스를 만드는 것이라고 할 수 있다.

추상 클래스를 받는 자식 클래스는 부모의 추상 메서드를 상황에 맞게 적절히 구현해줘야한다.

추상 클래스, 추상 메소드 예시

#final 키워드

 

final 키워드는 '마지막의' 또는 '변경 될 수 없는'의 의미를 가지고 있으며 거의 모든 대상에 사용될 수 있다.

final 키워드가 사용될 수 있는 대상 - 클래스,메소드,멤버변수,지역변수

 

  • final이 클래스에 적용될때 - 변경되거나 확장될 수 없는 클래스가 되기때문에 final로 지정된 클래스는 부모 클래스가 될 수 없다.
  • final이 메소드에 적용될때 - 변경될 수 없는 메소드가 되기 때문에 final로 지정된 메소드는 오버라이딩을 통해 재정의 될 수 없다.
  • final이 멤버변수 or 지역변수 에 적용될때 - 변수 앞에 final이 붙으면 값을 변경할 수 없는 상수가 된다.

 

#Object 클래스

 

Object 클래스는 모든 클래스 상속계층도의 최상위에 있는 부모 클래스이다.

어떠한 클래스에도 상속 받지 않는 모든 클래스들은 자동적으로 Object 클래스로 부터 상속받게 함으로써 이것을 가능하게 한다.

 

예시 처럼 AudioPlayer라고 class를 정의 하면 자연스럽게 오른쪽 사진의 노란색 부분처럼 Object로 부터 상속받는 것이다.

Object 클래스에는 toString(), equals() 등과 같은 모든 인스턴스가 가져야 할 기본적인 11개의 메소드가 정의되어 있고

유용하게 쓰인다.

 

 

# Reference

  • 자바의정석 (저자. 남궁성)
  • blog.naver.com/rrest00/221618109099

 

 

반응형