코딩 57일차 C/C++

마스터피스·2023년 12월 12일
0

C/ C++ 

목록 보기
29/35
post-thumbnail

const / static / extern

1) const

  • const 키워드는 어떤 변수를 상수처럼 변하지 못하게 만들어 줍니다. 이 키워드를 통해 변수의 값의 변화를 막을 수 있고 변수의 타입을 지정해줄 수 있습니다. 하지만 이 키워드를 이용했다고 해서 프로그램 내부에 정해진 상수가 되는 것은 아닙니다. 프로그램 내부에 숫자로 정해진 상수를 만들기 위해서는 #define, 즉 전처리를 활용해야 합니다.

2) 클래스 멤버로서의 const

  • 클래스 내부에 선언된 멤버 변수를 이용하면 이 const 라는 키워드에 의해 정해진 멤버 변수의 값이 또 다른 변수의 저장 공간을 갖게 된다는 것을 이해할 수 있습니다.

*더 알아보기

생성자에서 const 멤버 변수를 초기화 해줄 때 사용하는 이 방법은 C 에서 기본적으로 변수를 초기화하는 방법입니다. 하지만 이 방법은 읽기에 난해하여 근래에는 사용되지 않는 방법입니다. C++가 이런저런 개념들에 C 의 문법을 모두 사용하기 때문에 벌어지는 웃기는 상황인 것입니다.

예제코드)

#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
#include <cstring>


#define MYVALUE 100

class Person {
public:
    const int age;

    Person(int n) : age(n) {

    }

};

int main() {

    const char* str;
    char* myStr = new char[100];
    strcpy(myStr, "Hello World");
    str = myStr;

    printf("%s", str);
    return 0;

    /*int input;
    fseek(stdin, 0, SEEK_END);
    scanf("%d", &input);

    Person* p = new Person(input);


    printf("%d", p->age);


    return 0;
    */
}

3) static 키워드

  • static이라는 것은 유일하고 독립적인 이라는 뜻으로서 클래스 내부에서 사용되었을 경우 클래스 이름에는 종속적이지만, 클래스 인스턴스에는 독립적인 어떤 변수와 어떤 함수를 만들어내게 됩니다. 클래스 외부에서 사용되었을 경우 obj 파일안에 종속적이지만, 이 obj 파일 안에서는 독립적인 어떤 변수와 어떤 함수를 정의할 수 있게 됩니다. 클래스 외부에서 static 을 뺀 함수나 변수를 만들게 되면 obj 파일에서 exe 파일로 갈 때까지도 유일무이한,즉 전체 프로그램에서 유일무이한 존재가 되게 됩니다. 일반적으로 일반 클래스 외부 영역, 즉 글로벌 영역에서 static을 뺀 것과 빼지 않은 것은 차이가 없다 라고 잘 못 알려져 있는데 둘은 서로 다릅니다.
  • dynamic 함수의 특징 : 자기 자신의 인스턴스가 있다.

  • static 함수의 특징 : this 라는 키워드가 존재 할 수 없다. 단 static int b; 같은 스태틱 변수는 사용이 가능하다.

  • static 변수 : 스태틱 변수는 항상 메모리에 존재해야하는 변수이기 때문에 cpp파일에서 몸체를 만들어줘야한다.

이를 예제코드를 통해 알아봅니다.

3-1) static 멤버 변수의 사용

  • static 멤버 변수는 꼭 static 멤버 변수의 실체가 있는 몸체가 존재해야 합니다.

이를 소스코드를 이용해 알아봅니다

예제코드)

헤더파일 )

#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
#include <cstring>



class Myclass {
public:
    static int static_member_int;
    int a;

    void foo(); // dynamic
    static void goo(); // static
};

cpp파일)

#include "Header.h"




int main() {
    Myclass::static_member_int = 100;
    printf("%d", Myclass::static_member_int);


    return 0;
}
int Myclass::static_member_int = 100;

void Myclass::foo() {

}

void Myclass::goo() {

}

4) extern 키워드 = 프로그램 전체에서의 static

  • extern은 사용법이 굉장히 많고 사실은 굉장히 복잡한 일을 할 수 있지만 우리가 배우는 이 단계에서는 '프로그램 전체에서의 전역변수'를 만들 수 있는 기능 정도로만 이해하고 넘어가도 충분합니다. extern 키워드를 이용해 변수를 만들게 되면 클래스 내부의 static 변수를 사용했던 것처럼 헤더파일에 선언이 필요하고 (굳이 소스코드가 아니더라도 소스파일의 첫 부분에) cpp 파일에 변수의 몸체가 필요하게 됩니다. 이를 이용해 프로그램 전체, 소스파일 전체에서 통용되는 변수를 만들 수 있게 됩니다. 이를 예제코드를 통해 알아봅니다.

*더 알아보기

실제로 extern 키워드를 많이 활용하면서 개발하는 것은 추천하는 개발 방법이 아닙니다. 실제로 테트리스 프로그램도 extern 이나 static 키워드를 사용하지 않고도 얼마든지 만들 수 있습니다.
다만 이를 이용해 extern 을 활용하는 방법을 배워보기 위해 일부러 사용한 것입니다.

예제코드 :
테트리스 만들기에서 헤드파일(Header.h)
extern int displayData[GRID_HEIGHT][GRID_WIDTH]; // 선언부분

Source.cpp 파일
int displayData[GRID_HEIGHT][GRID_WIDTH] = {0,}; // 정의 부분

profile
코딩 일지

0개의 댓글