일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 영속성
- 스케줄링
- 멀티프로세서
- 병행성 관련 오류
- 프로그래머스
- 동적계획법
- OS
- 그리디 알고리즘
- 자료구조
- 백준
- 다이나믹 프로그래밍
- directx
- 타입 객체
- 디자인패턴
- I/O장치
- 컨디션 변수
- 다이나믹프로그래밍
- codility
- 멀티쓰레드
- DirectX 12
- 알고리즘
- Direct12
- 병행성
- 그리디알고리즘
- 렌더링 파이프라인
- 쓰레드
- 파일시스템 구현
- 락
- 운영체제
- DirectX12
- Today
- Total
기록공간
객체 지향 프로그래밍( OOP ) 개념 본문
객체 지향 프로그래밍 ( Object Oriented Programming ) 개요
객체
객체는 말 그대로 대상을 나타내는 단어이다.
예를 들면, 개인 한 명 한 명 또는 책 한 권 한 권을 객체라고 할 수 있다.
사람은 생김새와 성격이 똑같을 수 없기 때문에 개개인을 객체라고 할 수 있으며, 책 또한 내용이 같을지라도 한 권의 책에 흠집을 낸다고 해서 모든 책들이 전부 흠집 나는 것이 아니기 때문에 모두 객체라고 할 수 있다.
클래스
사람들은 일반적으로 같은 속성들을 가지고 있다.
여기서 속성이란 눈, 코, 입, 등의 신체부위를 의미한다.
책 또한 제목, 작가, 출판사 등의 같은 속성들을 가지고 있다.
사람, 책, 같은 객체들이 공통적으로 갖는 속성들을 모아서 정의 내린 것을 클래스라고 한다. (보통 추상화한다고 부른다.) 사람이라는 클래스는 눈, 코, 입 등의 속성이 존재하고 객체들은, 눈, 코, 입의 생김새가 다르기 때문에 다른 객체로 분류된다.
많은 책들이 객체와 클래스를 붕어빵과 붕어빵을 만드는 기계라고 표현한다. 이 표현은 정말 적절하다고 생각한다. 붕어빵을 만드는 기계는 붕어빵이라는 객체들을 생성하기 위해 틀을 제공한다. 그래서 붕어빵 찍는 기계는 클래스라 표현할 수 있고, 기계를 통해 만들어진 붕어빵들은 각각이 모두 객체가 된다.
OOP
OOP는 객체의 관점에서 프로그래밍을 하는 것을 뜻한다.
C언어와 같은 절차 지향 프로그래밍은 프로세스가 함수 단위로 순서에 따라 진행되는 것을 뜻한다.
반면 OOP는 객체들의 유기적인 관계를 통해 프로세스가 진행된다.
즉, 프로그램을 구성하는 요소들을 객체로 바라보고, 객체들을 유기적으로 연결하여 프로그래밍하는 것을 뜻한다.
요즘 대부분 OOP 기반으로 개발되기 때문에 OOP가 당연한 것이라고 생각할 수 있다. 하지만 처음 이 개념이 나왔을 때에는 생소하면서 신기했다고 한다.
OOP의 특징
이제 OOP의 특징에 대해서 알아보도록 하겠다.
1. 추상화
추상화는 목적과 관련이 없는 부분을 제거하여 필요한 부분만을 표현하기 위한 개념이다.
지도에는 위성지도와 등고선 지도 등 여러 가지가 있는데, 각 지도마다 목적이 다르다.
-
위성 지도
-> 그 지형의 정확한 실제 모습을 담기 위한 목적의 지도
-
등고선 지도
-> 지형의 높낮이를 표현하기 위한 목적의 지도
등고선 지도를 그릴 때, 목적에 맞지 않는 부분을 제외하고 필요한 부분만 표현한다.
위와 같은 예를 객체와 클래스 관점에서 살펴보자.
객체들은 실제 그 모습 자체이지만, 클래스는 객체들의 어떤 특징들이 있어야 한다고 정의하는 추상화된 개념이다. 다시 말하면, 추상화는 객체들의 공통된 특징을 파악해 정의해 놓은 작업이라 할 수 있다.
2. 캡슐화
캡슐화에서 캡슐은 알약이라고 생각하면 편하다.
가루로 된 약을 그냥 먹으면 쓰다. 그래서 사람들이 약 먹는 것을 꺼릴 가능성이 있다.
그래서 가루 내용물을 아무 맛도 느껴지지 않도록 캡슐 안에 포장시켜 알약으로 만들어 쉽게 먹을 수 있도록 도와준다. 이것이 캡슐화이다.
클래스 입장에서 캡슐화를 살펴보자.
C++ 에는 접근 제어자(public, private,...)가 있다.
private으로 정의된 속성은 외부에 노출시키지 않고 자신의 클래스에서만 사용하기 위해 정의한다.
private으로 정의된 속성은 알약의 실제 내용물이라고 생각하면 편하다. 알약 내용물처럼 쓴맛을 가진 속성을 외부에서는 알 필요가 없다. 그냥 알약을 먹고 약의 효과가 나면 그만이다.
즉, 캡슐화는 정보은닉을 할 수 있다는 장점이 있다.
3. 상속
실제 세계에서 자식은 부모로부터 여러 가지를 상속받는다. 그것이 재산, 키, 체질 등이 될 수도 있다.
이는 OOP에서도 가능하다.
OOP에서는 부모 클래스와 자식 클래스로 표현된다.
예를 들어, 고양이 클래스와 강아지 클래스가 있다고 하자.
그런데 고양이와 강아지는 생물학적 관점에서 포유류에 해당한다. 포유류는 여러 속성들이 정의되어 있는데 고양이와 강아지는 포유류의 이러한 속성들을 가지고 있다.
하지만 아주 많은 속성이 다르기 때문에 디테일하게 고양이와 강아지로 종이 나뉘게 된 것이다.
즉, 포유류라는 클래스는 고양이와 강아지 클래스에 속성들을 물려준다. 이것이 상속이며, 포유류와 고양이, 포유류와 강아지 클래스는 상속관계에 있다고 한다.
상속이 필요한 이유는 코드의 중복을 없애기 위함이다.
코드의 중복이 많아지면 개발 단계에서도 피곤하지만, 유지 보수에서도 많은 비용이 든다.
그렇기 때문에 개발할 때에는 코드의 중복은 반드시 피해야 한다.
OOP에서는 상속을 통해 코드의 중복 문제를 일부 해결할 수 있다.
포유류 클래스에 여러 속성들을 정의해 놓고 포유류에 해당하는 종(강아지, 고양이 등)의 클래스가 필요할 경우 포유류 클래스와 상속 관계를 맺는다.
상속 관계를 맺으면 자식 객체는 생성 시 부모 클래스의 속성들을 자동으로 물려받기 때문에 자식 클래스에서 그 속성들을 또 정의할 필요가 없다. 이것이 상속이 필요한 이유라고 할 수 있다.
4. 다형성
다형성은 형태가 같지만 다른 기능을 하는 것을 의미한다.
예를 들어, 고양이 클래스에는 "울음"이라는 속성이 정의되어 있다고 하자.
사자는 고양이 과이기 때문에 사자 클래스는 고양이 클래스를 상속받는다. 그러므로 "울음"이라는 속성이 자동으로 추가된다. (상속에서 살펴본 바 있다.)
그런데 고양이와 사자의 울음소리는 매우 다르다.
같은 "울음"속성을 가지고 있음에도 실제 울음소리는 다르다.
이것이 다형성이다.
부모 클래스로부터 상속을 받은 속성에 대해, 자식 클래스에서 물려받은 속성을 재정의 할 수 있다.
이를 오버라이딩이라고 한다.
즉, 사자 클래스는 부모 클래스인 고양이 클래스의 "울음" 속성을 상속받았지만, 사자는 고양이의 울음소리가 다르므로 "울음" 속성을 오버라이딩하여 사자 울음소리에 맞게 재정의 할 수 있다.
OOP에서 이러한 다형성을 허용한다.
다형성을 사용하면 좋은 점을 무엇일까?
같은 이름의 속성을 유지함으로써, 속성을 사용하기 위한 인터페이스를 유지하고, 메서드 이름을 낭비하지 않는 것이다.
예를 들어, 고양이와 사자의 울음소리를 호출하기 위해서 각 개체에서 roar() 메서드를 호출하면 된다.
roar_cat(), roar_lion()과 같이 각각 정의할 필요가 없다는 것이다.
API가 많아질수록 복잡성이 증가하기 때문에 다형성은 유용하다.
출처 : https://victorydntmd.tistory.com/117
'C++' 카테고리의 다른 글
round 반올림 메서드 (C++ 11) (0) | 2020.06.25 |
---|---|
std::getline()을 이용한 string 표준입력 (0) | 2020.06.25 |
예외 처리 (0) | 2020.04.21 |
스마트 포인터 - 간략하게 (0) | 2020.04.07 |
decltype 키워드 (0) | 2020.04.03 |