본문 바로가기

C#/이것이 C#이다

3장. 데이터 보관하기: 자료형, 배열, 형 변환, 형식 확인, 입출력

반응형

변수 선언

a를 변수, a에 저장된 값을 리터럴이라고 한다.

int a = 30, b = 40, c = 50; // int a, b, c; 도 가능하다.
a = b = c = 10;

 


데이터 형식


정수

- sbyte: 부호 있는 8bit 정수

- byte: 부호 없는 8bit 정수

- short: 부호 있는 16bit 정수

- ushort: 부호 없는 16bit 정수

- int: 부호 있는 32bit 정수

- uint: 부호 없는 32bit 정수

- long: 부호 있는 64bit 정수

- ulong: 부호 없는 64bit 정수

- char: 16bit 문자

주의) char과 string은 다르다!
char형은 문자로, 작은따옴표('')로 글자를 묶고, string형은 문자열로, 큰 따옴표("")로 글자를 묶는다.

 

부동소수점

- float: 4byte(7자리) ... 3.14f로 표현

- double: 8byte(15~16자리) ... 3.14로 표현

- decimal: 16byte(29자리) ... 3.14m으로 표현

 

오브젝트 (object)

object: 모든 데이터 형식을 담을 수 있음

모든 데이터 형식이 object 형식을 상속받았기 때문이다.

 

var 키워드

var를 사용하면 해당 변수의 타입을 추론하여 알아서 형식을 정해 준다.

var q = "name";

 

열거 형식

서로 중복되지 않는 값을 가진 상수 모음

enum DialogResult
{
    YES = 10,
    NO,
    CANCEL,
    CONFIRM,
    OK
}
enum DialogResult
{
    YES = 1,
    NO = 2,
    CANCEL = 3,
    CONFIRM = 4,
    OK = 5
}

// 위처럼 명시하지 않아도 아래처럼 자동으로 할당된다.
enum DialogResult
{
    YES,
    NO,
    CANCEL,
    CONFIRM,
    OK
}

 

상수 (const)

값 재할당이 불가능한  상수, const 키워드를 통해 선언한다.

const int o = 1234;
o = 4321 // Error 발생

 

배열 (Array)

C#의 배열은 크기 지정이 필요하다.

int[] arr_sample = new int[5];

배열에 값 할당

Array[index] = 값;

배열의 길이

arr_sample.Length

 

리스트(List)

크기 지정이 필요 없는 배열 형태의 자료구조이다.

List<int> list = new List<int>();
list.Add(값);

리스트를 배열로 변환

arr_sample = list.ToArray(); // list를 array로

 

구조체

클래스와 비슷한 형식의 자료구조이다.

struct 구조체 이름 {
	// 필드
    // 메소드
}

 

튜플

간단한 형식의 순서가 없는 자료구조이다.

tuple = (123, 789); // 명명되지 않은 튜플
tuple - (Name: "박상현", Age: 17); // 명명된 튜플

 


데이터 형식 확인 (GetType())


int value = 10;
value.GetType().Name; // 속성의 이름 System.Int32 출력 
value.GetType().ToString(); // 속성의 이름 System.Int32 출력

해당 형식의 기본값 확인 (default)

default(bool) // false 출력
default(int) // 0 출력
default(string) // null 출력

 

 


형 변환


숫자 -> 숫자는 가능하지만, 문자열 -> 숫자는 불가능하다.

sbyte m = 127;
int n = (int)m;

1) 정수 형식 사이의 변환: 크기가 큰 자료형의 변수를 작은 자료형에 담을 경우 오버플로우 발생 (128(int) => -128(sbyte))

2) 부동소수점 형식 사이의 변환: 정밀성의 손상 발생 (0.1(float) => 0.100001490116(double))

3) 부호있는 형식과 부호없는 형식의 변환: 언더플로우 발생 (-20(int) => 422967266(uint))

4) 부동소수점을 정수로 변환: 내림으로 됨 (0.9(float) => 0(int), 0.1(float) => 0(int))


 

연산자


1) 산술연산자: + - * / %

2) 증감연산자: ++ --

3) 관계연산자: < > <= >= == !=

4) 논리연산자: && || !

5) 삼항연산자: 조건 ? 참 : 거짓

6) 널 조건부 연산자(nullable): ? 

7) 널 집합 연산자: ??

int? avg = null; // avg에 null 값을 허용
Console.WriteLine(avg?.ToString() ?? "없음");
// null 값을 허용하는 avg가 null이 아닐 경우, avg는 avg.ToString이고
// avg가 null일 경우, avg는 "없음"임

8) 비트연산자: << >> & | ^ ~

9) 할당연산자: = += -= *= /= %= &= |= ^= <<= >>=

 

 


입력과 출력


Console.ReadLine으로 입력받을 때

바로 숫자로 할당은 불가능하다. 무조건 string으로만 입력받을 수 있는 듯 하다.

 

Console.WriteLine으로 출력할 때

Console.WriteLine("{0} {1}", a, b);
Console.WriteLine($"{a} {b}");
Console.WriteLine(string.Format("{0} {1}", a, b));

위와 같이 다양한 방식으로 출력 가능하다.

 

String.Format() 함수

String.Format("{0,-10}DEF", "ABC"); //"ABC    DEF"
String.Format("{0,10}DEF", "ABC"); //"    ABCDEF"

string fmt = String.Format("{0,-20}{1,-15}{2,30");
WriteLine(fmt, "Publishr ...");
// ...
// Publisher    Author              Title
// Marvel       Stan Lee         Iron Man
// Hambit       Sanghyn Park  Programming

 

기타

- 숫자서식화: D, X, N, F, E 등

- 날짜: new DateTime(2012, 11, 3, 28, 18, 22);

반응형