본문 바로가기

객체지향설계

코드스피츠 1강 오브젝트 1회차 (1)

오브젝트를 기반으로 하는 코드스피츠 강의 오브젝트 - 1회차 (1) 를 정리한 내용입니다.

 

1.코드스피츠 1강 오브젝트 1회차 (1)

2.코드스피츠 1강 오브젝트 1회차 (2)

3.코드스피츠 1강 오브젝트 2회차 

4.코드스피츠 1강 오브젝트 3회차 

5. 코드스피츠 1강 오브젝트 4회차 

6. 코드스피츠 1강 오브젝트 5회차

7. 코드스피츠 1강 오브젝트 6회차

 

 

Value

켄트벡이 개발자 세계에서 제시하는 3가지 가치

Communication 

Communication 이 잘되지 않으면 그만큼 비용이 발생한다. 

 

Simplicity

간단하게 코드를 짜라

 

Flexibility

유연성을 얻기 위해서는 간단하게 짜라! 

 

 

Principle

원칙을 다같이 지키고 있을때 그 효과를 발휘한다. 또, 불필요한 비용을 줄일 수 있다.

원칙이 지켜진다면 원칙을 위반한 부분을 즉시 발견할 수 있기 때문이다.

Local consequences

변수의 생명주기는 최대한 짧게 가져가라!

 

Minimize repetition

중복을 최소화해야 한다.

중복은 제거하는 것이 아니라 발견하는 것이다.
Dry원칙

Symmetry

Getter가 있으면 Setter 도 있어야 한다.

Convention

회사, 개인이 지키고 있는 Convention 을 지켜야 한다!

Coding Style 등

 

Xoriented

OOP: SOLID, DRY

Reactive

Functional

 

 

우리는 어떻게 객체지향 설계를 해야하는가?

지금 시대에는 요구사항에 변경에도 코드가 유연하게 받아 줄 수 있도록 설계를 해야한다.

유연하지 않은 코드는 요구사항의 작은 변경에 모든 코드를 새로 짜는 경우가 많다.

 

설계가 잘못되었을때 나타나는 징후

어떻게?

객체지향의 역할모델을 통해 변화율에 따른 격리에 성공하면 된다. (글은 참 쉽다....)

 

Abstraction

역할모델을 이해하기 위해선 Abstraction 이해를 해야한다.

 

Generalization (일반화)

modeling, function, algorithm

Association (연관화)

reference, dependence

Aggregation(집단화)

group, category

 

Data Abstraction

Modeling: 현실 세계의 모델을 그대로 옮기는 것

Categorization: 분류

Grouping: 유한 집합과 같은 것

Procedural Abstraction

C언어와 같이 함수에게 데이터 처리를 맡긴다. 

절차적으로 실행하는 것이 아니다

Generalization: 보다 복잡한 상황에서의 공통된 속성을 묶는 것 (가장 어렵다)

Capsulization: ATM 를 예를 들 수 있다.

 

ATM 는 내부적으로 보안, Transaction, 타 은행 연계 등 복잡한 단계를 수행하지만 

사용자에게는 단순히 출금의 Interface 만 노출한다.

 

Capsulization 하지 않으면 내부의 복잡성이 높아지고 사용자의 지식 수준이 높아지게 된다.

 

OOP Abstraction

UML 에서 class 간 연결 관계를 표현하는 기법들을 토대로 리스트

 

Generalization: interface, abstract class 

Realization: 파생된 구상 class 

Dependency: 객체를 참조

Association: 필드에 정의되어 있는 Dependency

Directed Association

Aggregation

Composition

 

Program & Timing

program은 메모리에 적재되서 실행될 때 program 이라고 부른다.

 

Language Code        : Lint Time

Machine Language   : Compile Time

File                           

Load

Run                          : Run Time

Terminate

 

그외에 Runtime 안에 무서운 ContextError 가 있다. 

ContextError 예)

재현 경로: 슈팅게임 > 2번째 판 폭탄 > 3번째 보스 총알에 맞아도 죽지 않음.

 

그러므로 Runtime Error 를 가급적 Lint, Compile Time 으로 앞당길 수 있도록 해야 한다.

 

Script Program 은 Complie time 이 없다.

 

Runtime

 

제어유닉 디코더: 명령을 해석한다.

연산유닉 제어정보: +, -, /, * 연산을 수행

데이터유닉: 데이터의 위치를 찾아서 넣거나 읽거나 빼거나 더한다.

 

 

폰노이만 머신으로 1+1 = 2 과정

1. 제어유닉은 명령을 가지고 온다.

2. 제어유닉은 가져온 명령을 해석한다.

3. 제어유닉은 연산유닉에게 명령을 실행을 시킨다.

4. 연산유닉은 데이터 유닉을 통해 값2, 값3을 가져온다.

5. 데이터 유닉은 연산유닉에게 가져온 값을 전달한다.

6. 데이터 유닉은 연산은 수행한다.

7. 연산유닉은 연산된 결과를 데이터 유닉에게 전달한다.

8. 데이터 유닉은 전달받은 값을 메모리에 적재한다.

 

위 과정은 동기적으로 일어난다.

명령이 모두 처리되면 프로그램은 종료된다. 

 

Essental Definition Loading 

프로그램을 구동하기 위한 기초적인 로딩을 수행한다.

 

Vtable Mapping

변수의 실제 메모리 주소와 가상 메모리 주소를 맵핑한다.

 

https://www.google.co.kr/search?q=Vtable&sxsrf=ACYBGNSQy_oj3va5GbmKcMI-ouJ78Ie7EQ:1570449256135&source=lnms&tbm=isch&sa=X&ved=0ahUKEwjpv7Kwi4rlAhVFxosBHQDnAZsQ_AUIEigB&biw=846&bih=647#imgdii=BgeDb3v624skGM:&imgrc=tb4SI3ttLSrw2M:

 

Run

프로그램을 실행한다.

 

Runtime Definition Loading

프로그램 실행 중에 class, 함수 정의한다.

 

Java는 Runtime Definition Loading 시점에 ClassLoader 를 통해 class 들을 로딩한다.

 

Run 

Runtime Definition Loading 이후 프로그램을 실행한다.

 

Pointer of Pointer

B = A

C, D = B 

아래는 수식을 그림으로 표현한 것이다.

 

B 가 K 를 참조하도록 변경하면?

예측한 결과는 B, C, D 모두 K 를 바라보는 것이지만

C, D 는 여전히 A 를 바라보고 있다. 

 

 

이 문제를 해결할려면?

위에 문제는 직접참조로 인해 발생한 문제이다. 

간접참조로 바꾸어주면 해결할 수 있다.