Channi Studies

[C++] 객체 지향 프로그래밍 | Object Oriented Programming (OOP) 본문

C++/객체지향 프로그래밍 (OOP)

[C++] 객체 지향 프로그래밍 | Object Oriented Programming (OOP)

Chan Lee 2023. 12. 26. 22:15

'객체 지향 프로그래밍 | Objecet Oriented Programming (OOP)' 이란 무엇일까요?

 

이를 더 잘 이해하기 위해서, 우리가 기존에 주로 사용하던

Procedural Programming, 절차적 프로그래밍을 우선 이해 해 봅시다.

 


절차적 프로그래밍 | Procedural Programming (PP)

 

절차적 프로그래밍의 핵심 포인트는 '함수' 입니다.

PP 프로그램은 기본적으로 함수의 집합 입니다.

 

또한, 우리는 데이터를 개별적으로 선언합니다.

그리고 필요시에 해당 데이터들을 함수에 인자로써 전달하여 활용합니다.

 

필요한 용도에 맞춰 과정을 분석하고, 나누어서

함수를 선언하고 사용하는 방법이기에 이해하기 매우 직관적입니다.

 

하지만 절차적 프로그래밍에는 분명한 한계들이 존재합니다.

 

 

대표적인 것은 바로

사용하게 되는 함수들이 인자로 받는 데이터들의 구조를 알아야 한다는 점 입니다.

 

만약 거대한 프로그램에서 함수에 의해 특정 값의 구조가 변경된다면?

프로그램 내의 또다른 수많은 함수들이 이에 영향을 받는 파급 효과가 생길 수 있습니다.

 

 

또한, 프로그램이 커지면 커질수록 수많은 함수들이 복잡하게 얽히기 때문에,

급격히 이해하기 어려워지는 측면이 있습니다.

 

이는 코드의 유지 보수에도 치명적입니다.

이후에 버그를 고치거나 코드의 특정 부분을 재활용하기에도 매우 힘들어집니다.

 

이러한 단점은 객체 지향 프로그램을 활용하면 다수 해결됩니다.

그렇다면 객체 지향 프로그래밍에 대해 알아볼까요?

 


객체 지향 프로그래밍 | Object Oriented Programming (OOP)

 

위에서 절차적 프로그래밍의 핵심은 함수였던것 기억 나시나요?

 

객체 지향 프로그래밍의 핵심은 클래스(Class)와 객체(Object)입니다.

이 클래스와 객체에 대한 자세한 설명은 보류하고, 이 것들이 왜 도움이 되는지를 먼저 설명하겠습니다.

 

클래스와 객체의 진가는 프로그램이 복잡해질 수록 두드러집니다.

프로그래머들로 하여금 더 높은 수준의 추상화(abstraction)이 가능하게 합니다.

 

 

한 가지 예를 들어보겠습니다.

대학생의 수강 신청 프로그램을 짠다고 할 때,

수많은 학생들의 각각의 성, 이름, 학번, 생년월일, 성별, 등등을 개별 데이터로 저장하여 관리하는 것 보다,

각 학생 한명의 대상에 연결되어 모든 데이터들을 관리할 수 있다면 더욱 편리하고 이해하기 쉽겠죠?

 

데이터 관리 뿐만 아니라 수강 신청이나 드랍과 같은 행동들 또한 연계되어 관리할 수 있다면, 

더욱 편리하겠죠?

 

각 객체(Object)들이 데이터와 연산 기능을 동시에 가지고 있는 것입니다.

이 개념을 우리는 캡슐화(encapsulation) 이라고 부릅니다.

 

 

또한 OOP의 엄청난 장점 중 하나는 코드의 재활용성입니다.

한 가지의 클래스 안에는 필요한 다양한 데이터와 연산 기능이 모두 포함되어 있기 때문에,

클래스 하나만의 재활용 만으로도 프로그래밍에 매우 큰 도움이 됩니다.

 

 

또한 자주 사용하게 되는 상속(inheritance)의 개념도 존재합니다.

이미 만들어진 클래스를 상속하는 또다른 클래스를 만드는 행위인데, 

간단하게 기존 클래스의 확장판, 또는 업데이트 버전을 만든다고 생각하셔도 좋습니다.

(주로 더 디테일한 값이나 제약이 포함됨)

 

예를 들자면 '인간' 이라는 클래스의 확장 버전으로

'남성'과 '여성' 클래스를 만들 수 있다 정도로 이해하셔도 괜찮습니다.

 

 

여기까지 대략적인 장점들이였는데요,

OOP는 너무나 훌륭하지만 몇가지 단점들도 존재합니다.

 

 

OOP의 단점

OOP를 아무리 잘 사용하더라도 이미 안좋은 코드를 더 낫게 만들어 줄 수는 없습니다.

 

또한 모든 종류의 문제를 다룰 수는 없습니다.

세상의 모든 개념들이 클래스로만 나타내어 질 수는 없기 때문이기도 합니다.

 

공부하기가 좀 어려운 개념인것도 단점 중의 하나입니다. (특히 C++에서는 더욱)

 

성능적인 측면에서는, 

프로그램이 꽤나 용량이 커지고, 느려지고, 복잡해질 수도 있다는 단점이 있습니다.

 

다만 다행인 점은 우리가 사용하는 C++가

모든 Object Oriented Languages중에 최상위권으로 성능적인 퍼포먼스를 낼 수 있는 언어라는 점 입니다.