본문 바로가기
언어/C++

[C++ 기본 공부정리] 13. 객체 지향 프로그래밍(Object Oriented Programming)

by 민-Zero 2019. 12. 24.

공부 내용을 정리하는 목적 이므로 참고용으로만 읽어 주시기 바랍니다.

틀린 부분에 대한 지적은 감사합니다.

클래스(class)란 앞서 정리한 구조체(struct)와 비슷한 구조를 가지고 있다. C++에서 구조체는 멤버로 함수도 가질 수 있기 때문에 구조체와 클래스는 구조적으로 기본 접근자의 차이만 존재한다. 이제 정리할 클래스를 사용하면 객체 지향 프로그램을 작성할 수 있게 된다. 따라서 객체 지향 프로그래밍(OOP)이 무엇인지 먼저 정리하자.

 

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

객체 지향 프로그래밍(OOP)은 컴퓨터 프로그래밍의 패러다임으로써 현실의 존재를 프로그램으로 구성하거나 어떤 문제를 해결하는등 다양한 이유로 프로그래밍을 하게 되는데 이때 프로그래밍에서 필요한 데이터를 추상화하여 속성이나 행동, 동작, 특징 등을 객체로 만들고 그 객체들이 서로 유기적으로 동작하도록 하는 프로그래밍 방법이다.

객체(object)란 메모리를 할당받아 프로그램에서 사용되는 모든 데이터를 객체라고 한다. 앞서 꾸준히 사용하던 변수나 구조체, 함수등 메모리를 할당받아 사용한 모든 것들이 객체이다. 

이제 이러한 객체들을 가지고 객체지향 프로그래밍을 위해 어떤 사물이나 주어진 문제를 해결하기 위해 추상화를 거쳐 속성이나 행동, 동작, 특징 등을 변수나 메소드를 통해 구현한 틀이 클래스이다.

 

2. 객체 지향 프로그래밍 사용 이유

이유는 객체 지향 프로그래밍을 이용할 경우 단점도 존재하지만 장점이 매리트가 있기 때문이다.

-장점

코드의 재사용이 용이하다. 다른 프로그래머가 작성한 클래스를 가져와 사용할수 있을 뿐 아니라 동일 프로그램 내에서 상속을 통해 확장하여 사용 가능하다.

유지보수 및 업그레이드가 쉽다. 수정, 보완이 필요하다면 일일이 찾아 수정할 필요 없이 클래스 내부에 멤버 변수나 함수로 작성되어 있으므로 해당 부분만 수정하면 된다.  

대형 프로젝트에 효과적이다. 클래스 단위로 모듈화 된 방식으로 작성할 수 있어 여러 명이 분담하여 개발하기 좋다.

직관적인 코드 분석을 가능하게 한다. 프로그래머가 각 객체들이 어떻게 유기적으로 상호작용하는지 정의하기 때문에 사용자의 기준으로 작업을 진행하는 더 직관적인 방법이다.

 

-단점

처리속도가 느리다. 모든 과정이 주로 함수로 이루어져 있기 때문에 일반적인 코드보다 함수 호출이 많아 처리속도가 느려지게 된다.

객체가 많아질수록 용량이 커진다.

설계 시 시간과 노력이 많이 든다.

 

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

객체 지향 프로그래밍의 장점은 객체 지향 프로그래밍의 다음과 같은 4가지 특징으로 인해 얻을 수 있다.

 추상화(abstraction)

 캡슐화(encapsulation)

 상속성(inheritance)

 다형성(polymorphism)

 

객체 지향 프로그래밍의 추상화란?

어떤 객체가 가진 공통된 특징이나 속성, 기능 등을 한 곳에 모아 이름을 붙여 작성하는 것이다. 예를 들어 사람이라는 객체를 간단히 추상화한다고 하자. 그렇다면 사람이란 객체를 세분화하더라도 사람이 가진 공통의 속성으로 이름, 나이, 키 등을 멤버 변수로 이름을 붙여 데이터를 저장할 수 있을 것이고 사람이 공통적으로 행동할 수 있는 걷거나 공부하는 등의 행동을 멤버 함수로 기능을 구현하여 추상화를 진행할 수 있다.

 

객체 지향 프로그래밍의 캡슐화란?

공통의 속성이나 기능, 행동 등을 캡슐에 보관하는 것처럼 하나의 클래스로 묶는 것이 캡슐화이다. 클래스 사용은 뒤에 정리하겠지만 앞서 추상화를 통해 작성한 이름을 캡슐화를 통해 묶는다면,

이와 같이 캡슐화를 진행할 수 있다. 캡슐화를 진행하는 이유는 변수나 기능을 구현한 함수가 여기저기 흩어져 있다면 재사용하기 위한 분류를 또 하고 찾아야 하기 때문에 복잡해진다. 따라서 이런 어려움을 줄이기 위해 캡슐화 과정을 거쳐 공통의 기능과 속성, 특징 등을 한 곳에 모아 재사용하기 원활하도록 돕기 위함이다.

캡슐화에 속한 개념으로 정보은닉이 존재하는데 객체의 로직이나 외부로 보일 필요 없는 변수나 특징 등은 감추고 동작 기능만 외부로 공개하는 것이다.

 

객체 지향 프로그래밍의 상속성이란?

클래스를 부모 클래스(상위 클래스), 자식 클래스(하위 클래스)로 나누어 점점 객체를 구체적으로 좁혀 나갈 수 있다. 이때 구체화시킨 자식 클래스가 부모 클래스의 기능이나 속성 특징 등 공통적으로 지니고 있는 것들을 그대로 물려받아 재사용하거나 기능의 일부를 변경하거나 좀 더 확장시켜야 하는 경우 해당 기능만 수정 가능할 수 있도록 하는 것이 상속의 기능이다.

쉽게 말해 라이브러리로 다른 사람이 제작한 기능을 가져와 재사용하는 것처럼 사용할 수 있고 그 기능에서 약간의 변형이 필요할 경우 수정까지 가능한 것이라고 이해하면 된다.

 

객체 지향 프로그래밍의 다형성이란?

동일한 함수명을 상황에 따라 다른 의미를 지니도록 하는 것이 다형성이다. 앞에서 정리했던 함수의 오버로딩(overloading)과 오버라이딩(overriding)이 가능함을 뜻한다.

오버로딩(overloading) - 앞에서 정리한 것처럼 같은 이름의 함수를 매개변수의 타입이나 개수를 다르게 하여 재정의하는 것이다.

오버라이딩(overriding) - 부모 클래스의 메소드와 같은 이름, 동일한 매개변수를 지닌 메소드를 자식 클래스에서 재정의 하여 확장하여 다른 기능을 수행할 수 있도록 하는 것이다.

 

 

 

 

댓글