" async="async"> ', { cookie_domain: 'auto', cookie_flags: 'max-age=0;domain=.tistory.com', cookie_expires: 7 * 24 * 60 * 60 // 7 days, in seconds }); 객체 지향 프로그래밍(Object Oriented Programming, OOP) :: 일단

객체 지향 프로그래밍은 Object Oriented Programming의 약자이다.

Object를 번역하면 목적, 대상, 물건, 동작 따위의 대상, 감정 따위의 대상, 이상 야릇한 것? 이라고 번역된다. 제일 마지막이 맞는 것 같다. 뭔가 딱 하나로 표현하기 힘들다. 일단 자바 프로그래밍에서는 Object를 객체라고 한다. 그리고 OOP를 풀이하면 객체를 지향하는 프로그래밍이라는 것이다. 

 

말속에도 포함되어 있는데 핵심적인 키워드는 객체이다. Object!

객체가 무엇인지를 이해하는 것이 OOP를 이해하는 것이다.

 

객체란?

 

객체는 데이터(실체)와 동작(기능)을 포함한다고 한다. 위 사전에서는 기차역에서 승차권을 발매하는 경우에서 손님(실체)과 승차권 주문(동작)을 객체라고 하고 있고 현재 나의 상태인 블로그 글쓰기를 예를 들면 ildann(실체)과 글쓰기, 수정하기(동작)로 볼 수도 있다. 그리고 면접 상황을 예를 들면 면접관, 면접자, 면접장소 및 시간 등이 실체가 되고 면접 질문을 하는 것, 대답하는 것, 평가를 하는 것 등이 동작으로써 하나의 객체가 될 수도 있다. 

 

이러한 객체들을 레고 블럭처럼 조립해서 하나의 프로그램을 만드는 것을 객체 지향 프로그래밍이라고 할 수 있다.

 

하나의 소프트웨어를 만들기 위해서는 기능적인 구분을 하게 된다. 할 수 밖에 없다. 처음엔 한번에 만들려고 하겠지만 자연스럽게 기능을 구분짓고 그 기능들을 잘 모으는 것(조립)이 편하다는 것을 느끼게 된다. 이것이 그룹핑, 카테고라이징, 구획화 모두 비슷한 말들이다.

나누어진 기능들이 하나의 객체가 되고 결국 객체 지향 프로그램으로 나타나게 된 것이다.

 

설계와 추상화

현실에서 어떠한 특성과 관점을 소프트웨어화 해서 문제를 해결하는 것을 프로그래밍이라고 한다.

아주 복잡한 현실을 아주 단순하게 소프트웨어화 하는 것은 아주 어려운일이다.

 

아래 그림들은 런던의 위성사진, 단면도, 지하철 노선도이다.

첫번째 그림은 현실 그대로에 약간의 설명이 더해졌다.

두번째 그림은 조금더 단순하게 나타내고 지하철이 지나가는 길을 보여준다.

세번째 그림은 실제 단면도가 빠지고 지하철 노선도만을 나타내었다.

마지막 네번째 그림은 앞의 지하철 노선도를 더 단순하게 거의 직선으로만 나타내었다.

런던에서 이동을 할 때 마지막 지하철 노선도 보는 것이 가장 빠르고 쉽게 이해할 수 있을 것이다.

위 사진들 중 위성사진이 현실을 나타낸 것이고 마지막 지하철 노선도가 그 복잡한 현실을 아주 간단화한 것이다. 이것을 추상화(abstract)라고 한다.

 

즉, 설계라는 것은 복잡한 현실을 추상화하는 것이다. 앞서 설명했던 기차역에서 발매하는 것, 블로그에 글을 쓰는 것, 면접이라는 현실을 데이터(실체)와 동작(기능)으로 추상화하는 것이다.

 

 

부품화

초기의 컴퓨터는 지금의 데스크탑 PC와 다르게 하나의 완제품으로 이루어져있었다. 그래서 키보드가 고장나도 통째로 바꿔야하고 모니터가 고장나도 통째로 바꾸고 다른 부품이 고장나도 통째로 바꿔야했다. (물론 전문가들은 다 분해해서 고칠 수 있었겠지만)

이것들도 자연스러운 고민 끝에 기준을 만들어 기능을 나누게 된다. -> 추상화

출력 기능을 담당하는 모니터, 입력 기능을 담당하는 키보드, 연산기능을 담당하는 본체, 저장기능을 담당하는 하드로 나눈다.

이렇게 기능을 부품화 시킨 덕분에 사용자들은 더 좋은 부품들을 직접 사서 교체할 수도 있고 더 저렴한 부품으로 교체할 수도 있다. 또한 한 곳에서 문제가 발생했을 때 그 부품만 교체할 수 있고 어디서 문제가 발생하였는지도 빠르게 진단할 수 있다.

 

부품화의 정점에는 객체 지향이 있다. 연관된 메소드와 그 메소드가 사용하는 변수들을 분류하고 그룹핑하는 것이다. 그렇게 그룹핑한 대상이 객체(Object)이다.

 

 

은닉화 캡슐화

모니터가 어떻게 작동하는지 몰라도 켜고 끄고 연결하는 방법만 알면 모니터를 사용할 있다.

내부의 동작 방법을 단단한 케이스 안으로 숨기고 사용자에게는 부품의 사용방법만을 노출하고 있다.

이러한 컨셉을 정보의 은닉화와 캡슐화라고 부른다.

 

 

인터페이스

만들어진 부품이라면 부품과 부품을 서로 교환가능하다A모니터와 컴퓨터를 사용하다가 B모니터로 쉽게 바꿀 수 있다.

이유는 모니터와 컴퓨터를 연결하는 케이블 단자가 표준화가 되어있기 때문이다. 규격 사이즈가 정해져있고 몇개의 핀으로 이루어져있고 각 핀으로 어떤 데이터가 들어가는지 모두 정해져 있다. 모니터는 컴퓨터가 어떻게 동작하는지, 컴퓨터는 모니터가 어떻게 동작하는지 모르지만 정해진 약속에 따라 신호를 보내고 연결점(케이블)을 이어주면 된다. 그 모니터와 컴퓨터의 연결점을 인터페이스라고 한다.

 

 

객체 지향 프로그래밍(OOP)를 이해하기 위해서는 먼저 객체를 이해해야하고 객체 무엇인지 알아야한다.

객체는 복잡한 현실을 추상화하여 간단하게 변수와 메소드로 표현한 것이다. 그 추상화는 부품화와 같은 기능적 구분을 의미하고 부품화의 정점에 객체 지향이 있다.

객체 지향의 특징들로는 은닉화 캡슐화, 인터페이스가 있다.

 

위 내용이 전부가 아니고 생활코딩을 직접 보고 내가 이해할 수 있는 정도로 정리한 것이다.

https://opentutorials.org/course/1223/5399

 

내용 추가, 수정이 상당히 필요하다.

+ Recent posts