Language/C# [C#] Hello World, 기본 자료형
  • 728x90
    반응형

    Hello World, 기본 자료형


     

    목차

       

      C# Hello, World

      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Text;
      using System.Threading.Tasks;
      
      namespace ConsoleApp
      {
          class Program
          {
              static void Main(string[] args)
              {
                  Console.WriteLine("Hello, world!");
                  Console.Write("Hello, world!\n");
              }
          }
      }

       

      결과)

      Hello, world!
      계속하려면 아무 키나 누르십시오...

       

       

      using

      using은 말 그대로 '사용하다' 라는 의미를 가지고 있다.

      using System;

       

      네임스페이스 System을 사용한다는 말과 같다. using을 이용하면 전체 이름을 참조하지 않고 선언된 네임스페이스 내부 개체들에 접근할 수 있어 불필요한 타이핑을 막아준다.

      (using은 C언어의 include와 유사하다.)

       

       

      namespace

      📌 네임스페이스(namespace)는 관련된 구조체, 클래스, 델리게이트, 인터페이스 등을 그룹화 한것을 의미한다.

       

      클래스(class)는 크게 두가지로 나뉘는데, 필드(field)와 메소드(method)로 나뉘게 되는데 필드는 정적인 상태를, 메소드는 동적인 기능을 표현한다. 독립적으로 존재할 수 있는 최소 단위 이며, 이 하나의 클래스를 가지고도 여러 개의 객체(object)를 만들어낼 수 있다.

       

       

      main

      📌 static void Main는 메소드(method)이며, 메인(main) 메소드는 그중에서 가장 중요한 메소드 이며, 프로그램의 최초의 진입점(Entry Point)을 나타낸다.

       

      모든 프로그램에는 메인 메소드가 반드시 존재해야하며, 메인 메소드가 시작되면 프로그램이 시작되며, 종료되면 프로그램도 같이 종료된다. static는 한정자로 정적인 메소드를 의미하며, void는 반환 형식으로 변화 값이 없음을 의미한다.

      (method는 C언어의 함수-Function와 같다.)

       

       

       

      기본 자료형(Primitive Types)

      📌 C#에서 제공하는 기본 자료형들 중 하나인 정수 형식, 실수 형식, 참과 거짓을 가리는 논리 형식 등을 아래의 표를 참조

       

      구분 데이터 형식 크기(Byte) 값의 범위
      정수 byte 1 0~255
      정수 sbyte 1 -128~127
      정수 short 2 -32,768~32,767
      정수 ushort 2 0~65535
      정수 int 4 -2,147,483,648~2,147,483,647
      정수 uint 4 -2,147,483,648~2,147,483,647
      정수 long 8 -922,337,203,685,477,508~922,337,203,683,477,507
      정수 ulong 8 0~18,446,744,073,709,551,615
      문자 char 2 -128~127
      실수 float 4 -3.402823e38~3.402823e38
      실수 double 8 -1.79769313486232e308~1.79769313486232e308
      실수 decimal 16 ±1.0x10e-28~±7.9x10e28
      문자열 string    
      논리 bool 1 true, false
      객체 object    

       

      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Text;
      using System.Threading.Tasks;
      
      namespace ConsoleApp
      {
          class Program
          {
              static void Main(string[] args)
              {
                  byte a = 200;
                  sbyte b = -126;
                  short c = 30000;
                  ushort d = 40000;
                  int e = 10000000;
                  uint f = 100000000;
                  long g = 1000000000000000000;
                  ulong h = 10000000000000000000;
      
                  float i = 123.567891011f;
                  double j = 1234.5678910111213;
                  decimal k = 1234.56789101112131415161718m;
                  Console.WriteLine("a={0}, b={1}, c={2}, d={3}, e={4}, f={5}, g={6}, h={7}", a, b, c, d, e, f, g, h);
                  Console.WriteLine("i={0}, j={1}, k={2}", i, j, k);
              }
          }
      }

       

      결과)

      a=200, b=-126, c=30000, d=40000, e=10000000, f=100000000, g=1000000000000000000, h=10000000000000000000
      i=123.5679, j=1234.56789101112, k=1234.56789101112131415161718
      계속하려면 아무 키나 누르십시오 . . .

       

      여기서 유의해야할 점은 float나 decimal 형식 같은 경우에는 맨 뒤에 f나 m같은 접미사가 붙는다는 점이다. 만약 위의 코드에서 접미사를 빼버린다면 아래와 같은 에러가 발생하게 된다.

       

      💡 오류 CS0664 double 형식의 리터럴을 암시적으로 'float' 형식으로 변환할 수 없습니다. 이 형식의 리터럴을 만들려면 'F' 접미사를 사용하세요.
      💡 오류 CS0664 double 형식의 리터럴을 암시적으로 'decimal' 형식으로 변환할 수 없습니다. 이 형식의 리터럴을 만들려면 'M' 접미사를 사용하세요.

       

       

      🔔 예제)

      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Text;
      using System.Threading.Tasks;
      
      namespace ConsoleApp
      {
          class Program
          {
              static void Main(string[] args)
              {
                  object a = 12345678910;
                  object b = 12345.67891011;
                  object c = true;
                  object d = "안녕하세요";
      
                  Console.WriteLine("a={0}, b={1}, c={2}, d={3}", a, b, c, d);
              }
          }
      }

       

      결과)

      a=12345678910, b=12345.67891011, c=True, d=안녕하세요
      계속하려면 아무 키나 누르십시오 . . .

       

      object는 모든 자료형의 최상위 부모 클래스, 즉 C#에서 모든 객체들은 object 클래스로 부터 상속을 받는다. 간단히 표현하면 모든 자료형의 조상은 object이다. 그래서 위와 같이 모든 자료형에도 대입할 수 있다.

       

       

       

      서식 지정자(Format Specifier)

      📌 서식 지정자는 지정한 형식대로 문자열을 출력할 수 있도록 도와준다. 예를 들어, 서식 지정자를 통해 출력 너비를 정하거나, 정수를 16진수 표기로 나타낼 수 있다.

       

      인덱스(index)는 0부터 시작하는데 이는 위의 "a, b, a + b"와 같이 뒤에 열거된 값의 순서라고 생각하면 된다.

       

      서식 종류 사용 예 출력 예
      c / C 통화(Currency) {0:c} ₩12,345
      d / D 10진법(Decimal) {0:d} 12345
      e / E 지수 표기법(Exponential Notation) {0:e} 1.2345000e+004
      f / F 고정 소수점(Fixed Point) {0:f} 12345.00
      g / G 일반(Genneral) {0:g} 12345
      n / N 숫자(Number) {0:n} 12,345.00
      x / X 16진법(Hexadecimal) {0:x} 3039
      p / P 백분율(Percentage) {0:p} 23.45%

       

      🔔 예제)

      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Text;
      using System.Threading.Tasks;
      
      namespace ConsoleApp
      {
          class Program
          {
              static void Main(string[] args)
              {
                  int a = 12345678;
                  double b = 12.345678;
      
                  Console.WriteLine("통화 (C): {0:C}", a);
                  Console.WriteLine("10진법 (D): {0:D}", a);
                  Console.WriteLine("지수 표기법 (E): {0:E}", b);
                  Console.WriteLine("고정 소수점 (F): {0:F}", b);
                  Console.WriteLine("일반 (G): {0:G}", a);
                  Console.WriteLine("숫자 (N): {0:N}", a);
                  Console.WriteLine("16진법 (X): {0:X}", a);
                  Console.WriteLine("백분율 (P): {0:P}", a);
              }
          }
      }

       

      결과)

      통화 (C): 12,345,678
      10진법 (D): 12345678
      지수 표기법 (E): 1.234568E+001
      고정 소수점 (F): 12.35
      일반 (G): 12345678
      숫자 (N): 12,345,678.00
      16진법 (X): BC614E
      백분율 (P): 1,234,567,800.00%
      계속하려면 아무 키나 누르십시오 . . .

       

      사용자 지정 수치 서식 문자열(Custom Numeric Format Strings)에 대해서는 아래 표를 참고 한다.

      아래어서 0과 #의 차이를 비교하면 0자리 표시(0)는 서식 문자열에서 0이 있는 위치에 숫자가 있다면 숫자를 그대로 출력하고, 그렇지 않다면 0을 출력한다. 10진수 자리 표시(#)는 서식 문자열에서 #이 있는 위치에 숫자가 있다면 숫자를 그대로 출력하는 것은 같지만, 숫자가 없을 경우에는 아무것도 표시하지 않는다.

       

      서식 종류 사용 예 출력 예
      0 0 자리 표시 {0:00.0000} 12345.1200
      # 10진수 자리 표시 {0:#.##} 12345.12
      . 소수점 {0:0.0} 12345.12
      , 천 단위 자릿수 표시 {0:0,0} 12,345
      % 백분율 자리 표시 {0:0%} 1234512%
      e 지수표기법 {0:00e+0} 12e+3

       

      🔔 예제)

      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Text;
      using System.Threading.Tasks;
      
      namespace ConsoleApp
      {
          class Program
          {
              static void Main(string[] args)
              {
                  int a = 1234;
                  double b = 12.345678;
      
                  Console.WriteLine("0자리 표시 (0): {0:00000}", a);
                  Console.WriteLine("10진수 자리 표시 (#): {0:#####}", a);
                  Console.WriteLine("소수점 (.): {0:0.00000}", b);
                  Console.WriteLine("천 단위 자릿수 표시 (,): {0:0,0}", a);
                  Console.WriteLine("백분율 자리 표시 (%): {0:0%}", b);
                  Console.WriteLine("지수 표기법 (e): {0:0.000e+0}", b);
                  
                  
              }
          }
      }

       

      결과)

      0자리 표시 (0): 01234
      10진수 자리 표시 (#): 1234
      소수점 (.): 12.34568
      천 단위 자릿수 표시 (,): 1,234
      백분율 자리 표시 (%): 1235%
      지수 표기법 (e): 1.235e+1
      계속하려면 아무 키나 누르십시오 . . .

       

      출력 너비를 지정하고, 값을 왼쪽 정렬하거나 오른쪽 정력하는 예제는 아래와 같다.

       

      🔔 예제)

      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Text;
      using System.Threading.Tasks;
      
      namespace ConsoleApp
      {
          class Program
          {
              static void Main(string[] args)
              {
                  int a = 12345;            
      
                  Console.WriteLine("|{0,15}|", a);
                  Console.WriteLine("|{0, -15}|", a);
                  Console.WriteLine("|{0, 15:N0}|", a);
                  Console.WriteLine("|{0, -15:N0}|", a);                                            
              }
          }
      }

       

      결과)

      |          12345|
      |12345          |
      |         12,345|
      |12,345         |
      계속하려면 아무 키나 누르십시오 . . .

       

      위의 코드에서 출력 너비를 그대로 적었을 경우 오른쪽 정렬이 되고, 출력 너비 앞에 -를 적었을 때에는 왼쪽 정렬이 되는것을 알 수 있다. 또한 출력 너비 지정은 서식 문자열과 같이 사용할 수 있다.

       

       

      형식 변환(Type Conversion)

      📌 형식 변환이한 특정 형식의 값을 우리가 원하는 형식의 값으로 변환하는 것을 말한다. 여기에서는 정수와 실수 간의 형식 변환, 실수와 정수를 문자열로 표현하는 방법 역으로 문자열을 실수와 정수로 변환하는 방법에 대해서 알아본다.

       

      🔔 예제) 정수와 실수 간의 형식 변환

      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Text;
      using System.Threading.Tasks;
      
      namespace ConsoleApp
      {
          class Program
          {
              static void Main(string[] args)
              {
                  int a = 500;
                  float b = a;    // 암시적 변환으로 별도의 구문이 필요하지 않음
      
                  Console.WriteLine("a={0}, b={1}", a, b);
      
                  double c = 123.45;
                  int d = (int)c;
      
                  Console.WriteLine("c={0}, d={1}", c, d);                       
              }
          }
      }

       

      결과)

      a=500, b=500
      c=123.45, d=123
      계속하려면 아무 키나 누르십시오 . . .

       

      주석부분의 정수를 실수로 변환하는 것은 데이터 손실이 없으므로 암시적 변환(Implicit conversions)이 이루어 진다.

      여기서 암시적 변환이란 일반적으로 형식 변환이 안전하고 데이터 손실의 우려가 없을 경우 컴파일러에 의해 수행되는 변환을 말한다.

       

      반대로 실수를 정수로 바꾸는 과정에서 소수점 이하는 모두 버려지면서 데이터 손실이 발생하게 된다. 손실 여부와는 상관없이 형식 변환을 하고 싶은 경우에는, 명시적 변환(Explicit conversions)을 사용하여 실수를 정수로 바꾸어야 한다.

       

      🔔 예제)

      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Text;
      using System.Threading.Tasks;
      
      namespace ConsoleApp
      {
          class Program
          {
              static void Main(string[] args)
              {
                  int a = 500;
                  float b = 60.44f;
                  string c = a.ToString();
                  string d = b.ToString();
      
                  Console.WriteLine("a={0}, b={1}, c={2}, d={3}", a, b, c, d);
      
                  string e = "123";
                  string f = "123.456";
                  int g = int.Parse(e);
                  float h = float.Parse(f);
                              
                  Console.WriteLine("e={0}, f={1}, g={2}, h={3}", e, f, g, h);
              }
          }
      }

       

      결과)

      a=500, b=60.44, c=500, d=60.44
      e=123, f=123.456, g=123, h=123.456
      계속하려면 아무 키나 누르십시오 . . .

       

      ToString() 메소드는 특정 형식의 값을 문자열 형식으로 바꿔주는 역할을 한다. 그리고 Parse() 메소드를 통해 문자열을 정수나 실수로 바꿔줄 수도 있다.

       

       

       

      상수(Constant)

      📌 const 키워드를 사용하게 되면 한번 초기화 된 값은 절대 변하지 않는다.

       

      🔔 예제)

      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Text;
      using System.Threading.Tasks;
      
      namespace ConsoleApp
      {
          class Program
          {
              static void Main(string[] args)
              {
                  const int a = 50;
      
                  Console.WriteLine(a);
              }
          }
      }

       

      결과)

      a=500, b=60.44, c=500, d=60.44
      e=123, f=123.456, g=123, h=123.456
      계속하려면 아무 키나 누르십시오 . . .

       

      위 예제에서의 상수 a의 값을 변경하게 되면 아래와 같은 에러가 발생하게 된다.

       

       

      🔔 예제)

      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Text;
      using System.Threading.Tasks;
      
      namespace ConsoleApp
      {
          class Program
          {
              static void Main(string[] args)
              {
                  const int a = 50;
                  a = 60; // 오류 발생
      
                  Console.WriteLine(a);
              }
          }
      }

       

      💡 오류 CS0131 할당식의 왼쪽은 변수, 속성 또는 인덱서여야 합니다.

       

      상수의 값은 변경이 불가능한 것을 확인할 수 있다. 아래와 같이 상수의 선언과 초기화를 분리하면 아래와 같은 에러가 발생하게 된다.

       

       

      🔔 예제)

      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Text;
      using System.Threading.Tasks;
      
      namespace ConsoleApp
      {
          class Program
          {
              static void Main(string[] args)
              {
                  const int a;
                  a = 60;     // 오류 발생
      
                  Console.WriteLine(a);
              }
          }
      }

       

      💡 오류 CS0145 const 필드에 값을 입력해야 합니다.
      💡 오류 CS0131 할당식의 왼쪽은 변수, 속성 또는 인덱서여야 합니다.

       

      const 키워드의 특징을 정리해 보면 선언과 동시에 초기화를 하여야 하며 초기화가 된 후로부터는 값의 변경이 불가능한 것을 알 수 있다.

       

       

       

      728x90
      반응형

      'Language > C#' 카테고리의 다른 글

      [C#] 클래스(Class), 접근 제한자(Access Modifier), this  (0) 2019.09.06
      [C#] 배열(Array)  (0) 2019.09.06
      [C#] foreach, Method  (1) 2019.09.06
      [C#] 연산자(Operators)  (0) 2019.09.06
      .NET Framework, .NET Core, Xamarin 차이점  (0) 2019.09.05
    상단으로