1. 목표


연산자의 종류와 이해

디버그 모드 사용해 보기

분기문의 종류와 이해


2. 연산자의 종류


 종류

연산자 

 사용법

  이항 연산자

 +, -, *, /, % 

 a = b + c

  복합 할당 연산자

 +=, -=, *=, /=, %= a += b

  논리 연산자

 >, <, >=, <=, ==, !=

 a > b

  이항 논리 연산자

 &&, ||, !

 a && b

  비트 이항 연산자

 &, |, ^, <<, >>

 a >> b

  증감 연산자

 ++, --

 ++a, a++

  삼항 연산자

 ? :

 (a > b) ? a : b


프로그래밍에서 많은부분 기본 수학의 계산방식과 동일하고 연산 순서는 왼쪽에서 오른쪽으로 우선 연산 되고

일부 복합 할당 연산(+=, -=...), 전위(++a, --a), 단항 형식은 일부 오른쪽에서 왼쪽으로 연산 됩니다.

자세한 사항은 코드와 함께 알아보도록 하겠습니다.


3. 실습


이항 연산자
using System;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            //이항 연산자
            //+, -, *, /, % 
            int a = 28;
            int b = 10;
            
            Console.WriteLine("{0} + {1} = {2}", a, b, a + b);
            Console.WriteLine("{0} - {1} = {2}", a, b, a - b);
            Console.WriteLine("{0} * {1} = {2}", a, b, a * b);
            Console.WriteLine("{0} / {1} = {2}", a, b, a / b);
            Console.WriteLine("{0} % {1} = {2}", a, b, a % b);

            //C# 에서는 다른 언어와 다르게 실수 % 연산이 됩니다.
            float f1 = 3.141592f;
            float f2 = 2.141592f;
            float result = f1 % f2;
            Console.WriteLine("{0} % {1} = {2}", f1, f2, result);
        }
    }
}

결과

28 + 10 = 38

28 - 10 = 18
28 * 10 = 280
28 / 10 = 2

28 % 10 = 8

3.141592 % 2.141592 = 1
 


코드내에 주석과 마찬가지로 C#에서는 다른 언어와 다르게 실수 % 연산이 됩니다.

실수의 나머지 연산에서 나머지의 결과 값은 몫이 정수일때의 나머지 값을 의미합니다.


복합 할당 연산자

using System;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            //복합 할당 연산자
            //+=, -=, *=, /=, %=
            int a = 28;
            int b = 10;
            
            Console.WriteLine("{0}", a += b);
            Console.WriteLine("{0}", a -= b);
            Console.WriteLine("{0}", a *= b);
            Console.WriteLine("{0}", a /= b);
            Console.WriteLine("{0}", a %= b);
        }
    }
}

결과

38
28
280

28

8
 


복합 할당 연산자의 경우 값을 할당함에 있어 a 와 b 의 연산이후 다시 a에 값을 재할당 하는것을 의미합니다.

a = a+b 와 같은 결과 값을 가집니다. 재할당의 기준은 왼쪽 피연산자에게 연산이후 재할당 합니다.


값의 변화에 대해 디버깅을 통해 하나씩 확인해 봅시다.

강좌 2장에서 언급한 디버그 모드의 기능을 활용하면 쉽게 값의 변화를 알수 있습니다.

이 기능은 프로그램에 버그가 발생하였을때 자주 사용하는 기능으로 매우 중요합니다.




디버그 모드

 디버깅을 하고 싶은 곳에 클릭

② F9번을 누르면 왼쪽에 붉은색 브레이크 포인트가 생성

③ 디버그 모드인 F5번을 누르면 프로그램 시작과 함께 브레이크 포인트가 있는 곳에서 코드 실행 정지

    값이 보고싶은 변수위에 마우스를 올려 놓으면 값을 확인가능

④ 디버그 모드일때 주변 인터페이스가 변경 되는것을 확인 할수 있는데 하단에 조사식1 탭을 사용하여

    변수의 값을 추적하며 확인할수 있음 ( 변수를 클릭 드래그하여 블럭을 씌운뒤 조사식1 탭으로 옴겨놓음)


※ 코드가 실행 정지 되었을때 다시 F5번을 누르면 다음 브레이크 포인트로 이동이 됩니다.

디버그 모드일때 추가로 확인하고 싶은 곳이 있다면 해당 위치를 클릭후 F9을 눌러 브레이크 포인트를

추가하실수 있습니다. 코드 실행이 정지된 상태에서 F10을 누르면 다음 라인까지 코드실행 F11을 누르면

다음 라인까지 코드가 실행되지만 다른 참조된 라이브러리까지 차례로 들어가서 코드가 실행되는 것을

확인하실수 있습니다.


논리 연산자

using System;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            //논리 연산자
            //>, <, >=, <=, ==, !=
            int a = 1;
            int b = 2;
            int c = 2;

            Console.WriteLine("a > b = {0}", a > b);
            Console.WriteLine("a < b = {0}", a < b);
            Console.WriteLine();

            Console.WriteLine("a >= b = {0}", a >= b);
            Console.WriteLine("a <= b = {0}", a <= b);
            Console.WriteLine("b <= c = {0}", b <= c);
            Console.WriteLine();

            Console.WriteLine("a == b = {0}", a == b);
            Console.WriteLine("b == c = {0}", b == c);
            Console.WriteLine("a != b = {0}", a != b);
            Console.WriteLine("b != c = {0}", b != c);
        }
    }
}

결과


 a > b = False

 a < b = True


 a >= b = False

 a <= b = True

 b <= c = True


 a == b = False

 b == c = True

 a != b = True

 b != c = False



※ 논리 연산 결과가 맞다면 True 틀리다면 False로 리턴됩니다.



이항 논리 연산자


논리곱( && : AND) 연산

두개의 값이 모두 True일 경우에만 True


논리합( || : OR) 연산

두개의 값중 하나라도 True이라면 True


부정( ! : NOT) 연산

True라면 False, False 라면 True


using System;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            //이항 논리 연산자
            //&&, ||, !
            Console.WriteLine("논리곱(AND) 참 && 참 = {0}", true && true);
            Console.WriteLine("논리곱(AND) 참 && 거짓 = {0}", true && false);
            Console.WriteLine("논리곱(AND) 거짓 && 참 = {0}", false && true);
            Console.WriteLine("논리곱(AND) 거짓 && 거짓 = {0}", false && false);
            Console.WriteLine();

            Console.WriteLine("논리합(OR) 참 || 참 = {0}", true || true);
            Console.WriteLine("논리합(OR) 참 || 거짓 = {0}", true || false);
            Console.WriteLine("논리합(OR) 거짓 || 참 = {0}", false || true);
            Console.WriteLine("논리합(OR) 거짓 || 거짓 = {0}", false || false);
            Console.WriteLine();

            Console.WriteLine("부정(!) !참 = {0}", !true);
            Console.WriteLine("부정(!) !거짓 = {0}", !false);
        }
    }
}

결과

 논리곱(AND) 참 && 참 = True

 논리곱(AND) 참 && 거짓 = False

 논리곱(AND) 거짓 && 참 = False

 논리곱(AND) 거짓 && 거짓 = False


 논리합(OR) 참 && 참 = True

 논리합(OR) 참 && 거짓 = True

 논리합(OR) 거짓 && 참 = True

 논리합(OR) 거짓 && 거짓 = False


 부정(!) !참 = False

 부정(!) !거짓 = True




비트 이항 연산자

비트 연산자를 알기에 앞서 컴퓨터의 최소 데이터 단위는 Bit로 0과 1을 사용하는 2진수을 사용합니다.

1byte의 데이터는 0000 0000과 같습니다.


using System;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            //비트 이항 연산자
            //&, |, ^, <<, >>
            byte a = 15;
            byte b = 5;
            string s = "";

            s = Convert.ToString(a, 2).PadLeft(8, '0');      //8자리의 비트로 표현하기 위해 사용한 코드
            Console.WriteLine("a     : {0}, Bit : {1} ", a, s);
            s = Convert.ToString(b, 2).PadLeft(8, '0');
            Console.WriteLine("b     : {0} , Bit : {1} ", b, s);
            Console.WriteLine();

            s = Convert.ToString(a&b, 2).PadLeft(8, '0');
            Console.WriteLine("a & b : {0} , Bit : {1} ", a & b, s);
            Console.WriteLine();

            s = Convert.ToString(a | b, 2).PadLeft(8, '0');
            Console.WriteLine("a | b : {0}, Bit : {1} ", a | b, s);
            Console.WriteLine();

            s = Convert.ToString(a ^ b, 2).PadLeft(8, '0');
            Console.WriteLine("a ^ b : {0}, Bit : {1} ", a ^ b, s);
            Console.WriteLine();

            s = Convert.ToString(a << 1, 2).PadLeft(8, '0');
            Console.WriteLine("a << 1 : {0}, Bit : {1}", a << 1, s);

            s = Convert.ToString(a << 2, 2).PadLeft(8, '0');
            Console.WriteLine("a << 2 : {0}, Bit : {1}", a << 2, s);
            Console.WriteLine();

            s = Convert.ToString(a >> 1, 2).PadLeft(8, '0');
            Console.WriteLine("a >> 1 : {0}, Bit : {1}", a >> 1, s);

            s = Convert.ToString(a >> 2, 2).PadLeft(8, '0');
            Console.WriteLine("a >> 2 : {0}, Bit : {1}", a >> 2, s);
        }
    }
}

결과

a        : 15,  Bit : 00001111

b        : 5 ,  Bit : 00000101


a & b  : 5 ,  Bit : 00000101


a  |  b : 15,  Bit : 00001111


a ^ b : 10,   Bit : 00001010


a << 1 : 30, Bit : 00011110

a << 2 : 60, Bit : 00111100


a >> 1 : 7, Bit : 00000111

a >> 2 : 3, Bit : 00000011


비트연산은 최고의 연산속도를 자랑합니다. 프로그램 최적화나 최소한의 데이터를 이용하여 연산을 하기위해 사용 합니다.

컴퓨터 입장에서는 다른 추상화된 정보와 달리 별도의 과정없이 의미가 해석되어 전달 되기때문에 빠를수 밖에 없습니다.


a(15) : 0000 1111,  b(5)  : 0000 0101


&(AND) : 양쪽의 비트가 1일때 1

 0000 1111

 0000 0101

 ---AND---

 0000 0101

 | (OR)   : 양쪽의 비트중 하나라도 1이면 1

 0000 1111

 0000 0101

 ----OR----

 0000 1111 

^ (XOR) : 양쪽의 비트가 달라야 1 

 0000 1111

 0000 0101

 ---XOR---

 0000 1111 

 << : 비트를 왼쪽으로 이동
이동한 비트는 0으로 채워짐

 0000 1111

 ----<<----

 0001 1110 

 >> : 비트를 오른쪽으로 이동

데이터 값을 넘어가는 비트는 삭제됨

 0000 1111

 ---->>----

 0000 0111 1(삭제)




증감 연산자

전위, 후위로 나뉘는데 기본적으로 ++는 값에 1을 증가 시키거나 1을 감소 시키는 연산자 입니다.

전위의 경우 값을 먼저 증가 시키고 코드가 실행되며 후위의 경우 코드가 실행되고 값이 증가 됩니다.

using System;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            //증감 연산자
            //++, --

            int a = 1;

            Console.WriteLine("현재 값      : {0}",   a);
            Console.WriteLine();

            Console.WriteLine("전위 증가 값 : {0}", ++a);
            Console.WriteLine("후위 증가 값 : {0}", a++);
            Console.WriteLine("현재 값      : {0}", a);
            Console.WriteLine();

            Console.WriteLine("전위 감소 값 : {0}", --a);
            Console.WriteLine("후위 감소 값 : {0}", a--);
            Console.WriteLine("현재 값      : {0}", a);
        }
    }
}

결과

현재 값       : 1


전위 증가 값 : 2 

후위 증가 값 : 2

현재 값        : 3


전위 감소 값 : 2

후위 감소 값 : 2

현재 값       : 1



삼항 연산자

코드를 짜다보면 가독성이라는 말을 많이 하게 됩니다. 코드가 한눈에 들어오고 읽기 편한 코드 형태를

가독성이 좋다라고 말합니다. 삼항 연산자는 가독성을 올리고 간단한 논리의 오류가 적어보일때 사용하면 좋습니다.


(논리) ? 논리가 참 일때 참조되는 값 : 논리가 거짓 일때 참조되는 값

using System;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            //삼항 연산자
            //? :
            int num1 = 10;
            int num2 = 20;
            int numTrue = 77;
            int numFalse = 88;
            
            int r = (num1 > num2) ? numTrue : numFalse;
            Console.WriteLine(r);
        }
    }
}

결과

88 



4. 분기문의 종류


 종류

짝을 이루는 문법

 

  if문

 if, else if, else

 a = b + c

  switch문

 switch, case, break, default

 a += b
if 문

if문과 짝이되는 문법 : if, else if, else

if (조건식 1) // 예) a > b
            {
                //조건식 1이 참인 경우 중괄호 안의 코드 실행
            }
            else if (조건식 2) //예) a < b
            {
                //조건식 1이 거짓이고 조건식 2가 참인 경우 중괄호 안의 코드 실행
            }
            else
            {
                //모든 조건식이 거짓인 경우 중괄호 안의 코드 실행
            }

if문은 다양하게 사용가능 합니다.

-if 단독으로 사용

-if, else if 사용 가능

-if, else 사용 가능

using System;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            int a = 10;
            int b = 20;

            if(a > b)
                Console.WriteLine("a는 b보다 크다");

            if(a > b)
                Console.WriteLine("a는 b보다 크다");
            else
                Console.WriteLine("a는 b보다 크지 않다");


            if(a == b)
            {
                Console.WriteLine("a와 b는 같다");
            }
            else if(a < b)
            {
                Console.WriteLine("b는 a보다 크다");
            }
            else
            {
                Console.WriteLine("a는 b보다 크다");
            }
        }
    }
}

결과

a는 b보다 크지 않다
b는 a보다 크다


if, else if, else의 중괄호 {, }는 제외가 가능하지만 한줄 이상의 코드에서는 오히려 가독성이 떨어지고 버그를 유발할수 있습니다.




switch 문

switch 문과 짝이 되는 문법 : switch, case, break, default

switch (조건식1)
{
    case 조건식: //해당 조건식1 형식( 정수, 문자, 문자열 )에따라 조건식을 써야 합니다.
        {
            //조건식과 같다면 중괄호 안의 코드 실행
            //break를 만나면 switch문을 빠져나감
            break;
        }
    case 조건식: //순차 적으로 case 단위로 비교되고 조건식과 같다면 중괄호 안의 코드 실행
        {
            break;
        }
    default: //모든 case를 비교하였지만 같은 조건식이 없다면 중괄호 안의 코드 실행
        {
            break;
        }
}

switch문은 조건식1에 따라 위에서 아래로 순차적으로 case와 비교 진행되며 default문은 제외 가능합니다.


using System;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            int a = 13;
            switch (a)
            {
                case 10:
                    {
                        Console.WriteLine("a 는 10 이다");
                        break;
                    }
                case 13:
                    {
                        Console.WriteLine("a 는 13 이다");
                        break;
                    }
            }
            Console.WriteLine();


            string str = "파랑";
            switch (str)
            {
                case "빨강":
                    Console.WriteLine("좋아 하는 색은? {0}", str);
                    break;
                case "노랑":
                    Console.WriteLine("좋아 하는 색은? {0}", str);
                    break;
                case "파랑":
                    Console.WriteLine("좋아 하는 색은? {0}", str);
                    break;
                default:
                    Console.WriteLine("좋아 하는 색이 없다");
                    break;
            }
        }
    }
}

결과

a 는 13이다

좋아 하는 색은? 파랑


case의 중괄호 {, }는 제외 가능하나 코드가 늘어나면 가독성이 떨어지고 실수를 할수 있습니다.

코드는 명확한것이 가장 좋고 여러사람이 한 프로젝트를 공유하여 개발할때 가독성을 떨어트리거나 자신만 알아볼수 있는 코드는

삼가 해야됩니다.


다음장에서는 반복문과 제어문에 대해 알아보도록 하겠습니다.

수고하셨습니다.


1. 강좌 목표


- C# 자료형에 대해 알아보기

- 출력을 통한 값의 범위 알기


2. 실습


지난 강좌에서 배운 출력 방법으로 자료형에 대해 알아보도록 하겠습니다.

C# 에서는 크게 2가지의 자료형으로 나누어집니다. 


Value(값)

값 형식은 변수가 값을 담는 데이터 형식이고 타입은 struct 형으로 되어있습니다.

struct는 프로그래밍 언어에서 구조화 된 데이터를 처리 할때 사용하는 구조체이다.

(하나의 제품으로 치자면 이미 완성되어 있는 완제품)


Reference(참조)

참조 형식은 변수가 값 대신 값이 있는 곳의 위치(참조)를 담는 데이터 형식이고 타입은 class 형으로 되어있습니다.

(하나의 제품으로 치자면 변경이 가능한 제품)


이제 코드를 써보면서 데이터 형식과 크기(Byte) 담을 수 있는 값의 범위를 알아보도록 하겠습니다.

코드작성에 앞서 Console.WriteLine에 대해 좀더 알아보고 넘어가도록 하겠습니다.

Console.WriteLine 다음 소괄호 안에는 여러가지 데이터형이 들어갈수 있도록 이미 System 네임스페이스안에

Console이라는 클래스에 WriteLine 이라는 함수로 여러가지 데이터형을 쓸수있겠금 정의되어 있습니다.

아래 사진과 같이 코드를 작성할때 소괄호 ( 를 타이핑하면 들어갈수 있는 매개변수들의 도움말이 나타납니다.

키보드의 방향키 ↑와 ↓키로 해당내용을 볼수도 있습니다.





using System;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
		int a = 10;
                Console.WriteLine(a);
		Console.WriteLine("int 형 Max : {0} ~ Min : {1} size : {2}byte",  int.MaxValue, int.MinValue,sizeof(int));
        }
    }
}

결과

10
 int 형 Max : 2147483647 ~ Min : -2147483648 size : 4byte


결과의 첫번째 라인은 정수 10

두번째 라인은 int라는 데이터형식의 최대값의 범위와 최소 값의 범위 데이터형식의 크기값 까지 출력 되었습니다.

어떻게 이러한 결과가 나왔는지 하나하나 살펴보도록 하겠습니다.



데이터 형식과 변수명을 선언하고 값 할당하기

1. [자료형] [변수명];

   [변수명] = [값 할당];

int a;
a = 10;


2. [자료형] [변수명] = [값 할당];

int a = 10;


값 형식의 int라는 자료형에 변수 a10이라는 숫자를 대입해 놓고 이것을 Console.WriteLine 메서드를 이용해

Console.WriteLine(a); 처럼 a라는 변수를 넣어 주면서 변수의 자료형에 맞는 출력을 해주는 것 입니다.

※데이터 형식의 종류와 크기 값의 범위등은 아래 <데이터 형식 표>를 참고해 주세요.


두번째 Console.WriteLine 메서드의 사용방법으로는 아래의 형태로 "문자열 내용" 안에 {0} 이나 {1} 처럼 중괄호안에 인덱스가 

들어 있는 형태를 서식 항목이라 하는데 인덱스는 0부터 시작하며 줄 종결자 , 다음으로 오는 순서대로 서식 항목과 치환되어 출력 됩니다.


결과

문자열aaa 문자열bbb


위의 방법처럼 Console.WriteLine의 메서드와 int 데이터 형식에 키워드인 const로 정의된 상수 int.MaxValue, int.MinValue


형식의 크기를 가져오는 연산키워드 sizeof() 를 활용하여 다른 데이터형식의 선언과 값의 할당 데이터의 크기를 확인해 보세요.


 데이터 형식

구분

분류

크기(Byte)

값의 범위 

 byte

 부호없는 정수

 값(struct)

 1(8bit)

 0~255

 sbyte 

 정수

 값(struct)

 1(8bit)

 -128~127

 short 

 정수

 값(struct)

 2(16bit)

 -32,768~32,767

 ushort 

 부호없는 정수

 값(struct)

 2(16bit)

 0~65535

 int 

 정수

 값(struct)

 4(32bit)

 -2,147,483,648~2,147,483,647

 uint

 부호없는 정수

 값(struct)

 4(32bit)

 0~4,294,967,295

 long 

 정수

 값(struct)

 8(64bit)

 -922,337,203,685,477,508~922,337,203,685,477,507

 ulong

 부호없는 정수

 값(struct)

 8(64bit)

 0~18,446,744,073,709,551,615

 char

 문자

 값(struct)

 2(16bit)

 

 float

 실수

 값(struct)

 4(32bit)

 -3.402823e38~3.402823e38

 double

 실수

 값(struct)

 8(64bit)

 -1.79769313486232e308~1.79769313486232e308 

 decimal

 실수

 값(struct)

 16(128bit)

 -79228162514264337593543950335~79228162514264337593543950335

 bool

 논리

 값(struct)

 1(8bit)

 true, false

 string

 문자열

 참조(class)

 

 

 object

 객체

 참조(class)

 

 

<데이터 형식 표>


소스코드

using System;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            int a = 10;
            Console.WriteLine("int 형 Max : {0} ~ Min : {1} size : {2}byte", int.MaxValue, int.MinValue, sizeof(int));
            Console.WriteLine(a);

            uint b = 10;
            Console.WriteLine("uint 형 Max : {0} ~ Min : {1} size : {2}byte", uint.MaxValue, uint.MinValue, sizeof(uint));

            short c = 10;
            Console.WriteLine("short 형 Max : {0} ~ Min : {1} size : {2}byte", short.MaxValue, short.MinValue, sizeof(short));

            ushort d = 10;
            Console.WriteLine("ushort 형 Max : {0} ~ Min : {1} size : {2}byte", ushort.MaxValue, ushort.MinValue, sizeof(ushort));

            long e = 10;
            Console.WriteLine("long 형 Max : {0} ~ Min : {1} size : {2}byte", long.MaxValue, long.MinValue, sizeof(long));

            ulong f = 10;
            Console.WriteLine("ulong 형 Max : {0} ~ Min : {1} size : {2}byte", ulong.MaxValue, ulong.MinValue, sizeof(ulong));

            byte g = 10;
            Console.WriteLine("byte 형 Max : {0} ~ Min : {1} size : {2}byte", byte.MaxValue, byte.MinValue, sizeof(byte));

            sbyte h = 10;
            Console.WriteLine("sbyte 형 Max : {0} ~ Min : {1} size : {2}byte", sbyte.MaxValue, sbyte.MinValue, sizeof(sbyte));

            char i = 'A';
            Console.WriteLine("char 형 size : {0}byte", sizeof(char));

            float j = 1.41421356237f;
            Console.WriteLine("float 형 Max : {0} ~ Min : {1} size : {2}byte", float.MaxValue, float.MinValue, sizeof(float));
            Console.WriteLine("{0}", j);

            double k = 1.41421356237d;
            Console.WriteLine("double 형 Max : {0} ~ Min : {1} size : {2}byte", double.MaxValue, double.MinValue, sizeof(double));
            Console.WriteLine("{0}", k);

            decimal l = 10m;
            Console.WriteLine("decimal 형 Max : {0} ~ Min : {1} size : {2}byte", decimal.MaxValue, decimal.MinValue, sizeof(decimal));

            bool m = false;
            Console.WriteLine("bool 형 size : {0}byte", sizeof(bool));

            object obj = null;
            string str = "";
        }
    }
}
결과

int 형 Max : 2147483647 ~ Min : -2147483648 size : 4byte

10

uint 형 Max : 4294967295 ~ Min : 0 size : 4byte

short 형 Max : 32767 ~ Min : -32768 size : 2byte

                               .

                               .

                               .











주의사항

1. 실수의 변수 선언 및 값 할당시 C#컴파일러는 기본적으로 double형으로 인식을 합니다. 그래서 실수형을 사용시 접미사

   float ( f ), double ( d ), decimal ( m )를 붙여 정확히 사용하여야 합니다.


2. 편의를 위해서 형식이 맞지 않는 값으로 변환을 하였을때 생기는 문제점들 입니다.

   컴파일러에서는 문제를 발생하지 않았지만 결과 값과 같이 데이터 손실로 인해 의도치 않은 버그를 유발하기도 합니다.

            double a = 1.23456789123456d;
            float b = (float)a;
            int c = (int)b;
           
            Console.WriteLine("double : {0}", a);
            Console.WriteLine("float : {0}", b);
            Console.WriteLine("int : {0}", c);
결과

double : 1.23456789123456

float : 1.234568

int : 1






다음 강좌에서는 기본 연산자 및 분기문 대해 알아보도록 하겠습니다.

1. 강좌 목표


- 기본구조 파악

- 콘솔창 출력


2. 새 프로젝트 만들기


[비주얼 스튜디오를 실행 -> 파일->새로 만들기 ->프로젝트또는 [단축키 Ctrl+Shift+N] 새 프로젝트 창을 엽니다.



새 프로젝트 창에서 Visual C# -> 콘솔 앱(.NET Framework)를 선택하여 확인


이렇게 새로운 프로젝트를 생성을 하면 아래와 같은 창이 보이게 됩니다.

항목들을 간단하게 확인해 보면 Program.cs 는 앞으로 우리가 작성하게될 코드 문서이고

우측 솔루션 탐색기는 작성한 문서들의 폴더 같은 역활을 하게 됩니다.

Visual Studio는 프로그램을 하기위한 도구임으로 강좌 중간중간 기능들을 설명 하도록 하겠습니다.

코드란 : 컴퓨터가 알아볼수 있는 기호 또는 부호


이제 본격적으로 C#의 기본 코드를 보면서 진행하겠습니다.


3. 기본구조 이해

기본 코딩하기 위해서는 문서작성을 하듯이 하면 됩니다.

처음 새 프로젝트를 만들면 아래와 같은 코드로 구성이 되는데 실제 사용하기위한 코드만 남기고 수정을 하겠습니다.

(Program.cs 안에 있는 내용 모두를 삭제하셔도 됩니다.)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
        }
    }
}

우선 아래와 같이 작성을 하도록 합니다.


using System;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
           Console.WriteLine("안녕하세요");
        }
    }
}

작성이 끝나셨으면 [Ctrl+Shift+b] 또는 [빌드 -> 솔루션빌드] 를 누릅니다.

정상적으로 빌드가 되었다면 이제 결과를 확인해봅시다.

결과를 확인 하기 위해서는 [Ctrl+F5]를 눌러보면 콘솔창이 뜨면서 확인할수 있습니다.


컴파일 : 위에 작성한 코드들의 문법을 분석해 기계어로 번역

빌드    : 컴파일을 통해 번역된 것과 그외 잡다한걸 모아서 실행 가능한 파일로 만드는것


결과:

안녕하세요
계속하려면 아무 키나 누르십시오...


축하합니다.

위의 내용과 동일한 결과를 보셨다면 프로그래밍의 첫발을 내딛었으며 앞으로 진행할 강좌도 쉽게 진행 하실수 있습니다.

혹시 실패 하셨더라도 아래 내용을 참고하여 다시한번 도전해보세요.


4. 구조 이해


컴파일러

우리가 공부하는 C# 뿐만아니라 C, C++, JAVA 등 많은 프로그래밍 언어들은 각각의 컴파일러가 존재 합니다.

각 컴파일러에 의해 exe, dll 파일 등과 같이 만들어진 출력 파일을 어셈블리(Assembly)_라고 부르는데 이것을 

컴퓨터는 다시 자신이 알수있는 원시 코드로 컴파일하여 우리가 만든 프로그램이 실행되게 만듭니다.


[C# 코드] -> [C# 컴파일]->[빌드]->[exe, dll 실행]->[원시 코드 컴파일]->[프로그램 시작]



디버깅

일반적으로 게임을 하다보면 의도치 않은 종료나 비정상적인 결과가 나왔을때 유저들은 버그라고 부릅니다.

이런 논리적 오류나 잠재적인 오류를 가리켜 통칭 버그(Bug)라 부르는데 이를 근본적인 원인을 찾아내 

해결할수 있는 작업을 디버깅이라 할수 있습니다.


디버깅을 하기 위해서는 F5를 누르면 바로 디버깅이 시작되는데 결과창을 확인 하기도전에 콘솔창이 닫히게

되는데 이는 코딩을 잘못해서가 아니라 컴퓨터가 더이상 행할수 있는 코드가 없어서 자동 종료된 것입니다.

우리가 사용하였던 Ctrl+F5는 디버깅을 하지 않고 실행을 누른것과 마찬가지로 동작하게 됩니다.


이제 우리가 작성한 코드를 보도록 하겠습니다.


using System;은 얼핏 보면 하나 같지만 세 가지 요소로 이루어져 있습니다.

[키워드] + [네임스페이스] + [문장의 끝을 알리는 기호]

쉽게 말해 "System이라는 네임스페이스를 가져다 쓰겠다."라고 컴파일러에게 알리는 알리는 역활을 합니다.

using System;

네임스페이스

네임스페이스란 성격이 비슷한 클래스(Class), 구조체(Struct), 인터페이스(Interface) 등을 그룹화 한것을 말합니다.

여기서 클래스는 정적인 것과 동적인 기능으로 나뉘는데 정적인것은 필드(Field) 동적적인것은 메소드(Method)로

표현됩니다. 이는 프로그램을 구성하는 기본 단위이고 하나의 클래스는 여러 개의 객체(Object)를 만들어 낼수 있습니다.


앞서 작성한 코드에서 보면 System 네임스페이스로 부터 Console 이라는 메소드를 가져다 사용 하였습니다.

실제 코드에서 using System; 이라는 문장을 삭제하고 빌드를 하면 실패와 오류 메세지를 출력합니다.

Console.WriteLine("안녕하세요"); 

메인

static void Main 메소드는 프로그램의 최초 진입점을 나타내며 반드시 있어야 하는 메소드입니다.

프로그램이 시작되면 메인 메소드를 통해 차례차례 동작을하고 마지막에 도달하면 더이상 실행할 코드가 없으므로 

프로그램 또한 종료 됩니다. static은 한정자로 정적인 메소드를 의미하고 void는 반환 형식으로 반환 값이 없다는

것을 의미합니다.


5. 정리

우리가 작성한 코드를 정리하여 책을 읽듯이 읽어보자면


컴파일러야 나는 프로그램을 시작하기전에 System이라는 네임스페이스를 가져다 쓸꺼야 준비해둬

그리고 내가 만들 네임스페이스는 ConsoleApp1이야 여기에는 Program이라는 클래스를 만들거야

Program클래스에는 내가 만든 프로그램을 시작할 진입점이 있어 거기서부터 차례대로 일을 시작하자

System 네임스페이스로 부터 가져온 Console.WriteLine 에 "안녕하세요" 라는 문자열을 전해줘

더이상 할일이 없으면 프로그램을 종료해줘


이 처럼 프로그래밍을 하다보면 컴파일러가 번역하여 컴퓨터가 알수있도록 논리적인 소설을 쓰는듯한 생각이 들기도 합니다.

미리 정의되고 약속되어진 규칙을 지키면서 자신만의 이야기를 써내려 간다는 것입니다. 


using System;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
           Console.WriteLine("안녕하세요");
        }
    }
}


1. 알림


C# 강좌를 하기 앞서 초보자에게 흥미를 유도하기 위해 실습 위주로 진행 하고 용어, 예시 등은 다른 인터넷 강좌와 서적들과

차이가 있을수 있습니다. 초등학교 시절 1+1=2 이라는 간단한 사칙연산을 지금 정의하라고 하면 막막해 지기만 합니다.

하지만 이렇게 배운 사칙연산을 실생활에서 아무렇지 않게 사용은 할 수 있습니다.

수박 겉 핥기식 강좌가 될 수도 있음에도 최대한 많은 분들이 프로그램을 배우는데 도움이 되었으면 하는 생각에

강좌를 시작하려 합니다.



2. 강좌 목표


마이크로소프트사의 비주얼스튜디오를 설치


3. 비주얼스튜디오 다운로드


아래 링크에서 Visual Studio Community 를 다운로드 합니다.


다운로드 : https://www.visualstudio.com/ko/downloads/



<마이크로 소프트 홈페이지>


다운로드를 완료하고 실행시키면 다음과 같은 설정 화면이 열립니다.

우리는 C# 언어의 기초적인 공부를 위해 설치하는 거라 ".NET 데스크톱 개발" 항목만 선택하여 설치 합니다.


- 추후 다양한 목적(모바일 어플리케이션, 유니티, 데이터베이스)으로 프로그램을 만들기 위해서는 다른 구성 요소도 필요하게 된다면 

  Visual Studio Installer 를 통해 설정 화면을 다시 불러올수 있습니다.


<옵션 설정 화면>


설치 버튼을 눌러 설치가 진행되고 설치가 완료되면 실행버튼을 누릅니다.

- 화면이 어둡게 나오는것은 "도구->옵션->색 테마 (어둡게)로 설정하여 사용하기 때문에 화면색이 다르게 보일수 있습니다.


<Visual Studio 실행 화면>


이제 다음 강좌부터 프로젝트를 만들고 간단한 C# 문법들을 살펴 보겠습니다.

+ Recent posts