상속(inheritance) extends

김지원·2022년 6월 1일
0

Java

목록 보기
25/38

상속(inheritance)

기존의 사용중인 클래스의 필드를 다른 클래스에서 계속 사용을 해야 한다면 상속을 받는다. 그렇게 되면 부모 클래스의 필드를 마치 자신의 것처럼 사용할 수 있다.

기존의 class 필드들을 내가 지금 만드는 곳에서 그대로 사용하고 싶을 때 상속 사용.
다중 상속은 불가능하다.

class A {
	A필드
}
class B extends A {
	A,B필드
}

A : 부모클래스, 상위 클래스, 수퍼클래스, 기반 클래스
B : 자식클래스, 하위 클래스, 서브 클래스, 파생 클래스

다중 상속이 되지 않는 이유
엄마클래스 아빠클래스 나클래스가 있다고 했을때 엄마,아빠 두 클래스를 상속받는다고 하자.
그러면 나클래스에 있는 money가 누구로 부터 상속을 받은지 모르기 때문에 막아놨기때문에 사용할 수 없다.

+추상클래스, 인터페이스를 알게되면 사용할 수 있게 된다.

상속 시 초기화 방법

부모 클래스로부터 상속받은 멤버 변수 접근 권한이 private일 때
1. 부모 클래스의 생성자를 호출해서 초기화 시킬 수 있다.
2. 부모 클래스에 setter메서드를 통해서 초기화 시킬 수 있다.
3. 변수에 저장된 값은 getter메서드를 통해서 가져온다.

부모 클래스로부터 상속받은 멤버 변수 접근 권한이 protected일 때 (크게 사용하지 않는다.)
1. 자식 클래스에서 접근이 가능하기 때문에 this를 사용해서 초기화 한다.
-상속을 받았다면 자식클래스에서 this.을 찍으면 부모의 필드들도 다 뜨며 사용가능하다.
2. 자식 클래스에서 접근이 가능하므로 getter메서드를 사용하지 않고 변수명으로 값에 직접 접근하면 된다.

자식 클래스의 생성자가 실행되기 전에 부모 클래스의 생성자가 먼저 실행된다.
실행할 부모 클래스의 생성자를 지정하지 않으면 부모 클래스의 기본 생성자가 자동으로 실행된다.
자동으로 입력되는 super( )를 지우더라도 자바 컴파일러가 자동으로 넣어준다.


재밌는 예로 상속을 이해해보자.
어느 핸드폰 개발자A가 있다.

2G phone
전화메서드
문자메서드  

3G phone
전화메서드
문자메서드
인터넷    


4G phone
전화메서드
문자메서드
인터넷
영상통화

5G phone
전화메서드
문자메서드
인터넷
영상통화
원격제어(빅데이터) 

2G에서 5G까지 개발이 되면서 상속을 몰랐던 개발자 A는 똑같은 작업을 반복적으로 해야만 했다. 반복되는 작업에 개발자A는 회사를 그만두기로 했다ㅎ
그렇다면...개발자A가 상속을 알았다면 회사를 그만두지 않고 계속 만들었지 않았을까?

상속은 이런 개념이다.
2G가 3G의 부모가 되고 4G는 3G의 자식이 된다.

2G에서 5G로 확장되는 것 : extends

keyword : extends - 상속

=> ex) 3G extends 2G 라고 쓴다.

< example >
Human class 부모클래스(수퍼클래스)

class Human {
	void eat( ) {
 
	}
	void sleep( ) {
 
	}
	void walk( ) {
		syso("두발로 걷습니다")
	}
}

Monkey class 자식클래스(서브클래스)

class Monkey extends Human {
	void walk( ) {
    	syso("네 발로 걷습니다.
    }
}

Monkey에서 Human을 상속받았다고 했을 때 walk를 들여다 보자.
원숭이는 네발로 걷을수도 있고 두발로 걸을 수도 있다.
그러면 Human클래스의 walk 메소드를 쓸 수 없게 되는 건가?
Monkey클래스에서 walk를 4발로 걸어다닐 수 있도록 해주는 아이가 있다.

OverRiding

부모 클래스 필드에서의 메서드 이름을
똑같이 자식클래스에서 선언하면 '재정의한다'라고 한다.
자식클래스에서 재정의 하는 걸 overRiding (덮어쓰기) 라고 한다.

상위 클래스의 메서드의 이름과 융례가 같은 함수를 하위클래스에 재정의 하는 것.

다형성에는 overriding과 overloading이 있다.
다형성에 관한 설명을 아래에..

Overriding VS Overloading

Overriding : 상속 관계에 있는 클래스 간에 같은 이름의 메서드를 정의하는 것.
Overloading : 두 메서드가 같은 이름을 가지고 있으나 인자의 수나 자료형이 다른 경우.

이 두개가 이름이 비슷해 자칫 헷갈릴 수 있다. 유의해서 이해할 것.

super( ); //부모클래스의 생성자


overriding, 코드를 통해 이해를 해보자
< example >

class A와 A를 상속받는 class B가 있다.
class A는 show메서드를 만들었고 기본생성자도 만들어 주었다.(ctrl + space + A )

class B는 A의 show를 상속받아서 마치 자신의 것처럼 사용할 수 있다.

main에서 호출해보았다.

< 결과 >

"부모 클래스 생성자" 부터 나오는 이유

new B() : 자식생성자를 사용하는 부분이다.
기본생성자 안에 부모생성자를 호출하는 super()가 자동으로 들어가 있기때문에 부모 클래스 생성자부터 먼저 호출이 된다.

그렇다면 상속받은 show메서드의 내용을 바꿀 순 없을까!
그때 사용하는게 오버라이드이다.

show() + ctrl + spacebar = overriding 자동입력키

A클래스를 상속받은 B클래스에서 show메서드를 오버라이드 해서 재정의 한 결과


다형성(polymorphism)

-실무 문제에서 많이 나온다.

다형성 : 다양한 형태의 성질을 띄고 있음.

다형성이란 하나의 메소드가 서로 다른 클래스에서 다양하게 실행 되는 것을 말한다.

다형성을 구현하기 위해서는 다형성을 구현할 메소드를 포함할 클래스에게 부모 클래스가 상속해 줘야 한다.
부모 클래스와 자식 클래스에 같은 이름의 메소드가 있어야 하고, 자식 클래스 에서는 재정의 해야한다.
따라서 다형성의 종류에는 오버로딩, 오버라이딩이 있다.
이름은 똑같지만 기능들이 다르다.

overriding과 overloading 헷갈리지말기..

0개의 댓글

관련 채용 정보