Java

객체 지향 프로그래밍

객체 지향 프로그래밍

객체지향 프로그래밍(Object-Oriented Programming)은 좀 더 나은 프로그램을 만들기 위한 프로그래밍 패러다임으로 로직을 상태(state)와 행위(behave)로 이루어진 객체로 만드는 것이다. 이 객체들을 마치 레고 블럭처럼 조립해서 하나의 프로그램을 만드는 것이 객체지향 프로그래밍이라고 할 수 있다. 다시 말해서 객체지향 프로그래밍은 객체를 만드는 것이다. 따라서 객체지향 프로그래밍의 시작은 객체란 무엇인가를 이해하는 것이라고 할 수 있다. 말이 어렵게 느껴지지 않는가? 그것은 아직 객체 지향에 대한 체험이 없기 때문이다. 본 수업에서는 객체 지향에 대해서 코드 없이 이야기 할 수 있는 것들에 대해서만 이야기 할 생각이다. 객체 지향에 대한 오리엔테이션이라고 생각하고 가벼운 마음으로 나머지 내용을 읽어보자.

객체지향 프로그래밍을 학습하는데 장애 중의 하나는 번역이다. Object를 번역한 객체는 현실에서는 거의 쓰지 않는 말이고, 머랄까 철학적인 느낌을 자아낸다. 그래서 객체지향 프로그래밍을 처음 접하는 입문자들은 객체지향 프로그래밍을 철학적인 탐구의 대상으로 파악하는 경향을 보이는데, 필자의 생각에 이것은 공부를 어렵게 할 뿐 도움이 되지 않는다. 쉽게 생각하자. 객체는 변수와 메소드를 그룹핑한 것이다.

문법과 설계

객체지향 프로그래밍 교육은 크게 두 가지로 구분된다.

문법

하나는 객체지향을 편하게 할 수 있도록 언어가 제공하는 기능을 익히는 것이다. 이러한 기능들은 if, for문처럼 문법적인 구성을 가지고 있다. 이 문법을 이해하고, 숙지해야 객체를 만들 수 있다. 객체를 만드는 법에 대한 학습이라고 할 수 있다. 우리 수업은 여기에 초점이 맞춰져 있다.

설계

두번째는 좋은 객체를 만드는 법이다. 이것을 다른 말로는 설계를 잘하는 법이라고 할 수 있다. 좋은 설계는 현실을 잘 반영해야 한다. 현실은 복잡하다. 하지만 그 복잡함 전체가 필요한 것은 아니다. 아래의 그림을 보자.

위의 그림은 런던의 지도다. 여러분이 지하철을 이용한다면 어떤 지도를 선호할까? 오른쪽 하단의 지도를 선호할 것이다. 왼쪽 상단의 지도는 현실의 복잡함을 나타낸다. 오른쪽 하단의 지도는 지하철 탑승자의 관심사만을 반영하고 있다. 역 간의 거리나 실제 위치와 같은 요소들은 모두 배제하고 있다. 복잡함 속에서 필요한 관점만을 추출하는 행위를 추상화라고 한다.

지하철 노선도가 디자인의 추상화라고 한다면 프로그램을 만든다는 것은 소프트웨어의 추상화라고 할 수 있다. 객체 지향 프로그래밍은 좀 더 현실을 잘 반영하기 위한 노력의 산물이다. 이것은 단순히 객체 지향의 문법을 이용해서 객체를 만든다고 달성되는 것이 아니다. 고도의 추상화 능력이 필요하다. 좋은 설계는 문법을 배우는 것보다 훨씬 어려운 일이다. 심지어 이것은 지식을 넘어서 지혜의 영역이다. 좋은 설계를 위한 조언들은 많지만 이러한 조언들은 조언자의 입을 떠나는 순간 생명력을 잃어버린다. 지식은 전수되지만 지혜는 전수되지 않기 때문이다. 스스로 경험하고 깨우쳐서 자기화시켜야 한다. 필자도 그 긴 여정을 따라가고 있는 견습생에 불과하다.

객체지향의 설계 원칙이나 객체 지향의 철학적인 의미는 대단히 중요하다. 하지만 이러한 것들을 지금 언급한다면 여러분은 미궁 속에 빠지게 될 것이다. 그래서 필자가 제안하는 것은 일단은 지식부터 익히자는 것이다. 언어가 지원하는 객체지향 문법을 배우고, 이것들이 어떻게 동작하는지를 충분히 이해한 다음에 비로소 설계 원칙도 이야기할 수 있고, 객체와 사물의 비유도 시도해 볼 수 있을 것이다. 여기서는 몇 가지 객체지향이 추구하는 지향점을 가볍게 이야기하고 다음 토픽부터 구체적인 문법을 알아볼 것이다.

부품화

프로그래밍은 정신적인 활동이다. 정신적인 것은 실체가 없고, 무한하고, 유연하다. 이러한 특성은 정신이 가진 장점이면서  소프트웨어의 극치다. 하지만 정신의 이러한 특성은 때로 오해나 모순 같은 문제점을 유발한다. 소프트웨어도 이러한 문제점을 그대로 상속받는다. 이러한 문제점을 극복하기 위한 노력 중의 하나가 부품화라고 할 수 있다. 객체 지향과 부품화를 동일시 할 수는 없지만 부품화라고 하는 소프트웨어의 큰 흐름은 객체 지향이 만들어지는데 지대한 공헌을 했다고 할 수 있다. 하드웨어에서 이루어지는 부품화의 예를 보자.

아래의 컴퓨터는 초창기의 컴퓨터다.

본체와 모니터와 키보드가 하나로 단일화되어 있다. 이것의 문제점은 분명하다. 모니터가 고장 나면 컴퓨터를 바꿔야 한다. 키보드가 고장 나도 컴퓨터를 교체해야 한다.

그래서 위와 같이 모니터와 본체와 컴퓨터를 분리했다. 다시 말해서 부품화 시킨 것이다. 기능들을 부품화 시킨 덕분에 소비자들은 더 좋은 키보드나 저렴한 모니터를 선택할 수 있게 되었다. 또 문제가 생겼을 때 그 문제가 어디에서 발생한 것인지 파악하고 해결하기가 훨씬 쉬워진다.

위의 그림에서 모니터와 키보드 그리고 본체를 분리하는 기준은 무엇일까? 그 기준을 세우는 것이 추상화일 것이다. 위 제품의 기획자는 컴퓨터를 입력과 출력 그리고 연산 & 저장으로 분류하고 있다. 이 분류에 따라서 부품들을 모으고 분리해서 모니터, 키보드, 본체와 마우스라는 개별적인 완제품을 만들고 있다. 이 완제품들을 부품으로 조합하면 컴퓨터라는 하나의 완제품이 만들어진다.

물론 정해진 답이 있는 것은 아니다. 아래 컴퓨터는 저장 장치를 부품화시키고 있다.

또 아래 장치는 현시점에서 최신 데스크탑이다. 그런데 부품화를 제거하고 있다. 기술이 경량화되면서 컴퓨터는 더욱 작아지게 되었고, 그 결과 컴퓨터를 부품화하는 것의 매력이 반감되고 있기 때문이 아닐까? 부품화가 중요한 것임에는 분명하지만 그 보다 중요한 것은 적절함이다. 그래서 설계가 어려운 것이다.

 

객체 지향은 부품화의 정점이라고 할 수 있다. 하지만 우리는 아직 객체 지향을 배우지 않았다. 그래서 우리가 배운 것 중에서 부품화의 특성을 보여줄 수 있는 기능을 생각해보면 좋을 것 같다. 메소드는 부품화의 예라고 할 수 있다. 메소드를 사용하는 기본 취지는 연관되어 있는 로직들을 결합해서 메소드라는 완제품을 만드는 것이다. 그리고 이 메소드들을 부품으로 해서 하나의 완제품인 독립된 프로그램을 만드는 것이다. 메소드를 사용하면 코드의 양을 극적으로 줄일 수 있고, 메소드 별로 기능이 분류되어 있기 때문에 필요한 코드를 찾기도 쉽고 문제의 진단도 빨라진다.

그런데 프로그램이 커지면 엄청나게 많은 메소드들이 생겨나게 된다. 메소드와 변수를 관리하는 것은 점점 어려운 일이 되기 시작한다. 급기야는 메소드가 없을 때와 같은 상황에 봉착하게 된다. 메소드는 프로그래밍의 역사에서 중요한 도약이었지만, 이 도약이 성숙하면서 새로운 도약지점이 보이기 시작한 것이다.

그 도약 중의 하나가 객체 지향 프로그래밍이다. 이것의 핵심은 연관된 메소드와 그 메소드가 사용하는 변수들을 분류하고 그룹핑하는 것이다. 바로 그렇게 그룹핑 한 대상이 객체(Object)다. 비유하자면 파일과 디렉토리가 있을 때 메소드나 변수가 파일이라면 이 파일을 그룹핑하는 디렉토리가 객체라고 할 수 있다. 이를 통해서 더 큰 단위의 부품을 만들 수 있게 되었다. 객체를 만드는 법에 대해서 호기심이 생기지 않는가? 이런 호기심을 유발시키는 것이 이번 토픽의 목적이다. 객체를 만드는 법은 다음 토픽에서 알아보고 지금은 부품화에 대해서 조금 더 생각해보자.

은닉화, 캡슐화

그런데 부품화라고 하는 목표는 단순히 동일한 기능을 하는 메소드와 변수를 그룹핑한다고 달성되는 것은 아니다. 제대로된 부품이라면 그것이 어떻게 만들어졌는지 모르는 사람도 그 부품을 사용하는 방법만 알면 쓸 수 있어야 한다. 이를테면 모니터가 어떻게 동작하는지 몰라도 컴퓨터와 모니터를 연결하는 방법만 알면 화면을 표시 할 수 있는 것과 같은 이치다. 즉 내부의 동작 방법을 단단한 케이스 안으로 숨기고 사용자에게는 그 부품의 사용방법만을 노출하고 있는 것이다. 이러한 컨셉을 정보의 은닉화(Information Hiding), 또는 캡슐화(Encapsulation)라고 부른다. 자연스럽게 사용자에게는 그 부품을 사용하는 방법이 중요한 것이 된다.  

인터페이스

잘 만들어진 부품이라면 부품과 부품을 서로 교환 할 수 있어야 한다. 예를들어보자. 집에 있는 컴퓨터에 A사의 모니터를 연결하다가 B사의 모니터를 연결 할 수 있다. 또 집에 있던 모니터에 A사의 컴퓨터를 연결해서 사용하다가 새로운 컴퓨터를 구입하면서 B사의 컴퓨터를 연결 할 수 있다. 모니터와 컴퓨터는 서로가 교환관계에 있는 것이다. 이것은 모니터와 컴퓨터를 연결하는 케이블의 규격이 표준화 되어 있기 때문에 가능한 일이다. 아래의 그림을 보자. 모니터와 컴퓨터를 연결하는 케이블인 HDMI를 보여준다.

 

컴퓨터와 모니터를 만드는 업체들은 위와 같은 케이블의 규격을 공유한다. 모니터 입장에서는 컴퓨터가, 컴퓨터 입장에서는 모니터가 어떤 식으로 만들어졌는지는 신경쓰지 않는다. 각각의 부품은 미리 정해진 약속에 따라서 신호를 입, 출력하고, 연결점의 모양을 표준에 맞게 만들면 된다. 이러한 연결점을 인터페이스(interface)라고 한다. 위의 그림을 보면 HDMI 케이블의 연결점은 특유의 생김새가 있다. 만약 HDMI 케이블을 랜선을 연결하는 구멍에 연결하려고 한다면 어떻게 될까? 동작하지 않을 뿐 아니라 연결 자체가 되지 않는다. 인터페이스란 이질적인 것들이 결합하는 것을 막아주는 역할도 하는 것이다. 즉 인터페이스는 부품들 간의 약속이다. 이러한 약속을 프로그래밍적으로는 어떻게 구현하는가도 살펴본다.

지금까지 객체를 부품으로 비유해서 설명 했다. 그런데 비유는 비유일 뿐이다. 비유는 의도한 유사점 뿐만 아니라 의도하지 않은 차이점까지도 전달될 가능성이 있기 때문이다. 비유의 함정이라고 할 수 있다. 소프트웨어는 하드웨어가 아니다. 하드웨어가 할 수 없는 것을 소프트웨어는 할 수 있다. 그 중의 하나가 복제와 상속이다. 이러한 개념을 구체적인 문법 없이 설명하는 것은 효용이 크지 않을 뿐만 아니라 자칫 흥미를 저해할 위험이 있기 때문에 여기서는 설명하지 않았다. 소프트웨어가 있기 이전부터 하드웨어가 이룩한 성취를 잘 수용하면서 동시에 소프트웨어 다운 소프트웨어를 만드는 것은 우리게게 주어진 숙제라고 할 수 있다.

 

Designed by Mourad Mokrane

댓글

댓글 본문
작성자
비밀번호
  1. 선생님
    감사합니다
    선생님
    열심히 살겠습니다
  2. 니가프로그래밍을한다고?
    10번 이해할거 한번에 이해하게 해주는 매직튜토리얼입니당
  3. ㅇㅇ
    잘 보았습니다
  4. Thank you sir
  5. cicada
    이고잉님의 철학을 본받고싶네요.
    배우는 자들을 위한 섬세함...
  6. 정명호
    감사합니다
  7. 만사총수
    잘 봤습니다. 객체지향, 인터페이스,상속,복제,은닉,캡슐화.. 개념이 쪼끔 잡히네요.^^
  8. 446번째 시청자 입니다.
    프로그램을 처음 배우면서 가장 힘든 것이 프로그램이라는 거대한 개념들을 이해하는 것이
    참 쉽지 않았는데 비유의 함정에 최대한 빠지지 않고 필요한 개념만을 잘 이해할 수 있도록
    참 잘 설명해주셔서 너무나 도움이 많이 되고 있습니다.
    자바를 시작으로 개발에 필요한 다른 요소들 까지도 생활 코딩을 통해서 알아나갈 수 있을 것
    같아서 다음 학습이 항상 기대가 되고 더 배우고 싶은 호기심과 동기부여가 되서 참 좋은것
    같습니다.^^
  9. jsm0292@gmail.com
    감사합니다 정말 도움이 많이 되용! 다들 화이팅 !
  10. 신입생 용가리
    객체지향에 대한 최고의 강의 입니다.
  11. 투덜이아저씨
    잘 봤습니다.
  12. 비유가 이해하기 정말 쉽네요~ 감사합니다.
  13. 김성키
    진짜... 대단하세요... 이고잉느님..
  14. 정말 간단하고 쉽게 이해했습니다. 좋은강의 감사합니다!
  15. joo0914krs
    감사합니다
  16. vpdls1512
    정말 대단합니다..
  17. UOS_Student
    언어의 마술사시네요 짝짝짝
  18. JustStudy
    고맙습니다
  19. 코딩인가비
    잘 배우고있습니다
  20. 택이
    정말 잘가르치십니다. 짝짝짝
  21. 캄사하므니다!!!
  22. 오빠는다르다
    감사합니다!!!!
  23. 꾸이
    이고잉님은 이해왕
    오늘도 잘넘어갑니다
    계속 잘따라가겟습니다
  24. 김치현
    좋은 강의 감사합니다!
  25. 박첩구드
    감사합니다~
  26. 농부
    감사합니다. 많은 도움되었습니다.
  27. 루낰이
    어려운 개념을 쉽게 설명해주시다니... 왠만한 교수님들보다 대단하신거 같아요! 감사합니다
  28. Byunghawk Lee
    다음으로...
    클래스와....
    감사합니다
  29. 허니버터
    잘보고 넘어 갑니다.
  30. 대수니
    이고잉님 감사합니다
  31. 맨발
    큰 도움이 되었습니다.

    감사합니다
  32. 히스토
    객체지향에 대해서 어렵게 생각하고 있었는디 명쾌하게 정리되었네요. 강의도 잘하시고,글도 잘 쓰시네요.^^

    감사합니다~
  33. SCSC
    계절학기로 기초컴퓨터프로그래밍을 자바로 처음 배우고 있는데요~~
    수업시간에 객체지향 생성자 접근지정자 static멤버... 이틀만에 슉 지나가서 수박 겉 물기만 다 닦았네요 ㅠ
    대신 여기서 제대로 공부하고 있습니다^^
  34. 마르티엘
    메소드 강의를 들어보니까 자바에서 메소드가 c에서 함수라고 보면 되는 것 같던데..

    객체는 변수와 메소드를 그룹핑 한거라고 말씀을 해주셨는데 이거는 충분히 c에서도 가능하다고 생각이 듭니다.

    하지만 c는 객체지향 언어가 아닌데 아닌 이유가 '객체지향에 해당하는 문법이 따로 존재하지 않아서 그렇다' 라고

    받아 들이면 되는 것인가요?? 아직 개념이 명확하지가 않아서 이런 질문을 올리게 됐습니다.
  35. EunJe Cho
    정말 잘 들었습니다 ^^ 좋은 강의 감사합니다.
  36. couldbe
    두근두근 .... 시즌 2를 앞두고 이고잉님의 명료하고 친절한 강의 기대됩니다. 그리고 페이스북 생활코딩 그룹 가입이 아직 대기중입니다. 가입승인 부탁드려요^^
  37. 옐로우드
    추상적인 개념에 대한 이해가 어려워 비전공자로써 공부하는데 끊임없이 무언가 잡히지 않았던 부분들이 이렇게 해결 되다니요.
    대학 강의와도 같은 수준의 이고잉님 수업. 정말 감사합니다.
    항상 좋은 강의 부탁드립니다! :)
  38. 안톤
    소프트웨어만이 할 수 있는 기능. 이래서 꼭 배우고 싶습니다. 화이팅
  39. Gelgel
    좋은 강의 제공해주셔서 감사합니다.
  40. kkppqq@daum.net
    good!!
  41. 김용선
    진짜 잘 설명라시네요 핵심 개념을
    사실 객체가 아리송 했거든요
    클래스도 그런데 아직 못봐서 기대하고 봐야겠네요
    감솨합네다 ~ㅇ
  42. 수강생
    ㄷㄷ... 명강의... 대학교, 유명한 IT 학원 강의는 비교 불가한 레벨의 상당한 명강의 잘 보고 있습니다...
    핵심과 초보자도 접근하기 쉬운 단어, 비교들로 훨씬 수월하게 지식이 전달되고 있습니다.
    다른 대학교수, 학원강사들은 필히 본 강의를 하시는 분에게 배워야 할 것입니다... 감사히 배우고 있습니다.
  43. 해골당나귀
    질좋은 강의 항상 감사합니다.
  44. 비비
    크래딧 줄만한 강의다
  45. 안녕이란말
    좋은강의 감사합니다~
  46. 싸구려입맛
    너무 감사드립니다.
    매번 잘 보고 있습니다.
  47. sona
    제가 찾아보았던 객체지향에 대한 글중에 가장 이해하기 쉽도록 설명한 글 같습니다.
  48. kanadel
    많이 배워갑니다. 감사합니다.
  49. 심비행기
    대박입니다.. 이렇게 가려운 곳을 긁어주는 강의가 또 있을까요..ㅎㅎ
    감사합니다!!
  50. egoing
    xinics 라는 소프트웨어입니다. 와콤 타블렛에 포함된 제품입니다.
    대화보기
    버전 관리
    egoing
    현재 버전
    선택 버전
    graphittie 자세히 보기