객체지향 프로그래밍
객체 지향 프로그래밍(OOP, Object-Oriented Programming)이란 컴퓨터 프로그램을 여러 명령어(command)의 목록으로 보지 않고 여러 개의 독립된 객체(object)들의 집합으로 파악하는 프로그래밍 기법이다. 객체 지향 프로그래밍은 컴퓨터 프로그램을 객체라는 기본 단위로 나누고, 각각의 객체가 메시지를 주고받으며 데이터를 처리하는 비절차적 프로그래밍 방법이다. 프로그램을 유연하고 변경하기 쉽게 만들기 때문에 절차지향 언어에 비하여 재사용성이 용이하고 유지 보수가 간편하다.
개요
오늘날 많은 유명한 프로그래밍 언어(Java, C++, C#, Python, PHP, Ruby, Object-C)는 객체지향 프로그래밍을 지원한다. “객체지향”이라는 개념은 불행히도 명확한 정의가 없는 것이 특징이다. 우리가 어떠한 개념을 이해하려할 때, 그 개념의 특성(attribute, property)을 통해 이해하는 것처럼 객체지향도 객체지향의 특성을 통해 이해할 수밖에 없다.
객체지향 프로그래밍은 실세계에 존재하고 인지하고 있는 객체(Object)를 소프트웨어의 세계에서 표현하기 위해 객체의 핵심적인 개념 또는 기능만을 추출하는 추상화(abstraction)를 통해 모델링하려는 프로그래밍 패러다임을 말한다. 다시 말해, 우리가 주변의 실세계에서 사물을 인지하는 방식을 프로그래밍에 접목하려는 사상을 의미한다.
객체지향 프로그래밍은 함수들의 집합 혹은 단순한 컴퓨터의 명령어들의 목록이라는 전통적인 절차지향 프로그래밍과는 다른, 관계성있는 객체들의 집합이라는 관점으로 접근하는 소프트웨어 디자인으로 볼 수 있다.
각 객체는 메시지를 받을 수도 있고, 데이터를 처리할 수도 있으며, 또다른 객체에게 메시지를 전달할 수도 있다. 각 객체는 별도의 역할이나 책임을 갖는 작은 독립적인 기계 또는 부품으로 볼 수 있다.
객체지향 프로그래밍은 보다 유연하고 유지보수하기 쉬우며 확장성 측면에서서도 유리한 프로그래밍을 하도록 의도되었고, 대규모 소프트웨어 개발에 널리 사용되고 있다.[1]
등장 배경
초기 프로그래밍은 절차적 프로그래밍이었다. 명시된 입력을 받아서 명시된 순서로 처리한 다음, 그 결과는 내는 방식이었다. 프로그램을 어떤 논리로 어떤 순서대로 써 내려가는것이 주요한 쟁점이었다. 그러나 간단한 알고리즘이면 몰라도, 조금만 복잡해지면 순서도로 나타내지는게 불가능한 스파게티코드를 양산하게 된다. 시간이 흐를수록 복잡한 프로그램이 요구되었는데, 기존 절차적 프로그래밍으로는 도저히 작성할 수가 없었던것이다.
이 때 구조적 프로그래밍이 탄생하게 된다. 프로그램을 함수단위로 나누고 함수끼리 호출을 하는 방식이다. 프로그램이라는 큰 문제를 해결하기 위해 작은 함수로 쪼개는 방식이기 때문에 탑-다운(하향식) 방식이라고도 불린다.
그러나 구조적 프로그래밍도 데이터 자체를 구조화 하지는 못했다. 전역 네임 스페이스는 점점 포화상태가 되어가고, 특히나 GUI프로그램에서는 실행 콘텍스트를 저장할 방법이 없었다.
이를 극복하기 위한 대안으로 나온것이 객체지향 프로그래밍이다. 큰 문제를 쪼개는 것이 아니라, 먼저 작은 문제들을 해결할 수있는 객체들을 만든 뒤, 이 객체들을 조합해서 큰 문제를 해결하는 상향식(Bottom-up) 해결법을 도입한 것이다. 객체를 독립성과 신뢰성이 보장되게 만들어 놓으면 재사용성도 높아지므로 개발기간과 비용 또한 줄어들게 되었다.[2]
역사
초기 프로그래밍 방식인 절차적 프로그래밍 방식은 입력을 받아 명시된 순서대로 처리한 다음 그 결과를 내는 언어로서, 조금만 복잡해져도 다른 사람이 보고 이해하기 어려울 정도여서 유지보수가 어려운 단점이 있었다. 절차적 프로그래밍 방식을 보완하기 위해 1960년 조한 달과 크리스틴이 시뮬라67(Simula67)을 발표했다. 시뮬라는 최초의 객체 지향 프로그래밍 언어로 클래스 라는 개념이 도입되었으나 널리 확산되지는 못하였다. 이 뒤로 10여년 간 객체 지향 언어는 전혀 주목을 받지 못하였고 이어서 팰러액토 연구소의 스몰토크(Smalltalk), 미 국방성의 에이다 등이 만들어졌다. 이후 AT&T 벨 연구소의 C++등의 프로그램들이 객체 지향 언어에 큰 영향을 미쳤던 GUI의 발전에 따라 향상되었다. 1990년대 중반 이후로 각광받고 있는 썬 마이크로시스템즈의 자바(Java) 언어가 만들어졌다. 이후 펄(Perl), 파이썬(Python), PHP, 루비(Ruby), C# 등 다양한 객체 지향 프로그래밍 언어가 만들어졌다.[3]
구성 요소
- 객체(object) : 객체는 자신의 고유의 속성(attribute)을 가지며, 클래스에서 정의한 행위(behavior)를 수행 가능하게한다. 객체에서 실행하는 행위를 클래스에서 정의된 행위를 공유함으로써 메모리를 추가로 사용하지 않기에 중복해서 사용하는 값을 지불할 필요가 없어진다. 데이터와 그에 관련되는 동작(절차, 방법, 기능)을 모두 포함하는 인스턴스이다.[3]
- 클래스(class) : 같은 종류의 집단에 속하는 속성(attribute)과 행위를 정의한 객체지향 프로그램의 기본적인 사용자 정의 데이터형(defined data type)이며 오퍼레이션, 관계 등을 갖고 있는 객체들의 집합이다. 다른 클래스 또는 외부 요소와 독립적으로 디자인되어야 한다.[3]
- 메소드(method) : 클래스 내부에 정의된 객체가 수행해야 할 오퍼레이션이다. 한 객체의 서브루틴 형태로 객체의 속성을 조작하는데 사용된다. 존의 프로그래밍 언어에서 함수(function)와 같은 역할을 한다. 한 객체의 서브루틴 형태로 객체의 속성을 조작하는데 사용된다.[3]
특징
- 캡슐화(Encapsulation) : 캡슐화란 관련 기능과 특성을 모아서 분류하는 작업이다. 프로그램의 실제 구현 내용이 외부로 드러나지 않도록 특정 모듈(클래스) 내부로 은닉하는 것이다. [4]
- 상속(Inheritance) : 새로운 클래스가 기존의 클래스의 자료와 연산을 이용할 수 있게 하는 기능이다. 상속을 받는 새로운 클래스는 부클래스, 파생 클래스, 하위 클래스, 자식 클래스라고 하며 새로운 클래스가 상속하는 기존의 클래스를 기반 클래스, 상위 클래스, 부모 클래스라고 한다. 상위 클래스의 특성과 기능을 그대로 물려받음으로써, 하위 클래스를 이용해 프로그램의 요구에 맞추어 클래스를 수정가능하고 클래스 간의 종속 관계를 형성함으로써 객체를 조직화할 수 있다. 캡슐화 및 재사용이 용이하도록 해준다. [4]
- 다중 상속(Multiple inheritance) : 다중 상속은 클래스가 2개 이상의 클래스로부터 상속받을 수 있게 하는 기능이다. 클래스들의 기능이 동시에 필요할 때는 용이하나 클래스의 상속 관계에 혼란을 줄 수 있기 때문에 프로그래밍 언어에 따라 사용 가능 유무가 다름으로 주의가 필요하다. JAVA는 지원하지 않는다.[3]
- 다형성(多形性, Polymorphism) : 하나의 변수명이 상황에 따라 다른 의미로 해석될 수 있는 성질을 뜻한다. 일반적으로 오버라이딩 , 오버로딩을 의미한다. 다형 개념을 통해서 프로그램 안의 객체 간의 관계를 조직적으로 나타낼 수 있다.[3]
- 자료 추상화(Data Abstraction) : 불필요한 정보를 숨기고 중요한 정보만 표현함으로 프로그램을 보다 간단화 시켜 공통의 속성이나 기능을 묶어 이름을 붙이는 것이다. 자료 추상화를 통해 정의된 자료형을 추상 자료형이라고 한다. 추상 자료형은 자료형의 자료 표현과 자료형의 연산을 캡슐화한 것으로 접근 제어를 통하여 자료형의 정보를 은닉할 수 있다. 객체 지향 프로그래밍에서 일반적으로 추상 자료형을 클래스, 추상 자료형의 인스턴트를 객체, 추상 자료형에서 정의된 연산을 메소드(함수), 메소드의 호출을 생성자라고 한다.[3]
- 동적 바인딩(Dynamic binding) :실행 시간 중 일어나거나 실행 과정에서 변경될 수 있는 바인딩이다. 정적 바인딩과는 대비되는 개념으로 헌 개체나 기호를 실행과정에 여러 속성이나 연산에 바인딩함으로써 다형 개념을 실현한다.[3]
객체 지향 언어
다양한 객체 지향 프로그래밍 언어가 존재한다.
- 스몰토크(Smalltalk)
- 루비(Ruby)
- 파이썬(Python)
- 자바(Java)
- C#
- C++
- Objective-C
- 오브젝티브-파스칼(Objective-Pascal)
- 비주얼베이직닷넷(VB.NET)
- 델파이(Delphi)
- ASP
각주
- ↑ , <자바스크립트 객체지향 프로그래밍>, 《5.20 Object-Oriented Programming》
- ↑ , <객체지향 프로그래밍의 정의와 탄생배경>, 《궁금한 Daniel》, 2018-10-17
- ↑ 3.0 3.1 3.2 3.3 3.4 3.5 3.6 3.7 , 〈객체 지향 프로그래밍 〉, 《위키백과》, 2020-07-23
- ↑ 4.0 4.1 <객체 지향 프로그래밍이 뭔가요? (꼬리에 꼬리를 무는 질문 1순위, 그놈의 OOP)>, 《기본기를 쌓는 정아마추어 코딩블로그》, 2017-11-15
참고자료
- 위키백과,<객체 지향 프로그래밍>, 《위키백과》, 2020-07-23
- 정아마추어, <객체 지향 프로그래밍이 뭔가요? (꼬리에 꼬리를 무는 질문 1순위, 그놈의 OOP)>, 《기본기를 쌓는 정아마추어 코딩블로그》, 2017-11-15
- 나무위키, <객체 지향 프로그래밍>, 《나무위키》, 2020-05-22
- PoiemaWeb, <자바스크립트 객체지향 프로그래밍>, 《5.20 Object-Oriented Programming》
- Daniel.kwa, <객체지향 프로그래밍의 정의와 탄생배경>, 《궁금한 Daniel》, 2018-10-17
같이 보기