두번째 발표하는 날..!!
강의 날짜:4/18(금)
두번째는 덜 떨릴 줄 알았는데 전혀 아니였고 진짜로 도망가고 싶었다
주제: 상속과 포함 비교하며 이해하기
학습목표
- 상속과 포함의 정의
- 상속과 포함의 특징
- 상속과 포함의 차이점
상속의 정의
상속을 비유를 통해 이해하기
- '나'가 집에서 간장계란밥을 만들다 보니 간장이 없음
- 간장을 새로 구입하기는 뭔가 아까움
- 윗집 부모님 집에 가서 간장을 가져옴
- 가져온 간장을 다양하게 활용해서 간계밥을 만듦
- 부모님은 내가 간장가져간걸 모름
- 부모님 물건 = 내꺼
- 그래서 나는 부모님보다 짐이 많음 = 자손의 멤버개수는 조상보다 많거나 같다
- is a관계 나 is a 부모님
상속을 어떻게 사용하는가
class Animal{
void 울음소리(){};
}
class Dog extends Animal{
void 울음소리(){멍멍}; // 오버라이딩
void 공물어오기(){}
}
class SmallDog extends Dog{
void 울음소리(){낑낑};//오버라이딩
void 공물어오기(){} //오버라이딩
void 이갈이(){};
}
상속의 특징과 장점?
- 코드 재사용성(간장가져와서 씀)
- 유지보수성이 좋다
- 상속받은 기능이 한 곳(부모클래스)에 있기 때문에 수정을 한군데만 해도 전체 반영됨
- 그러나 계층구조가 깊어지면 복잡함
- 계층적 구조 설계 가능
- Animal → Dog → SmallDog : 공통기능 위로 올리고 세부 기능 아래로 분리해서 재사용성과 설계 도와줌
- 그러나 구조가 깊어지면 바꾸기 어렵고 유연성 떨어짐
- 단일 상속
포함의 정의
- 클래스 안에 다른 클래스 타입의 iv를 선언하는 것
- 작은 단위의 클래스를 만들고 이들은 조합해서 클래스 만든다
포함을 비유를 통해 이해하기
- 간장계란밥을 만들기 위해 냉장고를 봄
- 간장, 계란, 밥이 있어서 냉장고에서 가져옴
- 가져온 재료로 간계밥 완성
- 간계밥말고 계란볶음밥도 쌉가능함
- has a 관계 간계반은 간장,계란,밥을 가지고 있다
포함을 어떻게 사용하는가
class Engine{
void 시동걸기();
}
class Car{
Engine e = new Engine(); //Engine 객체를 Car가 포함
void startCer(){
engine.시동걸기(); //포함된 엔진의 기능을 사용
}
}
포함의 특징과 장점
- 상속은 강한 결합인데 포함은 여러 객체 조립하듯 결합 가능 -> 수정교체유연(다형성 활용 가능)
- 책임분리
- 클래스가 자기 역할만 하면 됨, Car는 운전하는 책임 Engine은 시동거는 책임
상속과 포함의 차이점
- 상속은 is a 관계, 포함은 has a 관계
- 상속은 계층구조 바꾸기 어려움, 포함은 더 유연하다
- 상속은 단일상속만 가능, 포함 여러개 사용 가능
상속을 여러개 사용하고 싶으면?
- 상속은 중요한거 하나만하고 나머지는 포함을 사용하면 된다
상속보다 포함을 더 많이 사용한다
상속은 언제 포함은 언제 사용하면 좋을까
- 상속
- A is a B 관계일 때(ex. Dog is Animal)
- 공통 기능을 재사용하고 싶을 때
- 변경 가능성 적고, 계층적 설계가 유리할 때
- 포함
- 여러 기능(객체)을 조합해야 할때
- 객체 교체나 확장이 예상될 때(유지보수, 유연성 중요)
- 강한 결합을 피하고 싶을 때(느슨한 연결 지향)
다음에 준비할 것
- 이번 발표는 준비가 부족했던거 같다
- 내 마음에 너무 들지 않은 발표였음
- 개념과 예시코드 설명만 해도 평타칠 듯 다음에는 그렇게 해야겠다