본문 바로가기

카테고리 없음

자료형에 대하여

 

 

저는 자료형에 대한 이해가 다른 C 문법을 배울때나 예제 코드를 분석할 때 큰 도움이 되었습니다. 

오늘은 지금까지 제가 이해한 자료형에 대하여 정리해 보겠습니다. 

 

 

1. 자료형이란 무엇일까 ?  

 

 

책에는 다음과 같이 적혀 있습니다. 

 

 

Shaffer, C.A.  Data Structures and Algorthms , 1.2

 

 

결국 컴퓨터는 0 혹은 1 이라는 말 들어 보셨나요 ? 

현실 세계에 존재하는 어떠한 데이터든 컴퓨터에서 다룰려면 0 혹은 1 로 표현할 수 있어야 합니다. 

 

 

어떤 데이터든 결국 0 또는 1 입니다.

 

 

이런 데이터들을 저장할 때 정수인지 문자인지 구분 없이 저장한다면 , 

나중에 0 , 1 모음을 컴퓨터가 어떤 데이터 인지 판별할 때 까다롭게 느낄 것입니다.

 

따라서 자료형을 제시하여 컴퓨터가 0 ,1 모음을 표현하고 판단하는 기준이 되게 하였습니다.    

 

그렇다면 자료형을 통해 우리는 어떤 내용을 알 수 있을까요 ? 

 

위의 책 내용에서 자료형은 

 

1. 해당 자료형에 대한 가능한 값 

2. 해당 자료형에서 수행을 마칠 수 있는 명령들

3. 데이터의 의미 

4. 해당 자료형의 값을 저장하는 방식 

 

을 결정한다고 쓰여 있습니다. 

 

64 bit CPU 기준 , int 형으로 예를 든다면 

1. ( - 2^31 ) ~ ( 2^31 - 1 ) / 다음 범위의 정수 데이터가 가능합니다.  

2. 산술 / 비교 / 할당 등 의 연산자를 통해 명령을 수행할 수 있습니다.  

3. 범위 내 정수를 의미하는 데이터 입니다.  

4. 4 byte 를 할당하며 보통 2의 보수법을 이용하여 저장합니다. 

 

다음의 내용을 알 수 있습니다. 

 

2. 자료형의 종류에는 ? 

 

 

그렇다면 자료형에는 어떤 것들이 있을까요 ? 

 

기본적으로 떠오르는 것은 int , double , char 과 같은 기본적인 자료형들 입니다. 

 

-----------------------------------------------------

 

또한 포인터 형이 있습니다. 

포인터형은 주소를 저장하는 자료형 입니다.  

물론 모든 주소를 저장할 수 있는 건 아니고 , 해당하는 형의 object ( 실행환경에서 데이터 저장의 위치 , 객체랑 다름 )  주소를 저장할 수 있습니다. 

 

예를들어 포인터형이 int * 이면 int 형의 object 주소를 저장할 수 있고 

int ** 이면 int * 형의 object 주소를 저장할 수 있습니다. ( 포인터형 그자체도 하나의 object 가 있습니다. )

 

포인터형에 수행할 수 있는 산술 연산을 pointer arithmetic 이라고 합니다. 

C 는 포인터 a , b 가 배열의 요소 주소를 가질 때 다음의 3가지 산술 연산을 허용했습니다. 

 

1. a + 정수

2. a - 정수

3. a - b

 

즉 , a * b 와 같은 연산은 형이 pointer 이기 때문에 허용되지 않습니다. 

( 자료형은 어떤 연산이 수행 가능한 지 여부에 영향을 줍니다. )  

 

-----------------------------------------------------

 

그 밖에도 묶음으로 데이터를 관리하는 배열 , 구조체 형이 있습니다. 

둘의 차이는 요소들의 데이터 타입이 같은가 ? 같지 않은가 ? 입니다.

이 둘을 합쳐 aggregate 형 이라 부릅니다. 

 

신기한 점은 같은 형이라도 배열 끼리는 할당 연산을 할 수 없지만 구조체 끼리는 할당 연산을 할 수 있습니다. 

( 자료형은 어떤 연산이 수행 가능한 지 여부에 영향을 줍니다. )  

 

 

#include <stdio.h> 

int main( ){
	int a[4] = { 1 , 2 , 3 , 4 } ; 
    	int b[4] ; 
    	b = a ; 
    
    	return 0 ; 
}

 

 

위 코드는 허용하지 않지만 

 

 

#include <stdio.h> 
struct example { 
	int k1 ; 
    	double k2 ; 
} ; 

int main( ){
	struct example a = { 3 , 4.5 } ; 
        struct example b ; 
        b = a ; 
        
        return 0 ; 
}

 

위 코드는 허용합니다.  

 

심지어 배열을 구조체 맴버로 정해서 할당할 수도 있습니다. 

 

 

3. 형 변환이란 ? 

 

 

다음을 참조 : 

 

 

4. typedef 란 ? 

 

 

type 에 해당하는 식별자(이름)를 하나 더 추가하는 키워드 입니다. 

typedef 키워드 작성후 일반적인 변수를 선언하는 것처럼 코드를 작성하면 작성한 식별자(이름)가 타입에 해당합니다. 

 

 

 

 

다음과 같이 작성한다면 길이 10 인 배열  a 를 선언하고 싶을 때 

1. int a[10] ; 

2. INT_ARRAY_LEN_10 a ; 

두 가지 방법을 사용할 수 있습니다. 

 

이점은 1) 코드의 가독성을 올릴 수 있고  2) 프로그램의 이식성을 향상 시킬 수 있습니다.