강께르의 개발일지

[C++] 객체 지향 프로그래밍과 특징 정리 본문

프로그래밍/C++

[C++] 객체 지향 프로그래밍과 특징 정리

강께르 2021. 6. 10. 23:29

1. 객체 지향 프로그래밍(Object-Oriented Programming, OOP)이란?

- 객체 지향 프로그래밍에 대해 여러 설명이 있다. 문제를 바라볼 때, 여러 개의 객체 단위로 나눠 작업하는 방식을 말하기도 한다.

- 프로그램을 여러 개의 객체 모임으로 간주하여 개발하는 것이다.

- 상태와 행동으로 이루어진 다수의 객체를 만들어, 서로 상호작용을 통해 프로그램을 만들어지는 방식이다.

- 여러 객체 지향 프로그래밍의 정의를 보아하니 공통점은 프로그래밍을 할 때, 여러 개의 객체를 생성하여 그 객체들을 이용해서 프로그램을 만들어가는 개발 방식 정도로 해석된다.

 

2. OOP의 장/단점

- 객체로 구분하여 프로그래밍하기에 코드의 재사용을 높일 수 있다.

- 잘 만들어진 클래스는 프로그램을 확장하기에 유용하여 개발의 생산성도 향상시킨다.

- 일상생활의 모습을 객체화하는 방식이어서 자연스러운 구현이 가능하다.

- 캡슐화라는 개념 덕에 유지보수에도 우수하다.

 

- 객체가 처리하려는 것을 정확하게 이해하는 것이 필요하기에 개발속도가 느리다.

- 객체지향 프로그래밍은 대체적으로 실행속도가 느리다.

 

3. 클래스와 객체

- 클래스는 일종의 설계도이다. 이를 이용해 객체를 만들어내는 행위를 한다.

- 객체는 그 클래스를 사용해 만들어낸 물건과 같은 것이다.

- 예를 들어 모니터가 있다고 하자. 이 모니터는 다양한 회사에서 만들어낼 것이고, 그 회사마다 내놓은 모니터 제품은 각각마다 사양이 조금씩 다를 것이다.

- 하지만 모니터라는 공통점은 변치 않는다. 무언가를 디스플레이를 해주는 기능이 있듯이 모니터라면 당연히 있어야할 공통된 기능은 모든 회사의 제품들은 있을 것이다.

- 각각의 제품은 큰 개념으로 봤을 때, 모니터라는 한 범주에 모인다. 그렇다면 모니터는 또 다른 한 범주에 모이지 않은가? 전자제품이 될 수 있고, 컴퓨터 기기가 될 수 있을 것이다. 그리고 그 범주 내에서 그 범주끼리 공유하는 특징이 있을 것이다.

- 여기서 모니터, 전자 제품 등이 클래스이다. 모니터의 하위 범주로 한성컴퓨터의 모니터가 있을 것이다. 이런 것이 클래스다. 하지만 이 클래스는 어떤 물체 하나를 뜻하는 게 아니다.

- 한성컴퓨터의 모니터라는 제품 라인 중 하나라는 거지, 누군가가 소유하는 어떤 고유한, 단 하나의 물건이 아니라는 것이다. 공장에서 한성컴퓨터의 모니터라는 제품 라인이 생산되기 시작하면 그 제품 라인의 설계에 따라 공장은 모니터를 하나씩 찍어낼 것이다. 그 모니터들은 다른 일련 번호를 가지면서 서로 구별된 물건이 될 것이다. 이 제품 라인을 통해 찍어낸 하나의 물건을 객체라고 한다.

 

- 클래스는 객체를 정의하는 틀 또는 설계도이며 서로 연관되어 있는 변수와 함수의 집합이다.

- 객체는 소프트웨어 세계 혹은 프로그램 내에서 구현할 대상이다. 클래스가 정의해 놓은 변수와 함수에 따라서 객체는 만들어진다. 여기서 변수는 상태 혹은 속성을 나타낸다고 하고, 메소드는 동작을 나타낸다고 한다.

- 엄격하게 따진다면 클래스 타입으로 선언되었을 때는 객체라고 부르고, 객체가 메모리에 할당되어 실제 사용되어질 때는 인스턴스라 부르기도 하지만, 결국에 메모리 할당이 된 객체를 이르는 말이기에 알아만 두면 될 것 같다.

 

4. 객체 지향 프로그래밍의 특징

- 객체 지향 프로그래밍이라고 불리기 위해서는 몇 가지 특징들이 있어야 한다.

 

4-1. 캡슐화

- 데이터와 코드의 형태를 외부로부터 알 수 없게 하고, 데이터의 구조와 역할, 기능을 하나의 캡슐 형태로 만드는 방법이다.

- 좀 더 상세한 설명으로는, 어떠한 클래스를 사용할 때 내부 동작이 어떻게 돌아가는지 모르더라도 사용법만 알면 쓸 수 있도록 클래스 내부를 감추는 기법이라고 한다.

- 클래스를 캡슐화를 하면 그 클래스를 사용하는 사람이 내부 동작에 대한 것들, 변수나 메소드를 파악할 필요가 없기 때문에 골머리를 앓을 필요가 없다.

- 그리고 클래스를 사용하는 사람이 접근하면 프로그램 돌아가는 데에 영향을 줄 변수나 메소드를 숨길 수 있기 때문에 데이터를 보호할 수 있다는 장점이 있다.

- 클래스를 사용하는 사람은 그 클래스를 사용함으로 캡슐화된 데이터를 직접 접근한다거나 어딘가 우회해서 사용하지 않을 것이라는 신뢰를 구축해준다.

 

- 클래스 내부의 데이터를 감추는것을 정보 은닉이라고 하며, 클래스 내에서 접근 제한자(public, private, protected)를 사용해 경우에 따라 필요한 접근제한자를 선택해 사용한다.

 

4-2. 상속

- 상속은 상위 클래스의 속성과 행동을 하위 클래스로 물려주는 것을 의미한다.

- 하위 클래스에선 상위 클래스에게 물려받은 것 즉, 기존 기능에 더하여 추가적인 요구 사항을 개발할 수 있다.

- 공통된 부분을 따로 다른 클래스로 분리해서 여러번 쓸 필요 없이 공통된 부분을 상위 클래스의 속성과 동작으로 정의하고 하위 클래스에서 다른 부분을 속성과 동작으로 정의하면 코드의 양이 줄어드는 효과가 있을 것이다.

- 그리고 또다른 공통된 부분을 가진 하위 클래스를 만든다면 그 상위 클래스로부터 상속받아서 속성과 행동을 가져오면 되는 것이다. 이렇게 하면 코드를 재사용하는 효과가 있다.

- 공통된 부분이 추가된다면 상위클래스에 공통된 부분을 추가함으로 하위 클래스에 모두 적용할 수 있다. 제거도 마찬가지.

 

4-3. 다형성

- 다형성은 하나의 이름이 상황에 따라서 다르게 해석될 수 있음을 의미한다. 하나의 함수가 매개변수에 따라서 다른 내용을 갖는다거나 하나의 함수가 각각 다른 하위 클래스에서 다른 내용을 갖는 등.

- 하나의 이름이지만 다양한 모습을 가질 수 있어 다형성이라고 명칭을 하는 것 같다.

- 다형성이라는 특징을 이용해 가상함수, 오버라이딩, 순수가상함수, 추상클래스, 오버로딩을 사용되도록 할 수 있다.

 

4-4. 추상화

- 추상화는 객체의 공통적인 속성과 기능을 추출하여 정의하는 것을 말한다.

- 클래스를 만드는 과정과 밀접하다. 공통적인 속성과 기능을 추출한다는 것은 어떤 것의 상위 개념을 생각한다는 것이다. 예를 들어 갤럭시S21과 아이폰12를 공통적인 속성과 기능을 생각한다면 핸드폰이라는 상위 개념을 떠올리는 것과 같다. 즉, 상위 클래스인 핸드폰은 하위 클래스인 갤럭시와 아이폰을 상속하는 모양으로 보인다.

 

 

더보기