C# 초보 캠프

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

  1. A,B,C,D,F 성적등급을 받아들여 각 성적등급의 점수 범위를 리턴하느 함수를 작성하시오. 예를 들어, 함수는 입력이 "A" 이면 "점수범위는 90부터 100" 이라는 문자열을 리턴한다.
  2. 복수 라인을 갖는 데이타 파일을 읽어 (File.ReadAllLines 사용) 이를 문자열 배열에 넣고, foreach 를 사용하여 각 라인을 출력하는 코드를 작성하시오.



본 웹사이트는 광고를 포함하고 있습니다. 광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.