Java #7 - 상속, 오버라이드, Final (국비19일차)

 

 

오늘은 상속을 주로 공부할 것이다.

목차

1. 상속

2. 상속의 특징

    1. 생성자 메소드를 사용하면 자동으로 부모객체를 생성하면서 생성자 메소드가 호출된다.
    2. 접근제한자가 적용이 된다.
    3. super();
    4. 상속은 여러 번 가능하다. (그러나 여러 클래스를 동시에 하나의 클래스로 상속은 불가)

3. 오버라이드(Override)

    1. 기존기능을 완전히 바꾸는 형태
    2. 기존 기능을 유지하며 조금만 바꾸는 형태

4. 대학교 정보 제공 프로그램 예제

5.Final

 

 

 

 

 

1. 상속

 

 상속이란

흔히 다른 사람이 사망한 사람으로부터 그 권리와 의무의 일체를 이어받는 일을

말한다.

 

비슷하게 프로그래밍에서 상속은

어떤 클래스가 가지고 있는 메소드와 변수를 다른 클래스가 갖도록 하는 것이다.

이로써 코드의 재사용성을 높이고, 유지보수 편의성을 높이고,

가독성을 높이고, 코드의 양을 줄일 수 있다.

 

 

etc-image-0
etc-image-1

퍼스트와 세컨드 클래스를 위의 사진처럼 만들었다고 해보자.

First에는 int a라는 멤버변수가 있고

세컨드엔 아무것도 없다.

 

etc-image-2

그러나 메인함수에서

a라는 int형 멤버변수를 사용할 수 있다.

 

 

etc-image-3

그리고 세컨드 클래스에 본인만의 멤버변수를 추가할 수 있다.

etc-image-4

그러면

메인함수에서 First의 멤버변수뿐만 아니라

본인만의 멤버변수도 사용이 가능하다.

 

etc-image-5

 

그러나 객체지향은 멤버변수의 제어를 직접 하는 것을 권장하지는 않는다.

etc-image-6
etc-image-7

그렇기에 퍼스트와 세컨드 클래스에 출력하는 기능 메소드를 만든다.

 

etc-image-8

이런 식으로 메인함수에서 출력가능하다.

그러나 한 번에 출력하는 메소드가 있는 것이 더 합리적이고 효율적이라고 생각이 된다.

 

etc-image-9

 

그래서 show라는 메소드를 만들었다.

물론 a라는 변수를 사용가능하지만

객체지향에서는 객체의 멤버제어는 객체스스로 하도록 권장하며

a 변수를 가진 First객체가 스스로 출력하도록 요청하는 것이 좋다.

그래서 show라는 메소드 안에 

showFirst 메소드를 쓰고

Second 클래스 안에 있는 멤버변수 b를 출력하는 명령문을 써주면 된다.

 

 

 

etc-image-10

이제 멤버변수에 값을 한 번에 대입해 주는 메소드를 만들어보자.

지금까지 배운 문법을 사용하면

this.a / this.b를 사용해서 대입할 수 있다.

그러나 this는 Second 클래스를 의미하기에

this.a는 적합하지 않다.

물론 부모객체를 지칭하는 키워드 Super이라는 것이 있지만

객체지향이니 First가 직접 하도록 요청하는 게 좋다.

 

etc-image-11

그래서

퍼스트 클래스에선 멤버변수의 값을 입력하는 기능 메소드를 따로 만들어야 한다.

그리고 setMembers 메소드 안에 입력해 주면 끝

 

etc-image-12

이를 이용하면 메인함수엔 편하게 대입하고 출력이 가능해진다.

 

 

 

2. 상속의 특징

1. 생성자 메소드를 사용하면 자동으로 부모객체를 생성하면서 생성자 메소드가 호출된다.

etc-image-13

그래서 메인함수에서 Second 객체를 만들면

First 객체도 생성이 된다.

즉, super();라는 부모객체를 생성하는 생성자가 숨겨져 있는 것이다.

 

2. 접근제한자가 적용이 된다.

따라서 멤버변수를 다룰 때 주의해야 한다. (메소드를 통해 다룰 것 권장)

 

3. super();

어제 공부한 This();처럼 super();을 통해 상속해 준 클래스에 값을 넣을 수 있다.

etc-image-14

퍼스트 클래스에 생성자가 이렇게 있다고 하자.

etc-image-15

또 int a는 private이라서 세컨드 클래스에서 바로 대입이 불가한 상황이다.

이때 super(a);를 써서 값을 넣어줄 수 있다.

 

4. 상속은 여러 번 가능하다. (그러나 여러 클래스를 동시에 하나의 클래스로 상속은 불가)

퍼스트 클래스를 상속한 세컨드 클래스 외에도

t1 클래스에도 퍼스트를 상속할 수 있다.

그리고 상속받은 클래스인 Second 클래스를 상속한 Third 클래스를 만들 수 있다.

 

 

 

 

3. 오버라이드(Override)

 

'기존의 것을 무시하고 덮어쓰다.'의 의미를 가진다.

자바에서 메소드 오버라이딩이란, 

상속의 관계에 있는 클래스 간에 하위 클래스가

상위 클래스와 '완전 동일한 메소드'를 덮어쓴다는 의미이다. 

 

1. 기존기능을 완전히 바꾸는 형태

etc-image-16

이렇게 생긴 Robot이라는 클래스를 만들었다.

 

근데 이제 하늘을 나는 기능을 추가한 새로운 로봇 캐릭터를 만든 상황이다.

그러면 기존 것 + 새로운 기능만 추가해 주면 간단하게 생성이 가능하다.

즉, 우리가 배운 상속의 개념을 사용해 주면 된다.

 

etc-image-17

그런데 이렇게 코딩 후

flyrobot 객체를 만들어

move, attack, fly를 해보면 잘 작동하지만

하늘에서 '주먹 발사'하는 것은 이상하다.

 

이때, 수정하고 싶은 메소드를 덮어쓸 수 있는 것이 오버라이드이다.

etc-image-18

 

똑같은 메소드 명으로 메소드를 만들어주면

이젠 flyrobot은 공격할 때 

'미사일 발사'를 하게 되는 것이다.

 

 

2. 기존 기능을 유지하며 조금만 바꾸는 형태

 

etc-image-19

First 클래스의 모습이다.

private int형 변수를 가지고 있고 단순 출력 기능이 있다.

 

etc-image-20

First 클래스를 상속받은

Second 클래스이다.

private int 변수를 가지고 있다.

 

기존의 show 메소드는 first 클래스의

a변수만 출력하니 이를 개선하기 위해

override를 하였다.

 

이때 private멤버는 사용이 불가하니

super이라는 키워드를 사용해

First 클래스의 show() 메소드를 불러왔다.

그리고 출력문으로 변수 b를 출력하였다.

 

 

 

 

4. 대학교 정보 제공 프로그램 예제

 

etc-image-21

 

etc-image-22
클래스 다이어그램

 

 

 

etc-image-23

 

어떤 대학교의 정보제공 앱을 제작하려 한다.(회원가입 기능이 있는)

이때 회원의 종류는 4가지이다. 위의 사진처럼

일반, 학생, 교수, 근로학생이 있다.

 

그럼 이 4가지 종류가 각각 클래스를 가져야 한다.

 

etc-image-24
일반회원 클래스

우선 Person 클래스는 다음과 같이 만들 수 있다.

 

한 가지 팁을 주자면

생성자는 적어도 2개는 만드는 게 좋다고 한다.

파라미터가 아무것도 없는 생성자와

파라미터가 다 있는 생성자!

 

이렇게 일반회원 클래스를 다 만들었으니

이를 상속시켜 학생과 교수 클래스를 만들 수 있다.

 

etc-image-25
학생회원 클래스

 

 

 

 

그런데 매번 클래스를 만들고 extends를 쓰는 게 귀찮을 수 있다. 

이땐 클래스 만들 때 설정을 바꿔주면 된다.

etc-image-26

이렇게 이름을 작성하고

Superclass에서 Browse를 눌러서 Super을 검색해서 찾아주면 된다.

 

etc-image-27
교수 클래스

이런 형식으로 교수 클래스 역시

간단하게 만들 수 있다.

 

매개변수가 빈 생성자인 경우

super()를 주석한 이유는

이미 앞에 생략된 것이기 때문에 안 써도 되기 때문이다.

또 subject를 만들 때부터 초기화해서 굳이 쓸 필요가 없다.

 

etc-image-28

마지막으로 show메소드까지 오버라이드해주면

교수 클래스 역시 완성이다.

 

마지막으로 근로학생 클래스이다.

etc-image-29

클래스를 만들 때 

Which method stubs would you like to create?

라는 체크란에서

2번째 Constructors from sueprclass를

체크해 주면

 

etc-image-30

이렇게 생성자를 가져오게 된다.(너무.. 편리하다) 굳

 

etc-image-31
메소드 오버라이드 팁

그리고 이 역시 팁인데

메소드를 오버라이드 할 때

그 메소드 이름만 적고

컨트롤 + 스페이스를 누르면

위의 사진처럼 뜬다.

그때 엔터를 누르면

etc-image-32

이렇게 표시가 된다.!!!(편리)

 

etc-image-33

근로학생 클래스까지 완성

 

etc-image-34

이제 메인 함수로 돌아가

 

출력을 하면

etc-image-35

잘 출력이 된다.

 

 

 

 

5.Final

 

 

 

final 키워드는

변수, 메소드, 클래스에 붙일 수 있다.

 

final은 c언어로 치면

const와 같다.

 

즉 상수화를 시킬 수 있는 키워드이다.

 

etc-image-36
지역변수 final

우선 지역변수에 final을 붙이면 이 변수는 상수화가 된다.

처음 변수를 선언할 때 값을 초기화한 경우

그다음에 값을 절대 변경할 수 없다.

 

etc-image-37

자바의 특이한 점인데

바로 final을 붙일 때 값을 바로 초기화하지 않으면

그다음에 대입한 값으로 상수화 된다.

하지만 이 형태는 권장하지 않으니 쓰지 말자.

 

 

etc-image-38
멤버변수 final

멤버변수는 final을 쓸 때 값을 쓰지 않으면 에러가 난다.

(그리고 이 형태는 아까 말한 대로 권장하지 않는다.)

 

etc-image-39

이렇게 바로 값을 초기화해줘야 한다.

 

etc-image-40

final 변수인 num 값을 바꾸려 하니

에러가 난다.

 

그리고 우리가 기억해야 할 것이 있다.

etc-image-41

상수는 스네이크 표기법을 사용한다.

(협업과 가독성등을 생각했을 때 꼭 필요하다)

 

etc-image-42

다시 돌아와서

매개변수에서도 final을 쓸 수 있다.

매개변수로 받은 값을

가공할 수 있으나,

이를 개발자가 의도적으로 막기 위한 방법이다.

 

 

etc-image-43
static final

그리고 static변수에도 사용이 가능하다.

 

etc-image-44
메소드에 final

그럼 메소드에 final이 들어가면 어떻게 될까?

바로 오버라이드를 하지 못하게 하는 것이다.

이 기능이 마지막이니 개선하지 말라는 소리이기도 하다.

 

etc-image-45

show메소드를 오버라이드하려고 했더니 

위의 사진처럼 빨간색으로 표시가 뜨며

void show() { }를 입력해도 에러가 난다.

 

그럼 클래스엔 어떻게 적용될까?

etc-image-46
클래스 final

final이 마지막이란 의미를 고려했을 때

클래스에 적용시키면

상속이 불가능한 클래스가 된다.

 

etc-image-47

이렇게 생긴 final 클래스가 있다고 가정하자.

etc-image-48

이를 다른 클래스에서 상속하려 하자 에러가 난다.

 

 

즉, final 키워드는

더 이상 무언가를 이어지지 않게 할 때 쓰는 것이다.