CNU_SW_모각코

6주차 모각코 학습 결과 (2022.08.12 9:00~12:00)

nayeonee__ 2022. 8. 13. 16:39

<실습>

 

<47강 SRP와 DIP 실습>

```java

interface CanAble{
public abstract void talk();
}

abstract class 홀직원 implements CanAble{
abstract void 청소();

@Override
public void talk(){
System.out.println("손님과 대화");
}
}

abstract class 종업원 extends 홀직원{
void 서빙하기(){
System.out.println("서빙하기");
}
// void 주문받기(){
// System.out.println("주문받기");
// }
}

abstract class 캐셔 extends 홀직원{
void 정산하기(){
System.out.println("계산기 정산하기");
}
void 계산하기(){
System.out.println("카드 계산하기");
}
}

abstract class 요리사{
abstract void 요리();
}

class 홍길동 extends 종업원{

요리사 j; // 의존성 역전 원칙 : 추상적인 것에 의존한다는 것

@Override
void 청소(){
System.out.println("화장실 청소");
}
}

class 임꺽정 extends 종업원{

요리사 j; // 의존성 역전 원칙

@Override
void 청소(){
System.out.println("주방 청소");
}
}

class 김유신 extends 캐셔{
@Override
void 청소(){
System.out.println("홀 청소");
}
}

class 이몽룡 extends 캐셔{
@Override
void 청소(){
System.out.println("테이블 청소");
}
}

// class 장보고 extends 요리사{
// @Override
// void 요리(){
// System.out.println("양식 만들기");
// }
// }

class 정몽주 extends 요리사{
@Override
void 요리(){
System.out.println("양식 만들기");
}
}

class 이순신 extends 요리사{
@Override
void 요리(){
System.out.println("한식 만들기");
}
}

public class OOPEx10{

public static void main(String[] args){


}
}

```

[챕터 5 연습문제]

길동이 집에는 티비가 두 대가 있다. 그런데 정말 불편한 점이 있다.
삼성 티비는 초록버튼을 클릭하면 전원이 켜지고 파랑버튼을 클릭하면 전원이 꺼졌다.
엘지 티비는 초록버튼을 클릭하면 전원이 켜지고 빨간버튼을 클릭하면 전원이 꺼졌다.

두 회사의 차이 때문에 안방에 있는 삼성 티비에서는 티비를 끌 때 파랑버튼을 클릭했고 거실에 있는 엘지 티비에서는 빨간버튼을 클릭해서 티비를 껐다. 너무 너무 혼란스러웠다.

길동이는 이 문제를 해결하고자 삼성과 엘지에 동시에 적용되는 리모콘을 직접 개발하기로 했다.

초록버튼은 전원켜짐
빨간버튼은 전원꺼짐

이렇게 통일하기로 마음 먹었고 행위에 대한 제약을 주기위해 인터페이스를 만들었다. 인터페이스 이름은 RemoconAble이라고 지었다.


```java

interface RemoconAble{
public void 초록버튼();
public void 빨간버튼();
}

class Samsung implements RemoconAble{

@Override
public void 초록버튼(){
System.out.println("전원이 켜졌습니다.");
}

@Override
public void 빨간버튼(){
System.out.println("전원이 꺼졌습니다.");
}
 

}

class LG implements RemoconAble{

@Override
public void 초록버튼(){
System.out.println("전원이 켜졌습니다.");
}

@Override
public void 빨간버튼(){
System.out.println("전원이 꺼졌습니다.");
}
}

public class ExampleEx01{

public static void main(String[] args){
//삼성 리모콘 2개 만들기 (new)
Samsung s1 = new Samsung();
Samsung s2 = new Samsung();
// 엘지 리모콘 2개 만들기
LG g1 = new LG();
LG g2 = new LG();
}
}

```

<객체지향의 사실과 오해>
행동에 따라 객체를 분류하기 위해서는 객체가 내부적으로 관리해야하는 데이터가 아니라 객체가 외부에 제공해야 하는 행동을 먼저 생각해야 한다. 
이를 위해서는 객체가 외부에 제공해야 하는 책임을 먼저 결정하고 그 책임을 수행하는 데 적합한 데이터를 나중에 결정한 후, 데이터를 책임을 수행하는 데 필요한 외부 인터페이스 뒤로 캡슐화해야 한다. 
데이터를 먼저 결정하고 객체의 책임을 결정하는 방법은 유연하지 못한 설계라는 악몽을 초래한다.


* 객체의 역할
  - 여러 객체가 동일한 역할을 수행할 수 있다.
  - 역할은 대체 가능성을 의미한다.
  - 각 객체는 책임을 수행하는 방법을 자율적으로 선택할 수 있다.
  - 하나의 객체가 동시에 여러 역할을 수행할 수 있다.

협력 공동체의 일원으로서 객체는 다음과 같은 두 가지 덕목을 갖춰야 하며, 두 덕목 사이에서 균형을 유지해야 한다.
1. 객체는 충분히 '협력젹'이어야 한다.
2. 객체는 충분히 '자율적'이어야 한다.

* 객체지향의 본질
  - 객체지향이란 시스템을 상호작용하는 자율적인 객체들의 공동체로 바라보고 객체를 이용해 시스템을 분할하는 방법이다.
  - 자율적인 객체란 상태와 행위를 함꼐 지니며 스스로 자기 자신을 책임지는 객체를 의미한다.
  - 객체는 시스템의 행위를 구현하기 위해 다른 객체와 협력한다. 각 객체는 협력 내에서 정해진 역할을 수행하며 역할은 관련된 책임의 집합이다.
  - 객체는 다른 객체와 협력하기 위해 메시지를 전송하고, 메시지를 수신한 객체는 메시지를 처리하는 데 적합한 메서드를 자율적으로 선택한다.

객체의 다양한 특성을 효과적으로 설명하기 위해서 객체를 상태(state), 행동(behavior), 식별자(identity)를 지닌 실체로 보는것이 가장 효과적

객체란 식별 가능한 개체 또는 사물이다. 객체는 자동차처럼 만질 수 있는 구체적인 사물일 수 도 있고, 시간처럼 추상적인 개념일 수 도 있다. 객체는 구별가능한 식별자, 특징적인 행동, 변경 가능한 상태를 가진다. 소프트웨어 안에서 객체는 저장된 상태와 실행 가능한 코드를 통해 구현된다. 

결론적으로 모든 객체의 상태는 단순한 값과 객체의 조합으로 표현할 수 있다. 이때 객체의 상태를 구성하는 모든 특징을 통틀어 객체의 프로퍼티(property)라고 한다/
- 일반적으로 프로퍼티는 변경되지 않고 고정되기 때문에 '정적'이다.
- 반면, 프로퍼티 값(property value)은 시간이 흐름에 따라 변경되기 때문에 '동적'이다.


객체와 객체 사이의 의미있는 연결을 링크(link)라고 한다. 객체와 객체 사이에는 링크가 존재해야만 요청을 보내고 받을 수 있다.

 

 

 

[ 객체지향의 사실과 오해 ] 

내가 기존에 알고 있었던 객체지향과 관련한 내용이 조금 달랐다는 것을 알게 되었다. 그래서 그런지 너무 흥미롭다. 

그리고 추상적인 개념에 대한 설명을 잘해주셔서 더 재밌었다.