교외활동/공모전

C언어 데이터의 정의

cchucchu 2018. 5. 27. 18:30
반응형

데이터 형식

기본 데이터 형식과 기본 데이터 형식을 부품으로 삼아 구성된 복합 데이터 형식이 있다.

복합 데이터 형식의 종류에는 구조체와 클래스, 배열 등이 있다.

데이터 형식은 값 형식과 참조 형식으로도 분류할 수 있다.

 

변수

데이터를 담는 일정 크기(데이터 형식에 따라 결정)의 공간

데이터 형식(ex. int)을 먼저 명시하고 다음에 변수 식별자(이름)을 명시한다. 마지막엔 세미콜론(;)

선언된 변수는 대입 연산자를 통해 데이터를 입력하며 선언과 데이터 할당을 동시에 할 수도 있다.

데이터 형식이 같은 변수들은 콤마로 여러 개를 동시에 선언할 수도 있다.

* 초기화 : 변수에 최초의 데이터를 할당하는 것, 변수 선언 후 데이터를 입력하지 않으면 쓰레기 데이터가 입력된다.

 

코드에 만드는 것이 아닌 선언한다라고 하며 이는 컴파일러에게 선언하는 것이다.

 

값 형식

변수가 값을 담는 데이터 형식

* 스택 메모리 영역 : 차례대로 스택에 쌓였다가 코드 블록이 끝나면 스택에서 차례대로 제거되는 방식

값 형식의 변수는 모두 스택에 저장되므로 모든 값 형식의 변수들은 프로그램 실행이 ‘}‘를 만나면 제거된다.

 

참조 형식

변수가 값 대신 값이 있는 곳의 위치(참조)를 담는 데이터 형식

참조 형식은 힙과 스택을 모두 사용하는 데 실제 데이터가 저장되어 있는 메모리의 주소를 참조한다.

* 힙 메모리 영역 : 데이터를 스스로 제거하는 대신 가비지 컬렉터가 수거한다.

코드 블록이 끝나는 시점과 상관없이 데이터를 유지하고 싶을 때는 스택 대신에 힙을 사용한다.

 

기본 데이터 형식

15가지가 있는 데 크게 숫자 데이터 형식, 논리 형식, 문자열 형식, 오브젝트 형식으로 나누어지는 데 문자열

형식과 오브젝트 형식은 참조 형식이고 나머지는 값 형식이다.

* 숫자 데이터 형식 : 기본 자료 형식 중 12가지가 숫자 데이터 형식으로 제공한다. 12가지는 정수 계열, 부동 소수

계열, 소수 계열 3가지로 나뉜다.

@ 정수 계열 형식 : 정수 데이터를 담기 위해 사용하며 12가지 중 9가지가 정수 계열 형식이다.

데이터 형식

설명

크기(바이트)

담을 수 있는 값의 범위

byte

부호 없는 정수

1(8비트)

0~255

sbyte

signed byte 정수

1(8비트)

-128~127

short

정수

2(16비트)

-32,768~32,7671

ushort

unsigned short 부호 없는 정수

2(16비트)

0~65,535

int

정수

4(32비트)

-2,147,483,648~2,147,483,647

uint

unsigned int 부호 없는 정수

4(32비트)

0~4,294,967,295

long

정수

8(64비트)

-922,337,203,685,477,508~922,337,203,685,477,507

ulong

unsigned long 부호 없는 정수

8(64비트)

0~18,446,744,073,709,551,615

char

유니코드 문자

2(16비트)

 

 

@ 부호 있는 정수 : 음의 부호가 있는 정수로 음의 영역까지 다루며 sbyte, short, int, long 등이 있다.

@ (부호 없는) 정수 : 0과 양의 영역을 다루며 양의 부호를 생략하기도 하고 byte, ushort 등이 있다.

부호 있는 정수의 경우 제일 앞의 비트를 부호 비트로 사용하여(0 양수, 1 음수) 부호를 나타낸다.

부호와 절대값 방식 : 부호 비트를 순수하게 음과 양을 나타내고 나머지 비트도 순수하게 수를 나타내는 방식.

2의 보수법 : 부호와 절대값 방식은 00 두가지가 나오므로 만든 방식

수 부분 비트를 채우고 전체 비트를 반전시킨 뒤 반전된 비트에 1을 더해서 만든다.

 

오버 플로우

변수의 데이터 형식의 크기를 넘어서는 값을 담아서 넘치는 현상

오버 플로우 현상이 일어나면 넘쳐 흐르는 비트는 버리고 크기에 맞는 비트만 보관한다.

* 언더 플로우 : 데이터 형식의 최저값보다 작은 데이터를 저장할 때 나타나는 현상

 

부동 소수점 형식(Floating Point Types)

소수점이 고정되어 있지 않고 움직이면서 수를 표현한다는 뜻인 부동 소수점의 형식으로 실수 영역의 데이터.\

메모리를 두배로 사용하지만 데이터의 손실이 적기 때문에 float보다 double을 선호한다.

float

(Floating Point)

단일 정밀도 부동 소수점 형식

(7개의 자릿수만 다룰 수 있음)

4(32비트)

-3.4028523e38~3.402823e38

double

(Double Precision Point)

복수 정밀도 부동 소수점 형식

(15~16개의 자릿수를 다룰 수 있음)

8(64비트)

-1.79769313486232e308~

1.79769313486232e308

* 정밀도 : 부동 소수점 형식의 특징이자 한계

float는 굉장히 넓은 범위의 수를 다루지만 유효숫자가 7뿐이라 대략적으로 표현하기 때문에 한정된 정밀도를 가 진다고 한다. float 형식의 정밀도를 기준으로 단일 정밀도라 하고 double 형식을 복수 정밀도라 한다.

 

정수 형식 대신 부동 소수점 형식을 사용하는 이유는 같은 크기의 수를 표현할 수 없고 느리기 때문.

 

Decimal 형식

실수를 다루는 데이터 형식으로 부동 소수점과 다른 방식으로 정밀도가 훨씬 높다

decimal

29자리 데이터를 표현할 수 있는 소수 형식

16(128비트)

±1.0×10e-28~±7.9×10e28

 

문자 형식과 문자열 형식

* char 형식 : 정수를 다루는 데이터 형식 출신이지만 문자 데이터를 다룬다.

개별 문자를 표현하고 작은 따옴표‘’로 묶어 표시한다.

* string 형식 : 여러 개의 문자 형식을 하나의 실로 묶어 처리하는 형식으로 정해진 크기나 담을 수 있는 데이터의 범위가 정해져 있지 않다.

string과 문자열을 혼용해서 많이 사용하며 큰 따옴표 “”로 묶어 담는다.

ex) char c = ‘’;

string a = “안녕하세요?”;

 

논리 형식

(true)과 거짓(false) 두 가지 데이터로 비교 데이터가 같은지 다른지 판단할 때 사용.

bool

논리 형식

1(8비트)

true, false

 

object 형식

어떤 데이터라도 다룰 수 있는 데이터 형식으로 상속의 효과로 가능하다.

모든 데이터 형식은 자동으로 object 형식으로부터 상속받게 함으로써 모든 데이터 형식의 조상이 된다.

참조 형식이기 때문에 힙에 데이터를 할당한다.

* 박싱 : 값 형식의 데이터를 힙에 할당하기 위해 object 형식이 제공하는 기능.

object 형식에 값 형식의 데이터를 할당하려는 시도가 일어나면 박싱을 수행해 해당 데이터를 힙에 할당.

* 언박싱 : 박싱되어 있는 값을 꺼내 값 형식 변수에 저장하는 과정

 

형식 변환

변수를 다른 데이터 형식의 변수에 옮겨 담는 것으로 박싱과 언박싱도 값 형식과 참조 형식 간의 형식 변환.

* 크기(표현 범위)가 서로 다른 정수 형식 사이의 변환

작은 정수 형식 변수의 데이터를 큰 정수 형식 변수에 옮길 때는 문제가 없지만 반대의 경우 원본 변수의 데이터 가 형식 변환하려는 대상 변수의 용량보다 큰 경우 오버플로우가 발생한다.

 

* 크기(표현 범위)가 서로 다른 부동 소수점 형식 사이의 변환

정수 사이의 변환과 다르게 부동 소수점 형식의 특성상 오버플로우가 일어나지 않고 정밀성에 손상을 입는다.

변환할 때 10진수로 복원하고 다시 2진수로 변환하는 데 이진수로 표현하는 소수가 완전하지 않아 정밀한 수를 다루는 프로그램에서는 변환에 주의를 기울여야 한다.

* 부호 있는 정수 형식과 부호 없는 정수 형식 사이의 변환

* 부동 소수점 형식과 정수 형식 사이의 변환

부동 소수점 형식의 변수를 정수 형식으로 변환하면 데이터에서 소수점 아래는 버리고 소수점 위의 값만 남긴다.

* 문자열과 숫자 사이의 변환

C#이 정수 계열 형식과 부동 소수점 형식에게 넣어준 “Parse()”라는 메소드에 숫자로 변환할 문자열을 넘기면 숫자로 변환해 준다.

ex) int a = int.Parse( “12345” );

float b = float.Parse( “123.45” );

정수 계열이나 부동 소수점 형식은 ToString() 메소드를 자신이 가진 숫자를 문자열로 변환하도록 재정의했다.

ex) int c = 12345;

string d = c.ToString();

 

상수와 열거 형식

변수와 달리 안에 담긴 데이터를 절대 바꿀 수 없는 메모리 공간이다.

이를 사용하면 컴파일러가 소스 코드를 컴파일할 때 프로그래머의 실수를 잡아주고 버그를 줄여준다.

* 상수 : 변수의 선언과 비슷하며 데이터 형식 앞에 const 키워드가 위치하고 상수가 가져야 하는 데이터를 반드시 대입해줘야 한다.

ex) const 자료형 상수명 = ;

* 열거 형식 : 같은 범주에 속하는 여러 개의 상수를 선언할 때 유용하고 enum 키워드를 사용한다.

ex) enum 열거 형식명 : 기반자료형 { 상수1, 상수2, 상수3,... }

기반자료형은 정수 계열만 사용할 수 있으며 생략할 경우 컴파일러가 int를 사용한다.

열거 형식에서 아무것도 지정하지 않은 경우에 순서대로 0, 1, 2라는 식으로 컴파일러가 자동으로 할당한다.

열거 형식의 요소가 어떤 값을 갖느냐보다 서로 중복되지 않은 값을 갖는 것이 더 중요하기 때문이다.

@ DialogResult : 열거 형식의 다른 형식으로 헷갈릴 위험이 적고 고치기도 쉽다.

ex) DialogResult result = DialogResult.YES;

 

Nullable 형식

Null(비어 있는) + able(될 수 있는) 비어 있는 상태가 될 수 있는 형식이라는 뜻.

값 형식만 사용할 수 있으며 참조 형식은 사용할 수 없다.

모든 Nullable 형식은 HasValueValue 두 가지 속성을 갖고 있다.

ex) 데이터형식? 변수이름;

* null : 해당 변수를 비운다는 뜻의 문장

* HasValue 속성 : 해당 변수가 값을 갖고 있는지 또는 그렇지 않은 지를 나타낸다.

* Value 속성 : 변수에 담겨 있는 값을 나타낸다.

 

var 키워드

C#은 강력한 형식 검사를 하는 언어인 데 프로그래머의 실수를 줄여주는 장점이 있다. 하지만 코드를 작성하는 단 계에서는 약한 형식 검사가 더 편리하기 때문에 var 키워드로 약한 형식 검사를 지원한다.

var 키워드로 변수를 선언하려면 반드시 선언과 동시에 초기화를 해줘야 한다.

var은 지역 번수로만 사용할 수 있고 클래스의 필드를 선언할 때 반드시 명시적 형식을 선언해야 한다.

ex) var a = 3;

var b = “Hello”;

* 지역 변수 : 코드 블록 안에서 선언되는 변수로 코드 블록이 종료되면 소멸된다.

 

 

공용 형식 시스템

.NET 프레임워크의 형식 체계의 표준으로 기본 데이터 형식과 복합 데이터 형식, 값 형식, 참조 형식을 아우르는 모든 체계가 공용 형식 시스템으로부터 왔다.

마이크로소프트에서 .NET 언어들끼리 서로 호환성을 갖도록 하기 위해 도입했다.

클래스 이름

C# 형식

C++ 형식

비주얼 베이직 형식

System.Byte

byte

unsigned char

Byte

System.SByte

sbyte

char

SByte

System.Int16

short

short

Short

System.Int32

int

int 또는 long

Integer

System.Int64

long

__int64

Long

System.UInt16

ushort

unsigned short

UShort

System.UInt32

uint

unsigned int 또는 unsigned long

UInteger

System.Uint64

ulong

unsigned __int64

ULong

System.Single

float

float

Single

System.Double

double

double

Double

System.Boolean

bool

bool

Boolean

System.Char

char

wchar_t

Char

System.Decimal

decimal

Decimal

Decimal

System.IntPtr

없음

없음

없음

System.UIntPtr

없음

없음

없음

System.Object

object

Object*

Object

System.String

string

String*

String

 

반응형