2013년 12월 5일 목요일
객체지향 프로그래밍 (Object Oriented Programming)
객체지향 프로그래밍(OOP)의 개념이 생기게 된 이유는 하드웨어는 빠르게 발전하는데 소프트웨어는 그 속도를 따라가지 못하고 생산성이 정체가 되어 사용자의 요구사항을 제대로 반영하지 못하게 되자, CPU, 그래픽카드의 컴퓨터 부품처럼 소프트웨어도 부품화(컴포넌트, Component)시키면서 유지보수를 쉽게 하여 거대한 프로그램을 빠르게 개발할 수 있도록 하자는 취지에서 만들어졌다.
절차지향 프로그래밍이든 객체지향 프로그래밍(OOP)이든 기계어로 변환이 되어야 컴퓨터에서 실행이 가능한데, 객체지향 프로그래밍(OOP)언어는 기계어로 변환해주는 컴파일러(Compiler)에서 처리해야될 내용이 더 많고 기계어로 변환된다 하더라도 여러가지 정보에 대한 오버헤드가 있기 때문에 절차지향 프로그래밍 언어보다 느릴 수 밖에 없다. 하지만 컴퓨터의 성능은 날이 갈수록 좋아지고 있으니 장점이 단점을 상쇄하고도 남는다.
객체지향 프로그래밍(OOP, Object Oriented Programming) 언어로는 Java 이외에도 Objective C, C++, Object Pascal 등이 있는데 C++계열에는 Microsoft 사의 Visutal C++ 이 유명하고, Apple 사의 맥OS에서 사용하는 언어는 Objective C 이며, 예전에 Borland 사의 제품이였지만 지금은 CodeGear 라는 회사에서 Dephi 라는 제품을 내놓고 있는데 Object Pascal을 사용한다.
Windows 환경에서 DirectX를 이용한 게임을 만든다고 하면 Visaul C++ (MFC) 를 배워야 하고, Apple의 iPod/iPhone 어플을 만든다고 하면 Objective C를 배워야 한다. Java는 웹/서버 프로그래밍이나 네트워크에 특화되어 있다. 특히 모바일쪽에서는 강세를 나타내는데 (JavaME) 요즘 이슈가 되고 있는 Google의 안드로이드 폰 어플리케이션도 Java로 만든다.
객체지향 프로그래밍의 핵심적인 개념은 "데이터(Data)"중심이 아닌 "객체(Object)"중심이라는 것이다. 객체(Object)는 "데이터(Data)와 절차의 융합체"라고 할 수 있다. 절차지향 프로그래밍에서의 단위 프로그램을 "기능"이 아닌 "행위(Behavior)"로 바라보고 외부의 입/출력 데이터를 함께 묶어서 현실세계의 "사물"의 속성을 그대로 표현할 수 있도록 발상의 전환을 한 것이다. 문법적인 구조는 차차 공부하기로 하고 일단 객체지향 프로그래밍에는 아래와 같은 3대 요소가 있다.
캡슐화 (Encapsulation)
상속 (Inheritance)
다형성 (Polymorphism)
Java 에서 객체(Object)는 클래스(Class)를 이용해 구현하는데 클래스의 문법적인 구조가 캡슐화, 다형성, 상속을 모두 지원한다. 또한 "모든 클래스는 Object 클래스를 상속받는다".
예전에 이클립스에서 HelloWorld라는 간단한 프로젝트를 하나 만들었는데, Class 이름에(HelloWorld) 마우스 오른쪽 클릭해서 "Open Type Hierarchy (F4)"를 선택해보자. 이 기능은 부모 클래스의 계층 구조를 표시해준다.
별도로 Object 클래스를 상속받겠다고 한 적이 없는데 알아서 상속이 되었다. 객체(Object)와 Object 클래스는 의미가 조금 다르다. 아뭏든 Object 클래스를 도식화하면 아래와 같다.
위의 Object 클래스를 보면 equals(), toString()등이 보이는데, 절차지향 프로그래밍에서 단위 프로그램(Procedure/Function)과 같은 역할을 한다. 하지만 클래스에서는 메소드(Method)라고 부르며 객체의 행위를 정의하게 된다. 여기에는 표시되지 않았지만 클래스는 내부에서 사용하는 필드를 가질 수 있고 메소드들이 공유해서 사용할 수 있다. 정리하면 클래스는 이런식으로 표현이 가능하다. (객체=필드+메소드)
절차지향 프로그래밍 언어의 단위 프로그램(Procedure/Function)에서 확장된 개념으로 이해해도 사실 큰 무리는 없다. 실제로 C 언어에서 구조체(Structure)와 함수 포인터(Pointer)를 활용하면 이와 같이 구현하는 것이 불가능한 건 아니다. 하지만 프로그램이 복잡해지고 어려워져서 유지보수가 더욱 힘들게 된다.
보통의 경우 클래스는 바로 사용하지 않고 인스턴스(Instance)를 생성해서 사용한다는 것을 기억하자. 클래스는 객체(Object)의 구조를 정의한 것이고 클래스의 내용을 실질적으로 접근하고 사용하려면 인스턴스를 생성해야 된다는 뜻이다. 마치 도장을 찍으려면 도장을 먼저 파야 되는 것과 마찬가지이다.
중요한 것은 객체지향 프로그래밍은 추상화를 통한 "인간적인 사고방식"의 표현을 가능하게 한다는 것이다.
피드 구독하기:
댓글 (Atom)
댓글 없음:
댓글 쓰기