본문 바로가기

TIL

[Java]상속(Inheritance)

728x90

학습 목표

  • 상위 클래스-하위 클래스의 상속 관계의 핵심을 이해하고, 그 장점을 설명할 수 있다.

상속이란 기존 클래스를 재활용하여 새로운 클래스를 작성하는 자바의 문법요소를 의미한다. 예를 들면 두 클래스를 상위클래스와 하위클래스로 나누어 상위 클래스의 멤버 (필드,메서드,이너클래스)를 하위클래스와 공유하는것을 의미한다. 여기서 우리는 이 두 클래스를 서로  상속 관계 있다고 하며 하위클래스는 상위 클래스가 가진 모든 멤버를 상속 받게된다. 따라서 하위 클래스의 멤버 갯수는 언제나 상위 클래스와 비교했을 때 같거나 많습니다 이러한 상위클래스 -하위 클래스의 관계를 부모관계로 표한하기도합니다.또한 클래스로부터 상속받았다라는 표현보다는 ~클래스로부터 확장되었다는 표현이 그 역할과 기능을  생각했을 때 더 적절한 표현입니다. 

왜 상속을 하는지 >> 상속을 통해 클래스를 작성하면 코드를 재사용하여 보다 적은 양의 코드로 새로운 클래스를 작성할 수 있어 코드의 중복을 제거할 수 있다. 또한 상속은 다형적 표현이 가능하다.

예를들면 40대 남성은 아버지이자 누군가에겐 아들이자 직장인이자 동료이자 친구이다 즉 하나의 객체가 여러 모양으로 표현될 수 있다는 것을 다형성이라고 말한다.

  • extends 키워드를 사용하여 두 개 이상의 클래스 간 상속 관계를 정의할 수 있다.

클래스를 상속할 때에는 extends키워드를 사용하며, 클래스명 다음에 extends 상위 클래스명 을 사용하여 정의합니다.

상위 클래스로부터 하위클래스가 확장되어 상위클래스에 있는 속성과 기능을 사용할수 있고 ,객체지향 프로그래밍에서는 단일상속만 허용한다.

  • 포함관계와 상속관계의 차이를 설명할 수 있다.

포함관계는 상속처럼 클래스를 재사용할수 있는 방법으로 클래스의 멤버로 다른 클래스 타입의 참조변수를 선언하는것을 의미한다.

객체지향 프로그래밍에서 상속보다는 포함관계를 사용하는 경우가 더많고 대다수가 그렇다.

클래스간의 관계를 설정하는데 있어서 상속관계를 맺어 줄것인지 포함관계를 맺어줄것인지 기준은 클래스 간의 관계가
"~은 ~이다(IS-A)"관계인지 "~은 ~을 가지고있다 (HAS-A)"관계인지 문장을 만들어 생각해보는것이다.

예를들어 재헌이는 address이다 라는문장은 성립하지 않는 반면, 재헌이는 address를 가지고있다는 어색하지않는 문장이므로 이경우엔 상속보단 포함관계가 적합하다.

반면 car클래스와 sportcar 클래스가 있을땐 sportcar는 car이다 라는문장이 자연스러우므로 car를 상위 클래스로 상속관계를 맺어주는것이 더 적합하다.

  • 상속 관계에서 사용할 수 있는 메서드 오버라이딩의 정의, 성립 조건, 장점을 이해하고 이를 활용할 수 있다.

메서드 오버라이딩은 상위 클래스로부터 상속받은 메서드와 동일한 이름의 메서드를 재정의하는것을 의미한다. Override의  사전적 의미가 "~위에 덮어쓰다"라는 의미이다.

메서드 오버라이딩을 사용할 때 세가지 조건을 만족시켜야한다

1.메서드 선언부(메서드 이름,매개변수,반환타입)가 상위 클래스의 그것과 완전히 일치해야한다.

2.접근제어자의 범위가 상위 클래스의 메서드보다 같거나 넓어야한다.

3.예외는 상위 클래스의 메서드보다 많이 선언할 수 없다.

오버라이딩의 장점으로는 코드를 줄일수있다.

  • super 와 super() 의 차이를 설명할 수 있다.

super 키워드는 사위 클래스의 객체, super()는 상위 클래스의 생성자를 호출하는것을 의미

공통적으로 모두 상위 클래스의 존재를 상정하며 상속 관계를 전제로 한다.

만약 super 키워드를 붙이지 않는다면, 자바 컴파일러의 해당 객체는 자신이 속한 인스턴스 객체의 멤버를 먼저참조하지만 super키워드를 사용하면 부모의 객체의 멤버값을 참고할수있다. 즉 상위 클래스의 멤버와 자신의 멤버를 구별하는데 사용된다는 점을 제외하면 this와 super는 기본적으로 같은것이라 말할수 있다.

- 즉 상속하지않으면 호출하지 않지만 상속함으로써 main메서드엔 student만 있지만 student안에있는 human도 실행이 된다. 

-this()와 마찬가지로 첫줄에 super()가 선언되어야함

  • Object 클래스가 자바 클래스의 상속계층도에서 최상단에 위치한다는 사실을 이해할 수 있다.

자바의 모든 클래스는 Object클래스로부터 확장된다.

자바 컴파일러는 컴파일링의 과정에서 다른 클래스로부터 아무런 상속을 받지 않는 클래스에 자동적으로 extend Obejct를 추가하여 오브젝트 클래스를 상속 받도록합니다. 

Object의 중요한 몇가지 메서드

메서드명반환 타입주요 내용

메서드명                                반환타입                         주요내용

toString() String 객체 정보를 문자열로 출력
equals(Object obj) boolean 등가 비교 연산(==)과 동일하게 스택 메모리값을 비교
hashCode() int 객체의 위치정보 관련. Hashtable 또는 HashMap에서 동일 객체여부 판단
wait() void 현재 쓰레드 일시정지
notify() void 일시정지 중인 쓰레드 재동작
728x90

'TIL' 카테고리의 다른 글

[Java]컬렉션  (0) 2022.09.14
[Java]캡슐화(Encapsulation)  (0) 2022.09.13
[Java]기초  (0) 2022.09.13
[Java]객체지향 기초  (0) 2022.09.12
느슨해진 마음가짐을 바로잡고자 시작하는 기록일지.  (0) 2022.09.07