[C++] 클래스 키워드

Vaughan·2022년 8월 10일
0

C++

목록 보기
4/6
post-thumbnail

1. const 키워드

01-const 객체

const 키워드를 이용하여 변수를 상수화 하듯, 객체도 상수화 할 수 있다.

  • const 객체의 의미
    • const 선언과 함께 만들어진 객체를 대상으로는 const 멤버 함수만 호출할 수 있다.
    • 객체의 데이터 변경을 허용하지 않기 때문이다.
      → 객체 데이터값을 변경시킬 능력이 있는 함수(≠const 함수)는 아예 호출할 수 없도록 한다.
  • const 객체 선언예시
    #include <iostream>
    using namespace std;
    
    class Simple{
    		private:
    				int num;
    		public:
    				Simple(int n) : num(n) {}
    				void ShowData() const {
    						cout<<"num: "<<num<<endl;
    				}
    		};
    
    int main(){
    		const Simple obj(5);     //const 객체
    		obj.ShowData();          //const 멤버함수 호출
    		return 0;
    }

02-함수 오버로딩에서 const

  • 기본적으로 함수를 오버로딩 하려면 함수 호출시 확인하는 매개변수의 개수나 그 자료형이 달라야 한다.
  • 함수 오버로딩에서는, 함수가 정의될 때 const 키워드의 유무로도 함수를 구분한다.
    아래 두 함수는 서로 다른 함수이다!
    • void SimpleFunc() { . . . }
    • void SimpleFunc() **const** { . . . }

2.friend 선언

친구 !

01-클래스의 friend 선언

  • friend 선언의 의미
    • 어떤 A클래스가 B클래스를 대상으로 friend선언을 하면, B클래스는 A클래스의 private 멤버에 직접 접근이 가능하다.
      → private 멤버의 접근을 허용하는 선언
    • 단, A클래스도 B클래스의 private멤버에 직접 접근하기위해서는 B클래스가 A클래스를 대상으로 friend선언을 해야한다.
      → friend선언은 일방적인 선언이다.
  • friend 선언방법
    • friend 선언은 클래스를 생성할 때, friend선언을 하고자하는 클래스를 클래스 안의 멤버로 선언하면 된다.
    • friend선언은 클래스 내의 private, public 영역 어디에 존재하든지 상관없다.
    • friend선언 예시코드
      #include <iostream>
      using namespace std;
      
      class B;     //클래스 원형
      class A {
      		private: 
      				int num;
      				friend class B; //A클래스가 B클래스를 대상으로 friend선언을 함.
      		public:
      				A(int num) : num(num) {}
      }

02-friend 선언이 존재하는 이유

  • friend선언은 객체지향의 기본 원리 중 하나인 ‘정보은닉'을 무너뜨리는 문법이다.
  • 따라서 클래스를 사용할 때 freind선언을 가급적 사용하지 말자.
  • friend선언은 주로 연산자 오버로딩에 사용된다.

03-함수의 friend 선언

  • 전역함수, 클래스의 멤버함수를 대상으로 friend선언이 가능하다.
  • 클래스 안에서 friend선언된 함수는 자신이 선언된 클래스의 private영역에 접근할 수 있다.

3. static 키워드

01-C언어에서 static

  • 전역변수에 선언된 static : 선언된 파일 내에서만 참조를 허용한다.
  • 함수 내에 선언된 static : 딱 한번만 초기화되고, 일반적인 지역변수와 달리 함수를 빠져나가도 소멸되지 않는다.

02-static 멤버변수: 클래스변수

c++에서는 각각의 클래스별로 전역변수를 사용하고자하는 상황이 발생할 수 있다. 그러나 그냥 전역변수를 사용하면 그 변수에 대해 제한을 시켜줄 장치가 존재하지 않기 때문에, static멤버를 사용하여 그 역할을 대신한다.

  • static 멤버변수는 그 클래스의 객체를 몇개를 생성하건 아니면 아예 생성하지 않건, 메모리 공간에 딱 하나만 할당되어 공유되는 변수이다.
  • static 멤버변수는 객체안에 존재하지 않으며, 객체에게는 단지 해당 멤버변수에 접근할 수 있는 권한만을 주었을 뿐이다.
    • 따라서 생성자를 이용해 초기화 하면 안된다. (static 멤버변수는 객체 생성과 상관없이 이미 메모리 할당이 이루어진 변수이기 떄문이다)
    • static 멤버변수의 초기화
      /* 자료형 클래스이름::클래스변수이름 = 초기화값 */
      int SoSimple::simObjCnt = 0;
  • 생성 및 소멸의 시점 또한 전역변수와 동일하다.
  • static 멤버변수 사용예시
    • 객체가 생성될 때마다 몇번째로 생성된 객체인지를 알려주는 프로그램

    • 객체 생성될 때마다 해당객체의 클래스변수값을 증가시켜 그 클래스의 객체끼리 공유하는 변수로서 기능을 구현해냈다.

      #include <iostram>
      using namespace std;
      
      class SoSimple {
      		private:
      				static in simObjCnt;
      		public:
      				SoSimple(){
      						simObjCnt++;
      						cout<<simObjCnt<<"번째 SoSimple 객체"<<endl;
      				}
      };
      int SoSimple::simObjCnt = 0;
      
      class SoSimple2 {
      		private:
      				static in sim2ObjCnt;
      		public:
      				SoSimple2(){
      						sim2ObjCnt++;
      						cout<<sim2ObjCnt<<"번째 SoSimple2 객체"<<endl;
      				}
      };
      int SoSimple2::sim2ObjCnt = 0;
      
      int main(){
      		SoSimple sim1;
      		SoSimple sim2;
      
      		SoSimple2 sim21;
      		SoSimple2 sim22;
      		SoSimple2();
      		return 0;
      }

03-static 멤버변수의 접근방법

  1. 객체이름을 이용한 접근 (.)

    ex) obj1.simObjCnt

  2. 클래스 자체를 이용한 접근 (::) → 단 이런 접근은 public static 멤버인 경우에만 가능하다.

    ex) SimClass::simObjCnt

04-static 멤버함수

static 멤버함수 또한 static 멤버변수와 동일한 특징을 가진다.

  • 선언된 클래스의 모든 객체가 공유
  • public으로 선언되었으면, 클래스의 이름을 통해 접근할 수 있다.
  • 객체의 멤버로 존재하지 않는다.
    • 객체의 멤버가 아니기 때문에, static 멤버함수에서는 객체의 일반적인 멤버변수에 접근할 수 없다. (아직 만들어지기 전이니까)
    • 따라서 static 멤버함수 안에서는 static 멤버변수와 static멤버함수만 호출할 수 있다.

05-const static

const static으로 선언되는 멤버변수는 상수라는 의미의 const키워드가 추가되었기 때문에, 따로 초기화해주지 않고 선언과 동시에 초기화가 가능하다.

  • 일반적인 static변수의 초기화
    int SoSimple::simObjCnt = 0;
  • const static 변수(상수)의 초기화
    const static int SIMOBJCNT = 0;

4.값의 변경에 대한 키워드

01-const와 explicit

  • const : 값과 주소를 변경할 수 없도록 한다.
  • explicit : 자동 형변환이 일어나지 않도록 한다.

02-mutable*

  • 거의 사용하지 않아야한다.
  • const 함수 내에서 값의 변경을 예외적으로 허용한다.
profile
우주의 아름다움도 다양한 지식을 접하며 스스로의 생각이 짜여나갈 때 불현듯 나를 덮쳐오리라.

0개의 댓글