※ 데이터 형식
→ 기본 데이터 형식과 기본 데이터 형식을 부품으로 삼아 구성된 복합 데이터 형식이 있다.
→ 복합 데이터 형식의 종류에는 구조체와 클래스, 배열 등이 있다.
→ 데이터 형식은 값 형식과 참조 형식으로도 분류할 수 있다.
※ 변수
→ 데이터를 담는 일정 크기(데이터 형식에 따라 결정)의 공간
→ 데이터 형식(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의 보수법 : 부호와 절대값 방식은 0과 –0 두가지가 나오므로 만든 방식
→ 수 부분 비트를 채우고 전체 비트를 반전시킨 뒤 반전된 비트에 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 형식은 HasValue와 Value 두 가지 속성을 갖고 있다.
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 |
'교외활동 > 공모전' 카테고리의 다른 글
제4회 나만의 국어사전 뜻풀이 공모전 (0) | 2018.08.03 |
---|---|
연산자 (0) | 2018.05.30 |
객체 지향 프로그래밍 (C#) (0) | 2018.05.23 |
2017 KEPCO 대학생 서포터즈 (한국전력공사) 피드백 (0) | 2018.05.22 |
바이로봇 패트론 (전기학회 미니드론 자율비행 경진대회) (Byrobot petrone) 후기 및 피드백 (3) (0) | 2018.05.17 |