상세 컨텐츠

본문 제목

[JAVA] 자바 _상속(inheritance)제대로 파고들기!!

java_자바

by 쫑메이 2020. 6. 28. 00:38

본문

 

 

 

 

 

 

 

 

 

 


 

 

 

 

 

 

도대체 프로그램 언어인 자바가

상속이란 개념을 왜 쓰는 것일까?

우리가 알고 있는 부모가 자식에서 재산을 물려주는 것 같이 

자바에서도 그런 모티브가 그대로 적용되다니

한 번 살펴보자~

 

 

 

 


 

 

자바에서 상속(Inheritance)이 뭐길래..

 


 

 

 

상속은 객체지향 프로그래밍의 4개의 개념 중에

Inheritance(상속)에 해당하는 아주 중요한 개념

 

 

 


 

 

실생활에 상속은 부모의 재산을 물려받는 것이다.

상속을 받으면 부모가 이룬 모든 것을 물려받을 수 있다

프로그램에서 상속은 기존의 클래스의 재산을 다른 클래스에서 재사용하기 위한 것이다.

여기서 재산이란 기존 클래스의 멤버 변수와 메서드를 말한다

 

 


 

상속관계에서 물려주는 클래스는 조상 클래스 부모 클래스, 상위 클래스 슈퍼클래스

상속받는 쪽을 자식 클래스, 자손클래스, 하위 클래스, 서브클래스

 

 

 

 

 

 

도표: 상속관계

화살표 방향 주의 :화살표를 받은 게 부모 클래스, 하위-> 상위

 

 

 

 

 

 

 

 

상속_적용 기본 문법

 


 

< 상속 적용 기본 문법 >

class 서브 클래스명 extends 슈퍼 클래스명 { }

 

 

<예>

class child class_nameextendssuper class_name

 

 

 

 

 

 

 

 

 

<예제 설명>

상속을 하고 나서 내 클래스 인스턴스 생성만 하고서 바로 별다른 선언 없이

바로 부모 클래스를 갖다 쓸 수 있다.

이는 마치 내가 별다른 노력 안 해도 부모가 물려준 재산을 쓰는 것과 같다

 

 

부모가 가진 것에서 내 것을 추가해서 확장시켜나가서 extends를 쓴다

할아버지가 가진 것은 2개(변수, 메서드),

하지만 아버지가 할아버지를 상속해서 아버지 인스턴스로 접근 가능한 변수 및 메서드는 4개,

또 내가 아버지 것을 상속받아서 총 6개의 접근 가능한 변수 및 메서드를 사용할 수 있다

 

 

 

 

 

 

 

 

 

 

 

 

상속_ 특징

 


 

1) 슈퍼클래스의 멤버 (변수 및 메서드)를 서브 클래스에서 물려받아 선언 없이 사용하는 것

 

2) 상속을 적용하기 위해서는 서브 클래스 정의 시 서브 클래스명 뒤에 extends 키워드를 사용하여

슈퍼클래스의 이름을 지정해야 함

 

 

 

 

 

 

 

 

 

상속을 쓰면 왜  좋을까?


 

1) 코드 절감 효과

2) 유지 보수성 향상

 

 

 

 

 

 

 

 

 

 

 

Object 클래스: 단군 격의 최상위 조상 클래스

 


 

 

상속받을 후속 슈퍼클래스를 정해주면 클래스 생성 단계에서 바로 임포트 불러서

 

자동으로 상속받게 된다

 

Object라는 것은 아주 중요한 클래스

 

왜? Object 클래스는 모든 클래스의 조상 클래스로 만약 클래스 선언에

 

명시적인 extends 선언이 없는 경우는 무조건 extends Object 코드가 생략된 것이다

 

 

 

 

 

 

 

상속과 관련한 접근 제한자

 


 

protected 다른 패키지의 자손 클래스: 상속관계에 있는 다른 서브 클래스까지 허용한다

남이 볼 때는 private인데, 

결혼한 내 여동생은 친정집 김치냉장고의 김치를 가져갈 수 있는 것처럼

상속한 자손 클래스에서는 접근이 가능하다. 

 


 

접근의 적용 가능 범위가 넓은 것부터 순서대로 배열하면..

private <default <protected <public

 

Default value'에서 유래한 말로, 별도 설정을 하지 않은 '치기 값', 즉 '기본 설정값'을 의미한다.

 

 

 

 

 

 

정리하자면

 

 

접근 제한자란? 특정 멤버에 대한 접근 범위를 제한하는 키워드

클래스, 메서드, 멤버 변수에 사용 가능

 


<총 4가지 종류>

public: 모든 클래스에서 접근 가능

protected: 같은 패키지 또는 패키지가 달라도 상속 관계인 서브 클래스에서 접근 가능

default: 같은 패키지 내에서 접근 가능

private: 자신의 클래스 내에서만 접근 가능(외부 클래스에서 접근 불가)

 

 

 

 

 

 

 

 

 

 

 

상속에서 주의해야 할 상황


 

 

상속관계에 있더라도

인스턴스 생성하여 접근하게 되면 상속관계의 접근이 아닌 일반 클래스의 관계로 취급된다

 

인스턴스를 생성했을 때는 상속을 받으면 사용 가능한 protected가 상속과 상관없는 별개가 되어버려서

 

상속관계에 있는 protected는 오류 뜬다

 

 

 

 

public이 없으면 상속 자체가 안된다!!!!!!!

 

 

 

 

 

 

 

 

 

 

왜 힘들게 멤버를 만들어 놓고 또 사용할 수 없게 제한을 둘까?

 

 

객체지향은 실생활을 반영하니 실생활 비유를 들어보자

부모님도 사람이니 비밀(private이 있을 것이다.

 

그중 어떤 것은 가족들끼리는 공유되는 것(default)이 있을 것이고,

 

어떤 내용은 결혼한 자식에게까지 알려져도 되는 내용(protected)이 있다.

 

또 어떤 것은 세상 모든 사람에게 알려도 되는 일이 있다.

 

 

 

 

 

 

 

 

 

상속에서 생성자

 


 

생성자 기본 생성문법= [접근 제한자] 클래스명(){ }

 

 

 

특징:

메서드와 달리 리턴 타입이 없으며, 생성자의 이름은 클래스명과 동일하게 작성

 

 

 

 

 

 

 

 

*상속에서 생성자


1) 상속관계에 있어서 부모의 생성자는 상속되지 않는다

즉 자식이 부모의 것을 상속받을 때, 부모의 생성자는 상속받지 않는다는 뜻

이유> 생성자의 이름은 클래스 이름을 사용하므로,

상속받은 생성자는 부모 클래스의 이름이 되어 생성자 규칙에 위배되기 때문이다.

 

 

 

 

 

 

 

 

 

 

2) 서브 클래스의 인스턴스를 생성할 때는 자동으로 슈퍼클래스의 인스턴스를 먼저 생성한 후

서브 클래스의 인스턴스가 생성된다. 자식이 있으려면 부모가 먼저 태어나는 것과 같은 이치다

서브 클래스의 인스턴스 생성시점에서 생성자를 호출하게 되면

슈퍼클래스의 인스턴스를 생성하기 위해 자동으로 슈퍼클래스의 생성자를 호출하게 됨

(기본적으로는 슈퍼클래스의 파라미터가 없는 기본 생성자를 호출)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

상속이란? 부모의 재산을 물려받는 것

실 생활을 반영한 프로그램 언어인

자바에서 역시 상속은 기존의 클래스의 멤버 변수와 메서드를

다른 클래스에서 재사용한다

 

상속을 하면 코드 절감 효과 및 유지 보수성에도 좋기 때문이다

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ㅣ읽느라 수고 많으셨어요~ㅣ

 


 

 

 

 

 

 

 


 

 

 

 

 

 

 

부족한 글을 읽어주셔서 감사드립니다

아직 부족한 게 많으니

틀린 곳이 있다면

조언의 말씀 꼭 부탁드립니다!!!!

 


 

반응형

관련글 더보기