검수요청.png검수요청.png

"객체지향 프로그래밍"의 두 판 사이의 차이

위키원
이동: 둘러보기, 검색
2번째 줄: 2번째 줄:
  
 
== 개요 ==
 
== 개요 ==
오늘날 많은 유명한 프로그래밍 언어(Java, C++, C#, Python, PHP, Ruby, Object-C)는 객체지향 프로그래밍을 지원한다. “객체지향”이라는 개념은 불행히도 명확한 정의가 없는 것이 특징이다. 우리가 어떠한 개념을 이해하려할 때, 그 개념의 특성(attribute, property)을 통해 이해하는 것처럼 객체지향도 객체지향의 특성을 통해 이해할 수밖에 없다.
+
오늘날 많은 유명한 프로그래밍 언어(Java, C++, C#, Python, PHP, Ruby, Object-C)는 객체지향 프로그래밍을 지원한다. “객체지향”이라는 개념은 불행히도 명확한 정의가 없는 것이 특징이다. 우리가 어떠한 개념을 이해하려 할 때, 그 개념의 특성(attribute, property)을 통해 이해하는 것처럼 객체지향도 객체지향의 특성을 통해 이해할 수밖에 없다.
  
객체지향 프로그래밍은 실세계에 존재하고 인지하고 있는 객체(Object)를 소프트웨어의 세계에서 표현하기 위해 객체의 핵심적인 개념 또는 기능만을 추출하는 추상화(abstraction)를 통해 모델링하려는 프로그래밍 패러다임을 말한다. 다시 말해, 우리가 주변의 실세계에서 사물을 인지하는 방식을 프로그래밍에 접목하려는 사상을 의미한다.
+
객체지향 프로그래밍은 실세계에 존재하고 인지하고 있는 객체(Object)를 소프트웨어의 세계에서 표현하기 위해 객체의 핵심적인 개념 또는 기능만을 추출하는 추상화(abstraction)를 통해 모델링 하려는 프로그래밍 패러다임을 말한다. 다시 말해, 우리가 주변의 실세계에서 사물을 인지하는 방식을 프로그래밍에 접목하려는 사상을 의미한다.
  
객체지향 프로그래밍은 함수들의 집합 혹은 단순한 컴퓨터의 명령어들의 목록이라는 전통적인 절차지향 프로그래밍과는 다른, 관계성있는 객체들의 집합이라는 관점으로 접근하는 소프트웨어 디자인으로 볼 수 있다.
+
객체 지향 프로그래밍은 함수들의 집합 혹은 단순한 컴퓨터의 명령어들의 목록이라는 전통적인 절차지향 프로그래밍과는 다른, 관계성 있는 객체들의 집합이라는 관점으로 접근하는 소프트웨어 디자인으로 볼 수 있다.
  
각 객체는 메시지를 받을 수도 있고, 데이터를 처리할 수도 있으며, 또다른 객체에게 메시지를 전달할 수도 있다. 각 객체는 별도의 역할이나 책임을 갖는 작은 독립적인 기계 또는 부품으로 볼 수 있다.
+
각 객체는 메시지를 받을 수도 있고, 데이터를 처리할 수도 있으며, 또 다른 객체에게 메시지를 전달할 수도 있다. 각 객체는 별도의 역할이나 책임을 갖는 작은 독립적인 기계 또는 부품으로 볼 수 있다.
  
객체지향 프로그래밍은 보다 유연하고 유지보수하기 쉬우며 확장성 측면에서서도 유리한 프로그래밍을 하도록 의도되었고, 대규모 소프트웨어 개발에 널리 사용되고 있다.<ref name="PoiemaWeb"> , <[https://poiemaweb.com/js-object-oriented-programming 자바스크립트 객체지향 프로그래밍]>, 《5.20 Object-Oriented Programming》</ref>
+
객체지향 프로그래밍은 보다 유연하고 유지 보수하기 쉬우며 확장성 측면에서도 유리한 프로그래밍을 하도록 의도되었고, 대규모 소프트웨어 개발에 널리 사용되고 있다.<ref name="PoiemaWeb"> , <[https://poiemaweb.com/js-object-oriented-programming 자바스크립트 객체지향 프로그래밍]>, 《5.20 Object-Oriented Programming》</ref>
  
 
== 등장 배경 ==
 
== 등장 배경 ==
초기 프로그래밍은 절차적 프로그래밍이었다. 명시된 입력을 받아서 명시된 순서로 처리한 다음, 그 결과는 내는 방식이었다. 프로그램을 어떤 논리로 어떤 순서대로 써 내려가는것이 주요한 쟁점이었다. 그러나 간단한 알고리즘이면 몰라도, 조금만 복잡해지면 순서도로 나타내지는게 불가능한 스파게티코드를 양산하게 된다. 시간이 흐를수록 복잡한 프로그램이 요구되었는데, 기존 절차적 프로그래밍으로는 도저히 작성할 수가 없었던것이다.
+
초기 프로그래밍은 절차적 프로그래밍이었다. 명시된 입력을 받아서 명시된 순서로 처리한 다음, 그 결과는 내는 방식이었다. 프로그램을 어떤 논리로 어떤 순서대로 써 내려가는 것이 주요한 쟁점이었다. 그러나 간단한 알고리즘이면 몰라도, 조금만 복잡해지면 순서도로 나타내지는 게 불가능한 스파게티 코드를 양산하게 된다. 시간이 흐를수록 복잡한 프로그램이 요구되었는데, 기존 절차적 프로그래밍으로는 도저히 작성할 수가 없었던 것이다.
  
이 때 구조적 프로그래밍이 탄생하게 된다. 프로그램을 함수단위로 나누고 함수끼리 호출을 하는 방식이다. 프로그램이라는 큰 문제를 해결하기 위해 작은 함수로 쪼개는 방식이기 때문에 탑-다운(하향식) 방식이라고도 불린다.
+
이때 구조적 프로그래밍이 탄생하게 된다. 프로그램을 함수 단위로 나누고 함수끼리 호출을 하는 방식이다. 프로그램이라는 큰 문제를 해결하기 위해 작은 함수로 쪼개는 방식이기 때문에 탑-다운(하향식) 방식이라고도 불린다.
  
그러나 구조적 프로그래밍도 데이터 자체를 구조화 하지는 못했다. 전역 네임 스페이스는 점점 포화상태가 되어가고, 특히나 GUI프로그램에서는 실행 콘텍스트를 저장할 방법이 없었다.  
+
그러나 구조적 프로그래밍도 데이터 자체를 구조화하지는 못했다. 전역 네임 스페이스는 점점 포화상태가 되어가고, 특히나 GUI 프로그램에서는 실행 콘텍스트를 저장할 방법이 없었다.
  
이를 극복하기 위한 대안으로 나온것이 객체지향 프로그래밍이다. 큰 문제를 쪼개는 것이 아니라, 먼저 작은 문제들을 해결할 수있는 객체들을 만든 뒤, 이 객체들을 조합해서 큰 문제를 해결하는 상향식(Bottom-up) 해결법을 도입한 것이다. 객체를 독립성과 신뢰성이 보장되게 만들어 놓으면 재사용성도 높아지므로 개발기간과 비용 또한 줄어들게 되었다.<ref name="Daniel.kwak"> , <[https://dduddublog.tistory.com/8 객체지향 프로그래밍의 정의와 탄생배경]>, 《궁금한 Daniel》, 2018-10-17 </ref>
+
이를 극복하기 위한 대안으로 나온 것이 객체지향 프로그래밍이다. 큰 문제를 쪼개는 것이 아니라, 먼저 작은 문제들을 해결할 수 있는 객체들을 만든 뒤, 이 객체들을 조합해서 큰 문제를 해결하는 상향식(Bottom-up) 해결법을 도입한 것이다. 객체를 독립성과 신뢰성이 보장되게 만들어 놓으면 재사용성도 높아지므로 개발 기간과 비용 또한 줄어들게 되었다.<ref name="Daniel.kwak"> , <[https://dduddublog.tistory.com/8 객체지향 프로그래밍의 정의와 탄생배경]>, 《궁금한 Daniel》, 2018-10-17 </ref>
  
 
== 역사 ==
 
== 역사 ==
초기 프로그래밍 방식인 절차적 프로그래밍 방식은 입력을 받아 명시된 순서대로 처리한 다음 그 결과를 내는 언어로서, 조금만 복잡해져도 다른 사람이 보고 이해하기 어려울 정도로 구조적 설계에서 잘못된 해석을 한다면 그로 인해 요구 사항이 발생하면서 유지보수가 불가하기 때문에 프로그램 자체를 새로 작업해야하는 요소들이 많았다. 초기 프로그래밍 방식들은 이러한 유지보수가 어려운 단점이 많았다. 그렇기에 유지보수와 개발시 프로그램을 쉽게 수정, 보완할 수 있는 재사용성이 높은 새로운 응용프로그램의 개발이 간절한 상황되었다. <ref name="위키백과"> , 〈[https://ko.wikipedia.org/wiki/%EA%B0%9D%EC%B2%B4_%EC%A7%80%ED%96%A5_%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D 객체 지향 프로그래밍 ]〉, 《위키백과》, 2020-07-23</ref>
+
초기 프로그래밍 방식인 절차적 프로그래밍 방식은 입력을 받아 명시된 순서대로 처리한 다음 그 결과를 내는 언어로서, 조금만 복잡해져도 다른 사람이 보고 이해하기 어려울 정도로 구조적 설계에서 잘못된 해석을 한다면 그로 인해 요구 사항이 발생하면서 유지 보수가 불가하기 때문에 프로그램 자체를 새로 작업해야 하는 요소들이 많았다. 초기 프로그래밍 방식들은 이러한 유지 보수가 어려운 단점이 많았다. 그렇기에 유지 보수와 개발 시 프로그램을 쉽게 수정, 보완할 수 있는 재사용성이 높은 새로운 응용프로그램의 개발이 간절한 상황 되었다. <ref name="위키백과"> , 〈[https://ko.wikipedia.org/wiki/%EA%B0%9D%EC%B2%B4_%EC%A7%80%ED%96%A5_%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D 객체 지향 프로그래밍 ]〉, 《위키백과》, 2020-07-23</ref>
  
절차적 프로그래밍 방식을 보완하기 위해 1960년 [[조한 달]](Ole joan Dahl)과 [[크리스틴]](Kristen Nygaard)이 노르웨이에서 [[시뮬라67]](Simula67)을 발표했다. 시뮬라는 최초의 객체 지향 프로그래밍 언어로 클래스(Class) 라는 개념이 도입되었으나 70년대 개발 상황으로 인해 실용적인 프로그래밍 언어로는 발전하지 못했다. 이 뒤로 10여년 간 객체 지향 언어는 전혀 주목을 받지 못했다.<ref name="홍련의연금술사"> , 〈[https://kentanos.tistory.com/entry/1-%EA%B0%9D%EC%B2%B4-%EC%A7%80%ED%96%A5-%EA%B0%9C%EB%85%90%EC%9D%98-%EC%97%AD%EC%82%AC 객체 지향 개념의 역사 ]〉, 《홍련's Program World》, 2016-10-07</ref>
+
절차적 프로그래밍 방식을 보완하기 위해 1960년 [[조한 달]](Ole joan Dahl)과 [[크리스틴]](Kristen Nygaard)이 노르웨이에서 [[시뮬라67]](Simula67)을 발표했다. 시뮬라는 최초의 객체 지향 프로그래밍 언어로 클래스(Class) 라는 개념이 도입되었으나 70년대 개발 상황으로 인해 실용적인 프로그래밍 언어로는 발전하지 못했다. 이 뒤로 10여 년간 객체 지향 언어는 전혀 주목을 받지 못했다.<ref name="홍련의연금술사"> , 〈[https://kentanos.tistory.com/entry/1-%EA%B0%9D%EC%B2%B4-%EC%A7%80%ED%96%A5-%EA%B0%9C%EB%85%90%EC%9D%98-%EC%97%AD%EC%82%AC 객체 지향 개념의 역사 ]〉, 《홍련's Program World》, 2016-10-07</ref>
  
이어서 Dynabook시스템의 개발을 하면서 팰러액토 연구소의 [[스몰토크]](Smalltalk)를 발표했으나, 단순한 프로그래밍 언어로 만들어지지 않고 하드웨어와 개발환경 프로그래밍 언어로 만들어져 이식성이 부족하여 널리 사용되지 못하고 아쉬움만 남겼다.<ref name="홍련의연금술사"> , 〈[https://kentanos.tistory.com/entry/1-%EA%B0%9D%EC%B2%B4-%EC%A7%80%ED%96%A5-%EA%B0%9C%EB%85%90%EC%9D%98-%EC%97%AD%EC%82%AC 객체 지향 개념의 역사 ]〉, 《홍련's Program World》, 2016-10-07</ref>
+
이어서 Dynabook시스템의 개발을 하면서 팰러액토 연구소의 [[스몰토크]](Smalltalk)를 발표했으나, 단순한 프로그래밍 언어로 만들어지지 않고 하드웨어와 개발 환경 프로그래밍 언어로 만들어져 이식성이 부족하여 널리 사용되지 못하고 아쉬움만 남겼다.<ref name="홍련의연금술사"> , 〈[https://kentanos.tistory.com/entry/1-%EA%B0%9D%EC%B2%B4-%EC%A7%80%ED%96%A5-%EA%B0%9C%EB%85%90%EC%9D%98-%EC%97%AD%EC%82%AC 객체 지향 개념의 역사 ]〉, 《홍련's Program World》, 2016-10-07</ref>
  
이후로 포트란 코볼로 개발을 진행하다 이후 유지보수 비용 절감을 위해 미 국방성의 [[에이다]](Ada)가 개발되어 발표되었다. 클래스 구조로 예외처리 기능이 도입된 언어였지만, 상속 개념이 반영이 되지 않고 정적 바인딩을 이용하는 프로그래밍 언어였다.<ref name="홍련의연금술사"> , 〈[https://kentanos.tistory.com/entry/1-%EA%B0%9D%EC%B2%B4-%EC%A7%80%ED%96%A5-%EA%B0%9C%EB%85%90%EC%9D%98-%EC%97%AD%EC%82%AC 객체 지향 개념의 역사 ]〉, 《홍련's Program World》, 2016-10-07</ref>
+
이후로 포트란 코볼로 개발을 진행하다 이후 유지 보수 비용 절감을 위해 미 국방성의 [[에이다]](Ada)가 개발되어 발표되었다. 클래스 구조로 예외 처리 기능이 도입된 언어였지만, 상속 개념이 반영이 되지 않고 정적 바인딩을 이용하는 프로그래밍 언어였다.<ref name="홍련의연금술사"> , 〈[https://kentanos.tistory.com/entry/1-%EA%B0%9D%EC%B2%B4-%EC%A7%80%ED%96%A5-%EA%B0%9C%EB%85%90%EC%9D%98-%EC%97%AD%EC%82%AC 객체 지향 개념의 역사 ]〉, 《홍련's Program World》, 2016-10-07</ref>
  
이후 AT&T 벨 연구소의 [[C++]]이 나오면서 c언어를 바탕으로 이식성이나 유연성등이 장점인 객체 지향적 프로그래밍 언어가 사람들의 이목을 끌기 시작했다. 그러나 C++도 C언어와 혼합된 언어이기 때문에 객체 지향성을 제대로 반영하지 못하는 점은 단점으로 꼽히고 있다.<ref name="홍련의연금술사"> , 〈[https://kentanos.tistory.com/entry/1-%EA%B0%9D%EC%B2%B4-%EC%A7%80%ED%96%A5-%EA%B0%9C%EB%85%90%EC%9D%98-%EC%97%AD%EC%82%AC 객체 지향 개념의 역사 ]〉, 《홍련's Program World》, 2016-10-07</ref>
+
이후 AT&T 벨 연구소의 [[C++]]이 나오면서 c언어를 바탕으로 이식성이나 유연성 등이 장점인 객체 지향적 프로그래밍 언어가 사람들의 이목을 끌기 시작했다. 그러나 C++도 C언어와 혼합된 언어이기 때문에 객체 지향성을 제대로 반영하지 못하는 점은 단점으로 꼽히고 있다.<ref name="홍련의연금술사"> , 〈[https://kentanos.tistory.com/entry/1-%EA%B0%9D%EC%B2%B4-%EC%A7%80%ED%96%A5-%EA%B0%9C%EB%85%90%EC%9D%98-%EC%97%AD%EC%82%AC 객체 지향 개념의 역사 ]〉, 《홍련's Program World》, 2016-10-07</ref>
  
 
객체 지향 언어에 큰 영향을 미쳤던 GUI의 발전에 따라 향상되면서 90년대 썬 마이크로시스템즈의 제임스 고즐링에 의한 가전제품에 사용될 목적으로 개발된 언어인 [[자바]](Java)가 개발되면서 언어의 단순성과 플랫폼의 독립성을 가진 자바를 이용하여 웹브라우저를 개발하고, 온갖 인터넷 응용 분야에서 각광을 받으며 객체지향 프로그래밍이 빛을 받기 시작했다.<ref name="홍련의연금술사"> , 〈[https://kentanos.tistory.com/entry/1-%EA%B0%9D%EC%B2%B4-%EC%A7%80%ED%96%A5-%EA%B0%9C%EB%85%90%EC%9D%98-%EC%97%AD%EC%82%AC 객체 지향 개념의 역사 ]〉, 《홍련's Program World》, 2016-10-07</ref>
 
객체 지향 언어에 큰 영향을 미쳤던 GUI의 발전에 따라 향상되면서 90년대 썬 마이크로시스템즈의 제임스 고즐링에 의한 가전제품에 사용될 목적으로 개발된 언어인 [[자바]](Java)가 개발되면서 언어의 단순성과 플랫폼의 독립성을 가진 자바를 이용하여 웹브라우저를 개발하고, 온갖 인터넷 응용 분야에서 각광을 받으며 객체지향 프로그래밍이 빛을 받기 시작했다.<ref name="홍련의연금술사"> , 〈[https://kentanos.tistory.com/entry/1-%EA%B0%9D%EC%B2%B4-%EC%A7%80%ED%96%A5-%EA%B0%9C%EB%85%90%EC%9D%98-%EC%97%AD%EC%82%AC 객체 지향 개념의 역사 ]〉, 《홍련's Program World》, 2016-10-07</ref>
37번째 줄: 37번째 줄:
  
 
== 구성 요소 ==
 
== 구성 요소 ==
* '''[[객체]]'''(object) : 객체는 자신의 고유의 속성(attribute)을 가지며, 클래스에서 정의한 행위(behavior)를 수행 가능하게한다. 객체에서 실행하는 행위를 클래스에서 정의된 행위를 공유함으로써 메모리를 추가로 사용하지 않기에 중복해서 사용하는 값을 지불할 필요가 없어진다. 데이터와 그에 관련되는 동작(절차, 방법, 기능)을 모두 포함하는 [[인스턴스]]이다.<ref name="위키백과"> , 〈[https://ko.wikipedia.org/wiki/%EA%B0%9D%EC%B2%B4_%EC%A7%80%ED%96%A5_%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D 객체 지향 프로그래밍 ]〉, 《위키백과》, 2020-07-23</ref>
+
* '''[[객체]]'''(object) : 객체는 자신의 고유의 속성(attribute)을 가지며, 클래스에서 정의한 행위(behavior)를 수행 가능하게 한다. 객체에서 실행하는 행위를 클래스에서 정의된 행위를 공유함으로써 메모리를 추가로 사용하지 않기에 중복해서 사용하는 값을 지불할 필요가 없어진다. 데이터와 그에 관련되는 동작(절차, 방법, 기능)을 모두 포함하는 [[인스턴스]]이다.<ref name="위키백과"> , 〈[https://ko.wikipedia.org/wiki/%EA%B0%9D%EC%B2%B4_%EC%A7%80%ED%96%A5_%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D 객체 지향 프로그래밍 ]〉, 《위키백과》, 2020-07-23</ref>
 +
 
 
* '''[[클래스]]'''(class) : 같은 종류의 집단에 속하는 속성(attribute)과 행위를 정의한 객체지향 프로그램의 기본적인 사용자 정의 데이터형(defined data type)이며 오퍼레이션, 관계 등을 갖고 있는 객체들의 집합이다. 다른 클래스 또는 외부 요소와 독립적으로 디자인되어야 한다.<ref name="위키백과"> , 〈[https://ko.wikipedia.org/wiki/%EA%B0%9D%EC%B2%B4_%EC%A7%80%ED%96%A5_%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D 객체 지향 프로그래밍 ]〉, 《위키백과》, 2020-07-23</ref>
 
* '''[[클래스]]'''(class) : 같은 종류의 집단에 속하는 속성(attribute)과 행위를 정의한 객체지향 프로그램의 기본적인 사용자 정의 데이터형(defined data type)이며 오퍼레이션, 관계 등을 갖고 있는 객체들의 집합이다. 다른 클래스 또는 외부 요소와 독립적으로 디자인되어야 한다.<ref name="위키백과"> , 〈[https://ko.wikipedia.org/wiki/%EA%B0%9D%EC%B2%B4_%EC%A7%80%ED%96%A5_%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D 객체 지향 프로그래밍 ]〉, 《위키백과》, 2020-07-23</ref>
 +
 
* '''[[메소드]]'''(method) : 클래스 내부에 정의된 객체가 수행해야 할 오퍼레이션이다. 한 객체의 서브루틴 형태로 객체의 속성을 조작하는데 사용된다. 존의 프로그래밍 언어에서 [[함수]](function)와 같은 역할을 한다. 한 객체의 서브루틴 형태로 객체의 속성을 조작하는데 사용된다.<ref name="위키백과"> , 〈[https://ko.wikipedia.org/wiki/%EA%B0%9D%EC%B2%B4_%EC%A7%80%ED%96%A5_%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D 객체 지향 프로그래밍 ]〉, 《위키백과》, 2020-07-23</ref>
 
* '''[[메소드]]'''(method) : 클래스 내부에 정의된 객체가 수행해야 할 오퍼레이션이다. 한 객체의 서브루틴 형태로 객체의 속성을 조작하는데 사용된다. 존의 프로그래밍 언어에서 [[함수]](function)와 같은 역할을 한다. 한 객체의 서브루틴 형태로 객체의 속성을 조작하는데 사용된다.<ref name="위키백과"> , 〈[https://ko.wikipedia.org/wiki/%EA%B0%9D%EC%B2%B4_%EC%A7%80%ED%96%A5_%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D 객체 지향 프로그래밍 ]〉, 《위키백과》, 2020-07-23</ref>
  
44번째 줄: 46번째 줄:
 
* '''[[캡슐화]]'''(Encapsulation) : 캡슐화란 관련 기능과 특성을 모아서 분류하는 작업이다. 프로그램의 실제 구현 내용이 외부로 드러나지 않도록 특정 모듈([[클래스]]) 내부로 은닉하는 것이다. <ref name="정아마추어"><[https://jeong-pro.tistory.com/95 객체 지향 프로그래밍이 뭔가요? (꼬리에 꼬리를 무는 질문 1순위, 그놈의 OOP)]>, 《기본기를 쌓는 정아마추어 코딩블로그》, 2017-11-15</ref>
 
* '''[[캡슐화]]'''(Encapsulation) : 캡슐화란 관련 기능과 특성을 모아서 분류하는 작업이다. 프로그램의 실제 구현 내용이 외부로 드러나지 않도록 특정 모듈([[클래스]]) 내부로 은닉하는 것이다. <ref name="정아마추어"><[https://jeong-pro.tistory.com/95 객체 지향 프로그래밍이 뭔가요? (꼬리에 꼬리를 무는 질문 1순위, 그놈의 OOP)]>, 《기본기를 쌓는 정아마추어 코딩블로그》, 2017-11-15</ref>
  
* '''[[상속]]'''(Inheritance) : 새로운 클래스가 기존의 클래스의 자료와 연산을 이용할 수 있게 하는 기능이다. 상속을 받는 새로운 클래스는 부클래스, 파생 클래스, 하위 클래스, 자식 클래스라고 하며 새로운 클래스가 상속하는 기존의 클래스를 기반 클래스, 상위 클래스, 부모 클래스라고 한다. 상위 클래스의 특성과 기능을 그대로 물려받음으로써, 하위 클래스를 이용해 프로그램의 요구에 맞추어 클래스를 수정가능하고 클래스 간의 종속 관계를 형성함으로써 객체를 조직화할 수 있다. [[캡슐화]] 및 재사용이 용이하도록 해준다. <ref name="정아마추어"><[https://jeong-pro.tistory.com/95 객체 지향 프로그래밍이 뭔가요? (꼬리에 꼬리를 무는 질문 1순위, 그놈의 OOP)]>, 《기본기를 쌓는 정아마추어 코딩블로그》, 2017-11-15</ref>
+
* '''[[상속]]'''(Inheritance) : 새로운 클래스가 기존의 클래스의 자료와 연산을 이용할 수 있게 하는 기능이다. 상속을 받는 새로운 클래스는 부클래스, 파생 클래스, 하위 클래스, 자식 클래스라고 하며 새로운 클래스가 상속하는 기존의 클래스를 기반 클래스, 상위 클래스, 부모 클래스라고 한다. 상위 클래스의 특성과 기능을 그대로 물려받음으로써, 하위 클래스를 이용해 프로그램의 요구에 맞추어 클래스를 수정 가능하고 클래스 간의 종속 관계를 형성함으로써 객체를 조직화할 수 있다. [[캡슐화]] 및 재사용이 용이하도록 해준다. <ref name="정아마추어"><[https://jeong-pro.tistory.com/95 객체 지향 프로그래밍이 뭔가요? (꼬리에 꼬리를 무는 질문 1순위, 그놈의 OOP)]>, 《기본기를 쌓는 정아마추어 코딩블로그》, 2017-11-15</ref>
 +
 
 
* '''[[다중 상속]]'''(Multiple inheritance) : 다중 상속은 클래스가 2개 이상의 클래스로부터 상속받을 수 있게 하는 기능이다. 클래스들의 기능이 동시에 필요할 때는 용이하나 클래스의 상속 관계에 혼란을 줄 수 있기 때문에 프로그래밍 언어에 따라 사용 가능 유무가 다름으로 주의가 필요하다. JAVA는 지원하지 않는다.<ref name="위키백과"> , 〈[https://ko.wikipedia.org/wiki/%EA%B0%9D%EC%B2%B4_%EC%A7%80%ED%96%A5_%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D 객체 지향 프로그래밍 ]〉, 《위키백과》, 2020-07-23</ref>
 
* '''[[다중 상속]]'''(Multiple inheritance) : 다중 상속은 클래스가 2개 이상의 클래스로부터 상속받을 수 있게 하는 기능이다. 클래스들의 기능이 동시에 필요할 때는 용이하나 클래스의 상속 관계에 혼란을 줄 수 있기 때문에 프로그래밍 언어에 따라 사용 가능 유무가 다름으로 주의가 필요하다. JAVA는 지원하지 않는다.<ref name="위키백과"> , 〈[https://ko.wikipedia.org/wiki/%EA%B0%9D%EC%B2%B4_%EC%A7%80%ED%96%A5_%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D 객체 지향 프로그래밍 ]〉, 《위키백과》, 2020-07-23</ref>
  
51번째 줄: 54번째 줄:
 
* '''[[자료 추상화]]'''(Data Abstraction) : 불필요한 정보를 숨기고 중요한 정보만 표현함으로 프로그램을 보다 간단화 시켜 공통의 속성이나 기능을 묶어 이름을 붙이는 것이다. 자료 추상화를 통해 정의된 자료형을 추상 자료형이라고 한다. 추상 자료형은 자료형의 자료 표현과 자료형의 연산을 캡슐화한 것으로 접근 제어를 통하여 자료형의 정보를 은닉할 수 있다. 객체 지향 프로그래밍에서 일반적으로 추상 자료형을 클래스, 추상 자료형의 인스턴트를 객체, 추상 자료형에서 정의된 연산을 메소드(함수), 메소드의 호출을 생성자라고 한다.<ref name="위키백과"> , 〈[https://ko.wikipedia.org/wiki/%EA%B0%9D%EC%B2%B4_%EC%A7%80%ED%96%A5_%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D 객체 지향 프로그래밍 ]〉, 《위키백과》, 2020-07-23</ref>
 
* '''[[자료 추상화]]'''(Data Abstraction) : 불필요한 정보를 숨기고 중요한 정보만 표현함으로 프로그램을 보다 간단화 시켜 공통의 속성이나 기능을 묶어 이름을 붙이는 것이다. 자료 추상화를 통해 정의된 자료형을 추상 자료형이라고 한다. 추상 자료형은 자료형의 자료 표현과 자료형의 연산을 캡슐화한 것으로 접근 제어를 통하여 자료형의 정보를 은닉할 수 있다. 객체 지향 프로그래밍에서 일반적으로 추상 자료형을 클래스, 추상 자료형의 인스턴트를 객체, 추상 자료형에서 정의된 연산을 메소드(함수), 메소드의 호출을 생성자라고 한다.<ref name="위키백과"> , 〈[https://ko.wikipedia.org/wiki/%EA%B0%9D%EC%B2%B4_%EC%A7%80%ED%96%A5_%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D 객체 지향 프로그래밍 ]〉, 《위키백과》, 2020-07-23</ref>
  
* '''[[동적 바인딩]]'''(Dynamic binding) :실행 시간 중 일어나거나 실행 과정에서 변경될 수 있는 바인딩이다. 정적 바인딩과는 대비되는 개념으로 헌 개체나 기호를 실행과정에 여러 속성이나 연산에 바인딩함으로써 다형 개념을 실현한다.<ref name="위키백과"> , 〈[https://ko.wikipedia.org/wiki/%EA%B0%9D%EC%B2%B4_%EC%A7%80%ED%96%A5_%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D 객체 지향 프로그래밍 ]〉, 《위키백과》, 2020-07-23</ref>
+
* '''[[동적 바인딩]]'''(Dynamic binding) : 실행 시간 중 일어나거나 실행 과정에서 변경될 수 있는 바인딩이다. 정적 바인딩과는 대비되는 개념으로 헌 개체나 기호를 실행 과정에 여러 속성이나 연산에 바인딩함으로써 다형 개념을 실현한다.<ref name="위키백과"> , 〈[https://ko.wikipedia.org/wiki/%EA%B0%9D%EC%B2%B4_%EC%A7%80%ED%96%A5_%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D 객체 지향 프로그래밍 ]〉, 《위키백과》, 2020-07-23</ref>
  
 
== 객체 지향 언어 ==
 
== 객체 지향 언어 ==

2020년 8월 6일 (목) 13:16 판

객체 지향 프로그래밍(OOP, Object-Oriented Programming)이란 컴퓨터 프로그램을 여러 명령어(command)의 목록으로 보지 않고 여러 개의 독립된 객체(object)들의 집합으로 파악하는 프로그래밍 기법이다. 객체 지향 프로그래밍은 컴퓨터 프로그램을 객체라는 기본 단위로 나누고, 각각의 객체가 메시지를 주고받으며 데이터를 처리하는 비절차적 프로그래밍 방법이다. 프로그램을 유연하고 변경하기 쉽게 만들기 때문에 절차지향 언어에 비하여 재사용성이 용이하고 유지 보수가 간편하다.

개요

오늘날 많은 유명한 프로그래밍 언어(Java, C++, C#, Python, PHP, Ruby, Object-C)는 객체지향 프로그래밍을 지원한다. “객체지향”이라는 개념은 불행히도 명확한 정의가 없는 것이 특징이다. 우리가 어떠한 개념을 이해하려 할 때, 그 개념의 특성(attribute, property)을 통해 이해하는 것처럼 객체지향도 객체지향의 특성을 통해 이해할 수밖에 없다.

객체지향 프로그래밍은 실세계에 존재하고 인지하고 있는 객체(Object)를 소프트웨어의 세계에서 표현하기 위해 객체의 핵심적인 개념 또는 기능만을 추출하는 추상화(abstraction)를 통해 모델링 하려는 프로그래밍 패러다임을 말한다. 다시 말해, 우리가 주변의 실세계에서 사물을 인지하는 방식을 프로그래밍에 접목하려는 사상을 의미한다.

객체 지향 프로그래밍은 함수들의 집합 혹은 단순한 컴퓨터의 명령어들의 목록이라는 전통적인 절차지향 프로그래밍과는 다른, 관계성 있는 객체들의 집합이라는 관점으로 접근하는 소프트웨어 디자인으로 볼 수 있다.

각 객체는 메시지를 받을 수도 있고, 데이터를 처리할 수도 있으며, 또 다른 객체에게 메시지를 전달할 수도 있다. 각 객체는 별도의 역할이나 책임을 갖는 작은 독립적인 기계 또는 부품으로 볼 수 있다.

객체지향 프로그래밍은 보다 유연하고 유지 보수하기 쉬우며 확장성 측면에서도 유리한 프로그래밍을 하도록 의도되었고, 대규모 소프트웨어 개발에 널리 사용되고 있다.[1]

등장 배경

초기 프로그래밍은 절차적 프로그래밍이었다. 명시된 입력을 받아서 명시된 순서로 처리한 다음, 그 결과는 내는 방식이었다. 프로그램을 어떤 논리로 어떤 순서대로 써 내려가는 것이 주요한 쟁점이었다. 그러나 간단한 알고리즘이면 몰라도, 조금만 복잡해지면 순서도로 나타내지는 게 불가능한 스파게티 코드를 양산하게 된다. 시간이 흐를수록 복잡한 프로그램이 요구되었는데, 기존 절차적 프로그래밍으로는 도저히 작성할 수가 없었던 것이다.

이때 구조적 프로그래밍이 탄생하게 된다. 프로그램을 함수 단위로 나누고 함수끼리 호출을 하는 방식이다. 프로그램이라는 큰 문제를 해결하기 위해 작은 함수로 쪼개는 방식이기 때문에 탑-다운(하향식) 방식이라고도 불린다.

그러나 구조적 프로그래밍도 데이터 자체를 구조화하지는 못했다. 전역 네임 스페이스는 점점 포화상태가 되어가고, 특히나 GUI 프로그램에서는 실행 콘텍스트를 저장할 방법이 없었다.

이를 극복하기 위한 대안으로 나온 것이 객체지향 프로그래밍이다. 큰 문제를 쪼개는 것이 아니라, 먼저 작은 문제들을 해결할 수 있는 객체들을 만든 뒤, 이 객체들을 조합해서 큰 문제를 해결하는 상향식(Bottom-up) 해결법을 도입한 것이다. 객체를 독립성과 신뢰성이 보장되게 만들어 놓으면 재사용성도 높아지므로 개발 기간과 비용 또한 줄어들게 되었다.[2]

역사

초기 프로그래밍 방식인 절차적 프로그래밍 방식은 입력을 받아 명시된 순서대로 처리한 다음 그 결과를 내는 언어로서, 조금만 복잡해져도 다른 사람이 보고 이해하기 어려울 정도로 구조적 설계에서 잘못된 해석을 한다면 그로 인해 요구 사항이 발생하면서 유지 보수가 불가하기 때문에 프로그램 자체를 새로 작업해야 하는 요소들이 많았다. 초기 프로그래밍 방식들은 이러한 유지 보수가 어려운 단점이 많았다. 그렇기에 유지 보수와 개발 시 프로그램을 쉽게 수정, 보완할 수 있는 재사용성이 높은 새로운 응용프로그램의 개발이 간절한 상황 되었다. [3]

절차적 프로그래밍 방식을 보완하기 위해 1960년 조한 달(Ole joan Dahl)과 크리스틴(Kristen Nygaard)이 노르웨이에서 시뮬라67(Simula67)을 발표했다. 시뮬라는 최초의 객체 지향 프로그래밍 언어로 클래스(Class) 라는 개념이 도입되었으나 70년대 개발 상황으로 인해 실용적인 프로그래밍 언어로는 발전하지 못했다. 이 뒤로 10여 년간 객체 지향 언어는 전혀 주목을 받지 못했다.[4]

이어서 Dynabook시스템의 개발을 하면서 팰러액토 연구소의 스몰토크(Smalltalk)를 발표했으나, 단순한 프로그래밍 언어로 만들어지지 않고 하드웨어와 개발 환경 프로그래밍 언어로 만들어져 이식성이 부족하여 널리 사용되지 못하고 아쉬움만 남겼다.[4]

이후로 포트란 코볼로 개발을 진행하다 이후 유지 보수 비용 절감을 위해 미 국방성의 에이다(Ada)가 개발되어 발표되었다. 클래스 구조로 예외 처리 기능이 도입된 언어였지만, 상속 개념이 반영이 되지 않고 정적 바인딩을 이용하는 프로그래밍 언어였다.[4]

이후 AT&T 벨 연구소의 C++이 나오면서 c언어를 바탕으로 이식성이나 유연성 등이 장점인 객체 지향적 프로그래밍 언어가 사람들의 이목을 끌기 시작했다. 그러나 C++도 C언어와 혼합된 언어이기 때문에 객체 지향성을 제대로 반영하지 못하는 점은 단점으로 꼽히고 있다.[4]

객체 지향 언어에 큰 영향을 미쳤던 GUI의 발전에 따라 향상되면서 90년대 썬 마이크로시스템즈의 제임스 고즐링에 의한 가전제품에 사용될 목적으로 개발된 언어인 자바(Java)가 개발되면서 언어의 단순성과 플랫폼의 독립성을 가진 자바를 이용하여 웹브라우저를 개발하고, 온갖 인터넷 응용 분야에서 각광을 받으며 객체지향 프로그래밍이 빛을 받기 시작했다.[4]

이후 (Perl), 파이썬(Python), PHP, 루비(Ruby), C# 등 다양한 객체 지향 프로그래밍 언어가 만들어졌다.[3]

구성 요소

  • 객체(object) : 객체는 자신의 고유의 속성(attribute)을 가지며, 클래스에서 정의한 행위(behavior)를 수행 가능하게 한다. 객체에서 실행하는 행위를 클래스에서 정의된 행위를 공유함으로써 메모리를 추가로 사용하지 않기에 중복해서 사용하는 값을 지불할 필요가 없어진다. 데이터와 그에 관련되는 동작(절차, 방법, 기능)을 모두 포함하는 인스턴스이다.[3]
  • 클래스(class) : 같은 종류의 집단에 속하는 속성(attribute)과 행위를 정의한 객체지향 프로그램의 기본적인 사용자 정의 데이터형(defined data type)이며 오퍼레이션, 관계 등을 갖고 있는 객체들의 집합이다. 다른 클래스 또는 외부 요소와 독립적으로 디자인되어야 한다.[3]
  • 메소드(method) : 클래스 내부에 정의된 객체가 수행해야 할 오퍼레이션이다. 한 객체의 서브루틴 형태로 객체의 속성을 조작하는데 사용된다. 존의 프로그래밍 언어에서 함수(function)와 같은 역할을 한다. 한 객체의 서브루틴 형태로 객체의 속성을 조작하는데 사용된다.[3]

특징

  • 캡슐화(Encapsulation) : 캡슐화란 관련 기능과 특성을 모아서 분류하는 작업이다. 프로그램의 실제 구현 내용이 외부로 드러나지 않도록 특정 모듈(클래스) 내부로 은닉하는 것이다. [5]
  • 상속(Inheritance) : 새로운 클래스가 기존의 클래스의 자료와 연산을 이용할 수 있게 하는 기능이다. 상속을 받는 새로운 클래스는 부클래스, 파생 클래스, 하위 클래스, 자식 클래스라고 하며 새로운 클래스가 상속하는 기존의 클래스를 기반 클래스, 상위 클래스, 부모 클래스라고 한다. 상위 클래스의 특성과 기능을 그대로 물려받음으로써, 하위 클래스를 이용해 프로그램의 요구에 맞추어 클래스를 수정 가능하고 클래스 간의 종속 관계를 형성함으로써 객체를 조직화할 수 있다. 캡슐화 및 재사용이 용이하도록 해준다. [5]
  • 다중 상속(Multiple inheritance) : 다중 상속은 클래스가 2개 이상의 클래스로부터 상속받을 수 있게 하는 기능이다. 클래스들의 기능이 동시에 필요할 때는 용이하나 클래스의 상속 관계에 혼란을 줄 수 있기 때문에 프로그래밍 언어에 따라 사용 가능 유무가 다름으로 주의가 필요하다. JAVA는 지원하지 않는다.[3]
  • 다형성(多形性, Polymorphism) : 하나의 변수명이 상황에 따라 다른 의미로 해석될 수 있는 성질을 뜻한다. 일반적으로 오버라이딩 , 오버로딩을 의미한다. 다형 개념을 통해서 프로그램 안의 객체 간의 관계를 조직적으로 나타낼 수 있다.[3]
  • 자료 추상화(Data Abstraction) : 불필요한 정보를 숨기고 중요한 정보만 표현함으로 프로그램을 보다 간단화 시켜 공통의 속성이나 기능을 묶어 이름을 붙이는 것이다. 자료 추상화를 통해 정의된 자료형을 추상 자료형이라고 한다. 추상 자료형은 자료형의 자료 표현과 자료형의 연산을 캡슐화한 것으로 접근 제어를 통하여 자료형의 정보를 은닉할 수 있다. 객체 지향 프로그래밍에서 일반적으로 추상 자료형을 클래스, 추상 자료형의 인스턴트를 객체, 추상 자료형에서 정의된 연산을 메소드(함수), 메소드의 호출을 생성자라고 한다.[3]
  • 동적 바인딩(Dynamic binding) : 실행 시간 중 일어나거나 실행 과정에서 변경될 수 있는 바인딩이다. 정적 바인딩과는 대비되는 개념으로 헌 개체나 기호를 실행 과정에 여러 속성이나 연산에 바인딩함으로써 다형 개념을 실현한다.[3]

객체 지향 언어

다양한 객체 지향 프로그래밍 언어가 존재한다.

각주

  1. , <자바스크립트 객체지향 프로그래밍>, 《5.20 Object-Oriented Programming》
  2. , <객체지향 프로그래밍의 정의와 탄생배경>, 《궁금한 Daniel》, 2018-10-17
  3. 3.0 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 , 〈객체 지향 프로그래밍 〉, 《위키백과》, 2020-07-23
  4. 4.0 4.1 4.2 4.3 4.4 , 〈객체 지향 개념의 역사 〉, 《홍련's Program World》, 2016-10-07
  5. 5.0 5.1 <객체 지향 프로그래밍이 뭔가요? (꼬리에 꼬리를 무는 질문 1순위, 그놈의 OOP)>, 《기본기를 쌓는 정아마추어 코딩블로그》, 2017-11-15

참고자료

같이 보기


  검수요청.png검수요청.png 이 객체지향 프로그래밍 문서는 프로그래밍에 관한 글로서 검토가 필요합니다. 위키 문서는 누구든지 자유롭게 편집할 수 있습니다. [편집]을 눌러 문서 내용을 검토·수정해 주세요.