※ 일반화(상속)
흔히 상속은 속성, 기능의 재사용성만 강조되나 이는 극히 한정되게 바라보는 시각이다. 상속, 즉 일반화는 여러 개체들이 가진 공통된 특성을 부각시켜 하나의개념이나 법칙으로 성립시키는 과정이다.
ex) 교실에 있는 학생들의 스마트폰 숫자를 센다고 하자. 만약, 스마트폰이라는 공통된 개념을 적용하지 않는다면 교실에 갤럭시 s8이 몇 개 있는지, g6가 몇 개 있는지, 아이폰6가 몇 개 있는지 일일이 세야한다. 하지만 공통된 개념 스마트폰을 적용하면 교실에 스마트폰이 몇 개 있는지만 물으면 된다.
일반화는 자식 클래스를 외부로부터 은닉하는 캡슐화의 일종
ex) 객체지향 원리(1) 포스트에서 본 SmartPhone 예제
객체지향 원리(1) 포스트 예제의 경우와 위 다이어그램(Person 관점에서 구체적인 스마트폰 종류가 숨겨져 있다.)과 같이 서브 클래스가 일반화에 의해서 위와 같이 캡슐화되어 서브 클래스는 자유롭게 코딩이 가능하다.
일반화 관계는 "is a kind of 관계"가 성립되어야 한다. 성립되지 않고 기능을 재사용하고 싶으면 위임을 이용해라.
일반화 관계를 속성이나 기능의 상속, 즉 재사용을 위해 존재한다고 오해하면 안된다.
ex)
ArrayList 클래스를 상속받아 Stack 클래스를 만들었다. 프로그래머는 위 메서드를 자신이 구현하지 않고 그대로 사용하길 원했을 것이지만 ArrayList 클래스 안에 Stack과 관련 없는 연산이나 속성도 상속받게 되 기능의 재사용성 측면에서 성공적이지 못하다. 이에 관한 코드가 밑에 있다.
class MyStackextends ArrayList { public void push(String element){ add(element); } public String pop(){ return remove(size()-1); } }
기본적으로 Stack "is a kind of" ArrayList가 성립되어야 하는데 성립되지 않는다. 따라서, "is a kind of" 관계가 성립되지 않을 때 상속을 사용하면 불필요한 속성이나 연산을 물러받게 된다. 어떤 클래스의 일부 기능만 재사용하고 싶을 경우에는 자신이 직접 기능을 실행하지 않고 다른 클래스의 객체가 기능을 실행하도록 위임하면 된다.
public class MyStack{ pivate ArrayList list = new ArrayList (); public void push(String element){ list.add(element); } public String pop(){ return list.remove(list.size()-1); } public boolean isEmpty(){ return list.isEmpty(); } public int size(){ return list.size(); }
조상 클래스를 자손 클래스의 속성으로 생성하고 해당 속성을 통해서 해당 클래스의 기능을 사용한다. 즉, 일반화 관계를 없애고 위임을 통해 기능을 재사용했다.
'자바 > 기본' 카테고리의 다른 글
이클립스 단축키, 자바 기타 (0) | 2017.06.29 |
---|---|
객체지향 원리(4) - 다형성, 피터 코드의 상속 규칙 (0) | 2017.06.29 |
객체지향 원리(2) - 캡슐화 (0) | 2017.06.29 |
객체지향 원리(1) - 추상화 (0) | 2017.06.29 |
SOLID 원칙 - 예제 (0) | 2017.06.15 |