OOP에 대해 잘 정리된 글

안녕하세요. 데브뱅크(http://www.devbank.co.kr)의 장두헌입니다.

처음에 액션스크립트2.0을 소개하면서 액션스크립트2.0에 대한 그리 좋은 시선을 보이지 않았습니다. 기존의 개발자에게 OOP란 새로운 개발 환경을 강요하는 것이 그리 달갑지 않았기 때문인데 추세가 그런가 봅니다.


ASP나 PHP 보다 JSP가 더 유행을 타고 VB(.net) 머져도 클래스를 사용해야 한다니…. 그리고 플래시를 모르는 사람에게 플래시에서도 클래스를 사용하고 상속, 인터페이스와 같은 말을 늘어놓으면 어리둥??해 할수도 있겠군요.


아마 이 강좌를 보는 사람은 대부분 비 전공자가 많을 것이라고 생각하고 있습니다. 저도 화학 공학을 전공했어요. 공장에서 일하다 칙칙한 냄새가 싫어서 키보드를 누르며 끼닐를 채우게 되었지요.


이런 우리들에게 OOP의 생소한 개념을 먼저 설명 하겠습니다. 저희 회사 홈페이지에서 C#강좌 용으로 쓴 것입니다. 하지만 어자피 같은 OOP지.

1) 추상화 (Abstraction)


객체 지향 프로그램의 기원은 현실의 세상을 어떻게 하면 컴퓨터 상에서 구현할 수 있을까? 하는 근본적인 의문에서 시작합니다. 지도를 예를 들어 설명하겠습니다.


지도란 현실의 세계를 사람이 이해할 수 있도록 여러 가지 기호를 사용하여 형상화한 것입니다. 사람은 지도를 보고 건물의 위치나 방향 들을 알 수 있습니다. 사람이 입장이 아니라 컴퓨터의 입장에서 현실을 이해하기 위해서는 같은 방법으로 현실을 각각의 요소들로 구현해야 합니다. 그런데 지도를 보면 모든 사물을 세밀하게 그리는 것이 아니라 특징을 잡아 알기 편하도록 가능한 간단히 나타냅니다. 다시 말하면 객체를 구체적으로 설명하는 것이 아니라 특징을 요약하고 포괄적인 객체의 특징을 생략하게 됩니다. 이것을 추상화(Abstraction)이라고 합니다. 예를 들어 지도상에 십자가 모양이 있으면 우리는 교회구나 라라 생각합니다. 십자가는 구체적으로 그 교회에 대해 설명을 하지 않습니다. 교회의 종파는 장로교이고 교인 수나 규모 등등의 세부 사항을 알려주는 것이 아니라 단지 ‘교회란 예배를 드리는 곳이다’ 란 정보만을 담고 있습니다. 이처럼 추상화는 구체적인 특징을 설명하는 것이 아니라 모든 객체가 가지는 특징을 포괄합니다.




위의 그림은 추상화의 개념을 설명하고 있습니다. 현실 세계에서 존재하는 사물들이 오른쪽 그림에서 보면 단순한 기호들로 기호화 하였습니다. 그리고 불필요한 요소는 과감히 생략하여 현실 세계의 복잡성으로 인한 혼선을 최소화하였습니다. 다시 정리하면 객체 지향에서 추상화는 현식 새계의 객체들을 컴퓨터가 이해하도록 사물의 특징을 기호화 하는 과정을 말합니다.



2) 클래스(Class)


객체 지향이란 말을 들으면 클래스(Class)란 단어가 가장 먼저 떠올라야 합니다. 그만큼 객체 지향 프로그래밍에서 클래스는 중요합니다. 위에서 객체 지향 프로그래밍은 현실 세계의 이해에서 시작되었다고 말을 했습니다. 그러면서 추상화(Abstraction)를 통해서 현실 세계를 상징화합니다. 또한 추상화된 현실 세게는 재사용을 가능하게 합니다. 십자가의 예를 다시 들면 십자가를 한 곳에만 사용하는 것이 아니라 교회가 있는 곳이면 어디든지 십자가를 그려넣어 ‘이곳에 교회가 있습니다’라고 나타냅니다. 객체 지향 프로그래밍의 근본적인 목적도 여기에 있습니다. 공장에서 물건을 마구 쏟아내듯이 뚝딱뚝딱 해서 소프트웨어를 만들려는 의도였습니다. 일정한 틀을 만들어 놓고 같은 모양을 찍어내기만 하면 되는 그런 소프트웨어 공장을 생각했습니다. 그리고 새로운 소프트웨어를 만들 때도 이렇게 만들어진 일종의 부품들을 가지고 재결합하여 작업의 능률을 향상시킬 수 있습니다. 여기서 말하는 틀이 클래스(Class) 개념입니다.



그러면 클래스를 정의를 보겠습니다.






?래스(Class) 란?
An abstract data type which define the representation and behavior of object,



갑자기 영어를 사용해서 놀랐을지 모르겠네요. 필자가 영어를 잘해서도 아니고 그렇다고 영어 만을 골라 쓰는 그런 사람은 아닙니다. 이렇게 원문을 사용한 것은 컴퓨터 관련 서적을 보며 느낀점 중 하나가 용어 사용에 따른 오류가 많다는 것을 알았습니다. 애써서 번역을 한 것 보다 오히려 영어로 된 원문에서 표현이 이해하는데 쉬울 경우가 있습니다. 그래서 앞으로 몇몇 정의는 영어 원문을 그대로 쓸 생각입니다.



위의 정의를 보면 클래스란 표현이나 행동을 정의한 추상화된 데이터 타입이라고 해석됩니다. 다시 말하면 객체들의 공통 분모를 모아둔 그릇이라고 할 수 있습니다. 사람의 경우를 생각해봅시다. 우린 무엇을 사람이라고 하나요? 사람들은 재각기 모습과 행복방식은 달라도 우리는 사람을 다른 사물과 구분할 수 있습니다. 그것은 직립보행을 하고 사고 하는 능력이 있으며 말을 하고 등등의 공통된 특성이 있기 때문입니다.


그런데 하나의 클래스는 속성(attributes)과 가능(operation)으로 구분됩니다



3) 객체(Object)



클래스란 틀을 만들어서 물건을 마구 쏟아내는 공장처럼 객체들이 생성됩니다. 사람 공장을 만든 셈입니다. 사람이란 클래스가 만들어졌으므로 이젠 사람 클래스에서 만들어진 7000만 국민은 모두 각각의 객체입니다. 다른 예를 들어보면 세상에는 많은 컴퓨터가 있습니다. 하지만 내가 쓰는 컴퓨터와 순이네 컴퓨터, 영희네 컴퓨터, 철수네 컴퓨터와 서로 다릅니다. 컴퓨터 사양도 다를 뿐만 아리라 케이스 모양등 모든 면이 다를 것입니다. 여기서 개개인의 컴퓨터 하나하나가 객체입니다.







객체(Object) 란?
An object is an instance of its class



보통 인스턴스(instance)와 객체(Object)는 같은 의미로 쓰입니다. 각각의 객체들은 고유의 데이터(attributes)와 데이터를 처리하는 메소드(method)를 가지고 있습니다. 서로 다른 특성을 지니 객체들이 서로 메시지(nessage)를 교환하고 처리함으로써 자신의 역할을 감당합니다. 그리고 하나의 프로그램이 완성됩니다.


 



4) 캡술화(Encapsulation)


객체는 사생활이 있습니다. 그리고 보호 받기를 원합니다. 누구나 자신만의 드러내고 싶지 않는 비밀이 있으니까요. 이렇게 객체의 정보를 은닉(Information Hiding) 하는 것을 캡슐화(Encapsulation) 라고 합니다. 다시 설명하면 객체의 내부의 데이터를 사용자들에게 숨기는 것을 말합니다.
캡슐화의 목적은 정보의 은닉 이외에 아주 중요한 점이 있습니다. 그것을 객체의 사용을 편리하게 만들어줍니다. 예를 들면 우리가 키보드로 자판을 누르면 모니터에 글자가 나타납니다. 키보드를 눌렀을 때부터 모니터에 출력될 때까지 컴퓨터 내부적으로 어떠한 작용을 했는지 아는 사람은 거의 없을 것입니다. 사용자는 내부에서 무슨 일이 일어났는지 개의치 않습니다. 다만 목적하는 대로 작동을 하면 그것으로 만족합니다. 만약 모든 과정을 알아야 한다면 사용하기에 얼마나 어렵겠습니까? 사용자는 다만 키보드에서 공개하는 기능과 모니터의 역할을 알면 사용하는데 전혀 불편함이 없습니다.



5) 상속(Inheritance)


상속이라고 하면 부모가 자식에게 재산을 물려주는 것이 가장 먼저 떠오를 것입니다. 이와 마찬가지로 객체 지향 프로그래밍에서 상속이라고 하면 클래스에서 다른 클래스에게 자신의 속성과 기능을 물러주는 것을 말합니다.







상속(Inheritance)이란?


Sharing of common features among classes using generations



이 때 부모에 있는 클래스를 부모 클래스(Superclass)라고 하고 자식 입장에 있는 클래스를 자식 클래스(Subclass)라고 합니다.





6) 다형성(Polymorphism)


다형성은 말 그대로 부모 클래스로부터 상속을 받은 자식 클래스가 여러 가지 다른 형태를 가질 수 있다는 것을 의미합니다. 위의 그림을 다시 보면 야구공과 농구공는 모두 Ball이라는 클래스에서 상속을 받았지만 ‘친다’와 ‘패스하다’란 다른 메소드가 있습니다. 그리고 설령 부모 클래스와 같은 메소드가 자식 클래스 수준에서 구현되었어도 다른 형식으로 정의될 수 있습니다. 야구와 농구가 던지기란 메소드를 상속 받았다고 가정하면 야구의 던지기와 농구의 던지기는 그 역할이 다르므로 구현되는 방법도 다릅니다..






다형성(Polymorphism)이란?
An Object has its own type and also supertypes.

<!–"

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.