Day 5
자주 쓰이는 데이타 타입들
지금까지 가장 많이 쓰이는 정수형 int, 문자열 string 등을 사용하였는데, C# 에는 이외에도 다양한 타입들이 있다.
정수형 int 는 그 크기가 32비트 (4바이트)이므로 -2,147,483,648 부터 2,147,483,647 까지의 수를 가질 수 있는데,
이보다 더 큰 숫자를 저장하기 위해서는 64비트(8바이트)인 long 을 사용할 수 있다.
또한 소수점이 있는 숫자의 경우 float (32비트), double (64비트), decimal (128비트)를 사용할 수 있는데,
크기가 클수록 더 큰 숫자를 저장할 수 있다.
이외에도 중요한 타입으로 true 혹은 false 만 저장하는 bool, 8비트 즉 1 바이트를 저장하는 byte, 그리고 모든
타입의 데이타를 저장할 수 있는 object 타입이 있다. object는 모든 타입을 저장할 수 있으므로 편해 보일 수 있지만,
이를 불필요하게 사용하면 성능이 저하되거나 프로그래밍 타입 오류를 일찍 잡아 내지 못하는 단점이 있으므로 꼭 필요한 경우만 사용한다.
(각 데이타 타입에 대한 Spec은 C# 데이타 타입 링크를 참고)
실습
다양한 타입을 사용해 본다. 즉, long, float, double, decimal, bool, byte, object 타입을 사용해 본다.
using System; namespace Day5 { class Program { static void Main(string[] args) { // 긴 정수 long a = 123456789011; // 소수점 숫자 float b = 123.456F; double c = 123.456; //혹은 123.456D; decimal d = 123.456M; // 부울린 bool x = true; x = 12 == 11; // false // 바이트 byte f = 0xFF; // 0x는 16진수를 의미. 0xFF = 255 // 오브젝트: 다양한 데이타 저장 가능 object o = 123; o = "ABC"; o = true; } } }
- 위에서 long a 는 int 최대치를 초과한 값을 저장하고 있다
- 123.456 처럼 코드에 직접 숫자를 표기하는 것을 리터럴(literal)이라 한다. 소수점 리터럴은 디폴트로 double 타입이다. 소수점을 float 변수에 할당하기 위해서는 숫자뒤에 F 접미어를 쓰고, decimal 변수에 할당하기 위해서는 M을 붙인다. double 변수에 할당하기 위해서는 D 접미어를 붙일 수 있으나 보통 생략한다.
- bool x = (12 == 11) 은 12가 11과 같지 않으므로 x 는 false를 갖는다
- object 타입은 모든 데이타 타입을 다 가질 수 있는 타입으로, 위와 같이 숫자를 가졌다가 문자열을 할당하거 bool 값을 할당할 수 있다.
조건문 switch
지금까지 조건문으로 if 조건문을 사용했는데, 한 변수의 값을 여러 개의 값들과 비교하는 보다 간편한 조건문으로 switch를 사용할 수 있다. switch 문은 조건값이 여러 단일 값들을 가질 경우 각 case 별 다른 문장들을 실행할 때 사용된다. 각각의 경우에 해당하는 값을 case 문 뒤에 지정하며, 어떤 경우에도 속하지 않는 경우는 default 문을 사용해 지정한다. 각 case문 내에서 break 문을 사용하게 되면 switch 문을 빠져 나오게 된다.
실습
에러코드를 입력받아 그에 상응하는 에러메서지를 리턴하는 함수를 switch 문을 써서 작성해 본다.
using System; namespace Day5 { class Program { static void Main(string[] args) { int errorCode = 1200; string s = ErrorDescription(errorCode); Console.WriteLine(s); } static string ErrorDescription(int errorCode) { string desc; switch (errorCode) { case 1100: desc = "입력 데이타가 없습니다"; break; case 1200: desc = "잘못된 입력값입니다"; break; case 1300: desc = "입력 범위를 초과하였습니다"; break; default: desc = "Unknown Error"; break; } return desc; } } }
- switch 다음의 괄호 안에는 int, string 등 다양한 타입의 변수를 사용할 수 있다
- 각 case문은 순차적으로 실행되고, break 문을 만나면 switch문을 빠져나온다
- 마지막의 default문은 상단의 모든 case 문에 해당 사항이 없을 때 실행된다
반복문 foreach, while, do...while
지금까지 반복문으로 for만을 사용했었는데, 또다른 반복구문으로 foreach, while, do...while 문을 들 수 있다. foreach는 데이타의 집합 즉 컬렉션(Collection)에 사용하는데, 배열이나 리스트 등의 컬렉션으로부터 데이타 요소를 하나씩 가져와서 루프를 돌게 된다. while 문은 while 뒤의 조건이 참일 때 계속 루프를 도는 반복문이며, do...while은 while 과 비슷하나 do 와 while 안의 블럭을 먼저 한번 실행하고 while 뒤의 조건을 체크한다는 점이 다르다. do...while에서 while 조건식이 참이면 계속 do 와 while 사이의 블럭을 실행하게 된다.
실습
배열을 foreach 를 사용하여 출력해 보고, while 문으로 1부터 100까지 합계를 구해 본다. 또한 간단히 do...while 문 반복구문을 테스트해 본다.
using System; namespace Day5 { class Program { static void Main(string[] args) { // 배열을 foreach 를 사용하여 출력 string[] s = { "Jim", "Sam", "Kim", "Park" }; foreach (string x in s) { Console.WriteLine(x); } // while문으로 1부터 100까지 합계 구하기 int sum = 0; int i = 1; while (i <= 100) { sum = sum + i; i++; } Console.WriteLine(sum); // do...while 을 사용한 반복문 // 아래는 while 문이 거짓이 되지만 // Hello를 한번은 출력함 int j = 0; do { Console.WriteLine("Hello"); j++; } while (j < 0); } } }
- 위의 foreach문에서 in 다음의 s 는 문자열 배열로서 컬렉션으로부터 하나씩 가져와 in 앞의 변수 s 에 넣는다. 즉, 루프 처음에는 첫번째 배열요소인 Jim 문자열을 변수 x 에 넣고 루프 블럭을 실행하고, 다음 루프에서는 두번째 배열요소인 Sam을 변수 x 에 넣고 루프 블럭을 실행한다. 이러한 방식으로 모든 배열 요소를 차례로 가져와 루프 블럭을 실행한다.
- for 루프가 루프를 돌기 위한 변수 및 조건식, 변수증감 등을 모두 한 문장에 갖는 것과는 달리, while 문은 while 뒤의 조건이 맞으면 while 블럭을 실행하는 것으로 일반적으로 초기변수 설정은 while 문 바깥에서 그리고 (만약 필요하면) 증감 등의 변경을 블럭 안에서 실행한다.
- do...while 문은 do 와 while 문 사이의 블럭을 최소한 한번을 실행하고 while 문을 체크한다는 점이 while 문과 다르다.
예외처리: try...catch
C# 에서 에러 Exception이 발생하면 (그리고 이를 핸들링하지 않으면) 프로그램이 Crash하게 된다. try {...} catch {...} 는 try 안의 블럭이 실행되는 동안 에러가 발생하면 이 에러를 catch에서 잡아서 catch 블럭의 문장들을 실행하게 하는 것이다. 일반적으로 catch 블럭에서는 에러를 로깅하거나 중요하지 않은 경우 무시하거나 혹은 에러를 다시 편집해서 실행을 진행시킬 수 있다.
실습
어떤 수를 0으로 나누는 테스트 코드를 작성해 본다. 어떤 수를 0으로 나누면 에러가 발생하게 되는데, 이를 try...catch 를 써서 사용자가 다시 정의한 에러 메시지를 출력하도록 한다.
using System; namespace Day5 { class Program { static void Main(string[] args) { int a = 100; int b = 0; try { int c = a / b; Console.WriteLine(c); } catch (Exception ex) { Console.WriteLine("Error: " + ex.Message); } } } }
- 위 코드에서 변수 b가 0 이므로 c = a / b 문장에서 DivideByZeroException 에러를 발생시킨다. 그런데 이 나누기 문장이 try 블럭 안에 있으며 에러 발생시 catch 부분으로 가게 되고 Exception은 변수 ex 에 담기게 된다. Exception은 모든 Exception을 담을 수 있는 상위 Exception이다.
Homework
- A,B,C,D,F 성적등급을 받아들여 각 성적등급의 점수 범위를 리턴하느 함수를 작성하시오. 예를 들어, 함수는 입력이 "A" 이면 "점수범위는 90부터 100" 이라는 문자열을 리턴한다.
- 복수 라인을 갖는 데이타 파일을 읽어 (File.ReadAllLines 사용) 이를 문자열 배열에 넣고, foreach 를 사용하여 각 라인을 출력하는 코드를 작성하시오.
본 웹사이트는 광고를 포함하고 있습니다. 광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.