2. 관계(연관 관계는 전 포스트에 있음)


※ 일반화(상속) 관계

ex) 'Tv' is a kind of 'Appliancies'. 

     'Computer' is a kind of 'Appliancies'.


일반화 관계에서 삼각형이 있는 게 조상 클래스이고 turnOn()이나 turnOff() 구현의 경우 컴퓨터나 Tv마다 다르기 때문에 Appliancies 클래스에서 turnOn()과 turnOff()를 구현하지 않고 자식 클래스에서 구현할 필요가 있다. 이 때 부모 클래스에서 구현되지 않은 빈 껍데기만 있는 연산인 추상 메서드를 선언하고, 추상 메서드를 하나 이상 가진 클래스를 추상 클래스라고 한다. 추상 클래스/메서드는 이탤릭체로 표시하거나 '()<>' 안에 원하는 이름을 표시한다. 또는 Abstract를 클래스 이름 앞에 붙여주기도 한다.



※ 집합 관계 : 전체와 부분과의 관계로 합성 관계와 집약 관계가 있다.

- 합성 관계 : 전체 객체가 없어지면 부분 객체도 없어지고 부분 객체를 여러 전체 객체가 공유할 수 없다.

public class Computer{
   private MainBoard mc;
   private Cpu c;
   private Memory m;
   public Computer(){
         this.mc = new MainBoard();
         this.c = new Cpu();
         this.m = new Memory();
    }
}

만약 메인 클래스에서 Computer 객체를 생성하면 자동적으로 MainBoard, Cpu, Memory 객체가 생성된다. 또한 Computer객체를 생성하지 않으면 나머지 컴퓨터 부품 객체는 생성되지 않는다. 즉, 전체 객체가 없어지면 부분 객체도 사라진다. 그래서 합성 관계이다.


- 집약 관계 : 전체 객체와 부분 객체의 생명 주기가 다르고, 부분 객체를 어려 전체 객체가 공유할 수 있다.

public class Computer{ private MainBoard mc; private Cpu c; private Memory m; public Computer(MainBoard mc, Cpu c, Memory m){ this.mc = mc; this.c = c; this.m = m; } }

위 코드는 Computer 객체를 생성할 때 외부에서 인자값 전달로 부품 객체를 받기 때문에 객체가 없어져도 외부에서 존재할 수 있다. 따라서 Computer 객체와 부품 객체의 생명 주기가 다르고 다른 Computer 객체에서도 같은 부품 객체를 참조할 수 있다. 그래서 집약 관계이다.



※ 의존 관계 : 클래스에서 다른 클래스를 사용하는 경우는 클래스의 속성에서 참조할 때와 연산의 인자로 사용될 때, 메서드 내부의 지역 객체로 참조될 때가 있는 데 짧은 시간동안 참조하는 경우가 의존관계이다.(보통 연산의 인자로 사용될 때이고 오랜 시간동안 같이 하는 객체는 연관 관계, 보통 클래스의 속성 참조이다.)


사람들은 차를 소유하면 다른 차를 사용하는 경우는 거의 없다. 따라서 연관 관계이고, Person 클래스의 속성으로 Car 객체를 참조한다.

반면, 주유기의 경우 매번 같은 주유소를 간다고 해도 같은 자리에서 매일 주유하는 게 아니기에 주유기는 매번 달라진다. 즉, 짧은 시간 동안 이용하는 관계이므로 의존 관계이고 public void putGas(GasPump p); 와 같이 인자나 지역 객체를 사용해 구현할 것이다.



3.인터 페이스

: 인터페이스는 객체가 할 수 잇는 해야 하는 일로써 책임이다. 또는 어떤 공통되는 능력이 있는 것들을 대표하는 관점으로 볼 수 있다. 일반화 관계는 "is a kind of 관계" 이지만 인터페이스는 "can do 관계"이다.

비행기와 새는 공통적으로 날 수 있는 능력이 있다. 이를 인터페이스화 해서 Flyable 인터페이스를 정의하고 내부에 Fly() 메서드를 정의한 게 위 그림이다.

+ Recent posts