다른 객체지향 언어도 있겠지만, C++을 기준으로 알아봤다. 아직은 서론 수준 정도의 지식만 가지고 있어서 많은 내용을 담지 못했지만 좀더 공부하고 나서는 하나씩 자세히 알아보는 기회가 있었으면 한다.
객체(Objects)
객체지향 언어로 문제에 접근한다면, 더 이상 어떻게 하면 문제를 함수로 쪼갤 수 있을지 고민을 안 해도 된다. 대신 어떻게 객체로 쪼갤 수 있을지에 대한 고민을 해야 한다. 함수라는 단어와 객체라는 단어를 떠올렸을 때 함수보다는 객체가 프로그램을 만들 때 훨씬 더 쉬울 것 같다는 느낌이 드는데, 이것은 프로그래밍 세계의 객체와 실제 세계의 객체가 매우 비슷하기 때문이다. 지금까지 절차지향 언어에서는 이렇게까지 정밀한 모델을 만드는 것은 힘들었다.
프로그래밍에서는 모든 것이 객체가 될 수 있다.
대표적인 것은 다음과 같다.
- 레이싱 게임의 자동차
- 보드 게임의 게임 말
- 게임의 적과 아군
- 그래픽 객체(선, 사각형, 원 등)
- 자료구조(스택, 큐, 연결 리스트 등)
- 고용자, 학생, 영업 사원 등과 같은 사람
- 사용자 정의 데이터(시간, 천사 등)
클래스(Classes)
클래스는 어떤 데이터나 함수가 객체에 포함되어야 하는지 정의하기 때문에 객체들을 만들기 위한 청사진이라고 할 수 있다. 삼성, 현대, LG 등과 같은 재벌 기업들을 프로그래밍에서 표현하려고 하면 재벌 기업 클래스에는 기업명, 대표, 매출액, 직원 수 등의 데이터가 포함되며, ‘순환출자를 하여 지배구조를 강화한다’, ‘2세에게 그룹을 상속시킨다’ 등과 같은 함수가 포함될 수 있다.
상속(Inheritance)
우리는 하나의 개념을 서브클래스(subclass, 자식클래스라고도 함)로 나누는 일을 많이 한다. 예를 들면, 동물이라는 개념은 양서류, 포유류, 설치류 등으로 나뉘며, 이동수단은 자동차, 트럭, 버스, 오토바이 등으로 나뉜다.
서브클래스로 나눌 때의 원칙은 모든 서브 클래스가 부모 클래스로부터 물려받은 성질을 공유해야 한다는 것이다. 예를 들어, 자동차, 트럭, 버스, 오토바이 등은 모두 바퀴와 모터가 있다. 또한 각각의 서브 클래스는 부모 클래스와는 다른 성질을 가져야 한다. 예를 들어, 같은 이동 수단이라도 버스는 많은 사람을 태울 수 있는 좌석이 마련되어 있고, 트럭은 화물을 적재할 수 있는 공간이 있다.
주의할 점은, 클래스와 객체의 관계와 서브 클래스와 부모 클래스의 관계를 같다고 여겨서는 안된다는 것이다. 객체는 메모리에 존재하며, 클래스의 특성을 그대로 구현한다. 서브클래스는 부모 클래스로부터 몇가지 특성을 물려받지만 차별되는 특성이 있다.
절차지향 프로그래밍에서 함수의 등장으로 프로그래밍이 상대적으로 간단해졌는데, 상속도 객체지향 프로그래밍에서 같은 역할을 했다. 절차지향 언어로 프로그래밍을 할 때 거의 똑같은 기능을 하는 명령문이 여러 개가 있으면 공통점을 찾아내서 하나의 함수로 만들 수 있다. 이와 마찬가지로, 부모 클래스는 자식 클래스의 공통점을 포함하고 있다. 절차지향 프로그래밍에서 함수가 그랬던 것처럼, 상속도 객체지향 프로그래밍에서 프로그램 자체를 간단하고 객체끼리의 관계를 명확하게 해준다.
재사용성(Reusability)
클래스는 한번 만들고 나면 다른 프로그램에서 재사용할 수 있고, 다른 프로그래머도 사용할 수 있다.
절차지향 언어에서 함수도 이와 같은 역할을 했지만, 객체지향에서의 재사용은 상속과 결합해서 그 개념이 확장되었다. 만들어놓은 클래스를 별도의 수정없이 새로운 기능을 추가해 사용하는 것이다. 앞서 상속에서 봤던 서브클래스를 활용하는 것이다. 상속되어 만들어진 새로운 클래스는 부모 클래스의 모든 특성을 가지면서도 새로운 기능을 가질 수 있다.
예를 들어 RPG 게임을 만든다고 치자. 원래는 적(enemy)라는 클래스만 있었는데, 새로운 스킬과 이름, 무기 등을 가진 보스(boss) 몬스터를 만들어야 한다면 새롭게 보스 클래스를 만들 필요가 없다. 적 클래스를 상속받아(재사용) 새로운 것들만 추가해주면 된다.
재사용이 가능하다는 점은 객체지향 프로그래밍의 큰 장점이다.
새로운 자료형을 만들 수 있는 것(Creating New Data Types)
객체의 장점은 프로그래머로 하여금 새로운 자료형을 만들기 쉽게끔 한다는 것이다. 슈팅게임에서 사용하는 총을 객체로 만든다고 가정하자. 총을 설명하는 데이터는 총의 이름, 탄약의 종류, 총열의 길이, 총구가 향하는 방향, 남은 탄환의 수 등이 있는데 이것은 따로 놓고 보면 string과 int 타입의 자료일 뿐인데 클래스에 함께 정의함으로써 총이라는 객체을 만들어낼 수 있게 되었다. 그렇기 때문에 C++에서는 새로운 객체를 만들기 용이하도록 많은 특성이 있다.
다형성과 오버로딩(Polymorphism and Overloading)
+와 - 등은 흔히 볼 수 있는 연산자이고, c++에 내재되어 있는 연산자(int, double) 등과는 잘 작동한다. 하지만 새로운 자료형과 결합해서는 사용할 수는 없기 때문에 +와 - 등이 새로운 자료형에서는 어떻게 작동하는지 정의해줘야 한다(오버로딩).
이렇게 같은 연산자나 함수라도 그것이 무엇을 작동시키는지에 따라 기능이 달라지는 것을 다형성이라고 한다. + 와 - 을 새로운 자료형에서 작동할 수 있도록 만들었다면 오버로딩 되었다고 한다(overloaded). 오버로딩은 다형성의 종류 중 하나이며, 객체지향 프로그래밍의 중요한 특성 중 하나이다.
'C++' 카테고리의 다른 글
C++ 토막 지식(19.01.14) - struct, enum (0) | 2019.01.14 |
---|---|
C++ string 또는 char 배열을 int 타입으로 바꾸는 방법 (0) | 2019.01.13 |
C++ 토막 지식(19.01.09 - 10) (0) | 2019.01.10 |
UML(Unified Modeling Language)란? (0) | 2019.01.08 |
객체지향 프로그래밍(OOP)이 필요한 이유 (0) | 2019.01.05 |