내용 참고
C++ 기초플러스 4판 (성안당)
혼자 연구하는 C/C++ (Soen.kr/와우북스)
Microsoft Docs (구 MSDN)
변수 선언과 기본 데이터 타입
■ 앞에서 변수를 선언하는 것을 보여준적이 있다.
■ 이번에는 변수에 대해서 좀 더 자세히 알아보자.
Ⅰ. 변수 선언
int main()
{
int a;
int zero = 0;
return 0;
}
ⅰ. 변수 선언 방법
■ 위의 코드를 실행하면 변수를 선언만하고 한번도 쓰지 않았다는 warning(경고)가 뜰 것이다.
■ 하지만 딱히 Error(오류)가 뜨진 않고 실행된다.
■ 즉, 거의 모든 코드에 include문이 들어가긴 하지만 반드시 필요한 건 아니라는 뜻이다.
■ 변수 선언은 기본 문법적 내용이기 때문에 변수를 선언하기 전에 필요로 하는 것이 없다.
■ C언어와 C++에서 변수를 선언하는 방법은 동일하다.
■ 자료형 변수명 ;(세미콜론) 의 형식으로 선언하면 된다.
■ 변수명을 정할 때의 주의 사항이 몇가지 있다.
■ 이는 변수명 뿐 아니라 추후에 함수명 등을 지을 때도 동일하게 적용된다.
ⅱ. 변수명 선언시 주의사항 (명명시 주의사항)
■ C 및 C++은 대소문자를 구분한다.
■ 문법적으로 정해져 있는 키워드(for, while 등)는 변수명으로 사용할 수 없다.
■ 변수명에는 영문자, 숫자, _(언더바)만 사용가능하다.
■ 변수명의 시작에는 숫자가 올 수 없다.
■ 변수명은 띄어쓸 수 없다. 즉, 공백문자가 들어가서는 안된다.
■ 띄어쓰기 대신 _(언더바)을 사용하는 편이다.
■ 이하는 강제성은 없지만 변수명을 지을 때 지키면 좋은 조언이다.
■ 대소문자 구성을 일관되게 하는 것이 좋다.
■ 예를 들어 score와 Score는 다른 변수이므로 변수명의 시작을 대문자로 할지 소문자로 할지등을 정해두는 것이 좋다.
■ 사용처나 의미를 명확하게 알 수 있게 짓는 편이 좋다.
■ 영어가 약하고 개인 프로젝트라면 score보다 jumsoo가 개인에게는 더 좋을 수도 있다.
■ 컴파일러에 따라 구분 가능한 길이 제한이 있으니 너무 긴 이름보다는 3글자에서 10글자 정도로 짓는것이 좋다.
■ 너무 길면 오타를 낼 확률이 높아지고 기억하기 힘들수 있다.
ⅲ. 자주 쓰이는 명명규칙
■ 세계적으로 많이 사용되는 명명법 규칙이 있으므로 필요하다면 이를 따르는 것도 방법이다.
■ 카멜 표기법 : 첫단어의 시작은 소문자로 하고, 그 이후 연결된 단어의 시작은 대문자로 하는 방법
■ ex ) helloWorld, studentNumber 등
■ 주로 변수명이나 함수명에 많이 사용한다.
■ 스네이크 표기법 : 모든 문자를 소문자로 표기하고, 단어 연결시에 _(언더바)를 사용하는 방법
■ ex ) hello_world, student_number 등
■ 주로 변수명이나 함수명 그리고 사용자 지정 데이터 타입이나 이름 공간에 많이 사용한다.
■ 파스칼 표기법 : 모든 단어의 시작을 대문자로 하는 방법
■ ex ) HelloWorld, StudentNumber 등
■ 주로 클래스 명에 많이 사용한다.
■ 헝가리안 표기법 : 변수의 앞에 데이터 타입을 약자로 붙이는 방법
■ ex ) strHelloWorld, iStudentNumber 등
■ 사용자 정의 자료형은 알아보기 힘들고 지금은 컴파일러에서 자료형을 알아볼 수 있는 방법이 많아서 잘 쓰이지 않는다.
Ⅱ. 정수형 데이터 타입
ⅰ. 정수형 형식 지정자의 구성
■ 부호 형식 지정자 + 범위 형식 지정자 + int
■ 부호 형식 지정자 : signed(부호 있는), unsigned(부호 없는)
■ 범위 형식 지정자 : short, long, long long
■ 각각의 형식 지정자들은 생략 가능하기 때문에 같은 형식을 나타내는 다른 표현들이 존재한다.
■ 형식간의 크기 관계 : 1byte == sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)
■ C나 C++ 표준에는 형식들의 최소 표현 범위와 크기 관계만 지정되어 있을 뿐 정확한 크기는 지정되어 있지 않다.
■ 이러한 애매함은 데이터 통신 등을 할 때는 문제가 되기 때문에 C99 표준에서 stdint.h 헤더 파일이 추가되었다.
ⅱ. 양수를 표현하는 방법
■ 2진수 값으로 정수를 저장하고 표현하는 형식이다.
■ 메모리의 크기에 따라서 표현할 수 있는 값의 범위가 달라진다.
■ 1byte는 8비트이므로 1바이트로 양수만 표현한다고 가정하면 0부터 28=256까지의 수를 표현할 수 있다.
ⅲ. 정수에서 음수를 표현하는 방법
■ 2진수로 음수를 표현하는 방법은 여러가지를 생각할 수 있겠지만 대부분의 컴퓨터는 '2의 보수'를 이용하여 음수를 표현한다.
■ '2의 보수'를 음수로 사용하는 방법의 장점은 0을 표현하는 방법이 하나이고, 계산의 결과값이 직관적이라는 점이다.
■ 원래 수에서 일정한 수를 빼는 방법에서 빼주는 값을 바이어스(bias)라고 하며, 값의 범위를 평행이동시키는 것과 같다.
■ 부호 비트를 사용하는 방법은 가장 좌측의 비트(MSB; Most Significant Bit)를 부호를 표시하는 비트로 사용하는 것이다.
■ 이 방법은 직관적이고 간단하지만 0을 표현하는 방법이 2가지가 된다는 단점이 있다.
■ n의 보수란 숫자 a와 더했을 때 그 값이 n이 되는 값으로 2진수에서 1의 보수는 비트를 반전시킨 것과 같다.
■ 2진수의 1의 보수를 음수로 사용할 경우의 단점도 0을 표현하는 방법이 2가지가 된다는 점이다.
■ 2진수의 2의 보수는 더해서 2가 되는 수로 1의 보수에 1을 더한 값과 같다.
Ⅲ. 실수형 기본 자료형
ⅰ. 실수형 형식 지정자의 종류
■ 종류 및 크기 관계 : sizeof(float) <= sizeof(double) <= sizeof(long double)
■ C및 C++에서 실수는 항상 부호있는 수로 정의된다.
■ C 및 C++ 표준에서 각 형식 지정자의 크기를 명시적으로 정의하고 있지는 않다.
ⅱ. 실수를 표현하는 방법
■ 컴퓨터에서 실수를 표현하는 방법은 '고정 소수점 방식'과 '부동(浮動) 소수점 방식'의 2가지를 생각해볼 수 있다.
■ 이때 두 방식 모두 메모리의 한계 때문에 소수부를 무한하다고 가정하는 수학의 소수와 비교할 때 오차가 생긴다.
■ '고정 소수점 방식'은 십진수로 표현되어 있는 수를 그대로 2진수로 변환한 뒤 정수부와 소수부로 나누어서 표현하는 방식이다.
■ '부동 소수점 방식'은 소수점의 위치가 고정되어 있지 않다는 뜻이다.
■ 소수점이 떠다닌다는 뜻이므로 한국어 번역을 차라리 부유 소수점 방식으로 했으면 어땠을까 싶다.
■ '부동 소수점 방식'에서는 소수를 지수부와 가수부로 나누어 표현하는 방식이며 IEEE-745 국제 표준으로 지정되어 있다.
■ 우리는 실생활에서 실수를 10진수와 고정 소수점 방식으로 표현하는데 익숙하다. 이를 부동 소수점 방식으로 변환하면 다음과 같다.
■ 12345.6789 = 1.23456789 * 104 // 0.00123456789 = 1.23456789 * 10-3
ⅲ. 고정 소수점 방식
■ 부호부 1비트, 정수부 7비트, 소수부 8비트로 고정 소수점 방식을 표현하는 메모리가 있다고 가정하자.
■ 그리고 이 메모리에 47.515625를 저장한다고치면 그 과정은 다음과 같다.
■ 1. 부호를 2진수로 변환한다. (+1 = -10 이므로 부호비트는 0)
■ 2. 47을 2진수로 변환한다. (47 = 25+23+22+21+20 = 1011112)
■ 3. 0.515625를 2진수로 변환한다. (0.515625 = 2-6 + 2-1 = 1000012)
■ 4. 결과 값을 부호부와 정수부, 소수부에 각각 저장한다.
■ 47.515625를 고정 소수점 방식으로 저장하면 0 0101111.1000012가 된다.
■ 이 방식은 구현하기 쉽다는 장점이 있다.
■ 하지만 사용한 비트수 대비 표현가능한 수의 크기나 정밀도가 부동 소수점 방식에 비해서 떨어진다는 단점이 있다.
ⅳ. 부동 소수점 방식 ( = 부유 소수점 방식)
■ 부호부 1비트, 지수부 4비트, 가수부 11비트로 부동 소수점 방식을 표현하는 메모리가 있다고 가정하자.
■ 그리고 이 메모리에 47.515625를 저장한다고 치면 그 과정은 다음과 같다.
■ 1. 부호를 2진수로 변환한다. (+1 = -10이므로 부호비트는 0)
■ 2. 47을 2진수로 변환한다. (47 = 25+23+22+21+20 = 1011112)
■ 3. 0.515625를 2진수로 변환한다. (0.515625 = 2-6 + 2-1 = 1000012)
■ 즉, 47.515625를 2진수로 표현하면 101111.1000012이 된다. (부호비트 생략)
■ 4. 소수점 왼쪽에 1이 하나만 남게 한다. 이를 정규화라고 한다. 그럼 1.01111100012 * 25(=1012)이 된다.
■ 2진수를 정규화 할 경우 정수부의 값은 항상 1이므로 가수부에 저장할 때 이 1은 생략한다.
■ 5. 지수에 정해진 bias를 더해준다. bias값은 대략 지수부로 표현할 수 있는 수의 절반 정도이다. 여기서는 7(1112)로 가정한다.
■ 지수부에 bias값을 더해주는 이유는 음수 지수를 표현할 수 있게 하기 위해서이다.
■ 6. 결과값을 부호부와 지수부, 가수부에 각각 저장한다. 이 때, 남는 비트는 지수부는 왼쪽부터, 가수부는 오른쪽부터 0으로 채운다.
■ 그 결과 47.515625를 부동 소수점으로 표현하면 0 1100 011111000102가 된다.
■ 고정 소수점 방식보다 확실히 복잡하지만 고정 소수점보다 더 큰 수나 높은 정밀도의 수를 저장할 수 있다는 장점이 있다.
■ 예를 들어 246은 부동 소수점 방식으로는 0 1111 111101100002이지만 위와같은 고정 소수점 방식으로는 저장할 수 없다.