우아한형제들의 기술블로그를 읽으면서 정리한 내용이다.
핵심 키워드
이 4가지로 생각해 보았다.
객체를 나눠서 생각해보는 과정이 중요해 보인다.
블로그에서 예시로 커피점에서 커피를 사는 과정을 분석해본 예가 있다.
여기서 느낀점은 생각보다 세분화된 객체와 타입으로 분류해야 한다는 것이다.
객체를 구분하는것은 정말 존제하는 모든 고유의 사물 또는 형태를 생각할 수 있었다.
예를들어 메뉴판 객체를 생각할 수 있었지만 그속의 항목들 역시 객체라고는 생각하지는 않았다.
손님타입의 손님 인스턴스
바리스타 타입의 바리스타 인스턴스
메뉴 타입의 메뉴 인스턴스
메뉴항목 타입의 메뉴항목 인스턴스
커피타입의 커피 인스턴스
나는 다음을 보고 인스턴스를 생성하는 과정을 떠올렸다.
Customer customer = new Customer();
Barista baristar = new Baristar();
Menu menu = new Menu();
MenuItem menuItem = new MenuItem();
Coffee coffee = new Coffee();
타입별 객체의 생성과정으로 매칭해서 생각해 보았다.
주의할점은 타입과 클래스는 엄연하게 다르다.
객체의 클래스 - 객체가 어떻게 구현되어 있느냐를 정의. 객체 내부의 상태와 연산에 대한 구현방법을 정의.
객체의 타입 - 객체의 인터페이스. 객체가 응답할 수 있는 요청의 집합을 정의. 하나의 객체가 여러 타입을 갖을 수 있고 여러개의 클래스가 동일한 타입을 가질 수 있다.
이 두가지 분류를 하는 내용으로는 쉽게 이해가 가지 않는다
이렇게 생각할 수 있다.
제네시스(자동차)가 클래스가 있다면.
제네시스 클레스는 달린다,문이열린다 등의 여러가지가 구현되어 있을 것이다.
제네시스 객체는 차라는 타입을 가질 수 있다. 또 현대라는 타입도 가질 수 있다.
객체지향 설계에서 관계를 파악하고 구성하는것은 중요하다.
다양한 관계가 있는대 대표적으로 사용되는것이 포함관계와 연관관계 정도이다.
간략히 메뉴항목 객체는 메뉴판 객체에 포함되어있다. 이는 포홤과 합성관계라고 할 수 있다.
손님 타입은 주문을 하려면 메뉴판 타입을 알아야 하지만, 그렇다고 메뉴판 타입은 손님의 일부가 아니므로 이 관계는 합성 관계는 아닙니다.
이 경우는 단순한 선으로 연결하고, 연관(association) 관계라고 할 수 있다.
오퍼레이션의 경우
제품을 주문하라
메뉴항목을 찾아라
커피를 제조하라
생성하라
이 오퍼레이션들은 메서드로 해석해서 이해하면 좋을것 같다.
기존의 코드를 변경하지 않으면서 기능을 추가할 수 있도록 설계가 되어야 한다.
클레스간 직접적으로 연결된경우 확정성이 떨어진다. 이를 인터페이스를 통해서 확장성을 넓혀서 사용할 수 있으며 수정이나 추가에도 용이한 장점이 있다.
추상클래스는 추상 메서드를 가지고 있는 클래스 ( iv를 가질 수 있다 )
인터페이스는 아무것도 구현된것이 없다. ( 맴버변수를 가질 수 없다 )
https://kuno17.notion.site/9-interface-c46f5da719de4b8abd4599596f5fbf46