C++에서는 Class 기능을 지원한다. 이것은 객체지향형 프로그래밍의 첫 단추로써 중요하다 할 수 있다.
Class는 기본적으로 C에서 사용하던 Struct와 크게 다르지 않으며, C++에서 넘어오면서 Struct의 불편함을 수정하는 형태로 Class가 만들어졌다.
Clss로 묶는것 자체가 캡슐화 한다. 라고 볼 수 있다.
다음은 Class의 기본 예시이다.
class 기반의 프로그래밍은 객체지향이기 때문에, 절차형과 다르게 private코드는 그자리에서 내부처리만 되게 만들어야 한다.
오버헤드가 발생하여 코드의 처리속도가 많이 느려질 수 있지만, 오류를 줄이는것을 더 중요하게 여기는것이 객체지향 프로그래밍의 원칙이다.
다음은 객체지향 프로그래밍의 예시이다.
위 코드에서 class 코드의 위쪽 38 ~ 40줄은 privete 부분인데, Class는 따로 정의해주지 않는다면 프라이빗으로 처리해둔다.
class는 기본적으로 프라이빗 부분은 데이터저장부분, 퍼블릭은 그 변수의 접근지정자 처럼 사용하게 된다.
C++ 의 Class에는 생성자가 있다.
이 생성자는 객체가 생성되면 자동으로 실행되는것을 이야기하는데, 클래스가 생성됨 으로써 자동으로 실행되게 만드는 함수를 정의해줄 수 있다. 이렇게 함으로써 간단하게 private에 있는 변수를 초기화해주거나. 원하는 동작사항을 수행하게 만들 수 있다.
생성자는 3가지 방법이 있는데, 각 다음과 같다.
- 생성자
- 객체가 생성될 때 자동으로 호출되는 매서드로 생성자를 사용하여 객체가 초기화될 때 필요한 값들을 지정할 수 있다. 생성자는 클래스 이름과 동일한 이름으로 정의되며, 반환타입이 없는 특징이 있다.
- 복사 생성자
- 객체를 복사하는데 사용되는 메서드이다. 복사 생성자는 한 객체를 다른 객체에 복사할 때 사용된다. 클래스의 멤버변수 들을 복사하는 역활을 한다.복사 생성자에서 수정되는 변수들은 원본의 복사체 이기 때문에 원본에 영향을 주지 않는다.
- 이동 생성자
- 이동 생성자는 C++11부터 추가된 개념이다. 객체를 이동할때 사용하는 메서드로, 이동 생성자는 복사 생성자와 유사하게 동작하지만, 다른 객체를 복사하는 대신 그 객체의 자원을 이동하게하여 효과적인 메모리 관리를 보장한다. 보통. 복사와 같은방법으로 동작되고. 그 이후 원본데이터를 nullptr이나 null값 으로 초기화 해준다.
- 위임 생성자
- 한 클래스의 생성자에서 다른 생성자를 호출하는것을 말한다. 위임 생성자를 활용하면 코드의 재사용성을 높일 수 있고, 생성자를 호출하는 코드가 중복되는 경우, 위임 생성자를 사용하여 중복코드를 줄일 수 있다. 또한 초기화 리스트에서 모든 멤버변수를 초기화 하지 않고 일부 멤버변수 만 초기화 할 수 있다.
- 위임생성자는 함수의 오버로딩을 사용함으로 가급적 다중 매개변수를 사용하지 않는것이 좋다. 모호성 문제가 발생할 수 있기 때문이다.
다음은 위임 생성자의 예시이다.
Class에는 생성과 동시에 값을 초기화 할 수 있다.
이를 초기화 리스트(Initalizer list) 라고 하는데, 초기화 리스트는 클래스 생성자에서 맴버변수를 초기화 하는데 사용된다. 클래스 생성자는 객체가 생성될 때 호출되며, 생성자 내부에서 멤버변수를 초기화하는 방법이 있지만, 초기화 리스트를 사용하면 더 간단하게 이 작업을 수행할 수 있다.
초기화 리스트는 매개변수 목록 다음에 콜론(:)으로 시작하여 맴버변수를 초기화하게된다.
다음 코드의 10번줄은 12 ~ 14번줄과 같은 동작을 수행한다. 그러함에도 초기화 리스트는 일반적인 대입복사 초기화 보다 더 빠른 속도를 보장한다.
또한, 초기화 리스트를 사용하면 const나 참조타입의 멤버 변수를 초기화 할 수 있다는 장점이 있다. 이는 생성자의 본문에서 초기화 할 수 없기 때문에, 초기화 리스트를 사용해야만 한다.
Class에는 종료와 동시에 선언되는 함수가 있다.
이를 소멸자(Destructor) 라고 하는데, 소멸자는 클래스가 할당 해제될 때 자동으로 선언되는 것을 이야기한다. 이를 통해 동적할당된 메모리를 클래스가 소멸할 시 자동으로 날려줄 수 있게된다.
위 코드를 보면, 시작될시 코드가 자동으로 실행되는 생성자, 클래스가 없어질 시 자동으로 실행되는 소멸자 가 둘다 들어가 있는것을 볼 수 있다. 처음 test1이 실행되었음으로 생성자가 실행되고, 1번째 라인이 시작. 2번째 라인이 시작. 그후 test2가 선언되고, 3번째 라인이 시작. 그 후 지역변수가 종료되었음으로 test2가의 소멸자가 동작하여 Destructor를 출력해준다.
또한, 메모리 할당에서의 역활을 직관적으로 확인할 수 있는데.
다음과같은 코드를 동작시키면, 메모리 사용량이 계속 증가하여야 하지만, 할당해제를 정상적으로 해주면 메모리 사용량이 늘어나지 않는것 을 볼 수 있다.
Class 에는 자기 자신을 재참조하여 실행해주는 포인터 지시자를 사용할 수 있다.
이를 this 라고 하는데, 우측에 지정된 변수, 함수 등 주소값을 가지고있는 현재 객체의 값의 주소값을 리턴시켜주는 코드 라고 생각하면 된다.
즉, 원래라면 모호성문제로 사용이 힘든 코드들을 사용할 수 있게 만들어준다.
위 의 this 포인터를 사용하여 49번째 줄의 경우 원래라면 모호성 문제로 매개변수와 SetA의 변수 int a를 구분할 수 없어서 사용할 수 없지만, this-> a를 사용하면 현재 위치한 객체의 a를 가리키게 됨으로 모호성 문제에서 해방된다. 그리하여 사용이 가능해진다.
이러한 자기 재참조를 활용해서 사용할 수 있는 코드방법이 있다.
이를 체인처럼 엮인다 하여 chaining_member 라고 하는데, 코드는 다음과 같다.
원래라면 101번째 줄이 오류가 났을것이다. 도출된 결과값에대해 참조할 수 있는것이 없기 때문이다.
그러나, 83줄 부터 확인할 수 있듯, Calc에 대한 주소값을 리턴시키는 Add함수, 등을 선언하여. return으로 자기자신의 참조자를 반환해준다. 이로써 return이후에도 그것은 결국 Class임으로 다시 재호출이 가능해지는것이다.
'서울게임아카데미 교육과정 6개월 C++ ~ DirectX2D' 카테고리의 다른 글
26일차 10.static_member_variable, 11. // _function , 12. SOLID_and_singleton_pattern (0) | 2023.04.28 |
---|---|
25일차 08.Calcu h와cpp분리. 09.class_and_const (0) | 2023.04.26 |
23일차 47.type_information 48.assert 49.functional 50.elliopsis 00. OPP에 대하여. (0) | 2023.04.20 |
22일차 44.Structures 45.reference_variable 46.range_based_for_loop (0) | 2023.04.19 |
21일차 43.dynamic_memory_allocation (0) | 2023.04.14 |