객체지향 프로그래밍 (Object Oriented Programming)
프로그램을 단순히 데이터와 처리방법의 모임으로 보는시각에서 벗어나서, 프로그램을 수많은 객체로 나누어 객체들간의 상호작용으로 서술하는 방식을 말한다. 여기서 객체는 하나의 역할을 수행하는 단위로서 변수와 메서드의 묶음을 의미한다. 각각의 객체는 메시지 전달을 통해 통신하며, 데이터를 처리할 수 있다.
객체지향 프로그래밍의 장점
- 코드 재사용이 가능한 장점이 있다.
상속을 통해 확장을 통한 재사용이 가능하다. (재사용이 목적이 아니고 확장에 초점을 둔다)
- 유지보수가 보다 쉽다.
연관된 코드가 모여있기 때문에 코드를 수정할때, 제한된 영역만 고치면 된다.
- 클래스(객체)별로 모듈화하여 사용하기 때문에 대형 프로젝트를 구성하는 데에 적합하다.
- 문제해결을 위한 데이터가 각각의 클래스에 모여 있기 때문에 클래스의 응집도가 높고, 클래스 간 내용의 결합도는 낮다.
객체지향 프로그래밍의 단점
다만 객체 설계에는 많은 시간과 노력이 든다는 단점이 있다.
기본 구성요소
클래스, 객체, 메서드, 메시지
- 클래스(Class)
같은 특징을 가진 데이터들을 속성(상태)과 메서드(행위)를 정의하는 추상화 과정을 거쳐 객체를 만들어 낼 수 있게 만든 일종의 틀 혹은 형태라고 할 수 있다. 객체지향 프로그램의 기본 단위인 객체는 클래스를 통해 실제로 메모리에 할당되게 한 인스턴스(instance)를 의미한다.
클래스의 기능을 상속하여 만든 클래스를 서브클래스, 자식클래스라고 하며, 서브클래스는 자식이 상속한 클래스를 수퍼클래스, 부모클래스라 한다.
- 객체
객체는 클래스를 이용하여 인스턴스화 한것이다. 실제 메모리에 할당 된 것이며 고유의 메서드를 수행할 수 있고 속성 값을 가진다.
객체끼리는 메시지를 주고 받아서 자료를 처리하여 다른 객체로 보내기도 한다.
예를 들어, '자동차' 클래스의 인스턴스를 여러개 찍어낸다고 생각해보면 자동차1, 자동차2, 자동차3이라는 객체를 만들어 낼 수 있고 인스턴스화 할 때 이들은 모두 각각의 특징을 가진 자동차로 만들 수 있고 각각 다른 개체를 의미한다.
- 메서드, 메시지
객체를 사용하는 방법으로서 객체에 명령을 내리는 메시지라고 할 수 있다. 일반적으로 함수 형태로 객체의 속성을 다루는데 사용되고, 객체들 간의 통신은 메시지를 통해 이루어 진다.
객체 지향에 필요한 개념
상속
상속은 어떤 클래스를 상속한 자식클래스(서브 클래스, 하위클래스)가 자신의 부모클래스의 데이터와 기능을 사용할 수 있게 하는 것을 말한다. 예를 들어 부모클래스가 '이동수단'라고 한다면 자식 클래스는 '자동차', '비행기', '배' 등 여러가지가 있을 수 있다. 이들은 모두 '이동' 이라는 공통된 특성을 갖고 있다(부모 클래스에서 상속받은 것).
두 클래스의 상속 관계가 성립하려면, 클래스 간의 관계가 'is - a' 관계이어야한다. 자동차 is a 이동수단 관계가 성립하기 때문에 이동수단과 자동차 클래스는 상속관계라 할 수 있다.
다형성
하나의 개념이 다른 의미 혹은 여러가지 의미를 가질 수 있는 것으로 하나의 메서드가 재정의되어 다른 기능을 하거나, 경우에 따라 여러가지 기능을 할 수 있도록 한 개념이다. 일반적으로 오버라이딩(Overriding)과 오버로딩(Overloading)을 의미한다.
오버라이딩은 개념 혹은 기능 자체를 재정의 하여 사용하는 것이다. 즉, 같은 이름의 메서드가 각각의 클래스가 다른 기능을 하도록 다시 정의하여 사용 되는 것을 말한다.
오버로딩은 같은 이름의 메서드가 파라미터의 종류 혹은 갯수에 따라서 다른 기능을 할 수 있도록 여러번 정의하는 것을 의미한다. 우리가 어떤 객체의 메서드에 대해서 파라미터를 다른 방식으로 넣어도 작동하는 예가 바로 오버로딩이 적용된 것이다.
다중상속
다중상속은 여러개의 클래스로부터 상속 받을 수 있게하는 기능이지만 클래스 간 상속 관계에 혼란이 있을 수 있기때문에 주의해야한다.
Java 언어에서는 다중 상속을 지원하지 않고, C++에서는 지원한다.
추상화
추상화는 불필요한 정보는 숨기고, 중요한 정보만을 표현하여 프로그램을 간단하게 만드는 것이다. 다시 말해, 구현 세부 사항을 숨기고 코드 복잡성을 줄이기 위해 기능만을 표시하는 작업인데, 이를 객체지향의 관점에서 보면 이를 클래스를 정의한다고 한다.
캡슐화
캡슐화는 데이터와 메서드를 하나의 단위로 결합하여 클래스를 생성하는데, 데이터를 캡슐속에 넣어 숨기는 것처럼 정보 보호가 목적이기 때문에 중요한 정보를 은닉하거나 외부에서 접근하지 못하게 하는 접근 제어를 통해 캡슐화를 수행한다.
캡슐화에서 접근제어를 수행할 수 있도록하는 접근 제어자에는 일반적으로 public(제한 없이 접근가능), private(클래스 내부에서만 접근가능, 보통 getter / setter 등을 통해 접근), protected(자식 클래스에서만 접근 가능, 자바의 경우 같은 패키지내에서도 가능)
https://jeong-pro.tistory.com/95
https://ko.strephonsays.com/difference-between-data-abstraction-and-encapsulation
https://gracefulprograming.tistory.com/130
'algorithm > 개념' 카테고리의 다른 글
힙 정렬(Heap Sort) (0) | 2021.06.06 |
---|---|
병합 정렬 알고리즘(Merge Sort) (0) | 2021.06.06 |
퀵정렬 알고리즘(Quick Sort) (0) | 2021.06.06 |
배열과 연결리스트 (0) | 2021.06.01 |
인접행렬과 인접리스트 (0) | 2021.06.01 |