• 1.6.1 리터럴(Literal)
  • 1.6.2 연산자(Operator)와 피연산자(Operand)

1.6.1 리터럴(Literal)

 

리터럴은 C++에서 언급되는 상수 중의 하나로 직접적으로 입력하는 데이터이다.

#include <iostream>

using namespace std;

int main()
{
	// Assignment operator =
	int x = 2; // x is a variable, 2 is a literal.
	
	cout << 1 + 2 << endl; // 1 and 2 are literal.

	// Unary operator -
	cout << -x << endl;

	// Binary operator +
	cout << 1 + 2 << endl;

	// Ternary operator ? :
	int y = (x > 0) ? 1 : 2;
	cout << y << endl;

	return 0;
}

 

위의 코드에서 x를 2로 초기화하는데, 여기서 입력하게 되는 2를 리터럴이라고 한다. 저 2라는 값에 3이라는 값을 넣을 방법이 없는 것처럼 바꿀 수 없는 것을 리터럴이라고 한다.


1.6.2 연산자(Operator)와 피연산자(Operand)

 

연산자는 우리가 평소에 다루던 +, -, *를 의미하고 피연산자는 연산자가 행하는 연산 수행에 사용되는 것들을 의미한다. 연산자는 단항 연산자(unary operator), 이항 연산자(binary operator), 삼항 연산자(ternary operator)가 있다.

 

-의 경우 숫자 앞에 쓰이므로 하나의 피연산자로 행해지는 연산이다. 이처럼 피연산자가 하나만 사용될 경우 단항 연산자라 한다. +와 *는 연산자의 양쪽에 피연산자가 필요하므로 이항 연산자가 된다.

 

C++에서 정의된 삼항 연산자는 조건문을 비교하여 그 결과에 따라 값을 선택하는 연산을 수행한다. 위의 코드에서는 x가 0보다 큰지에 대한 판단을 하고 참이면 1을 거짓이면 2를 반환하도록 구현되어 있다.

  • 1.5.1 지역 변수(Local variables)
  • 1.5.2 지역 변수로 보는 매개변수와 인자의 차이

1.5.1 지역 변수(Local variables)

변수가 생성되고 없어지는 것엔 영역이 존재한다. 메모리에 할당된 지역 변수는 할당이 이루어진 곳을 묶고 있는 중괄호가 끝나는 지점까지만 존재한다. 이러한 영역을 지역 영역(local scope)이라고 한다. 다음의 예제를 보자.

 

#include <iostream>

using namespace std;

int main()
{
	// 구분을 하기 위한 식별자인데 같으면 문제가 생김
	int x = 0;
	//int x = 1;

	cout << x << " " << &x << endl;
	{
		// 앞의 x와 다르다.
		// 다른 메모리에 대한 식별자 공간 자체가 다르다.
		//int x = 0;
		x = 1;
		cout << x << " " << &x << endl;
	}

	cout << x << " " << &x << endl;

	{
		int x = 2;
		cout << x << " " << &x << endl;
	}

	return 0;
}

 

우선 같은 중괄호에 같은 이름(같은 식별자)으로 생성된 지역 변수를 보자.

redefinition

같은 중괄호에 같은 식별자의 변수는 존재할 수 없다. 애초에 식별자가 식별을 위해 존재하는 것이기 때문에 다른 메모리에 같은 식별자로 두는 것은 허용되지 않는다.

 

다른 중괄호에 묶인 경우 같은 식별자의 변수를 사용할 수 있다. 이것이 가능한 이유가 지역 범위가 있기 때문이다. 

local variables and local scope

메모리 주소를 출력한 결과 전부 다르다는 것을 알 수 있다. 첫번째와 세번째 출력 결과가 같은 이유는 같은 지역 변수의 메모리 주소를 출력하기 때문이다.

 

이번에는 새로 지역 변수를 할당하는 것이 아닌 값만 바꾸는 행위를 하는 코드의 결과를 보자.

x 값 변경

첫 중괄호에서 새로운 지역 변수 x를 할당하는 것이 아닌 x를 1로 만들고서 메모리 주소를 출력하기만 했다. 메모리 주소는 변하지 않았고 기존의 x의 값만 바꾼 것을 알 수가 있다.

 

지역 변수는 영역을 벗어나면 사용할 수 없게 된다.
지역 변수가 차지하고 있던 메모리는 그 지역 변수가 영역을 벗어날 때 "스택(stack)" 메모리로 반납된다.
반납된 메모리는 다음 지역 변수가 사용할 수 있도록 대기한다.

1.5.2 지역 변수로 보는 매개변수와 인자의 차이

지역 변수 예제를 통해 매개변수와 인자의 차이를 알 수가 있다. 다음 코드의 결과를 살펴보자.

 

#include <iostream>

using namespace std;

void doSomething(int x)
{
	x = 123;
	cout << x << "\t" << &x << endl; // #2
}

int main()
{
	int x = 0;
	cout << x << "\t" << &x << endl; // #1

	doSomething(x);
	cout << x << "\t" << &x << endl; // #3

	return 0;
}

 

arguments and parameters

main 함수에서 생성한 x를 인자로 사용하는 doSometing 함수이다. 인자의 주소는 끝이 A54이지만 doSomething 함수에서 사용한 x의 메모리 주소는 A30으로 끝난다. 이를 통해 인자의 메모리 주소와 매개변수의 메모리 주소는 다르다는 것을 알 수 있다. 그렇기 때문에 x의 값을 123으로 변경했어도 main 함수에서 할당한 x의 값은 변하지 않음을 알 수 있다.

  • 1.4.1 키워드(keywords)
  • 1.4.2 식별자(identifier)
  • 1.4.3 변수명을 짓는 방법

1.4.1 키워드(keywords)

 

프로그래밍 언어에는 reserved keywords가 있다. 프로그래머가 변수명이나 함수명으로 사용할 수 없도록 미리 예약을 해둔 것들로 int, double, main과 같은 기본적인 단어들이 keyword가 된다.

int double

이처럼 이미 예약된 키워드들은 변수명으로 사용할 수 없도록 컴파일 이전부터 에러임을 알려준다.


1.4.2 식별자(identifier)

 

식별자(identifier)란 변수의 이름, 함수의 이름, 객체의 이름처럼 식별할 수 있게 만들어준 것을 의미한다. 정확하게는 메모리 주소를 식별하기 위한 것으로 프로그래머가 해당 식별자를 통해 메모리를 인식할 수 있게 된다. 만약 int 자료형에 대한 초기화가 이루어지면 해당 변수가 4 bytes 크기의 메모리를 지닐 수 있음을 우리는 알 수 있게 된다. 실무에서 그렇게 많이 사용하는 단어가 아니므로 중요하게 알고 있을 필요는 없다.


1.4.3 변수명을 짓는 방법

 

변수명을 짓는 방법은 이전부터 여러가지 방법이 있었는데, 정확한 답은 없다. 한가지 예시를 보자.

변수명의 다양한 예시

위처럼 많은 방법이 있는데, 혼자 작업할 경우 변수명은 자신이 알아보기 쉽도록 자신만의 규칙으로 짓는 것이다. 여러명이 협업하는 경우에도 크게 고민할 필요가 없다. 어느 기업에 취직을 해서 해당 기업의 프로그램을 보면 그 기업에서 관습적으로 사용하는 변수명에 대한 패턴이 있다. 그 패턴을 따르면 되겠다.

 

위처럼 상황에 맞게 변수명을 짓는 것과는 다르게 대부분의 프로그래머들이 관습적으로 지키는 것들이 몇가지 있다. 그러한 것들만 관습으로 지키도록 하자.

띄어쓰기 대신 under bar를 쓴다.
대문자는 변수명에서 되도록 지양하며, 매크로에서 많이 쓴다.
함수명은 일반적으로 동사명사 구조로 작성하며, 이를 어기고 명사만으로 지을 수도 있다.

 

+ Recent posts