[Advanced C++] 2. Unitialized Variable, Keyword & Naming Identifier, WhiteSpace & 코드 가독성 향상, Literal & Operator

dev.kelvin·2024년 11월 28일
1

Advanced C++

목록 보기
2/74
post-thumbnail

1. Unitialized Variable

초기화 되지 않은 변수

C++에서는 변수 초기화가 되지 않으면 쓰레기 값이 들어가게 된다, 이때 쓰레기 값이란 해당 메모리 주소에 있는 아무 의미 없는 값을 의미한다 (이 값은 매번 달라질 수 있다)

C++에서 자동 초기화가 없는 이유는 아주 옛날 성능 최적화 때문이다 ex) 10000개의 변수를 자동초기화 하기에 옛날 하드웨어 스펙상 힘들었기 때문..

컴파일러에 따라 초기화 되지 않은 변수를 사용할 시 error를 뱉게 할 수 있다

요즘같은 시대의 하드웨어 스펙에서 초기화를 한다고 전혀 문제될게 없기 때문에 항상 변수는 선언하고 초기화를 하는 습관을 들여야 한다

2. Keywords & Naming Identifier

KeyWords

C++에서는 C++23 기준 92개 정도의 keyword가 존재한다, 그렇다면 keyword란 무엇일까?

Keyword란 C++ 자체에서의 특별한 의미, 기능을 가지는 단어이다

또한 Special Identifier들이 존재하는데 이 식별자들은 특정 맥락에서 사용될때만 keyword처럼 의미를 가지고 그렇지 않으면 의미를 가지지 않는다 ex) override, final, import.. 등등

Naming Identifier

변수, 함수의 이름들을 식별자 (Identifier)라고 칭하고 C++에는 이러한 식별자 명명 규칙이 존재한다

  1. Keyword는 식별자로 사용할 수 없다
  2. 문자, 숫자, _ 만 식별자로 사용할 수 있다 (기호, 공백은 포함X)
  3. 문자나 _ 로 시작해야한다, 숫자로 시작할 수 없다
  4. 문자에서 대소문자를 구분한다 -> int Knight, int knight는 서로 다르다

그렇다면 올바른 명명 규칙은 뭘까?

  1. C++에서는 기본적으로 식별자는 소문자로 시작한다 (Unreal Convention은 다름), 이때 대문자로 시작하는 식별자는 Struct, Class, Enum 등이 있다
  2. 식별자가 여러 단어로 구성되어 있다면 보통 2가지 case를 많이 사용한다
    밑줄로 구분하는 방법 (Snake_Case) -> int my_attack_speed;
    대문자로 구분하는 방법 (Camel Case) -> int MyAttackSpeed;
  3. _ 로 시작하는 식별자는 별로 좋지 않다, 왜냐하면 OS, Library, Compiler용으로 이미 예약이 되어있을 수 있기 때문이다
  4. 식별자는 해당 데이터를 정확히 표현해야 한다 (의미가 명확해야 함)
    ex) int a, int data -> 이런건 사용X
  5. 조금 길어지더라도 괜찮으니 줄임말은 사용하지 말자, 프로그래머가 읽을 때 혼동을 야기할 수 있다
    너무 길어질 것 같다면 주석을 사용하여 해당 코드가 왜 사용되었는지 설명하는것도 좋은 방법이다

위의 내용을 지키면서 회사나 사용하는 툴의 Coding Convention을 따르는게 제일 좋다

3. WhiteSpace, 코드 가독성 향상 방법

WhiteSpace

C++에서 일부 Syntax는 공백으로 구분이 되어야 한다

	int x; //자료형과 변수 사이의 공백, 이때 공백이 얼마나 있던 상관하지 않는다
    int           x = 10; //이것도 가능
	
    intx; //int라는 keyword를 컴파일러가 인식하지 못해 에러가 발생한다

하지만 " "안에서의 공백의 양은 그대로 반영된다

	std::cout << "He      llo"; //He     llo가 출력됨

그리고 " "내부에서 줄바꿈은 허용되지 않는다

	std::cout << "Hello
    	World!"; //error
        
    std::cout << "Hello"
    	"World"; //가능

또한 함수의 return과 이름을 공백으로 구분해야 한다

	int main() //반환형, 이름 사이의 공백

코드 가독성 향상

컴파일에는 문제가 없지만 공백을 사용하지 않으면 가독성이 떨어지기 때문에 공백을 사용하는 편이 좋다

	int main(){std::cout<<"Test"<<endl;return0;} //가독성 저하

이러한 가독성 문제 해결을 위해 공백과 줄 바꿈, tab을 적절히 사용해야 한다

	int main()
    {
    	std::cout << "Test" << std::endl;
        
        return 0;
    }
    
    //가독성 향상

또한 한 줄의 코드 길이가 너무 길어진다면 적당한 지점에서 줄을 나누는게 좋다 (80자 정도)

	std::cout << "This is another really, really, really, really, really, really, really, "
                 "really long line\n";

만약 긴 코드가 연산자로 이루어져 있다면 줄 바꿈 시 연산자를 앞에 사용하는게 좋다

	std::cout << 3 + 4 * 7 / 8 * 8;
    
    std::cout << 3 + 4 * 7
    	/ 8 * 8;

그리고 주석과 대입연산자의 위치를 맞춰주는것도 가독성 향상에 도움이 된다

	cost         = 100;   //TestComment
    attack_speed = 5.5f;  //TestComment
    value        = 5000;  //TestComment

4. Literal, Operator

Literal

Literal이란 코드에 직접 삽입된 고정된 값을 의미한다

	int a {5};
    std::cout << "Test Text" << std::endl;

여기서는 5, Test Text가 Literal값이 된다

변수는 초기화, 할당을 통해 값을 가질 수 있고 Literal은 고정된 값 그 자체인 상수를 의미한다

Operator

C++에서의 연산자는 굉장히 다양하다 (+, -, *, /, %, =, <<, >>, == 등등)

이러한 연산자를 표현할 때 operator를 붙혀 표현한다 (operator+, operator/)

  • 단항 연산자
    피연산자가 하나인 연산을 단항 연산이라고 한다
    ex) -5는 5에 operator- 연산을 하여 부호를 반대로 바꾸는 연산이다

  • 이진 연산자
    두개의 피연산자끼리 하는 연산을 이진 연산이라고 한다
    ex) 3 + 4, std::cout << 4, std::cin >> a

  • 삼항 연산자
    세개의 피연산자끼리 하는 연산을 삼항 연산이라고 한다
    ex) Hp > 0 ? "Live" : "Dead", 이런식으로 조건이 참이면 ? 뒤로, 거짓이면 : 뒤의 코드를 실행한다

일부 연산자는 두 가지 이상의 의미를 갖는다 ex) operator-는 부호를 반대로 변경의 의미도 있고 뺄셈의 의미도 있다

이렇게 연산을 하면 수학에서와 똑같이 체인하여 연산이 가능하다

	a = 3 + 5 * 9; // 5 * 9의 결과값과 3을 더해서 a에 할당하는 chain

또한 이렇게도 사용이 가능하다

	x = y = 9; //y에 9거 할당되고 x에 y의 값인 9가 할당되는 chain
    
    x += y; // x = x + y;
profile
GameDeveloper🎮 Dev C++, DataStructure, Algorithm, UE5, Assembly🛠, Git/Perforce🌏

0개의 댓글