출처 : https://www.journaldev.com/43719/class-object-c-plus-plus

안녕하세요! 코딩하는 경제학도 쏘코입니다.

오늘은 클래스를 다양하게 가공하는 방법에 대해서 배워보도록 하겠습니다!!

 

목차


    0. 객체 다루기

    0.0. Reference

    이전 포스팅에서 &에 대해서 배운 적이 있었습니다.

    일반적인 변수를 매개변수로 받으면 그 변수는 복사가 된다고 했었죠?

    &를 쓰면 주소값에 직접 접근하기 때문에 복사가 되지 않습니다.

    복사하는 과정이 없다면, 복사하는 시간이 없어지기 때문에 훨씬 빠르게 동작하겠죠!!

     

    아래 예시에서는 훨씬 효율적으로 동작하는 print함수의 예시입니다.

    print의 경우 요소를 복사할 필요도 없고, 요소의 내용이 바뀔 필요도 없습니다.

    따라서 &를 붙이고 const도 붙여줍니다.

    const는 두 번째 포스팅에서 변하지 않는 상수로 만들어주는 명령어라고 했었죠?

    아예 상수처리를 해서 바뀌지 않도록 만든 겁니다. 이제 바뀔 염려가 없어졌어요!

     


    0.1. 객체 포인터

    객체 포인터는 포인터는 포인터인데, 객체를 담은 포인터입니다.

    이 포인터는 객체의 주소를 담게 됩니다. 이게 끝이에요.

    대신 객체의 주소에 접근한 이후 객체 내부의 변수나 내장 함수에 접근하기 위해서. 대신 ->를 사용합니다!

     

    아래 예시는 acct라는 객체를 담은 포인터를 하나 만들어서 포인터를 통해 값을 변경하는 예시입니다.

     

    객체의 외부에서는 이런 식으로 객체 포인터를 사용할 수 있습니다.

    그런데 내부에서 자기 자신을 가리키고 싶을 때는 어떻게 할까요?

    this 포인터를 이용하면 가능합니다.

    this 포인터는 모든 멤버 함수에 추가되는 숨겨진 매개 변수로, 호출된 객체의 주소를 가리키는 상수 포인터입니다.

    이 this 포인터를 사용하면 메소드의 매개변수와 클래스의 멤버 변수를 쉽게 구별할 수 있습니다.

     

    아래 예시에서는 Counter 클래스의 count 변수에 접근했습니다.

    아래 Point 클래스에서는 멤버 변수인 x와 y와, set_x의 매개변수인 x를 구별하기 위해서 this 포인터를 사용했습니다.

     


    0.2. const 메소드

    메소드특정 클래스의 내장 함수를 말합니다.

    그렇다면 const 메소드가 뭘까요?

    함수의 매개변수를 받는 곳 뒤에 const를 붙이면, 이 함수는 멤버 변수의 값을 수정하지 않는다는 의미가 추가로 붙습니다.

    특히 이 const 메소드는 const형 객체에서 굉장히 중요합니다.

    일반 메소드(내장 함수)는 const형 객체와 일반 객체에서 모두 사용할 수 있지만

    const 메소드는 const형 객체에서만 사용할 수 있습니다.

     


    0.3. 클래스 파일 분리

    전에 .cpp와 .h로 함수를 분리하는 방법에 대해 공부한 적이 있습니다.

    이와 똑같은 방식으로 클래스도 .cpp(구현부)와 .h(선언부)를 나눌 수 있습니다.

    변수는 그대로 선언부에서 선언하고, 함수는 선언부에서는 선언만 하고 구현부에서 구현합니다.

    구현을 할 때는 특정 클래스에 종속된 함수라는 의미에서

     

    리턴형 클래스명::함수명 {명령문}

     

    형식으로 작성합니다.

     

    이렇게 분리한 후에 다시 사용할 때에도 똑같은 방식으로 불러올 수 있습니다.

    하지만 클래스에서도 중복해서 특정 클래스를 불러오는 경우 충돌이 일어나 컴파일 에러가 발생합니다.

     

    이런 케이스를 막기 위해서 전처리 과정에서 특정 클래스를 불러왔는지를 확인합니다.

    #ifndef를 통해 만약 그 클래스가 선언되어있지 않다면 #define / #endif 를 이용하여 선언합니다.

     


    0.4. 정적 멤버 변수

    전역 변수와 정적 변수에서 봤던 그 정적 변수가 맞습니다!

    정적 멤버 변수(Static Members)클래스에서 단 하나만 생성됩니다.

    클래스를 이용하여 객체를 여러 개 만들어도 정적 멤버 변수는 모두가 공유하게 되죠.

    어떤 객체에서 정적 멤버 변수를 바꾸면, 같은 클래스의 다른 객체에서도 그 정적 멤버 변수는 바뀌게 됩니다. 

     


    1. 연산자 오버로딩

    우리가 만든 클래스에서는 기본적으로 만들어져 있는 연산자를 사용할 수 없습니다.

    그 연산자가 우리가 만든 클래스를 인식하지 못하기 때문인데요,

    이런 경우에도 연산자를 특정 클래스에서 사용할 수 있도록 만들어주고 싶을 수 있습니다.

    + 연산자를 이용하여 문자나 숫자열을 더해주거나 하면 참 편하겠죠?

    연산자 오버로딩을 통해 내가 만든 클래스에서도 연산자를 사용할 수 있도록 만들어줄 수 있습니다.

     

    먼저 클래스 밖에서 연산자를 사용할 수 있는 방법입니다.

    operator를 우리가 사용하는 연산자 앞에다 붙여서 함수처럼 만들어줄 수 있습니다.

    아래와 같은 방식으로 operator+함수를 만들어주면, 매개변수로 Point형 변수의 주소값 2개가 들어온다면 명령문처럼 클래스의 x와 y변수끼리 더해줄 수 있습니다.

     

    추가로 ostream에 존재하는 operator<<도 Point형 변수에 사용할 수 있도록 만들어 주었습니다.

     

    만약 클래스 내부에다가 만들어 주고 싶다면 그것 역시 가능합니다.

    대신 이 때는 연산자 뒤에 들어갈 요소만 매개변수로 받아주면 되겠죠?

    (TMI : ostream의 <<는 클래스 내부에서 연산자 오버로딩을 할 수 없습니다!!)

     


    2. 구조체

    C++ 이전에 사용하던 C에서는 클래스와 비슷한 개념으로 구조체(Struct)를 사용했습니다!

    이 구조체와 클래스의 차이는, 아주 간단합니다.

    클래스는 Private이 기본 조건이고, 구조체는 Public가 기본 조건입니다.

    클래스에서는 Private를 통해서 보안이 조금 더 강화됐다고 보시면 되겠습니다!

     

    구조체의 생성 방법은 클래스와 거의 동일합니다.

     

    struct 구조체명 {명령문}

     

    형식으로 만들 수 있습니다.

    여기서도 구조체의 맨 끝에는 ;를 붙여주어야 합니다! 

     


    3. Friend

    Friend를 지정하게 되면 이 함수에서는 클래스 내의 private 멤버에 접근할 수 있게 됩니다.

    일종의 접근 권한을 준다고 생각하시면 되겠습니다.

    friend function은 private 멤버에 접근할 수 있는 함수이고

    friend class는 현재 클래스의 private멤버에 접근할 수 있는 권한을 가진 클래스가 됩니다!

     

    아래 예시에서는 friend설정을 통해 Gadget에서 Widget의 private 멤버 변수인 data에 접근하는 모습을 보실 수 있습니다! 

     


    이제 클래스도 거의 끝나갑니다!

    클래스까지만 익히시면, C++ 코드의 80%는 이해하실 수 있을 것이라고 생각합니다!

    마지막까지 도달할 수 있도록 여러분들을 응원합니다! 파이팅 :)

    반응형
    • 네이버 블로그 공유하기
    • 네이버 밴드에 공유하기
    • 페이스북 공유하기
    • 카카오스토리 공유하기