"객체지향 프로그래밍"의 두 판 사이의 차이
잔글 |
|||
2번째 줄: | 2번째 줄: | ||
== 역사 == | == 역사 == | ||
− | 초기 프로그래밍 방식인 절차적 프로그래밍 방식은 입력을 받아 명시된 순서대로 처리한 다음 그 결과를 내는 언어로서, 조금만 복잡해져도 다른 사람이 보고 이해하기 어려울 정도여서 유지보수가 어려운 단점이 있었다. 절차적 프로그래밍 방식을 보완하기 위해 1960년 [[조한 달]]과 [[크리스틴]]이 [[시뮬라67]](Simula67)을 발표했다. 시뮬라는 최초의 객체 지향 프로그래밍 언어로 클래스 라는 개념이 도입되었으나 널리 확산되지는 못하였다. 이 뒤로 10여년 간 객체 지향 언어는 전혀 주목을 받지 못하였고 이어서 팰러액토 연구소의 [[스몰토크]](Smalltalk), 미 국방성의 에이다 등이 만들어졌다. 이후 [[AT&T]] [[벨 연구소]]의 [[C++]]등의 프로그램들이 객체 지향 언어에 큰 영향을 미쳤던 GUI의 발전에 따라 향상되었다. 1990년대 중반 이후로 각광받고 있는 [[썬 마이크로시스템즈]]의 [[자바]](Java) 언어가 만들어졌다. 이후 [[펄]](Perl), [[파이썬]](Python), [[PHP]], [[루비]](Ruby), [[C샵|C#]] 등 다양한 객체 지향 프로그래밍 언어가 만들어졌다.<ref>, | + | 초기 프로그래밍 방식인 절차적 프로그래밍 방식은 입력을 받아 명시된 순서대로 처리한 다음 그 결과를 내는 언어로서, 조금만 복잡해져도 다른 사람이 보고 이해하기 어려울 정도여서 유지보수가 어려운 단점이 있었다. 절차적 프로그래밍 방식을 보완하기 위해 1960년 [[조한 달]]과 [[크리스틴]]이 [[시뮬라67]](Simula67)을 발표했다. 시뮬라는 최초의 객체 지향 프로그래밍 언어로 클래스 라는 개념이 도입되었으나 널리 확산되지는 못하였다. 이 뒤로 10여년 간 객체 지향 언어는 전혀 주목을 받지 못하였고 이어서 팰러액토 연구소의 [[스몰토크]](Smalltalk), 미 국방성의 에이다 등이 만들어졌다. 이후 [[AT&T]] [[벨 연구소]]의 [[C++]]등의 프로그램들이 객체 지향 언어에 큰 영향을 미쳤던 GUI의 발전에 따라 향상되었다. 1990년대 중반 이후로 각광받고 있는 [[썬 마이크로시스템즈]]의 [[자바]](Java) 언어가 만들어졌다. 이후 [[펄]](Perl), [[파이썬]](Python), [[PHP]], [[루비]](Ruby), [[C샵|C#]] 등 다양한 객체 지향 프로그래밍 언어가 만들어졌다.<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>, | + | * '''[[객체]]'''(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>, | + | * '''[[클래스]]'''(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>, | + | * '''[[메소드]]'''(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> |
== 특징 == | == 특징 == | ||
− | * '''[[캡슐화]]'''(Encapsulation) : 캡슐화란 관련 기능과 특성을 모아서 분류하는 작업이다. 프로그램의 실제 구현 내용이 외부로 드러나지 않도록 특정 모듈([[클래스]]) 내부로 은닉하는 것이다. <ref><[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><[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>, | + | * '''[[다중 상속]]'''(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> |
− | * '''[[다형성]]'''(多形性, Polymorphism) : 하나의 변수명이 상황에 따라 다른 의미로 해석될 수 있는 성질을 뜻한다. 일반적으로 [[오버라이딩]] , [[오버로딩]]을 의미한다. 다형 개념을 통해서 프로그램 안의 객체 간의 관계를 조직적으로 나타낼 수 있다.<ref>, | + | * '''[[다형성]]'''(多形性, Polymorphism) : 하나의 변수명이 상황에 따라 다른 의미로 해석될 수 있는 성질을 뜻한다. 일반적으로 [[오버라이딩]] , [[오버로딩]]을 의미한다. 다형 개념을 통해서 프로그램 안의 객체 간의 관계를 조직적으로 나타낼 수 있다.<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>, | + | * '''[[자료 추상화]]'''(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>, | + | * '''[[동적 바인딩]]'''(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일 (목) 10:48 판
객체 지향 프로그래밍(OOP, Object-Oriented Programming)이란 컴퓨터 프로그램을 여러 명령어(command)의 목록으로 보지 않고 여러 개의 독립된 객체(object)들의 집합으로 파악하는 프로그래밍 기법이다. 객체 지향 프로그래밍은 컴퓨터 프로그램을 객체라는 기본 단위로 나누고, 각각의 객체가 메시지를 주고받으며 데이터를 처리하는 비절차적 프로그래밍 방법이다. 프로그램을 유연하고 변경하기 쉽게 만들기 때문에 절차지향 언어에 비하여 재사용성이 용이하고 유지 보수가 간편하다.
역사
초기 프로그래밍 방식인 절차적 프로그래밍 방식은 입력을 받아 명시된 순서대로 처리한 다음 그 결과를 내는 언어로서, 조금만 복잡해져도 다른 사람이 보고 이해하기 어려울 정도여서 유지보수가 어려운 단점이 있었다. 절차적 프로그래밍 방식을 보완하기 위해 1960년 조한 달과 크리스틴이 시뮬라67(Simula67)을 발표했다. 시뮬라는 최초의 객체 지향 프로그래밍 언어로 클래스 라는 개념이 도입되었으나 널리 확산되지는 못하였다. 이 뒤로 10여년 간 객체 지향 언어는 전혀 주목을 받지 못하였고 이어서 팰러액토 연구소의 스몰토크(Smalltalk), 미 국방성의 에이다 등이 만들어졌다. 이후 AT&T 벨 연구소의 C++등의 프로그램들이 객체 지향 언어에 큰 영향을 미쳤던 GUI의 발전에 따라 향상되었다. 1990년대 중반 이후로 각광받고 있는 썬 마이크로시스템즈의 자바(Java) 언어가 만들어졌다. 이후 펄(Perl), 파이썬(Python), PHP, 루비(Ruby), C# 등 다양한 객체 지향 프로그래밍 언어가 만들어졌다.[1]
구성 요소
- 객체(object) : 객체는 자신의 고유의 속성(attribute)을 가지며, 클래스에서 정의한 행위(behavior)를 수행 가능하게한다. 객체에서 실행하는 행위를 클래스에서 정의된 행위를 공유함으로써 메모리를 추가로 사용하지 않기에 중복해서 사용하는 값을 지불할 필요가 없어진다. 데이터와 그에 관련되는 동작(절차, 방법, 기능)을 모두 포함하는 인스턴스이다.[1]
- 클래스(class) : 같은 종류의 집단에 속하는 속성(attribute)과 행위를 정의한 객체지향 프로그램의 기본적인 사용자 정의 데이터형(defined data type)이며 오퍼레이션, 관계 등을 갖고 있는 객체들의 집합이다. 다른 클래스 또는 외부 요소와 독립적으로 디자인되어야 한다.[1]
- 메소드(method) : 클래스 내부에 정의된 객체가 수행해야 할 오퍼레이션이다. 한 객체의 서브루틴 형태로 객체의 속성을 조작하는데 사용된다. 존의 프로그래밍 언어에서 함수(function)와 같은 역할을 한다. 한 객체의 서브루틴 형태로 객체의 속성을 조작하는데 사용된다.[1]
특징
- 캡슐화(Encapsulation) : 캡슐화란 관련 기능과 특성을 모아서 분류하는 작업이다. 프로그램의 실제 구현 내용이 외부로 드러나지 않도록 특정 모듈(클래스) 내부로 은닉하는 것이다. [2]
- 상속(Inheritance) : 새로운 클래스가 기존의 클래스의 자료와 연산을 이용할 수 있게 하는 기능이다. 상속을 받는 새로운 클래스는 부클래스, 파생 클래스, 하위 클래스, 자식 클래스라고 하며 새로운 클래스가 상속하는 기존의 클래스를 기반 클래스, 상위 클래스, 부모 클래스라고 한다. 상위 클래스의 특성과 기능을 그대로 물려받음으로써, 하위 클래스를 이용해 프로그램의 요구에 맞추어 클래스를 수정가능하고 클래스 간의 종속 관계를 형성함으로써 객체를 조직화할 수 있다. 캡슐화 및 재사용이 용이하도록 해준다. [2]
- 다중 상속(Multiple inheritance) : 다중 상속은 클래스가 2개 이상의 클래스로부터 상속받을 수 있게 하는 기능이다. 클래스들의 기능이 동시에 필요할 때는 용이하나 클래스의 상속 관계에 혼란을 줄 수 있기 때문에 프로그래밍 언어에 따라 사용 가능 유무가 다름으로 주의가 필요하다. JAVA는 지원하지 않는다.[1]
- 다형성(多形性, Polymorphism) : 하나의 변수명이 상황에 따라 다른 의미로 해석될 수 있는 성질을 뜻한다. 일반적으로 오버라이딩 , 오버로딩을 의미한다. 다형 개념을 통해서 프로그램 안의 객체 간의 관계를 조직적으로 나타낼 수 있다.[1]
- 자료 추상화(Data Abstraction) : 불필요한 정보를 숨기고 중요한 정보만 표현함으로 프로그램을 보다 간단화 시켜 공통의 속성이나 기능을 묶어 이름을 붙이는 것이다. 자료 추상화를 통해 정의된 자료형을 추상 자료형이라고 한다. 추상 자료형은 자료형의 자료 표현과 자료형의 연산을 캡슐화한 것으로 접근 제어를 통하여 자료형의 정보를 은닉할 수 있다. 객체 지향 프로그래밍에서 일반적으로 추상 자료형을 클래스, 추상 자료형의 인스턴트를 객체, 추상 자료형에서 정의된 연산을 메소드(함수), 메소드의 호출을 생성자라고 한다.[1]
- 동적 바인딩(Dynamic binding) :실행 시간 중 일어나거나 실행 과정에서 변경될 수 있는 바인딩이다. 정적 바인딩과는 대비되는 개념으로 헌 개체나 기호를 실행과정에 여러 속성이나 연산에 바인딩함으로써 다형 개념을 실현한다.[1]
객체 지향 언어
다양한 객체 지향 프로그래밍 언어가 존재한다.
- 스몰토크(Smalltalk)
- 루비(Ruby)
- 파이썬(Python)
- 자바(Java)
- C#
- C++
- Objective-C
- 오브젝티브-파스칼(Objective-Pascal)
- 비주얼베이직닷넷(VB.NET)
- 델파이(Delphi)
- ASP
각주
참고자료
- 위키백과,<객체 지향 프로그래밍>, 《위키백과》, 2020-07-23
- 정아마추어, <객체 지향 프로그래밍이 뭔가요? (꼬리에 꼬리를 무는 질문 1순위, 그놈의 OOP)>, 《기본기를 쌓는 정아마추어 코딩블로그》, 2017-11-15
같이 보기