본문 바로가기

Study/C C++

[두들낙서] 클래스와 객체

클래스

 - 특정한 용도를 수행하기 위한 변수와 함수를 모아 둔 틀이다  자료형으로 볼 수 있다

 - struct는 public 선언이, class는 private 선언이 기본이다

 

private

 - 클래스 내에서 private로 선언된 개체는 외부에서 접근이 불가능하다  클래스에서 선언되는 함수로만 접근 가능하다

 ex) class TV {

      private:

           bool powerOn;

           int channel;

           int volume;

       }

 

public

 - 클래스 내에서 public으로 선언된 개체는 외부에서 접근이 가능하다  private로 선언된 개체와 구분을 위해 사용한다

 - private와 사용방법은 같다

 

객채

 - 클래스라는 틀을 이용하여 찍어낸 개체(변수, 메모리상의 공간)이다

 - 변수를 선언해 주듯이, 선언을 해주면 객체가 생성된다

 

생성자

 - 객체가 생성될 때 자동으로 호출되는 함수

 - 클래스와 이름이 같은 함수를 만든다

 - 멤버 변수를 초기화하는데 유용하다

 - 중첩 사용이 가능하다  생성자 위임으로 코드 수정을 간편하게 만들 수 있다

 - 중괄호 앞에 ':'와 변수이름(값)을 써도 같다  중괄호 안에서 '변수이름(값)' 형태는 사용이 불가능하다

 ex) class Time {

      public:

            Time() {

                  hour = 0;

                  minute = 0;

                  second = 0;

            }

            Time(int s_) : Time() {

                   second = s_;

            }

            Time(int m_, int s_) : Time(s_) {

                   minute = m_;

            Time(int hour, int minute, int second) : Time(minute, second) {  멤버변수와 매개변수의 구분이 확실한 방법

                   hour = hour;

            }

 

소멸자

 - 객체가 소멸될 때 자동으로 호출되는 함수

 - 클래스와 이름이 같은 함수 앞에 '~'를 붙여 만든다

 

this

 - 자기가 소속된 객체의 주소를 나타낸다

 - 보이지 않는 매개변수로 주소가 넘어간다고 생각하면 된다  자주 사용되는 형태이기 때문에 간편화가 되어있다

 ex) class MyClass {

      public:

            void PrintThis() {

                 cout << "나의 주소는" << this << endl;

            }

       }

 

멤버 메서드

 - 클래스 내부에 있는 함수들을 지칭한다

 - 대부분 선언과 정의는 분리한다

 ex) class Vector2 {

      public:

           Vector();

           Vector(float x, float y);

      /* 중략 */

      };

      Vector2::Vector2() : x(0), y(0) { }

      Vector2::Vector2(float x, float y) : x(x), y(y) { }

 

연산자 오버로딩

 - +, -, *, / 등의 연산자를 원하는 연산으로 대체시켜준다

 주의 멤버 메소드로 작성한 오버로딩은 무조건 좌변에 객체를 두어야 한다

 ex) class Vector2 {

      public:

           Vector2 operator+(const Vector2 rhs) const { }

           Vector2 operator*(const Vector2 rhs) const { }

           Vector2 operator/(const Vector2 rhs) const { }

      /* 중략 */

      };

      Vector2 Vector2::operator+(const Vector2 rhs) const {

                return Vector2(x + rhs.x, y + rhs.y);

      }

      Vector2 operator*(const float a, const Vector2 b) {  클래스의 메소드가 아니다

           return Vector2(a * b.GetX(), A * b.GetY());

      }

      Vector2 c1 = a + b;

      Vector2 c2 = 1.6 * a;

      Vector2 c3 = 1.6 / a;  (1.6).operator/(a)는 (1.6)이 객체가 아니기 때문에 불가능하다

 

정적 멤버 변수

 - 클래스와 밀접한 전역변수를 클래스 내부로 들여오는 방법이다

 - 서로 다른 클래스의 전역변수 공동 사용으로 인한 오류를 방지할 수 있다

 주의 선언은 클래스 안에서 하지만 정의는 클래스 밖에서 해야한다

 ex) class Color {

      public:

            /*  중략 */

            static int idCounter;  class 안에서 정적 멤버 변수를 초기화 할 수 없다

      private:

            float r;

            float g;

            float b;

       };

       int Color::idCounter = 1;  정적 멤버는 네임스페이스처럼 작동한다

 

정적 멤버 메서드

 - 클래스의 private 멤버까지 접근이 가능하면서 전역 함수처럼 쓸 수 있다

 ex) class Color {

      public:

            /*  중략 */

            static Color MixColors(Color a, Color b) {  static을 쓰지 않으면 멤버의 소속을 밝혀야 해서 불편하다

                  return Color((a.r + b.r) / 2, (a.g + b.g) / 2, (a.b + b.b) / 2);  private 멤버에 접근이 가능하다

            }

      private:

            float r;

            float g;

            float b;

       };

       Color purple = Color::MixColors(blue, red);  purple.MixColors(blue, red); 사용도 가능하다

 

상수형 매개변수

 - 매개변수가 변화하지 않도록 만들어 준다  매개변수 값이 절대로 변하지 말아야 하는 상황에 쓰인다

 - 모든 함수에서 사용이 가능하다

 ex) void Deposit(const int d) {  임금되는 돈의 액수가 달라지면 안된다 

           d = money;  매개변수가 상수화 되었기 때문에 사용 불가능한 명령어

           money += d;

      }

 

상수형 메서드

 - 멤버 변수를 확인만 할 뿐, 값의 변경이 없어야 할때 사용한다  읽기 전용

 - 멤버 메서드에 대해서만 사용이 가능하다

 주의 함수 선언 뒤쪽에 const를 작성한다  함수 선언 앞에 작성하는 경우는 상수형 메소드가 아니다

 ex) int ViewMoney() const {

          money++;  메서드가 상수화 되었기 때문에 사용 불가능한 명령어

          return money;

     }

 

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

[두들낙서] 객체 복사  (0) 2021.03.04
[두들낙서] 동적 할당  (0) 2021.03.04
[두들낙서] C++ 스타일 문법  (0) 2021.03.03
[두들낙서] 상수  (0) 2021.03.01
[두들낙서] 구조체  (0) 2021.03.01