일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 깃허브 뱃지
- Redis
- GitHub profile
- visual studio code
- 파이썬 설치하기
- 알고리즘 입력받는 값
- 프라이탁 파이썬
- 깃허브 프로필
- Redisson
- 프라이탁
- 동등성
- spring-boot-starter-parent
- 깃허브 방문자
- 프라이탁 알림봇
- 리드미 꾸미기
- 깃허브 리드미 꾸미기
- maven 오류
- hashcode
- 신규 프로젝트 생성후 빌드시 오류
- 파이썬 pip
- 레디스
- 파이썬 설치
- pip업그레이드
- setting.xml
- Sanner와 BufferedReader의 차이점
- Visual Studio Code 파이썬
- 분산락
- 윈도우10에 파이썬 설치
- 깃허브
- 깃허브 리드미
- Today
- Total
yeo72.devlog
[JAVA] 상속과 포함관계 본문
객체지향프로그래밍(OOP) 의 특징 중 상속에 대해서 알아보고, 포함관계와 어떤 차이가 있는지 비교해 보겠습니다.
상속
상속이란 부모클래스로의 멤버를 자식클래스에서 사용 할 수 있는 것을 의미합니다.
자식클래스는 부모클래스의 멤버를 포함하여 더 많은 멤버를 가질수 있어 클래스를 확장 할 수있습니다.
이렇게 상속을 받으면 얻게 되는 장점은 무엇일까요?
바로 코드의 재사용성을 높일 수 있다는 것입니다.
Tv라는 클래스와 SmartTv라는 클래스가 있습니다.
class Tv {
int channel;
int volumn;
void on() {
System.out.println("Tv를 켭니다");
}
void off() {
System.out.println("Tv를 끕니다");
}
}
class SmartTv {
int channel;
int volumn;
void on() {
System.out.println("Tv를 켭니다");
}
void off() {
System.out.println("Tv를 끕니다");
}
void connectPhone() {
System.out.println("핸드폰과 연결합니다.");
}
}
위의 코드를 살펴보면 Tv클래스와 SmartTv 클래스에서는 동일한 멤버가 있습니다.
바로 channel, volumn, on(), off() 입니다.
Tv는 SmartTv보다 더 작은 수의 멤버를 가지고 있습니다. 이럴때 상속을 받게 된다면 아래의 코드로 간단하게 작성 할 수 있습니다.
class SmartTv extends Tv{
void connectPhone() {
System.out.println("핸드폰과 연결합니다.");
}
}
코드가 엄청 간결해 졌습니다.
이렇게 상속을 받게 되면, 공통적인 멤버를 하나의 클래스에서 관리하기때문에 유지보수에 용이하다는 장점이 있습니다.
다중상속? 단일상속?
그러면 여러개의 부모를 상속 받는것이 가능할까요?
C나 C++에서는 다중상속을 허용하고있으나, java에서는 단일 상속만 허용하고 있습니다.
여러 클래스에서 상속을 받게되면 복잡한 클래스를 작성하더라도 간단하게 작성할 수 있는 장점이 있습니다.
그렇지만 만약 2개의 부모 클래스에서 이름이 동일한 멤버를 상속받는다면,
자식 클래스가 해당 멤버를 사용할때 어떤 부모클래스의 멤버인지 알수 있는 방법이 있을까요?
만약 static 멤버라면 Class.멤버 를 사용하기 때문에 알수 있습니다.
그렇지만 인스턴스를 생성할 경우에는 어떤 부모클래스의 멤버인지 확인할 방법이 없습니다.
이러한 단점 때문에 자바에서는 단일 상속만 허용하고 있습니다.
포함관계
코드의 재사용성을 높일 수 있는 방법은 상속말고 포함관계도 있습니다.
포함관계는 클래스의 멤버변수로 다른 클래스 타입의 참조변수를 선언하는 것입니다.
class Circle {
int x;
int y;
int z;
}
class Point {
int x;
int y;
}
Circle, Point 두개의 클래스를 살펴보면 공통적으로 x, y 필드가 있는것을 볼 수 있습니다.
class Circle {
Point p = new Point();
int z;
}
이렇게 작성하면 보다 간결하고 손쉽게 클래스를 작성할 수 있고, 코드의 재사용도 용이합니다.
상속관계와 포함관계의 차이
그렇다면, 어떤 경우에 상속관계를 맺을지, 포함관계를 맺을지 의문이 들수 있습니다.
상속의 경우 A is a B. (A 는 B 이다.)
포함의 경우 A has a B. (A 는 B를 포함한다.)
위의 두 케이스를 한번 비교해서 어떤 관계가 더 명확한지 확인해보겠습니다.
- SmartTv 는 TV 이다.
- SmartTv 는 Tv를 포함하고 있다.
1번이 더 올바른 문장으로 보입니다. -> 상속관계를 맺어줍니다.
- Circle 은 Point 이다.
- Circle 은 Point 를 포함한다.
여기서는 2번이 더 올바른 문장으로 보입니다. -> 포함관계를 맺어줍니다.
실생활에서, 또는 업무에서는 어떻게 적용될까?
포함관계를 배우고 나서, 업무에서 어떤 방법을 써야 하는지 더 혼란스러워졌습니다.
업무에서 모듈API를 개발하는데 공통적인 모듈요소들을 묶어서 부모클래스로 만들어 주고,
나머지 모듈들은 해당 모듈을 상속받는 식으로 개발을 했습니다.
class Module {
private String sessionId;
private String columnName;
}
class RoundingModule extends Module{
private String roundType;
}
포함관계를 배우고 나서 다시 이 코드를 봤을때 아래처럼 변경해서 사용해도 될지 생각해보게 되었습니다.
class RoundingModule extends Module{
Module m = new Module();
private String roundType;
}
위의 경우에는 is a, has a 를 사용할 경우
- 라운딩 모듈은 모듈이다.
- 라운딩 모듈은 모듈을 포함한다.
어떤게 더 옳은 문장으로 보이나요?
저는 처음에 명확하게 구분하는게 힘들었습니다.
라운딩모듈은 모듈이기도 하고, 라운딩 모듈은 모듈을 포함하는것도 맞는거 같고..
모듈클래스에서 새로운 기능(roundType)이 포함된 새로운 클래스를 만드는 것이기 상속관계를 맺어 주었습니다.
기존의 클래스에 새로운 기능이 추가된 클래스를 만든다. -> 상속관계
즉, 기존의 클래스를 확장하여 새로운 클래스를 만드는것입니다.
추가로 상속은 단순히 클래스를 재사용하는 것이 아니라 객체지향의 특성중 하나인 다형성, 추상화와도 연관이 있기때문에
밀접한 관계끼리 사용해야 합니다.
그렇지만 포함관계는 단순히 클래스를 재사용 하는 것에 그치기때문에 현실세계의 대부분은 상속관계라기 보다는 포함관계라고 보면 됩니다.
'Study > Java' 카테고리의 다른 글
ArrayList와 LinkedList는 언제 쓰면 좋을까? (0) | 2023.11.05 |
---|---|
반복문(loop) 안에서 객체 생성과 성능 비교 (0) | 2023.10.18 |
[JAVA]JVM 동작원리 (0) | 2023.09.10 |
[Java]Scanner 와 BufferedReader의 차이 (0) | 2023.03.15 |
[Spring Cloud] Eureka server 와 Eureka Client 설정 - application yml (0) | 2023.03.14 |