1. 출력문 정리

[C#_2]에서 했던 Console.WriteLine() 과 Console.Write() 를 상기해 보자면

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!"); //줄바꿈 O
            Console.Write("Hello");            //줄바꿈 X
        }
    }
}

였습니다.

줄바꿈의 차이였었죠.

 

이후 [C#_3]에서 했던 변수 형태의 출력을 사용해보면

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            String str = "Hello World!";

            Console.WriteLine(str);
        }
    }
}

의 형식으로 변수에 담아 출력하는 것 이었습니다.


2. 입력문

입력문은 두 가지로 나뉩니다.

Console.Read() 와 Console.ReadLine() 인데요. 출력문에서 모양의 차이가 있던 것처럼 여기도 같은 차이가 있는 것 같네요! 하지만 이 두 가지의 기능은 현저히 차이가 납니다.

Console.Read() 는 '문자'를 받는 입력문

Console.ReadLine()은 "문자열"을 받는 입력문

이라는 부분에서 차이가 나는데요.

우선 Console.Read()를 알아보겠습니다.

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.Write("정수를 입력해주세요 : ");
            int user = Console.Read();

            Console.WriteLine(user);
        }
    }
}

이 코드를 실행해보시면 제 설명과 다르게 무언가 어긋나 있는 것을 알 수 있습니다.

분명히 저희는 1을 입력받았고 출력 역시 1이 나와야 하는데 49라는 수가 나왔네요.

이는 '아스키 코드' 라는 것으로 컴퓨터가 자동 변환하는 것 때문인데요!

우리가 1이라고 명시한 수를 컴퓨터는 컴퓨터만의 언어인 49 라고 명시했기 때문입니다!

코드로 다시 보자면

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.Write("정수를 입력해주세요 : ");
            int user = Console.Read();

            Console.WriteLine();

            Console.Write("입력한 user의 아스키 코드 : ");
            Console.WriteLine(user);
            Console.Write("입력한 문자 출력 : ");
            Console.WriteLine((char)user); //강제 형 변환
        }
    }
}

※ 1를 입력받고 컴퓨터가 아스키코드로  변환하는 것 까지 확인 

      이 후 강제 형변환을 통해 아스키코드 49를 문자로 변환시킨 코드와 결과

 

아스키 코드: https://terms.naver.com/entry.naver?docId=2270339&cid=51173&categoryId=51173

 

ASCII

초창기에는 다양한 방법으로 문자를 표현했는데, 호환 등 여러 문제가 발생했다. 이런 문제를 해결하기 위해 ANSI에서 ASCII(American Standard Code for Information Interchange)라는 표준 코드 체계를 제시했고

terms.naver.com

 

자 그럼 진짜 정수를 받고 싶다면 우리는 어떤 방식을 이용해야 할까요?

위 코드처럼 강제 형변환으로 일단 보이기는 원하는대로 보여주게 만들어도 컴퓨터가 사용하는 방식은

입력받기 ─> 아스키코드로 변환 ─> 강제형변환으로 인한 변환

이라서 우리가 원하는 '값'으로써의 역할을 하기 어렵습니다.

심지어 우리는 정수를 받거나 문자를 받을 때 한자릿수만 받는경우가 드물기도 하지요.

그래서 우리는 입력을 받을 때 문자열을 입력받는 Console.ReadLine() 을 사용할 것 입니다.

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.Write("정수를 입력해주세요 : ");
            int user = int.Parse(Console.ReadLine());

            Console.WriteLine();

            Console.Write("내가 입력한 수 : ");//입력한 수가 그대로 나오는 것을 확인 할 수 있다.
            Console.WriteLine(user);

        }
    }
}

위 코드에서 문자열을 입력받는 Console.ReadLine() 를 int.Parse를 사용하여 

입력한 문자열을 정수로 바꾸어주는 것을 볼 수 있습니다.

(파싱에 관해서는 차후 다시 다룰 것 이기에 여기서는 넘어가도록 하겠습니다.)


3. 연산자 수식 연산자, 증감 연산자, 관계 연산자, 할당 연산자, 논리 연산자 등
3-1. 수식 연산자

수식 연산자에는 더하기, 빼기, 곱하기, 나누기, 나머지 를 구하는 식이 있습니다.

분류 기능
+ 피연산자 끼리의 덧셈 A + B
- 왼쪽 피연산자에서 오른쪽 피연산자를 뺄셈 A - B
* 피연산자 끼리의 곱셈 A * B
/ 왼쪽 피연산자를 오른쪽 피연산자로 나눗셈 A / B
% 왼쪽 피연산자를 오른쪽 피연산자로 나눈 후 나머지 A % B

위 표는 그 기능과 식을 정리한 것 입니다. 이를 코드로 보면

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            int A = 100;
            int B = 10;

            Console.WriteLine($"A + B : {A + B}"); //덧셈
            Console.WriteLine($"A - B : {A - B}"); //뺄셈
            Console.WriteLine($"A * B : {A * B}"); //곱셈
            Console.WriteLine($"A / B : {A / B}"); //나눗셈
            Console.WriteLine($"A % B : {A % B}"); //나머지

        }
    }
}

($은 문자열 보간으로 아래에서 설명하겠습니다.)

→결과


3-2. 증감연산자

증감연산자는 피연산자를 1만큼 증가시키는 증가연산자, 피연산자를 1만큼 감소시키는 감소연산자가 있습니다.

분류 기능
전위 증감 피연산자의 값을 1만큼 증가 A++;
피연산자의 값을 1만큼 감소 A--;
후위 증감 피연산자의 값을 1만큼 증가 ++A;
피연산자의 값을 1만큼 감소 --A;

위 표를 코드로 보자면

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

            a++;

            Console.Write("전위 증가 :");
            Console.WriteLine(a);

            a--;

            Console.Write("전위 감소 :");
            Console.WriteLine(a);

            --a;
            Console.Write("후위 감소 :");
            Console.WriteLine(a);

            ++a;
            Console.Write("후위 증가 :");
            Console.WriteLine(a);

        }
    }
}

이 코드의 결과는

언뜻 보면 다른게 없어보이지만 전위증감과 후위증감은 큰 차이가 있습니다.

전위증감은 우선 피연산자의 값을 증가시키거나 감소시킨 뒤 문장을 실행하고

후위증감은 문장을 먼저 실행하고 피연산자의 값을 증가시키거나 감소시킨다는 것입니다.

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

            Console.WriteLine($"a - b : {a - b}");

            Console.WriteLine($"--a - b: {--a - b}");
            //문장 실행전에 1을 감소하고 문장을 실행시킴
            
            a++;//a복구
            Console.WriteLine();
            
            
            Console.WriteLine($"a-- - b : {a-- - b}");//후위
            //문장을 실행하고 1을 감소시킴
            Console.WriteLine($"(a - b : {a - b}");

        }
    }
}


3-3. 관계 연산자

관계 연산자는 두 피연산자간의 관계를 나타내며 결과는 Boolean 값으로 도출해줍니다.

분류 기능
< 왼쪽 피연산자가 오른쪽 피연산자 보다 작으면 True 크면 False A < B
> 왼쪽 피연산자가 오른쪽 피연산자 보다 크면 True 작으면 False A > B
== 양쪽 피연산자가 서로 같으면 True 다르면 False A == B
!= 양쪽 피연산자가 서로 다르면 True 같으면 False A != B
>= 왼쪽 피연산자가 오른쪽 피연산자와 같거나 크면 True 작으면 False A >= B
<= 왼쪽 피연산자가 오른쪽 피연산자와 같거나 작으면  True 크면 False A <= B

이를 코드로 활용해보면

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


            Console.WriteLine(a < b); // 5 < 10, True
            Console.WriteLine(a > b); // 5 > 10, False
            Console.WriteLine(a == b); // 5 == 10, False
            Console.WriteLine(a != b); // 5 != 10, True
            Console.WriteLine(a >= b); // 5 >= 10, False
            Console.WriteLine(a <= b); // 5 <= 10, True

        }
    }
}

이렇게 boolean값을 확인할 수 있습니다.


3-4. 대입연산자

왼쪽 피연산자에 오른쪽 피연산자를 대입하는 연산자입니다.

우리가 기본적으로 알고있는 대입은 '=' 하나입니다. 변수에 값을 줄 때 사용하고있었는데요.

int a = 10;

대입연산자는 이처럼 대입해줄 때 대입과 동시에 연산을 진행하는 것을 말합니다.

분류 기능
= 오른쪽 피연산자를 왼쪽 피연산자에 할당 A = B
+= 왼쪽 피연산자에 오른쪽 피연산자를 더하고 그 값을 왼쪽 피연산자에 할당 A += B
-= 왼쪽 피연산자에 오른쪽 피연산자를 빼고 그 값을 왼쪽 피연산자에 할당 A -= B
*= 왼쪽 피연산자에 오른쪽 피연산자를 곱하고 그 값을 왼쪽 피연산자에 할당 A *= B
/= 왼쪽 피연산자에 오른쪽 피연산자를 나누고 그 값을 왼쪽 피연산자에 할당 A /= B
%= 왼쪽 피연산자에 오른쪽 피연산자를 나눈 나머지를 구하고
그 값을 왼쪽 피연산자에 할당
A %= B
namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            int a = 10, b = 5;

            a += b;
            Console.WriteLine(a); // a = 10 + 5; 결과: 15
                                  //    (a) + (b)
            a -= b;
            Console.WriteLine(a); // a = 15 - 5; 결과: 10
                                  //    (a) - (b)
            a *= b;
            Console.WriteLine(a); // a = 10 * 5; 결과: 50
                                  //    (a) * (b)
            a /= b;
            Console.WriteLine(a); // a = 50 / 5; 결과: 10
                                  //    (a) / (b)
            a %= b;
            Console.WriteLine(a); // a = 10 % 5; 결과:0
                                  //    (a) % (b)
        }
    }
}


3-5. 논리 연산자

논리연산자는 위 관계연산자 처럼 그 값이 Boolean값으로 나옵니다.

 

종류는 3가지고 And 연산자 , Or연산자, Not 연산자 가 있습니다.

And연산자 ( 논리곱 연산자 = && )
A B A && B
참(True) 참(True) 참(True)
참(True) 거짓(False) 거짓(False)
거짓(False) 참(True) 거짓(False)
거짓(False) 거짓(False) 거짓(False)

A와 B 모두 True 여야 결과가 True인 것을 알 수 있다.

 

Or 연산자 ( 논리합 연산자 = || )
A B A || B
참(True) 참(True) 참(True)
참(True) 거짓(False) 참(True)
거짓(False) 참(True) 참(True)
거짓(False) 거짓(False) 거짓(False)

Or 연산자는 두 피연산자중 하나라도 True 라면 True이다.

 

Not 연산자 ( 부정연산자 = ! )
A !A
참(True) 거짓(False)
거짓(False) 참(True)

Not 연산자는 피연산자가 True 라면 False를 도출하고

피연산자가 False라면 True를 도출한다.

 

위 표들을 코드로 보자면

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

            Console.WriteLine(a > 5 && b > 10); // True && False; 결과: False
            Console.WriteLine(a >= 10 || b >= 10); // True || False; 결과: True
            Console.WriteLine(!(a < b)); // !(False) 결과: True
        }
    }
}

로 모든 결과가 Boolean으로 도출된 것을 볼 수 있습니다.


3-6. 비트 연산자

비트연산자는 비트를 다루는데에 사용되는 연산자입니다.

논리연산자와 마찬가지로 3가지로 나뉘며 종류 역시 And 연산자, Or연산자, Not 연산자 로 같습니다.

비트연산자 ( & , | , ^ ) 
분류 기능
& 두 피연산자의 대응되는 비트에 논리곱(AND) 수행 A & B
| 두 피연산자에 대응되는 비트에 논리합(OR) 수행 A | B
^ 두 피연산자와 대응되는 비트에 베타적 논리합(XOR) 수행 A ^ B
  • & 연산자는 양쪽 비트가 모두 1이어야만 결과가 1이 되고, 그렇지 않으면 결과가 0이 됩니다.
  • | 연산자는 양쪽 비트 중 하나라도 1이면 결과가 1이 됩니다.
  • ^ 연산자는 양쪽 비트가 서로 달라야 결과가 1이 됩니다.
namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            int a = 5, b = 10;

            Console.WriteLine(a & b);
            Console.WriteLine(a | b);
            Console.WriteLine(a ^ b);
        }
    }
}

→ 결과

→이유!

사실 비트연산자는 이 이유를 알아야 왜 이 값이 나오는지 알게되는데

이 칸들을 좌측부터 128  64  32  16  8  4  2  1 의 8칸입니다. (2진수)

1로 표기되어있는 칸들의 수를 더하면 15라는 값이 나온것을 알 수 있습니다.


4. 문자열 보간

문자열 보간($) ?

문자열 보간이라는 것은 우리의 출력 코드가 평소

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            string a = "one";
            string b = "two";

            Console.WriteLine("숫자 1은 영어로 {0}, 숫자 2는 영어로 {1}", a, b);
            // 결과: 숫자 1은 영어로 one, 숫자 2는 영어로 two
        }
    }
}

이런식으로 작동 하고 있었다면 

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            string a = "one";
            string b = "two";

            Console.WriteLine($"숫자 1은 영어로 {a}, 숫자 2는 영어로 {b}");
            // 결과: 숫자 1은 영어로 one, 숫자 2는 영어로 two
        }
    }
}

Console.WriteLine 이후 ()의 내부 "" 의 외부에 $ 기호를 붙혀서 더욱 간편하게 사용할 수 있도록 하는 것 입니다.

  • Console.WriteLine() 사용시 내부에 "" 를 넣는다
  • -> Console.WriteLine(" ")
  • 큰 따옴표 외부에 $를 넣는다.
  • -> Console.WriteLine($" ")
  • 내부에 적고싶은 문자들의 결합을 적는다.
  • -> Console.WriteLine($" 숫자 1은 영어로 ")
  • 변수를 적고싶다면 문자열 내부에 {} 로 경계를 만들어 넣어준다
  • -> Console.WriteLine($" 숫자 1은 영어로 {a} ")

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

[C#_6] 반복문(for,foreach,while,do while)  (0) 2021.09.24
[C#_5] 조건문 (if, else, switch)  (0) 2021.09.23
[C#_3] 변수, 자료형  (0) 2021.09.12
[C#_2] 콘솔 출력  (0) 2021.09.07
[C#_1] C# 설치  (0) 2021.09.07

+ Recent posts