[0911] 객체지향설계, Programming이란?

2019. 9. 12. 00:19

객체지향설계란? 어떤 것을 배우게 될 것인가? 프로그래밍은 무엇일까?에 대한 답을 내 나름대로 생각해보자.

우선 이번 차시에 배운 내용의 목차는 아래와 같다.

 

1. 프로그래밍이란 무엇인가

2. real world 프로그래밍

3. 프로그래밍의 패러다임

4. 어떤 프로그래밍이 좋은 프로그래밍일까?

 

1. 프로그래밍이란 무엇인가

딱히 정해진 답은 없다고 했다. 내가 생각하는 프로그래밍에 대해 생각해보았다. 

사실, 다른 사람들이 말했던 프로그래밍이라는 것도 내 생각과 크게 다를 바는 없어보였다. 

내가 생각하는 프로그래밍이란, 컴퓨터를 통해 내가 생각하는 것을 현실로 만들 수 있게 해주는 것이었다.

여기서 말씀해주신 것은, 프로그래밍은 단순히 어떠한 도구와 수단이 되어야 한다고 했다.

 

[컴퓨터의 역사]

최초의 컴퓨터 애니악은,

처음 만들어진 컴퓨터로 단일 목적 즉 무기의 궤도를 계산하기 위하여 만들어졌다.

사람보다 쉽고 빠르게 계산하기 위해서 이 최초의 컴퓨터를 만들었으며, 이때의 컴퓨터는 단순히 계산기 역할을 하게 된 것이다. 이것은 1945년 당시에 혁명이었다. 단순히 일반 사람들이 받아들이기에는 기계가 뭔가를 할 수 있다, 그 기계는 내가 어떠한 것을 하라고 묘사를 하면 사람을 위해서 무언가를 하라고 기술하는 행위를 하면 된다고 일반화를 하여 받아들였다고 한다. 

여기서 보았을때, 프로그래밍은 단순히 컴퓨터에게 무언가를 하라고 기술하는 행위가 되겠다.

그리고 그 '무언가'라는 것은 두가치 축으로 쪼갤 수 있다. 바로 Data와 Flow(조건을 가진 기술의 형태)다. 

 

컴퓨터가 만들어진 초창기에는 의도하지는 않았으나, 단순한 컴퓨터에서 멀티 퍼포먼스를 고려하기 시작했다.

제한된 사람들만 다룰 수 있었으나, 현재에는 약간의 교육만 받는다면 누구나 프로그래밍을 할 수 있는 시대가 왔다.

현재는 복잡한 일을 처리해야 하는 (고수준 언어)가 필요하게 되었다. 누구나 프로그래밍을 하려면 사람에게 쉬어야 하니 말이다.

 

지금의 컴퓨터는 과거와 다르게 일을 함께 하는 사람도 여러사람이고, 사용자도 불특정 다수가 된다. 과거의 프로그래밍과는 컨셉이 달라졌다고 볼 수 있다. 그렇기 때문에 단순히 기계와 사람의 인터페이스 뿐만 아니라 사람과 사람 중간에 끼어있는 인터페이스 형태의 영향이 커져가고 있다. 즉, 보기좋고, 쓰기좋고, 읽기 좋은 코드만 살아남을 수 밖에 없다는 뜻이다. 지금의 코딩 스타일은 철저하게 사람에게 맞춰져 있다고 볼 수 있다.

 

기계어<어셈블리어(저수준)<C,JAVA..(고수준)언어 영역 중, 

고급 언어 영역에서, 쓰기 좋은 스타일의 언어만 살아남게 된다. 그래서 C++과 Python도 각광받고 있다.

여기서 알 수 있는 깨알같은 새로 알게 된 사실은, 파이썬으로 텐서플로우를 한다고 흔히들 말하는데 사실은 이 텐서플로우가 순수 파이썬으로 이뤄져 있지 않다는 것이다. 

파이썬은 생각보다 실행 속도가 느리기 때문에(고수준 언어여서 거쳐가야 할 단계가 많아서 그런 것 같다.) 속도가 중요한 머신러닝의 경우 사람과 컴퓨터의 인터페이스에서 봤을 때 겉으로 쓰여지는 것은 파이썬을 이용하지만, 코어나 안에 있는 빠른 처리가 필요한 경우에는 C나 C++로 쓰여진다. 그리고 이것이 하드웨어에 직접적으로 영향을 미치게 된다.

 

결론적으로,

이러한 것들을 어떻게 숙련할 것인가보다는 어떻게 디자인할 것인가, 잘 짤 것인가에 대한 것을 배우는 과목이 OPP, 객체지향 설계가 된다. 꼭 배워야 하는 언어는 교수님이 개인적으로 자바, 자바스크립트, 파이썬이라고 한다. 파이썬은 예전에 쓰다가 지금은 조금 까먹었었는데.. 이 기회에 C++과 python을 구체적으로 조금 더 배워보아야겠다. 역시 이 언어들을 배우라고 하는데에도 전 세계적으로 많이 채용되는 언어이기 때문이라고 한다.

C++은 사실 그 다음으로 추천하는 언어이다. 모든 프로그래밍 언어와 고급 기술들은 C++로 인해 퍼져나가는 것이고, 개인적으로 들은 이야기도 알고리즘에서는 단언컨데 최고의 언어라고 들었다. 이렇게 여러모로 좋으니 노력을 해봐야겠다.

 

위의 장황한 이야기를 한마디로 정의하자면, 

초창기의 프로그래밍 언어들과 현재 프로그래밍 언어의 상황들은 바뀌었고, 앞으로도 바뀔 것이다. 

사람과 사람간의 인터페이스에서 일을 잘할 수 있는 방법으로 프로그래밍 언어는 도구로 생각하는 것이 좋다.

그리고 그 문제에 맞는 언어를 잘 선택해서 사용해야 한다, 였다.

 

2. Real world modaling

 

things라는 것은 data와 flow측의 두가지 측면으로 나눌 수 있다.

data는 간단히 말해 물건들이나 컨셉들을 말하는 것이고, flow는 순서가 있는 액션, 동작을 말한다. 

그래서 세상을 잘 뜯어내어 생각하는 사람과 잘 코딩하는 사람은 비슷하다고 한다. 이것이 어떻게 보면 코딩보다 디자인의 영역에 가깝다고 할수 있을 것 같다. 이렇게 세상을 바라보는 관점을 모델링 뷰라고 한다.

 

두 가지 관점에서 모델링 방법을 찾고 있다. 위의 사진처럼,

1. 실제 세상에 있는 물건(방식)

2. 실제 세상에 있는 액션

이것들을 보고 프로그래밍을 디자인 할 수 있어야 한다.

 

3. 프로그래밍 패러다임

 

패러다임이란, 생각의 틀의 변화를 일컫는 말이다.

하는 행위들을 쭉 늘어놓은 것이기도 하다. imperative(요긴하다라는 뜻)는 C나 Java가 속해있으며, 대부분 이 영역에 해당되는 언어를 사용하게 된다. (이게 사실 필기를 해 놓았는데 이 부분은 무슨말인지 정확히 알 수 가 없다..)

거기에 있는 thing에 집중해서 디자인 하는 것은 html이나 sql에서 볼 수 있는 양상이기도 하다.

 

imperative language의 흐름은 이러하다.

1. 똑같은 동작이 반복되는 흐름이 있다.

2. 이것 중 똑같은 동작이 반복되는 부분을 함수로 만들어 동작시킨다.

3. 하지만 똑같은 항목의 값을 똑같은 함수에 넣어줘야 하니 비효율적이다, 일일히 집어넣기보다는 구조체를 만든다.

4. 구조체를 똑같이 만들어서 쓰면 비효율적인 것 같다, 그냥 클래스를 만든다.

 

이러한 것과 같이 디자인을 해 나가는 것이다.

 

4. 어떤 프로그래밍이 좋은 프로그래밍일까?

이러한 세상에 존재하는 것을 그대로 프로그래밍에 넘기기 위한 것이 좋은 프로그래밍이다. 

또는, 내가 사고하는 상식을 그대로 담을 수 있는 프로그래밍 언어가 있는지 살피는 것도 좋은 방법이다.

이러한 측면에서 OPP라는 패러다임의 장점은 많다.

 

추가로, 상속의 개념을 대입해서 보자면 세상의 물건은 위계질서가 있고(탈 것: 자동차, 기차..) 이것을 잡아주는 것이 상속의 개념이 되는 것이라고 볼 수 있다. 

 

앞으로 배울 객체지향설계, 이러한 것들을 디자인 하는 방법을 배운다니 기대가 된다. 

그 전에 우선 C++과 Python을 조금 예습해야 할 필요가 있을 것 같다.

BELATED ARTICLES

more