일반화(상속)

 

흔히 상속은 속성, 기능의 재사용성만 강조되나 이는 극히 한정되게 바라보는 시각이다. 상속, 즉 일반화는 여러 개체들이 가진 공통된 특성을 부각시켜 하나의개념이나 법칙으로 성립시키는 과정이다.

 

ex) 교실에 있는 학생들의 스마트폰 숫자를 센다고 하자. 만약, 스마트폰이라는 공통된 개념을 적용하지 않는다면 교실에 갤럭시 s8이 몇 개 있는지, g6가 몇 개 있는지, 아이폰6가 몇 개 있는지 일일이 세야한다. 하지만 공통된 개념 스마트폰을 적용하면 교실에 스마트폰이 몇 개 있는지만 물으면 된다.

 

 

일반화는 자식 클래스를 외부로부터 은닉하는 캡슐화의 일종

ex) 객체지향 원리(1) 포스트에서 본 SmartPhone 예제

 

객체지향 원리(1) 포스트 예제의 경우와 위 다이어그램(Person 관점에서 구체적인 스마트폰 종류가 숨겨져 있다.)과 같이 서브 클래스가 일반화에 의해서 위와 같이 캡슐화되어 서브 클래스는 자유롭게 코딩이 가능하다.

 

 

 

일반화 관계는 "is a kind of 관계"가 성립되어야 한다. 성립되지 않고 기능을 재사용하고 싶으면 위임을 이용해라.

일반화 관계를 속성이나 기능의 상속, 즉 재사용을 위해 존재한다고 오해하면 안된다.

 

ex)

ArrayList 클래스를 상속받아 Stack 클래스를 만들었다. 프로그래머는 위 메서드를 자신이 구현하지 않고 그대로 사용하길 원했을 것이지만 ArrayList 클래스 안에 Stack과 관련 없는 연산이나 속성도 상속받게 되 기능의 재사용성 측면에서 성공적이지 못하다. 이에 관한 코드가 밑에 있다.

 

class MyStack extends 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();
    }

조상 클래스를 자손 클래스의 속성으로 생성하고 해당 속성을 통해서 해당 클래스의 기능을 사용한다. 즉, 일반화 관계를 없애고 위임을 통해 기능을 재사용했다.

+ Recent posts