프로그래밍 공부
작성일
2023. 4. 22. 05:15
작성자
WDmil
728x90

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임으로 다시 재호출이 가능해지는것이다.

728x90