일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- ruby
- S&P
- 셀트리온
- android
- 국제유가
- 안드로이드
- 어학·외국어
- 주식시황
- 시황
- Intent
- 네마녀의날
- 사드보복완화
- 트럼프
- LG전자
- 다우산업
- 다우
- toeice-mail
- 파이썬
- dataframe
- Python
- englishwriting
- 토익이메일
- 나스닥
- 영어메일
- 무역전쟁
- Java
- e-mailwriting
- 화승엔터프라이즈
- 영어메일쓰기
- 금리인상
- Today
- Total
Developer MJ Story
[Java/Thread] Thread를 구현하는 두 가지 방식 extends vs implements 뭐가 더 좋은가? 본문
[Java/Thread] Thread를 구현하는 두 가지 방식 extends vs implements 뭐가 더 좋은가?
집근처 2014. 7. 23. 20:57Thread를 구현 방법은 두 가지가 있습니다. 첫 번째는 상속 받아 구현하는 것이고, 두 번째는 인터페이스로 구현하는 것입니다.
하는 일과 결과 물이 똑같은데 뭐가 다른 것인가?? 뭐가 더 좋은 거지?? 라고 한 번쯤? 고민해 보신 분들이 있을 것이라고 생각합니다.
결과부터 말씀 드리면 implements로 구현하는 것이 더 좋다!? 라는 지극히 개인적인 결론을 얻었습니다.
왜 그런지 이제부터 설명하겠습니다.
- Extends (white-box)
먼저 구현 소스부터 보시겠습니다.
class ExtendsThread extends Thread {
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
System.out.println("Thread 클레스 상속!");
}
}
간단한 내용이니 설명은 하지 않겠습니다.
Thread를 extends 상속받아서 구현 한 것을 디자인 패턴에서는 white-box라고 합니다.
그 유명한 GOF의 디자인 패턴 얘기입니다.
왜 white-box일까요?
Super class의 속을 다 볼 수 있기 때문에 white box라고 합니다.
정말 간단하죠? 매우 직관적입니다.ㅋ 그래야 이해하기 쉽기 때문이겠죠?ㅋ
- Implements(Black-Box)
이것도 구현 소스 먼저 보시겠습니다.
class RunnableThread implements Runnable{
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("Thread 인터페이스!");
}
}
이것도 간단한 내용이니 설명은 하지 않겠습니다.
인터페이스로 구현한 방법은 GOF 디자인 패턴에서는 Black-Box라고 합니다.
이유는 interface의 실체를 확인 할 수 없기 때문입니다.
이제부터 왜 implements로 구현하는 방법이 좋은지 설명해 드리겠습니다.
첫 번째는 super class의 변경이 있을 경우 상속(extends)로 구현한 경우 하위 class도 변경을 해야 합니다.
물론 Thread class 가 변경 될 가능성은 매우 낮지만 만약, 변경이 사항이 생길 경우…..Orz
엄청난 issue가 발생하여, Thread class를 상속 받아서 구현한 코드 전부를 수정해야 하는 hell gate가 열릴 수도 있습니다.
두 번째는 시스템의 유연성 측면입니다.
상속 받은 class는 compile시점에서 class가 fix 되어 버리기 때문에 runtime 도중에 수정이 불가 합니다.
이런 일이 얼마나 많겠냐! 라고 생각할 수 있지만, issue를 줄일 수 있는 방안이라면 만에 하나도 없애는 것이 맞다고 생각합니다.
세 번째는 유지보수 및 확장성 측면입니다.
implements로 구현된 class는 유지보수가 매우 쉽다고 알려져 있습니다.
반면, 상속 받은 class는 상속을 하게끔 만든 개발자라면 편할 수 있지만, 아니라면 원작자의 의도를 파악하여 코드 수정을 해야 하기 때문에 쉬운 작업은 아니라고 생각합니다.
크게 세 가지의 이유를 생각해 봤습니다.
제가 적은 말이 무조건 맞다가 아니라 저는 이렇게 생각한다 입니다.
마지막으로 GOF의 디자인 패턴의 명언? 하나 적고 포스팅을 마치겠습니다.
Favor object composition over class inheritance
객체 composition(implements)가 상속보다 좋은 방법이다.
'Software > Java' 카테고리의 다른 글
[Java] Comparator를 이용해 정렬 Sort (0) | 2017.06.28 |
---|---|
[Java/Android] &, &&, |, || 연산에 대한 모든것과 활용 방안 (0) | 2016.02.18 |
[Java/Thread] Java Thread 바로 종료 시키기 – interrupt() (0) | 2014.07.22 |
[Java/Excel POI] POI apache cell 서식 적용 하는 방법 (1) | 2014.07.16 |
[Java/Arrays] java Arrays class를 활용한 object 정렬(sorting) (0) | 2014.07.10 |