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

"객체지향"의 두 판 사이의 차이

해시넷
이동: 둘러보기, 검색
10번째 줄: 10번째 줄:
  
 
===발전===
 
===발전===
 +
객체 지향 언어는 당시에 기존 절차적 프로그래밍과 매우 이질적이고, 컴퓨터 처리 능력이 별로 좋지 않아서 큰 주목을 받지 못하였지만 향후에 프로그래밍 언어가 많은 지원을 받으면서 [[스몰토크]], [[에이다]] 같은 프로그램이 등장하며 객체 지향에 대한 연구가 활발하게 진행되었다. [[C++]], [[델파이]], [[FoxPro]] 와 같은 프로그램들은 객체 지향 언어에 가장 큰 영향을 미쳤던 [[GUI]]의 발전에 따라 점점 향상되었다. 화면에 떠 있는 여러 개의 창은 각자의 실행 [[콘텍스트]](context)를 가지는데 콘텍스트의 현재 상태(활성화, 비활성화, 최소화 등)에 따라 같은 명령에도 다른 결과를 내보내야 했으며 사용자 상호작용을 위해 이벤트 처리도 수행해야 했다. 특히 이벤트 처리는 비동기적인 속성 때문에 기존 절차적 프로그래밍에서는 일종의 횡단 관심사가 되어 버려 코드 전체에 이벤트 처리 코드가 흩어져 있게 되는 문제가 있었다. 그래서 객체지향 프로그래밍를 도입하여 이벤트를 받았을 때 수행되는 기능([[이벤트 핸들러]]/[[콜백]])을 구현할 수 있는 단일 인터페이스를 정의하고, 프로그래머들은 이를 필요한 형태로 알아서 구현하며, 특정 이벤트가 일어났을 때 실행되어야 하는 기능들을 등록한 다음, 운영체제나 응용프로그램이 실제로 해당 이벤트가 발생했을 때 해당 이벤트에 등록된 이벤트 핸들러/콜백을 주욱 실행하기만 하면 되는 구조가 본격적으로 확산되면서 객체지향 프로그래밍 또한 빠르게 확산되었다.<ref name="역사 나무"></ref><ref name="역사"></ref><ref name="역사 위키"></ref>
 +
 +
==특징==
 +
객체 지향의 특징으로는 크게 캡슐화, 정보은닉, 추상화, 상속성, 다형성이 있으며, 이 중 구조적 기법과 차별되는 개념은 캡슐화, 상속성, 다형성이 있다.<ref name="특징"> 코딩팩토리 〈[https://coding-factory.tistory.com/328 (C++) 객체지향 언어의 5가지 특징]〉, 《티스토리》, 2019-03-01 </ref>
 +
===캡슐화===
 +
[[캡슐화]](Encapsulation)란 데이터(속성)와 데이터를 처리하는 함수로 외부에서 쉽게 접근하지 못하게 하는 것이 핵심이다. 객체에 직접적인 접근을 막고 외부에서 내부에 정보를 직접접근하여 변경할 수 없으며, 객체가 제공하는 필드와 메소드를 통해서만 접근이 가능해진다. 이는 유지보수나 확장시 오류의 범위를 최소화하고 객체내 정보손상, 오용방지, 조작법이 바뀌어도 사용방법 자체는 바뀌지않고, 데이터가 변경되어도 다른 객체에 영향을 주지 못하기 때문에 독립성이 좋다. 객체를 모듈화 할 수 있어 이식성이 좋다.<ref> radait, 〈[https://radait.tistory.com/5 자바(Java) 캡슐화(Encapsulation)란? 무엇인가?]〉, 《티스토리》, 2019-05-21 </ref>
 +
===상속성===
 +
[[상속성]](Inheritance)은 이미 정의된 상위 클래스(부모 클래스)의 모든 속성과 연산을 하위 클래스(자식 클래스)가 물려받는것을 의미 하므로 하위 클래스는 상위클래스의 모든 속성과 연산을 자신의 클래스 내에서 다시 정의하지 않고서도 즉시 자신의 속성으로 사용할 수 있게된다. 또한, 물려받은 속성과 연산외에 새로운 속성과 연산을 추가하여 사용할 수 있다. 상위클래스와 하위클래스가 서로 공유할 수 있기에 객체와 클래스의 재사용이 증대되는 중요한 개념이다.<ref name="특징"></ref>
 +
===정보은닉===
 +
[[정보은닉]](Information Hiding)은 캡슐화에서 가장 중요한 개념으로, 다른 객체에 자신의 정보를 숨기고 자신의 연산만을 통하여 접근을 허용하는 것이다.<ref name="특징"></ref>
 +
===추상화===
 +
[[추상화]](Abstraction)는 불필요한 부분을 생략하고 객체 속성 중 공통적이고 중요한 것에만 중점을 두어 개략화, 즉 모델화 하는 것이다. 객체들의 공통적 특성을 파악하여 필요없는 특성을 제거하는 과정을 가르킨다. 이 과정은 복잡한 문제를 해결하기 위한 가장 기본방법이며 완전한 시스템 구축을 하기전에 시스템 구조 및 구성을 가시적으로 볼 수 있고, 그 시스템과 유사한 모델을 만들어 여러가지 요인을 테스트할 수 있다.<ref name="특징"></ref><ref> radait, 〈[https://radait.tistory.com/4?category=836792 객체지향언어란? (특징, 장점, 단점, 종류)]〉, 《티스토리》, 2019-05-20 </ref>
 +
 +
 +
 +
  
  
20번째 줄: 36번째 줄:
 
* [[인스턴스]]
 
* [[인스턴스]]
  
{{프로그래밍|토막글}}
+
{{프로그래밍|검토 필요}}

2021년 8월 4일 (수) 14:24 판

객체지향(Object Oriented)은 프로그램 구현에 필요한 객체를 파악하고 각각의 객체들의 역할이 무엇인지를 정의하여 객체들 간의 상호작용을 통해 프로그램을 만드는 것을 말한다. 우리가 실생활에서 쓰는 모든 것을 객체(Object)라고 한다. 객체는 클래스(class)라는 틀에서 생겨난 인스턴스(instance)이다. 따라서 객체지향 프로그래밍은 객체와 객체 간의 연결로 되어 있으며 각각의 객체 안에 자료구조알고리즘이 들어 있는 것이다.[1]

개요

객체지향은 오늘날 자바(java),C#등의 프로그래밍 언어(programming language)들을 지배하고 있는 가장 중요한 맥박이라고 할 수 있다. 객체지향 프로그래밍은 크고 견고한 프로그램을 만들기 위한 노력의 산물이라고 한다. 여러 개의 객체 단위로 나누어 작업할 수 있기 때문에 개발자와 협업해 규모가 큰 프로젝트도 무리없이 진행할 수 있으며 유지보수도 뛰어나다는 장점이 있다. 하지만 코딩 난이도가 상승하며 객체에 대한 정확한 이해가 필요하여 설계단계부터 많은 시간이 소요된다.[2][3][4]

역사

등장 배경

초기 프로그래밍 방식은 절차적 프로그래밍(Procedure Programming) 방식으로 명시된 순서대로 처리한 다음 결과를 도출하는 방식이었다. 하지만 이 방식은 조금만 복잡해지면 순서도로 나타내는 것이 불가능할 정도로 꼬인 '스파게티 코드'를 만들게 되는데 명령어 양이 증가함에 따라 중복코드 대처가 힘들고, 특정 코드가 어디까지 영향을 미치는지 알 수 없기에 유지보수가 굉장히 어려웠다. 이러한 문제를 해결하기 위해 에츠허르 데이크스트라(Dijkstra)는 프로그램을 함수(procedure) 단위로 나누고 프로시져(Procedure)끼리 호출을 하는 구조적 프로그래밍(structured programming) 방식을 제안하면서 이러한 위기를 벗어나게 된다. 하지만 함수는 데이터의 처리 방법을 구조화했을뿐, 데이터 자체는 구조화하지 못했다. 그로 인하여 네임스페이스(Namespace) 포화 문제를 낳게 되며 엉뚱한 데이터가 엉뚱한 함수에 전달돼서 데이터를 오염시키는 문제가 발생하고 그런 가능성 때문에 프로그래머가 한 함수의 작동에 영향을 받는 변수를 조사해야 할 때 모든 변수를 다 조사해야 하는 어려움에 봉착했다. 또한, 만약 프로그램의 크기가 증가한다면 수 많은 변수가 생기며 함수가 접근할 수 있는 데이터의 범위에 명시적인 제한을 걸어야 하는 상황이였다. 이를 극복하기 위한 대안으로 객체 지향 언어의 시초인1960년 노위지안 컴퓨터링 센터조한 달크리스틴이 발표한 시뮬라67이다.[5][6][7]

  • 네임스페이스: 개체(entity)를 구분할 수 있는 범위를 나타내는 말로 일반적으로 하나의 이름 공간에서는 하나의 이름이 단 하나의 개체만을 가리키게 된다.[8]

발전

객체 지향 언어는 당시에 기존 절차적 프로그래밍과 매우 이질적이고, 컴퓨터 처리 능력이 별로 좋지 않아서 큰 주목을 받지 못하였지만 향후에 프로그래밍 언어가 많은 지원을 받으면서 스몰토크, 에이다 같은 프로그램이 등장하며 객체 지향에 대한 연구가 활발하게 진행되었다. C++, 델파이, FoxPro 와 같은 프로그램들은 객체 지향 언어에 가장 큰 영향을 미쳤던 GUI의 발전에 따라 점점 향상되었다. 화면에 떠 있는 여러 개의 창은 각자의 실행 콘텍스트(context)를 가지는데 콘텍스트의 현재 상태(활성화, 비활성화, 최소화 등)에 따라 같은 명령에도 다른 결과를 내보내야 했으며 사용자 상호작용을 위해 이벤트 처리도 수행해야 했다. 특히 이벤트 처리는 비동기적인 속성 때문에 기존 절차적 프로그래밍에서는 일종의 횡단 관심사가 되어 버려 코드 전체에 이벤트 처리 코드가 흩어져 있게 되는 문제가 있었다. 그래서 객체지향 프로그래밍를 도입하여 이벤트를 받았을 때 수행되는 기능(이벤트 핸들러/콜백)을 구현할 수 있는 단일 인터페이스를 정의하고, 프로그래머들은 이를 필요한 형태로 알아서 구현하며, 특정 이벤트가 일어났을 때 실행되어야 하는 기능들을 등록한 다음, 운영체제나 응용프로그램이 실제로 해당 이벤트가 발생했을 때 해당 이벤트에 등록된 이벤트 핸들러/콜백을 주욱 실행하기만 하면 되는 구조가 본격적으로 확산되면서 객체지향 프로그래밍 또한 빠르게 확산되었다.[5][6][7]

특징

객체 지향의 특징으로는 크게 캡슐화, 정보은닉, 추상화, 상속성, 다형성이 있으며, 이 중 구조적 기법과 차별되는 개념은 캡슐화, 상속성, 다형성이 있다.[9]

캡슐화

캡슐화(Encapsulation)란 데이터(속성)와 데이터를 처리하는 함수로 외부에서 쉽게 접근하지 못하게 하는 것이 핵심이다. 객체에 직접적인 접근을 막고 외부에서 내부에 정보를 직접접근하여 변경할 수 없으며, 객체가 제공하는 필드와 메소드를 통해서만 접근이 가능해진다. 이는 유지보수나 확장시 오류의 범위를 최소화하고 객체내 정보손상, 오용방지, 조작법이 바뀌어도 사용방법 자체는 바뀌지않고, 데이터가 변경되어도 다른 객체에 영향을 주지 못하기 때문에 독립성이 좋다. 객체를 모듈화 할 수 있어 이식성이 좋다.[10]

상속성

상속성(Inheritance)은 이미 정의된 상위 클래스(부모 클래스)의 모든 속성과 연산을 하위 클래스(자식 클래스)가 물려받는것을 의미 하므로 하위 클래스는 상위클래스의 모든 속성과 연산을 자신의 클래스 내에서 다시 정의하지 않고서도 즉시 자신의 속성으로 사용할 수 있게된다. 또한, 물려받은 속성과 연산외에 새로운 속성과 연산을 추가하여 사용할 수 있다. 상위클래스와 하위클래스가 서로 공유할 수 있기에 객체와 클래스의 재사용이 증대되는 중요한 개념이다.[9]

정보은닉

정보은닉(Information Hiding)은 캡슐화에서 가장 중요한 개념으로, 다른 객체에 자신의 정보를 숨기고 자신의 연산만을 통하여 접근을 허용하는 것이다.[9]

추상화

추상화(Abstraction)는 불필요한 부분을 생략하고 객체 속성 중 공통적이고 중요한 것에만 중점을 두어 개략화, 즉 모델화 하는 것이다. 객체들의 공통적 특성을 파악하여 필요없는 특성을 제거하는 과정을 가르킨다. 이 과정은 복잡한 문제를 해결하기 위한 가장 기본방법이며 완전한 시스템 구축을 하기전에 시스템 구조 및 구성을 가시적으로 볼 수 있고, 그 시스템과 유사한 모델을 만들어 여러가지 요인을 테스트할 수 있다.[9][11]




각주

  1. 이수호, 〈객체 지향〉, 《인코뎀》, 2020-10-21
  2. 객체지향 언어의 장점과 단점, 개념, 종류, 절차지향 언어와의 비교〉, 《티스토리》, 2020-10-28
  3. 객체지향〉, 《생활코딩》, 2014-04-21
  4. 재희 jaiyah, 〈객체지향 프로그래밍이란?〉, 《티스토리》
  5. 5.0 5.1 객체 지향 프로그래밍〉, 《나무위키》
  6. 6.0 6.1 DLGNDUD, 〈객체지향의 역사와 이해〉, 《세다트리스 인공지능연구소》, 2020-08-29
  7. 7.0 7.1 객체 지향 프로그래밍〉, 《위키백과》
  8. 이름공간〉, 《위키백과》
  9. 9.0 9.1 9.2 9.3 코딩팩토리 〈(C++) 객체지향 언어의 5가지 특징〉, 《티스토리》, 2019-03-01
  10. radait, 〈자바(Java) 캡슐화(Encapsulation)란? 무엇인가?〉, 《티스토리》, 2019-05-21
  11. radait, 〈객체지향언어란? (특징, 장점, 단점, 종류)〉, 《티스토리》, 2019-05-20

같이 보기


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