객체 지향 프로그래밍(Object oriented Programming, OOP)
컴퓨터 프로그래밍의 패러다임 중 하나로,
컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, 즉 객체들의 모임으로 파악하고자 하는 것이다.
각각의 객체는 메시지를 주고받고, 데이터를 처리할 수 있다.
객체 지향 프로그래밍은 프로그램을 유연하고 변경이 쉽게 만들기 때문에 대규모 소프트웨어 개발에 많이 사용된다.
또 프로그래밍을 더 배우기 쉽게 하고 소프트웨어 개발과 보수를 간편하게 하며, 보다 직관적인 코드 분석을 가능하게 하는 장점이 있다.
작가 rawpixel.com 출처 Freepik
왜 생겨났을까?
초기 프로그래밍 방식은 절차적 프로그래밍 방식이었고, 입력을 받아 명시된 순서대로 처리한 다음, 그 결과를 내는 것뿐이라는 생각이 지배적이었다. 프로그램 자체가 가지는 기능에 대해서만 신경을 썼지 이 프로그램이 대체 어떤 데이터를 취급하는 것인가에는 그다지 관심이 없었던 것이다. 즉, 프로그램을 명령어의 모음으로 인식한 것이다.
그러나 프로그램이 복잡해지면서 흐름을 나타내는 순서도에 그려내는 것이 불가능할 정도로 스파게티 코드가 만들어지게 된다.
예를 들어 절차지향으로 상품 판매하는 기능을 만든다고 생각해보자.
상품 하나 하나마다 판매하는 코드를 만들어야하고, 만약 여러개의 상품을 주문한다면 더 끔찍할정도로 반복된 코드 작업을 하게 될것이다.
이러한 문제를 해결하고자 프로시저 단위로 나누고 호출하는 구조적 프로그램 같은 방식이 제안 되기도 하였지만, 데이터의 처리 방법만 구조화 했을 뿐 데이터 자체는 구조화하지 못하였다.
이로 인해 전역 네임 스페이스 포화 문제나 실행 콘텍스트를 저장할 마땅한 방법이 없어지게 되어 GUI 환경 같이 예상치 못한 실행 순서가 많아지는 환경에서는 의도치 않은 데이터로 인해 엉뚱한 결과를 낳거나 데이터가 오염되는 문제가 발생하였고, 이러한 가능성 때문에 프로그래머는 한 함수에 작동에 영향을 받는 변수를 조사할 때 모든 변수를 조사해야하는 어려움이 발생하였다.
이러한 문제를 해결하고자 객체 지향 프로그래밍이 등장하였는데, 당시에는 기존 절차적 프로그래밍과 비교해 매우 이질적이고, 당시 컴퓨터의 처리 능력이 별로 좋지않아 주목을 받지 못하였다.
(모든 상황에서 객체 지향이 좋다 볼수는 없다!)
GUI가 등장하면서 객체 지향 프로그래밍이 급 부상하게 되었는데, GUI 환경 처럼 개발자의 의도에 벗어나는 사용 방법이 많이 발생하고, 사용자의 상호작용을 위해 이벤트 처리를 위한 비동기적인 처리를 기존 절차적 프로그래밍에서 구현하려면 더 복잡한 코드 형태를 가지게 되기에 기능 뿐만 아니라 데이터도 묶어 관리하고 상호작용할 수 있는 객체 지향은 매우 좋은 선택지였다.
(컴퓨터의 성능 발전도 한몫한다 생각된다.)
기본 구성요소
- 클래스(Class)
같은 종류(또는 문제 해결을 위한)의 집단에 속하는 속성(attribute)과 행위(behavior)를 정의한 것으로 객체지향 프로그램의 기본적인 사용자 정의 데이터형(user defined data type)이라고 할 수 있다.
클래스는 다른 클래스 또는 외부 요소와 독립적으로 디자인하여야 한다.(흔히 객체를 만들어내는 틀이라고 해서 붕어빵에 비유하는 글이 많이 보인다) - 객체(Object)
클래스의 인스턴스(실제로 메모리상에 할당된 것)이다.
객체는 자신 고유의 속성(attribute)을 가지며 클래스에서 정의한 행위(behavior)를 수행할 수 있다. 객체의 행위는 클래스에 정의된 행위에 대한 정의를 공유함으로써 메모리를 경제적으로 사용한다. - 메서드(Method)
클래스로부터 생성된 객체를 사용하는 방법으로서 객체에 명령을 내리는 메시지라 할 수 있다.
메서드는 한 객체의 서브루틴(subroutine) 형태로 객체의 속성을 조작하는 데 사용된다. 또 객체간의 통신은 메시지를 통해 이루어진다.
일상에서 말로 정의 가능한 것들 모두가 객체라고 할 수 있다.
작가 storyset 출처 Freepik
특징
- 추상화
불필요한 정보는 숨기고 중요한 정보만을 표현함으로써 프로그램을 간단히 만드는 것이다.
객체들의 공통적인 특징[속성(attribute)과 행위(behavior)]을 도출하는 것으로 객체지향적 관점에서는 클래스를 정의하는 것을 추상화라고 할 수 있다.
(위키 백과에서는 자료 추상화라 하여 추상화를 설명하면서 캡슐화와 정보은닉을 함께 설명하고 있다. 바라보는 관점에 따라 다르게 설명이 가능하니 아래 참고 링크를 통해 확인해보길 바란다.) - 캡슐화
변수와 함수를 하나의 단위로 묶는 것을 의미한다. 즉, 데이터의 번들링(bundling)이다. 대개 프로그래밍 언어에서 이 번들링은 클래스를 통해 구현되고, 해당 클래스의 인스턴스 생성을 통해 클래스 안에 포함된 멤버 변수와 메소드에 쉽게 접근할 수 있다. 클래스는 객체 지향 프로그래밍을 지원하는 거의 대부분의 언어가 제공하는 제1요소이다.
(정보 은닉은 캡슐화로부터 파생된 보조 개념!, 캡슐화 = 정보 은닉은 아니다.) - 상속성
상속은 새로운 클래스가 기존의 클래스의 자료와 연산을 이용할 수 있게 하는 기능이다.
상속을 받는 새로운 클래스를 부클래스, 파생 클래스, 하위 클래스, 자식 클래스라고 하며 새로운 클래스가 상속하는 기존의 클래스를 기반 클래스, 상위 클래스, 부모 클래스라고 한다.
상속을 통해서 기존의 클래스를 상속받은 하위 클래스를 이용해 프로그램의 요구에 맞추어 클래스를 수정할 수 있고 클래스 간의 종속 관계를 형성함으로써 객체를 조직화할 수 있다. - 다형성
다형성 개념이란 어떤 한 요소에 여러 개념을 넣어 놓는 것으로 일반적으로 오버라이딩(같은 이름의 메소드가 여러 클래스에서 다른 기능을 하는 것)이나 오버로딩(같은 이름의 메소드가 인자의 개수나 자료형에 따라서 다른 기능을 하는 것)을 의미한다.
다형 개념을 통해서 프로그램 안의 객체 간의 관계를 조직적으로 나타낼 수 있다. - 동적 바인딩
동적 바인딩은 실행 시간 중에 일어나거나 실행 과정에서 변경될 수 있는 바인딩으로 컴파일 시간에 완료되어 변화하지 않는 정적 바인딩과 대비되는 개념이다.
동적 바인딩은 프로그램의 한 개체나 기호를 실행 과정에 여러 속성이나 연산에 바인딩 함으로써 다형 개념을 실현한다.
참고 자료
객체 지향 프로그래밍 - 위키백과, 우리 모두의 백과사전
위키백과, 우리 모두의 백과사전. 객체 지향 프로그래밍(영어: Object-Oriented Programming, OOP)은 컴퓨터 프로그래밍의 패러다임 중 하나이다. 객체 지향 프로그래밍은 컴퓨터 프로그램을 명령어의 목
ko.wikipedia.org
객체 지향 프로그래밍 - 나무위키
프로그램의 세부 구현을 외부로 드러나지 않도록 특정 모듈 내부로 감추는 것이다. 내부의 구현은 감추고 모듈 내에서의 응집도를 높이며, 외부로의 노출을 최소화하여 모듈 간의 결합도를 떨
namu.wiki
생물정보 전문위키, 인코덤
Wikipedia for Bioinformatics
www.incodom.kr
'DEV > Etc' 카테고리의 다른 글
[Etc] 셀레니움 크롬 드라이버 자동 설치(webdriver-manager) (0) | 2023.11.03 |
---|---|
[Etc] WebRTC 란? (0) | 2023.08.11 |
[Flask] Flask 란? (0) | 2023.08.03 |
Google 간편로그인 등록 (feat. OAuth) (0) | 2023.07.22 |
OAuth 2.0 개념 정리 (0) | 2023.07.22 |