SturdyCobble's Study Note

[프로그래밍] 2.2 자료형[1] 본문

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

[프로그래밍] 2.2 자료형[1]

StudyingCobble 2019. 7. 5. 21:38

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

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


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

 

자료형(Data type)은 자료의 형태를 의미합니다. 이는 변수에 담긴 데이터에 해당하는 내용일수도 있고, 아니면 상수(literal)자체의 형태일 수도 있습니다. 이 상수는 변하지 않는 값으로 1과 같은 그냥 숫자일수도 아니면 'a'와 같은 문자 그 자체일수도 있습니다.먼저 여러 형태의 상수(literal)이 어떻게 나타나는지 알아봅시다.

  

여러 자료형의 상수(literal)

 

 첫째로, 정수입니다. 그냥 정수형의 상수는 그냥 우리가 쓰는 그 자체로 사용하면 됩니다. 예를 들어 저번 변수에 관한 글에 다루었듯이 int myVar = 1234;와 같이 정수 1234는 코드 상에서 1234라는 상수로서 나타납니다.

 

 둘째로, 실수입니다. 역시 그냥 0.1234하고 쓰면 됩니다. 여기서 주의할 점은, Java에서는 옆과 같이 쓴 실수는 실수형 자료형의 일종인 double이라는 자료형으로 인식되는데, 이를 더 크기가 작은 float라는 실수형 자료형을 가진 변수에 대입하려 하면, 오류가 나게 됩니다. 이때는 0.1234f와 같이 f또는 F를 붙여줍니다. 즉, float myFloat = 0.1234f;와 같이 초기화 하는 것입니다.

이렇게 변환이 불가능하다는 에러가 나옵니다.

 참고로 컴퓨터는 일반적으로 실수를 부동소수점(Float point) 형태로 표현하는데, (안 움직인다는 뜻의 不動이 아닌 떠다닌다 해서 부동입니다.), 이는 0.123142와 같이 소수점 위치가 고정된 고정 소수점(Fixed Point)형태와는 다르게 1.34×10²과 같이 지수(ex:예시의 2)와 가수(ex:예시의 1.34)를 분리해 정밀도가 제한되는 대신 효율적으로 공간을 사용할 수 있는 장점이 있습니다. 아래 그림을 참고해보세요.(실제 표준 저장 방식과는 약간 다릅니다.)

 

 

위쪽은 고정소수점, 아래는 부동소수점 방식으로 저장한 것입니다. 좀더 큰 숫자를 효과적으로 표현하려면 정확도가 떨어져도 아래쪽을 사용해야겠죠? 참고로 실제 표준 저장 방식은 이와 다릅니다. 실제론 지수부에 바이어스 상수를 더하는 등의 과정이 더 있습니다. 

 셋째로, 문자입니다. 문자의 경우 작은 따옴표로 감싸주는 것이 일반적입니다. (큰따옴표도 상관없습니다.)즉 문자형 자료형을 지정하는 키워드가 char이라면, char myChar = 'a';와 같이 (C/C++/Java)하면, a라는 문자를 myChar라는 변수에 집어넣게 되는 것입니다. 이때 알파벳이나 기본적인 특수문자는 1 Byte(=8 bit)의 크기로 표현되지만(문자를 숫자로 변환하여 저장합니다. 이 경우 ASCII코드가 사용됩니다.), 한글이나 다른 문자는 그 이상의 크기로 나타남에 유의해야 합니다.(주로 유니코드를 사용합니다.) 따옴표와 같은 일부 문자의 경우 이미 사용되기 때문에 다른 식으로 변환하여 사용하기도 하는데, 이는 다음 글에서 다루겠습니다.

 

 넷째로, 문자열입니다. 문자열은 큰 따옴표로 표시합니다. C언어에서는 문자열을 문자들의 배열로 저장하기 때문에, 별도의 자료형이 없습니다. 그러나 문자열 상수를 표현하는 방식은 모두 같습니다. "abcd"와 같이 사용합니다. Python에는 반대로 문자만을 나타내는 자료형을 따로 만들지 않은 것으로 보입니다. 

 

 또한, 불리언 자료형의 경우 True, False의 참 거짓만 다룹니다. 이때 0을 거짓, 1을 참으로 다루겠죠? (즉 True라는 상수대신 1이라고 나타내도 같은 의미입니다.) 당연하지만 아래 두개는 다른 표현입니다.

 

위는 문자열,    아래는 불리언 

 

 

 이제 각 언어에서 어떠한 자료형이 존재하는 지 알아보겠습니다. 이때 한 형태(ex: 정수)더라도, 여러가지 자료형이 존재하는데, 이는 사용가능한 범위를 지정함으로서 한정된 메모리 공간을 효율적으로 사용하기 위해서라고 보면 될 것같습니다.(동적 메모리 할당은 한참뒤에 다룹니다.)

 

 

 먼저 C언어에는 다음과 같은 기본적인 자료형들이 있습니다. 분류의 기준은 사람에 따라 달라지기도 하지만, 여기서는 soen.kr의 기준대로 분류해보았습니다. 볼드체 처리한 것은 당장 다음글에서 다룰 내용입니다. 나머지는 이런게 있구나 하는 정도면 됩니다.

기본형(Basic) 유도형(Derived)
  • 정수형(Int)
    int, __int8, __int16, __int32, __int64, short, long,
    long long
  • 실수형(Float)
    Float, double, long double
  • 문자형(Char)
    char, wchar_t
  • 열거형(Enum)
    enum
  • Void형(Void)
    void
  • 배열(Array)
  • 구조체(Structure)
  • 공용체(Union)
  • 포인터(Pointer)
  • 함수(Function)

 만약 C++이라면 다음과 같이 '문자열(String)'(string myStr = "String"과 같이 사용합니다), '불리언(Boolean)', '클래스(Class)'를 다루는 자료형 등이 추가되게 됩니다.

 물론 헤더 파일을 더 포함함에 따라 늘어나겠지만요.

 

 또한, unsigned와 같은 접두어(prefix)를 붙여서 자료의 범위를 음이 아닌 수로 제한할 수도 있습니다. 즉 각각에 대해서 unsigned int와 같은 자료형이 추가로 존재하는 것입니다.

 

 C/C++의 기본형 에 대해서 정리하자면 다음과 같습니다. (void와 enum 제외) 참고로 문자형이라고 되있는 변수에 범위만 맞다면 정수를 넣을 수도 있고, 그 반대도 가능합니다. 이는 문자나 정수나 메모리엔 정수형태로 저장되기 때문입니다.

 

자료형

크기 (1 Byte = 8 bit)

범위

정수형

short

2 Byte

$$ -2^{15} \sim 2^{15}-1 $$

int

4 Byte*

(실행 환경에 따라 다를 수 있음)

$$ -2^{31} \sim 2^{31}-1 $$

long

4 Byte

$$ -2^{31} \sim 2^{31}-1 $$

long long

8 Byte

$$ -2^{63} \sim 2^{63}-1 $$

__intN

(N=8,16,32,64)

N/8 bit

(= N bit)

$$ -2^{N-1} \sim 2^{N-1}-1 $$

(같은 크기의 정수형 자료형과 동일) ex: __int8 = char

(unsigned 추가)

붙이기 전과 동일

양수 범위

ex) unsigned int : $$ 0 \sim 2^{32}-1 $$

(signed 추가)

붙이기 전과 동일함.   ex) signed int

실수형

float

Byte

(1 bit : 부호)

(8[23] bit : 지수[가수]부)

$$1.2\times 10^{-38} \sim 3.4\times 10^{38}$$(절댓값)

double

Byte

(1 bit : 부호)

(11[52] bit : 지수[가수]부)

$$2.2\times 10^{-308} \sim 1.7\times 10^{308}$$(절댓값)

long double

컴파일러마다 다름 (gcc기반 : 12 Byte, VCC 6,7 : double과 동일)

문자형

char

Byte

$$ -2^{7} \sim 2^{7}-1 $$ (문자를 ASCII코드로 저장시 이용)

unsigned char

(char과 동일)

$$ 0 \sim 2^{8}-1 $$

wchar_t

Byte

$$ 0 \sim 2^{16}-1 $$ (문자를 Unicode로 저장시 이용)

불리언

bool (C++만)

1 Bit

true(1) / false(0)

 

 그러면 C언어에서 문자열을 어떻게 처리하는 지 궁금할법도 한데요, 일단은 char* 의 자료형으로 사용하면 됩니다. 즉 아래와 같이 말입니다. 그 이유는 나중에 다루겠습니다. 참고로 첫번째 식은 C++ 컴파일러에서 경고가 뜰 수 있습니다.

C언어에서 문자열을 저장하는 두가지 방법. 두번째의 경우 선언과 동시에 초기화하거나, 아니면 []안에 문장의 길이를 적어야 함에 유의하세요.(영어 기준, 한글은 2배로 해서)

 

 

 

 그러면 Java라면 어떨까요? 많은 부분에서 C++과 닮았지만, 닮지 않은 부분도 많이 존재함을 볼 수 있습니다. 아래는 대표적인 자료형을 정리해둔 표입니다. 볼드체는 다음 글에서 이어서 다룰 내용입니다.

기본형(Primitive) - 비객체 참조형(Reference)
  • 정수형
    byte, short, int, long
  • 실수형
    float, double
  • 불리언
    boolean
  • 문자형
    char
  • 클래스
  • 배열
  • 열거형
  • 인터페이스

* String 자료형의 경우 문자열을 다루는 자료형으로서 객체로서 다뤄지지만(참조형), 기본형처럼도 쓰입니다. (C++과 다르게 String임에 주의하세요!) 또한, StringBuffer라는 자료형도 객체로서 다뤄지며 문자열을 다룰 수 있지만, 자세한 논의는 나중에 다루겠습니다.

C++과 Java의 문자열 자료형 변수. 위는 C++, 아래는 Java.

 

마찬가지로 정리해봤습니다. C언어와는 다르게 운영체제에 무관하게 크기를 가지며, char, byte, long에서 C와 차이가 있습니다. unsigned는 없는게 또다른 특징입니다.

 

자료형

크기

범위

정수형

byte

1 Byte

$$ -2^{7} \sim 2^{7}-1 $$

short

Byte

$$ -2^{15} \sim 2^{15}-1 $$

int

Byte

$$ -2^{31} \sim 2^{31}-1 $$

long

Byte

$$ -2^{63} \sim 2^{63}-1 $$

실수형

float

Byte

$$1.4\times 10^{-45} \sim 3.4\times 10^{38}$$(절댓값)

double

Byte

$$4.9\times 10^{-324} \sim 1.7\times 10^{308}$$(절댓값)

문자형

char

Byte

$$ 0 \sim 2^{16}-1 $$

불리언

boolean

1 bit

True / False

 

 

 

 Python의 경우 자료형이라고 생각했던게 사실 다 객체로 표현된다는 점이 독특합니다.(Python 3.0 기준) Python에서는 변수의 자료형을 딱히 따로 지정하지 않아도 되는만큼, 그 자체도 크게 세분화되있지 않는 모습을 보여줍니다.

 

 큰 틀에서만 다루자면, int(정수형), float(부동소수점 실수형), str(문자열, string), bool(불리언, boolean), complex(복소수), list(리스트), tuple(튜플), set(셋, 집합), dict(사전형, dictionary), class(클래스) 정도가 있습니다. 이를 분류해보자면 아래와 같이 나타내볼 수 있겠습니다.(역시 볼드체는 다음 글에서 바로 다루는 내용입니다.)

수치형(Numbers) 순서형(Sequence) 매핑형(mapping)
  • int
  • float
  • complex
  • bool
  • str
  • list
  • tuple
  • class
  • set
  • dict

독특한 점은 복소수가 언어차원에서 기본적으로 지원된다는 것인데, 10+1j와 같이 -1의 제곱근을 j로 표현하여 표시합니다. 이런 언어는 일부 공학용 언어 제외하면 많이 없는 것으로 보입니다.(물론 구현은 어디서나 가능하며, 라이브러리에 들어있는 경우도 있습니다.)

 

내용과 무관한 MATLAB 캡쳐 화면. 복소수를 지원하는 대표적인 공학용 언어중 하나

 Python은 보시다시피 한 형태(ex: 정수형)에 여러 자료형이 있지 않은데(Python 3.0) 이는 각 자료형에 정해진 크기가 따로 없기 때문으로 보면 편할 것입니다.(편한 대신 약간의 속도상의 단점을 가지겠죠) 

 또한, 실수와 정수를 구분하기 위해 정수1은 1로 쓰고, 실수 1은 1.0과 같이 씁니다. 아래 사진을 참고하면 이해가 될 것입니다.

위에서부터 정수형, 실수형, 문자열, 복소수형 변수로 선언됩니다.

아래 표는 헷갈릴 경우를 대비하여 준비한 세 언어에서 Boolean형 변수가 가질 수 있는 값에 대한 표입니다.

언어 거짓
C++ true, 1 false, 0
Java true false
Python True, 1 False, 0

 

 

 다음 글에서 각각에 대한 좀더 세부적인 내용을 다루겠습니다.

Comments