심심한잉여의 잡동사니

JAVA - OOP 상속 본문

코딩일기/Java

JAVA - OOP 상속

심심한잉여 2021. 8. 22. 23:56
반응형

OOP - 상속

상속은 다른 클래스가 가지고 있는 멤버(필드, 메소드)들을 새로 작성할 클래스에서
다시 생성하지 않고 다른 클래스에서 가져와 새로운 클래스에서
사용할 수 있도록 가져오는 기능입니다.

상속의 목적은 클래스의 재사용과 연관된 클래스들의 공통적인 규약을 정의하는 것

상속의 장점
1. 보다 적은 양의 코드로 새로운 클래스를 작성가능
2. 공통적인 코드들에 대해 기능의 수정이나 추가, 보수가 용이
3. 코드의 중복을 제거하여 프로그램의 생산성/유지보수에 기여


Is a 상속

자식클래스 is 부모클래스 라는  뜻

즉 위 그림으로 나타내면
학생 is 사람
사과 is 과일
토끼 is 동물
이라는 뜻이며 이러한 상관관계로 부모와 자식클래스를 나눌 수 있다.

토끼말고도 코끼리, 사자 등등 동물이라는 개념이 공통적이므로 동물이라는 부모클래스에
토끼, 코끼리 사자 등의 자식클래스가 있다 라는 개념의 뜻이다.


Has a 상속

자식클래스는 부모클래스에 포함된다 라는 뜻

즉 위 그림으로 나타내면
책상은 교실에 포함되어 있다.
나무는 숲에 포함되어 있다.
핸드폰은 사람에 포함되어 있다.
라는 뜻이며 독립체(자식)클래스, 통제(부모)클래스로 나뉜다.

사람이 핸드폰을 가지고 있다라는 개념이며 그 외의 물건들에도 사람인 부모클래스가 가지고 있다
라는 개념으로 사용할 수 있다.


상속의 특징은
1. 모든 클래스는 Object클래스의 후손
Object클래스가 제공하는 메소드를 오버라이딩하여 메소드 재구현이 가능하다.
ex) java.lang.String 클래스의 equals()와 toString()을 구현 가능하다.

2. 부모클래스의 생성자, 초기화 블록은 상속 안됨
자식 클래스 생성자 안에 부모클래스 생성자를 super()를 통해 호출이 가능하며
호출 시 부모클래스 생성자가 먼저 실행된다.
따라서 모든 내용보다 super()를 먼저 사용하는 것이 옳다.

3. 부모의 private멤버는 상속은 되지만 직접 접근은 불가능하다.
자식 객체 생성 시 부모의 필드값도 전달 받은 경우,
자식 생성자 안에서 부모의 private 필드에 직접 접근하여 대입이 불가능하다.
따라서 super()를 통해 부모 생성자를 이용하여 값을 넘겨 생성하거나
super().set 혹은 get을 이용하여 접근해야 한다.


오버라이딩

자식클래스가 상속 받은 부모 메소드를 재작성 하는 것
부모가 제공하는 기능을 후손이 일부 고쳐 사용하겠다는 의미로
자식 객체를 통한 실행 시 후손 것이 우선권을 가짐

특징
1. 메소드 헤드라인 위에 반드시 Annotation, @Override 표시
2. 접근 제어자를 부모 것보다 같거나 넓은 범위로 변경 가능
3. 부모 메소드의 예외처리 클래스 처리범위보다 좁은 범위로 예외처리 클래스 수정 가능

성립 조건
- 메소드 이름 동일
- 매개변수의 개수, 타입 동일
- 리턴 타입 동일
- 접근제한자는 부모클래스의 메소드와 같거나 더 넓은 범위
- 예외 발생시 같은 예외 형식이거나, 더 구체적인 예외형식
- private 메소드 오버라이딩 불가
- final 메소드 오버라이딩 불가


super()와 super.

super는 부모를 뜻함 따라서, super()는 부모생성자를 뜻하며 이를 호출하는 메소드이다.
매개변수가 없는 생성자를 원하면 super()를
매개변수가 있는 생성자를 원하면 super(매개변수)를 사용하면 된다.

super.
상속을 통한 자식 클래스 정의 시 해당 자식클래스의 부모객체를 가리키는 참조변수로 자식 클래스 내에서 부모 클래스 객체에 접근 할 때 사용


final 예약어

final 예약어는 변수에 사용하면 상수(변경불가능)한 값이 되는 예약어이다.
이는 이전 시간에 배웠지만 클래스나 메소드에 들어가면 어떻게 되는지에 대해 지금 설명하겠다.

final + 클래스
final이 클래스에 붙으면 상속이 불가능한 클래스가 된다.

final + 메소드
final이 메소드에 붙으면 오버라이딩이 불가능한 클래스가 된다.

유의사항은 오버라이딩이 필요한 abstact의 예약어와는 반대되는 개념을 가졌으므로 함께 사용이 불가하다.


실습 - 깃허브 : https://github.com/thyum3891/kh_java_study/commit/6f0e6c886a5764a089acde95ff8ebbd670d842d0


마치며, 상속에 대해 배우면서 앞으로 중복되는 클래스 내용을 어떻게 정리하는지 배웠으며 이를 통해 새로운 클래스를 만들기 많이 편해질 것을 느꼇다. 하지만 오버라이딩에 대해 어느정도 알 것 같지만 다소 부족한 것 같아 지속적인 공부가 필요할 것으로 보인다.

반응형

'코딩일기 > Java' 카테고리의 다른 글

JAVA - 기본 API  (0) 2021.08.29
JAVA - 다형성  (0) 2021.08.23
JAVA - 객체 배열  (0) 2021.08.20
JAVA - OOP 객체 지향 프로그래밍  (0) 2021.08.18
JAVA - 2차원 배열  (0) 2021.08.16