SturdyCobble's Study Note

[프로그래밍] 2.3 자료형[2] 본문

휴지통/['19.06-'20.07]프로그래밍101

[프로그래밍] 2.3 자료형[2]

StudyingCobble 2019. 7. 8. 18:31

NOTICE : 독학인 만큼, 잘못된 내용이 있을 수 있습니다. 내용 지적은 언제나 환영합니다.

더 이상 이 블로그에는 글을 올리지는 않을 예정입니다. 그렇지만 댓글을 달아주시면 최대한 답변드리고자 노력하겠습니다.


※이 글은 프로그래밍 언어에 대한 기초적인 이해를 가정하고 있습니다. 최소 프로그래밍 언어 하나 정도를 약간이라도 접해보시는 것을 추천합니다. 또한, 이 글은 심화 내용은 되도록 피하여 서술했습니다.

자료형에 대한 두번째 글입니다. 먼저 숫자(정수와 실수) 자료형에 대해 좀더 깊이 파헤쳐보도록 하겠습니다. 전 글에 대해 리마인드해보자면, 아래와 같은 자료형들이 있었습니다.

C언어 Java Python

정수형
short, int, long, long long
__int8, __int16, __int32, __int64
(& unsigned/signed)

 

실수형

float, double, long double

정수형
byte, int, long

 

실수형
float, double

정수형
int

 

실수형

float

각 언어에서 자료형의 크기 및 범위가 다름에 주의하세요!

 C와 C++의 경우 정수형 상수는 기본적으로 그 크기에 따라서 알아서 종류가 지정됩니다. 따라서 우리가 따로 신경 쓸 필요가 없지만, 굳이 지정하고 싶다면 아래와 같이, L(소문자도 가능), U(소문자 가능, L과 순서 상관없이 사용 가능)을 뒤에 붙여서 각각 long형과 부호없는 정수형으로 지정할 수 있습니다.

23    //short형
147483647 //int형
23L //long형
23ul //unsigned long형

(//표시는 그 뒤가 설명이라는 의미입니다. 이에 관해선 추후 설명합니다.)

이때, 그러면 int형 변수에 23을 집어넣으면 오류가 날까라는 의문이 들 수 있습니다만, 전혀 그렇지 않습니다. 이는 범위만 들어맞는다면, 알아서 형태가 변환되기 때문입니다.

 

 그런데, 자바는 약간 다릅니다. int형으로 표현할 수 없는 숫자라면, L(소문자 가능)을 붙여서 long형임을 표시해야 합니다. 즉, 아래 코드는 오류가 납니다.

long myVar = 223372036854775808; 

아래 코드를 사용해야 합니다.

long myVar = 223372036854775808L;

 

실수형에서도 비슷한 개념이 존재하는데, F(Float), L(Long double), U(unsigned) 등의 접미어가 있으며, C,C++,Java 모두 double이 기본입니다. 단, Java의 경우 float에 접미어가 없는 숫자를 넣으면 무조건 오류가 나니 주의해야 합니다.

 

(한편, Python 3.0은 알아서 해줍니다.)

 

이러한 숫자를 표현하는 방법은 0.1231나 1231와 같은 일반적인 십진법만 있지는 않습니다. 일단, 부동소수점 표기법을 다루며 배웠듯이 지수 표현으로 나타낼 수도 있습니다. 아래와 같이 말입니다. (e또는 E사용)

1.45e3

이 경우 C,C++,Python,Java 모두 이를 1.45×10³으로 해석합니다. (물론 부동소수점 실수형 상수로 말입니다.)

 

또한, 우리가 흔히 아는 8진수와 16진수도 접두어를 붙여서 표현할 수 있습니다. 16진수의 경우 0x, (대소문자 상관X), 8진수의 경우 C,C++,Java는 0, Python은 0o(영 오)를 붙여서 표현가능합니다. 즉 0xA는 16이고, 010은 C,C++,Java에서 8이 됩니다.(Python에서는 0o10과 같이 표시하겠죠?) 또한, Python에서는 0b0101과 같이 이진수 지원도 됩니다.

 

(§ C++의 경우 C++14 표준에서 Binary Literal과 Digit Seperator가 추가되었다고 합니다. 0b또는 0B Prefix를 이용하며, Digit Seperator로 '을 이용할 수 있다고 합니다. C언어는 컴파일러 별로 가능할 수 있습니다.)

 

이제, 간단한 사칙연산에 대해 알아보겠습니다. 기본적인 +,-,*(곱하기),/(나누기) 기능이 지원되며, %(나머지) 연산자도 존재합니다. Python의 경우 //(몫)연산자도 존재합니다. 아래 예시를 참고해봅시다. 

int num1 = 0;
int num2 = 1;
num2 = num1 + num2 + 3;

아니면 Python 문법으로

num1= 0
num2 = 1
num2 = num1 + num2 + 3

두 예시에서, num2에는 0+1+3=4의 값이 저장되게 될 것입니다.(이 값을 출력하는 방법은 다음 글에서 다룹니다.) 아래 예시는 어떻게 될까요?

int num1 = 5;
num1 = num1 / 2;
num1 = 5
num1 = num1 / 2

이 경우 C/C++(위쪽)에서는 경고가 뜨고(안 뜰 수도 있습니다.) num1에 2가 저장됩니다. 이는 2.5라는 값을 정수형 변수에 넣기 위해 조용하게 형태가 변환된 것입니다.(묵시적 형변환) 하지만, Java에서는 그런거 없이 바로 에러가 납니다. 이 경우 명시적으로 해주지 않는 이상 오류가 나는데, 이는 이후 다루겠습니다.

 

Python(아래쪽)의 경우 2가 저장됩니다.

 

나머지 연산자도 이처럼 사용하시면 됩니다. 또한, 일반적인 연산자의 우선순위가 여기서도 성립합니다.(곱셈 우선, 왼쪽부터) 물론 다른 연산자까지 있으면 복잡해지는데, 이는 다음에 한번에 다루겠습니다.

 

 

그러면, 문자열 자료형은 어떨까요? 이 경우 복잡한 내용이 많기에 나중에 한 글에 모아서 정리하겠지만, 간단하게 확장열과 C언어의 wchar_t에 대해 이야기하고 마무리하겠습니다.

 

 먼저 확장열(Escape Sequence)는 따옴표와 같이 이미 문자열을 표현하기 위해 사용된 문자나 여러가지 문자들을 문자열 내에 표현하기 위해 대체로 사용되는 문자정도로 이해하시면 될 것같습니다. 다음과 같은 것들이 있습니다.

 

확장열 의미
\a 알림음(혹은 Beep)
\b 백스페이스
\f 폼 피드(Form Feed) - 프린터에서 다음 페이지
\n 개행(New Line)
\r 캐리지 리턴(Carriage Return) - 줄 처음 자리로 돌아옮
\t 수평 탭
\v 수직 탭
\\ \
\' '
\" "
\### 팔진수로 표기한 문자 ###은 팔진수
\x## 16진수로 표기한 문자 ##은 해당 16진수
\0 널 문자(Null)
\u#### 유니코드(U+####) 문자

 

다음 예시를 살펴봅시다.

"\"Hello!\n\""

다음 문장은 아래와 같은 문자열로 해석됩니다.

"Hello!
"

 

 

C언어의 wchar_t에 관해 잠깐 언급하자면, 저번 글에서는 생략했지만, 다음과 같이 앞에 L을 붙여서 wchar_t형임을 나타내야 합니다.

wchar_t *wstr1 = L"Wide 타입";

(소문자도 가능합니다.)

Comments