[0920] Object-Oriented Design Concepts

2019. 9. 20. 20:11

[목차]

- real world 모델링 하는데 어떻게 할 것인가

- OOD는 언제 써야 적절한 상황일까

- Case study

 

저번주의 내용 정리,

프로그래밍은 본질적이고 컴퓨터에 일을 시킬 수 있는 인터페이스에서의 무언가이다. 이것을 잘 동작을 정의해서 넣어주어야 한다. 우리의 프로그래밍은 이러한 리얼 월드에 있는 것들을 뜯어내어서 넣어주는 역할이다.

 

1. real world 모델링 하는데 어떻게 할 것인가

 

실제 세상에서 일어나는 일이나 객체 사건을 받아들이고, 인식하고 모델링을 하고 그런 걸 가지고 프로그래밍으로 녹여내서 코딩화 시켜야 한다. 내가 세상을 바라보는 관점, 내가 하고 있는 사고 방식을 잘 디자인하고 뜯어내는 과정을 잘 해야 한다는 소리이다. 그러한 능력과 그것을 효율적이면서도 유지 보수가 쉬운 형태의 코딩을 하는 것은 다른 형태지만 이지만 두가지 일을 다 해야 하는 것이 우리의 일이다.

 

아키텍트, 건축가들은 직접 건축을 하지 않고 도면만을 그린다. 그러한 것처럼 우리도 설계를 하고, 코딩을 하는 것은 다른 느낌이다. 컴퓨터 분야에서도 따로 아키텍트가 있다. 소프트웨어 아키텍트와 소프트웨어 디벨로퍼로 나눠진다.

프로그래밍의 아키텍쳐를 제대로 짜려면 모든 것을 다 알아야 해서 더 어렵다. 어쨌든, 핵심은 우리가 하는 일은 두 가지를 다 하는 것에 있음을 알아야 한다.

 

예전에는 프로그래밍을 하면 단순히 보고 끝나는 경우가 많았지만 요즘에는 설계하고 만들고 사용하기까지 하기 때문에 이것이 더 중요해졌다. 이러한 사이클을 돌면서 하는 것이 모델링이다.

 

분자모형을 예시로 들어보면, 눈에 보이지 않는 것들을 추상화로 모델링을 해서, 하나의 식으로 만들었더니 원리가 잘 성립하고 동작되는 모습을 볼 수 있다. 이것에 대한 장점은 이해하기가 쉽고 소통하기도 쉽다. 그리고 같은 모델을 공유하고 있는 사람들끼리 잘 통하며 같은 디자인의 관점을 가지고 있을 때 소통이 편해진다.

 

- Why Model?

모델이라는 것들은 우리의 상상력의 한계를 넓히거나 상상력 이해 능력을 높일 수 있는 장치가 될 수 있다.

 

- 프로그래머가 하는 일

앞서 말한 두가지 일들을 다 수행한다. 이렇게 모델링을 할 때, 각자의 관점에서 요구되는 면이 있다.

 

첫 번째로, 코딩하는 입장에서 보았을 때에는 모듈화가 가능한 것이 좋고, 재활용 가능한 것이 좋고, 불필요한 것들을 제외하고 꼭 필요한 것들만 하는 것, 그리고 다른 사람들과 협업하기 좋은 형태였으면 한다.

 

두 번째로, 세상을 잘 바라보는 모델링을 하는 입장에서 보았을 떄에는, 복잡한 세상을 단순화 시켜서 보아야 하고 또한 다른 사람들과 소통하기 좋아야 하며, 그 방식이 우리가 생각하는 방식과 유사하면 좋다.

 

그래서 이 두 가지를 만족시키기 위해 나온 것이 객체지향설계(OOP)이다.

 

'말로 형상화된 도는 원래 의미를 상실한 도이다.' 생각했던 것을 글자로 표현하려고 보니 생각한 것이 아니다 라는 노자가 한 이 말은 객체지향설계에서도 요긴하게 쓰일 수 있는 문장이다. 왜 글자로 생각을 표현한 것과 생각은 왜 다르게 될까? 이것은 인간의 언어가 가지고 있는 문제이다.

 

추상화라는 것은 좋을떄도 있지만 나쁠 때도 있다. 언어라는 것은 기호이기 때문에, 정보가 전해지고 전해지는 과정 그러니까 정보가 인코딩되고 디코딩되는 과정에서 해석하는 사람에 따라서 정보가 달라지게 된다.

 

이것을 'symbolic thinking'능력이라고 한다. 어떤 것을 생각하던지 그것을 언어화 시켜서 생각하는 것을 의미한다. 사진과 같은 채도와 명도가 다른 붉은색도 모두 빨간색이라고 표현하는 것도 이런 이유 때문이다.

색도 여러가지 색을 묶어서 color라고 표현하고, 코끼리 사람 등 여러 생물을 묶어서 mamml이라고 표현하고, 모든 나뭇잎을 묶어서 leaf, 여러가지 강읠 묶어서 river라고 한다. 자연의 추상화 모델들을 예로 들어보았다.

 

[OOP 컨셉]

 

1. Class(클래스)

이러한 추상화 능력을 우리는 모두 가지고 있고, 이렇게 세상을 받아들이는 방식이 디자인 방식인데 이것을 프로그래밍 언어로 나타내는 것이 class이다.

 

2. inheritance(상속)

개미를 예로 들어보면 목, 종, 류 등등 여러가지로 분류되어있다.

상위에 있는 클래스, 하위에 있는 클래스 등등 계층이 있다. 대학생> 학생> 사람과 같은 느낌의.

이러한 것에서 추상화와 계층화가 생각하는 것에 잘 녹여져 있다고 볼 수 있다. 상속은 계층화, 레벨링을 가지고 구현한다는 관점을 가지고 있다.

 

3. modual(모듈화)

모든 설계에서 가장 중요한 토픽이 된다.

전체의 건물이 여러개의 블록으로 이뤄져있는 모습과 유사하다. 이러한 큰 건물을 지을 때 이러한 블록으로 짓겠다 라는 기준을 내세우게 되는데 이것이 프로그래밍에서 쓰이는 개념 중 비슷한 것이 'API'다. 이것은 프로그래밍 인터페이스로 큰 개념을 잡아놓고 구현하는 것을 말한다. 즉, 하나의 큰 소프트웨어를 만들 때 어떻게 쪼개서 만들것인가? 에 대한 고찰이다.

 

4. information hidding(정보 은닉)

불필요한 정보들이 많이 노출되어서 생기는 일이 비일비재하게 일어난다. 예를 들어, 내가 모든 코드를 공개해놓았는데, 어떤 사람이 내 코드를 가져다가 사용하고 추가를 하였다. 그런데 내가 그 부분에 문제가 생겨서 제거하였을 경우 다른 사람이 추가한 코드는 아예 쓸모가 없어지는 현상이 발생할 수 있다. 그래서 이러한 프로그래밍 문제를 해결하기 위해 public을 최소화시키고, private를 최대화하자는 의견이 생겼다. 오픈된것만 쓰면 문제가 되지 않도록 말이다. 결국, 정보가 많이 노출된다고 해서 좋은 것이 아니고, 이것은 그저 전체 시스템의 복잡도를 올리는 일이 되어버린다.

 

또한, 보이지 않는 것에 대해 함수를 사용했을때의 문제이다.

이것은 다른 곳에서 불러오는 함수의 경우 사용은 할 수 있으나 기본적으로 정보를 공개하고 비공개한다는 것은 프로그래머의 책임관계의 문제이다. 문제가 발생했을 경우, 책임지는 범위에 대한 문제를 규정하는 것이다.

 

5. incapsulation (인캡슐레이션)

정보 은닉과 헷갈릴 수 있는 개념이므로 주의가 필요하다. 정보 인닉은 모든 디자인의 기본 원칙이지만, 인캡슐레이션은 class + information hidding의 개념을 합쳐놓은 디자인 철학이다. 즉, 인캡슐레이션은 노출 시킬 것만 노출시키고 필요한 것만 숨기겠다는 것이다. 사실 자세한 개념은 잘 모르겠다. 이것에 대해서 더 공부를 해 볼 예정이다.

 

6. polymorphism 

인터페이스는 동일하되, 하는 행동은 다르게 하고싶다고 하여 사용하는 것이 이것이다.

이 부분은 사실 OOP에 잘 구현이 되어있으나 꼭 필수적인 요소는 아니다. 그러나 이것이 어떤 개념인지는 더 추후에 자세하게 알아보고 싶다.

 

2. OOP는 언제 써야할까?

 

여기까지 OOP의 6까지 컨셉에 대해 알아보았다. 

오브젝트에는 데이터와 플로우가 있을텐데, 그렇다면 이러한 것들을 언제 써야하는걸까?

 

- 우선, 데이터만 있다면 class를 굳이 만들 필요가 없다. 또한 기능만 있어도 마찬가지이다. data + flow를 두개를 구현하고자 할 때 객체지향 설계를 하면 좋다. 불필요하게 쓸 필요가 없다는 소리이다.

 

- C같은 경우에는 API를 노출시키지 않을 방법이 없다. 

오픈하고 싶지 않을 경우에는 information hidding 컨셉을 사용하면 좋다. 보안을 신경써야하고 안정적인 시스템을 써야 하기 때문에 불가피 한 것이다.

 

- is-a 개념이 있으면 OOP 개념을 써도 좋다. 예를 들어, 이세돌은 바둑선수이다 라는 문장이 있을 때, 이세돌의 클래스를 만들 때 바둑선수라는 클래스의 개념을 상속받아서 사용하면 되는 것과 같은 예이다.

 

결론적으로, 이 케이스들을 유념해서 OOP를 사용할 때 생각하여 어떤 때에 어떤 곳에 사용할지 생각하고 적용하여 사용하면 된다. 

 

스티브 잡스가 하는 말이있다.

복잡한 것들은 숨기고, 인터페이스를 인캡슐레이션을 시키고 인터페이스만 가지고 소통하는 것이 그것이 바로 객체지향 설계이다. 이제서야 객체지향 설계의 도입부에 들어선 것 같다. 다음에는 C++문법과 Python 상속 개념에 대해 추가로 공부해보아야겠다.

BELATED ARTICLES

more