C++

객체 지향(OOP)

Keisa 2023. 10. 2. 17:56

객체 지향 프로그래밍의 여러가지 이점이 있다. 가장 큰 이점은 프로그램을 보다 유연하고 변경이 용이하게 만들 수 있다는 것. 객체 지향은 코드 변경을 최소화하고 유지보수를 하는데 유리하다. 

 

객체는 자동차와 같은 하나의 객체를 추상화 시켜 속성과 기능으로 분류하고 이것을 변수와 함수로 정의한다.

 

객체지향의 4가지 특징. 

 

1. 추상화

불필요한 세부 사항들은 제거하고 가장 본질적이고 공통적인 부분만을 추출하여 표현. 어떤 객체가 수행해야하는 핵심적인 역할만을 규정해두고, 실제 구현은 해당 인터페이스를 구현하는 각각의 하위 클래스에서 하도록 설계하는 것. 

 

이렇게 함으로써 자동차와 오토바이의 전진이 다른 방식으로 움직이듯이 다른 형태의 구현을 가능하도록하고 코드간의 직접적인 결합도를 낮추게 할 수 있다. 

 

아래는 언리얼 엔진에서 구현한 Player의 인터페이스 클래스로 반드시 구현해야할 내용을 선언한 것.

이렇게 선언된 함수들을 하위 클래스에서 내용을 정의함으로써 동작의 다변성을 추구할 수 있게된다. 

 

2. 상속

기존의 클래스를 재활용하여 새로운 클래스를 작성하는 문법 요소. 클래스들 간 공유하는 속성과 기능들을 반복적으로 정의할 필요 없이 딱 한 번만 정의해두고 간편하게 재사용할 수 있어 반복적인 코드를 최소화하고 공유하는 속성.

 

아래는 언리얼에서 개인프로젝트에서 사용한 Character 클래스의 모습

Character 클래스는 생성시에 모두 ABaseCharacter 클래스를 상속받고 ABaseCharacter클래스는 AActor를 상속받는다. 상속에 맞는 예로써 AActor에서는 내부에 GetActorLocation이라는 함수가 존재하는데 월드에 사의 좌표를 얻을 수 있게해주는 함수로 언리얼에서 모든 액터는 AActor를 상속받도록하여 해당 함수를 공통적으로 사용가능하도록 해준다.

 

3. 다형성

어떤 객체의 속성이나 기능이 상황에 따라 여러 가지 형태를 가질 수 있는 성질. 앞서 본 코드에서 AMainCharacter는 상속받은 클래스인 ABaseCharacter나 AActor 등의 형식으로 변형이 가능한 것처럼, 여러 형식으로 변환이 가능한 것.

 

추상화에서 보여준 코드에서 Player를 상속받은 많은 클래스들이 각자의 구현내용을 가지고 있을 때, 각 클래스의 객체를 모두 가져와 같은 기능을 실행시키는 클래스 의 내부에서 개별 클래스를 모두 포함시키고 각자 내용이 구현된 클래스로 형변환 시켜 사용하지 않아도 인터페이스 클래스의 형태로 형변환을 시키고 함수를 호출할 수 있다. 이는 클래스 간의 직접적인 결합도를 낮추는 역할을 수행할 수 있다.

 

즉, 다형성은 하나의 형태로 자신을 상속받는 여러형태의 클래스를 수용하고 자신에게 선언되어있는 기능들을 호출할 수 있게 해준다.

 

4. 캡슐화

서로 연관있는 속성과 기능들을 하나의 캡슐로 만들어 데이터를 외부로부터 보호하는 것. 캡슐화의 목적은 크게 두 가지.

 

1. 데이터 보호 : 외부로부터 클래스에 정의된 속성과 기능들을 보호.

- 데이터 보호는 해킹으로부터의 보호가 아니다. 코드를 작성하는 다른 프로그래머로부터의 보호를 뜻한다.

- Public, Protected, Private 같은 접근제어자를 사용하여 클래스에 접근가능한 수준을 정의할 수 있다.

- 이러한 보호는 코드의 결합도를 낮추는 방향을 유도할 수 있게한다.

 

2. 데이터 은닉 : 내부의 동작을 감추고 외부에는 필요한 부분만 노출

- 은닉은 다른 프로그래머가 작성한 클래스르를 사용하는 이용자를 배려하는 부분을 포함하고 있다. 다른 프로그래머가 작성한 클래스를 사용하려면 해당 클래스의 구조와 동작방식을 모두 알고서 사용해야 하는 경우가 일반적이지만 데이터 은닉으로 이 클래스에서 제공하는 기능의 내부를 알지못하더라도 사용가능하도록 유도할 수 있다.

이는 프로젝트의 크기가 커지면 커질수록 유용한데, 한 프로그래머가 모든 코드를 분석하여 인지하고 사용하기는 어려운 부분이 많다. 따라서 다른 프로그래머가 작성한 코드를 때로는 사용만하는 것이 업무의 효율성 측면에서나 프로그래머의 업무적 부담 측면에서나 필요하다. 

따라서 데이터 은닉은 구현을 감추지만 다른 사람이 사용가능하도록 하는, 마치 우리가 일상생활에서 사용하는 많은 제품들과 같다. 내부 구현을 몰라도 사용하는 많은 물건들, 예를 들어 핸드폰이나, 밥솥같은.

'C++' 카테고리의 다른 글

""과 L""과 _T("")의 구분  (0) 2024.02.20
__stdcall과 __cdecl  (0) 2024.01.26
Lambda(람다)  (0) 2023.10.01
좌측값(lvalue) & 우측값(rvalue)  (0) 2023.10.01
Condition_Variable(조건 변수)  (0) 2023.09.30