앞서 데이터 형과 변수 (상)편에 이은 포스팅입니다. 이전 글에 대한 정보는

[C# 입문] 데이터 형과 변수 (상) 에 있습니다.

 


문자를 다루는 방법에는 문자 자체를 다루는 문자 형식과 문자로 이루어진 문자열 형식으로 문자들을 다룰 수 있습니다. char과 string입니다. 

char

문자 형 char는 1개의 문자를 다루는 데이터 형입니다. 우리가 Hello, World를 입력한다고 생각합시다. 그러면 char형으로는 하나하나 입력해주어야 하는 것이죠.

 

using System;

namespace MyFirstApp
{
    class Program
    {
        static void Main(string[] args)
        {
            char a = 'H';
            char b = 'e';
            char c = 'l';
            char d = 'l';
            char e = 'o';
            char f = ',';
            char g = ' ';
            char h = 'W';
            char i = 'o';
            char j = 'r';
            char k = 'l';
            char l = 'd';

            Console.Write(a);
            Console.Write(b);
            Console.Write(c);
            Console.Write(d);
            Console.Write(e);
            Console.Write(f);
            Console.Write(g);
            Console.Write(h);
            Console.Write(i);
            Console.Write(j);
            Console.Write(k);
            Console.WriteLine(l);

        }
    }
}

 이렇게 하나의 문자를 담을 수 있는 것을 char형이라 합니다. 이러한 char형을 모아두면 string이라고 하는 문자열이 됩니다.

 

using System;

namespace MyFirstApp
{
    class Program
    {
        static void Main(string[] args)
        {
            string a = "Hello, World!";

            Console.WriteLine(a);

        }
    }
}

 

위의 문자로 이루어진 복잡한 형태가 문자열로 깔끔한 형태로 바꾸어주었습니다. 이러한 문자열 string은 정해진 데이터 범위가 없습니다. 데이터가 저장될 수 있는 양이 그때마다 다르기 때문이죠. 

 

그렇다면 여기서 또 생각해볼 수 있는 형태가 있습니다. 만약 문자열과 문자열을 더하게 되면 어떻게 될까요?

 

using System;

namespace MyFirstApp
{
    class Program
    {
        static void Main(string[] args)
        {
            string a = "Hello, World!";
            string b = " 안녕 세상!";
            string c;

            c = a + b;

            Console.WriteLine(c);

        }
    }
}

출력 결과를 확인하면

 

두 개의 문자열이 더해져서 나오는 것을 확인할 수 있습니다. 이렇듯 문자열은 다양한 상태로 사용될 수 있습니다. 그렇다면 여기서 문자의 갯수를 세고 싶다면 어떻게 해야할까요? 직접 하나하나 세야 할까요? 그렇지 않습니다. 우리에게는 강력한 메소드가 있으니까요!

 

using System;

namespace MyFirstApp
{
    class Program
    {
        static void Main(string[] args)
        {
            string a = "Hello, World!";
            string b = " 안녕 세상!";
            string c;

            c = a + b;

            Console.WriteLine(a.Length);
            Console.WriteLine(b.Length);
            Console.WriteLine(c.Length);

        }
    }
}

실제 실행을 시켜보면 13, 7, 20이 나옵니다.

실제로 하나씩 세어보도록 하겠습니다.

H e l l o ,   W o r
l d !              

총 13개의 문자가 나옴을 확인할 수 있습니다. 중간에 있는 공백을 포함해서 말이죠.

 

    !      

여기도 공백을 포함해서 7개임을 확인할 수 있습니다. 

c는 a와 b를 합친 것이므로 총 20개의 문자를 세어준 것이죠. 실제 Length의 역할을 string에 들어있는 char 유니코드 문자수가 아니라 인스턴스의 개체 수를 반환해서 수를 세어줍니다. 일반적으로 string에는 마지막에 널문자가 들어갑니다.

H e l l o null문자        

이러한 형태로 마지막 부분에 널문자를 넣음으로써 컴퓨터에게 문자열의 마지막임을 알립니다. 하지만 Length는 마지막 Null 문자를 제외하고 문자의 갯수를 공백을 포함해서 세어줍니다. 아주 편리한 기능이죠?

 


문자열에서는 사용하고 싶은 특수한 문자가 있을 수 있습니다. 예를 들어, ", \, /이러한 형태의 문자는 이대로 사용할 수 없습니다. 그래서 이러한 특수한 문자를 사용할 수 있게 하기 위해서 이스케이프 문자를 만들어두었습니다. 이스케이프 문자를 활용하면 언제든 특수한 문자를 사용할 수 있습니다. 

 

using System;

namespace MyFirstApp
{
    class Program
    {
        static void Main(string[] args)
        {
            string a = "Hello, \t this is tab \tand space";
            string b = "\" 큰 따움표를 사용하기 위해서는 \\를 입력해야 합니다.";

            //우리는 \를 이스케이프 문자라 합니다.

            Console.WriteLine(a);


        }
    }
}

 이스케이프 문자는 엔터 위에 있는 ' \ ' 표시가 이스케이프 문자입니다. 사용하는 곳에 따라 다르게 보이기 때문에 키보드 자판 상 돈 표시를 하고 있습니다.

 

이스케이프 형태 문자 이름 유니코드 인코딩
\' 작은 따옴표 0x0027
\" 큰 따옴표 0x0022
\\ 백 슬래시 0x005C
\0 NULL 0x0000
\a 경고 0x0007
\b 백스페이스 0x0008
\f 폼 피드 0x000C
\n 줄 바꿈 0x000A
\r 캐리지 리턴 0x000D
\t 탭 (시스템 설정에 따라 다름) 0x0009
\v 세로 탭 0x000B

등이 있습니다. 

 


Bool

  참과 거짓으로 이루어진 논리형 입니다. 단순히 true와 false 두가지 밖에 없습니다. 간략한 형태지만 프로그래머들에게는 강력한 도구가 됩니다. bool형이 없는 프로그래밍 언어에서는 0과 1로써 참과 거짓을 표현했는데, 이는 코드를 읽을 때 가독성이 떨어지게 됩니다. 하루에도 수십 줄의 코드를 읽는 프로그래머 입장에서는 굉장히 힘든일이죠. 그래서 bool형은 프로그래머가 코드를 더 잘 읽을 수 있도록 만들어주는 큰 역할을 했습니다.

 

  간략하게 bool형에 대해 살펴보겠습니다.

 

using System;

namespace MyFirstApp
{
    class Program
    {
        static void Main(string[] args)
        {
            bool a = true;
            bool b = false;

            Console.WriteLine(a);
            Console.WriteLine(b);
        }
    }
}

이 코드를 실행하면 treu와 false가 출력됩니다. 

 


이렇게 기본적인 데이터형에 대해서는 마무리가 되었습니다. 아직 안한 object형도 있지만, 나중에 상속에 대한 이야기를 배운 뒤에 object를 더 자세히 다루도록 하겠습니다. 감사합니다!

 

  지난 시간에는 Visual Studio 2019 설치와 더불어 Hello, World!를 출력해봄으로써 대략적인 구조를 확인했습니다. 이번 시간에는 지난 시간에 했던 Hello, World!의 소스코드를 하나씩 확인하며 어떠한 내용이 존재하는지 그리고 어떤 의미를 지니는지 간략하게 살펴보도록 하겠습니다. 기억이 안나시는 분은 지난 시간 포스트를 확인해보고 오시기 바랍니다.

 

  앞으로도 이러한 방식으로 하나하나 살펴보도록 할 예정입니다. 힘들수도 있지만, 머릿속으로 어떤 의미인지 확인이 안된다면 주먹구구식의 프로그래밍이 될 수밖에 없습니다. 그러니 하나씩 정확하게 배워가도록 하겠습니다. 

 

using System;

namespace MyFirstApp
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
        }
    }
}

 

  우리는 이러한 코드를 작성해보았습니다. C#과 같이 고수준 언어의 특징은 마치 사람이 쓰는 말을 간결하게 풀어놓은 듯한 느낌을 받습니다. 실제로도 컴퓨터에게 명령하듯이 코드를 작성합니다. 예를 들면, '사용해라', '만약 아니라면 ~를 해라' 이러한 형태로 컴퓨터에게 명령한다는 느낌으로 코드를 작성합니다. 

using System;

  Visual Studio IDE는 우리의 눈을 편하게 만들어주는 역할을 해줍니다. 보라색으로 보이는 것은 키워드(Keyword)입니다. 키워드는 프로그래밍을 하기 위해서 컴퓨터에게 내리는 명령어라 생각하시면 됩니다. 내가 정한 말인지 아니면 사전에 약속된 말인지 구분이 되어야 겠죠? 그러한 구분을 해놓은 단어들을 Keyword(키워드)라 합니다. 

 

  위에 코드 상에서 using, namespace, class, static, void, string은 모두 다 사전에 정의된 키워드가 되는 것이죠!

 

그렇다면 using 키워드의 의미는 무엇인지 생각해보면, '사용한다' 겠죠? 무엇을 사용한다? System을 사용하겠다는 의미입니다. 마지막으로 ; (세미콜론)은 컴퓨터에게 명령어 한 줄 한 줄을 구분시켜주는 역할을 하는 구분자 역할을 해주는 칸막이 같은 역할을 합니다. 컴퓨터가 봤을 때 사람의 언어는 구분이 안되는 외계어처럼 보이게 될 것입니다. (물론 세미콜론을 없애고자 하는 움직임이 없었던 것은 아닙니다. 그런데 세미콜론을 남겨둠으로써 얻는 이점이 많다고 생각해서 세미콜론을 남겨둔 형태로 지금도 사용되고 있습니다.)

 

실제로 우리가 컴퓨터의 기계어를 보면 010001010100111101 의 형태로 보이는데, 우리는 이 말이 무슨 말인지 모릅니다. 그리고 컴퓨터는 알 수 있는 것이죠. 

 

뒤에 나오는 System은 클래스(class)를 담고 있는 네임스페이스(namespace)가 됩니다. 

 


 

네임스페이스

  네임스페이스는 특정 클래스라 하는 것이 어디에 속해 있는지 알려주는 역할을 합니다. A라는 네임스페이스에 add 클래스가 있고, B라는 네임스페이스에 add라는 같은 이름의 클래스가 있으면 이를 구분지어주기 위한 역할을 하는 것이 네임스페이스가 됩니다. 

 

  예를 들어, A네 자전거, B네 자전거, C네 자전거라 하면 이를 구분지어주는 역할을 하는 것이 네임스페이스가 되는 것이죠. A씨 네 자전거입니다! B씨 네 자전거입니다. C씨 네 자전거입니다. 이렇게 소속을 구분지어주는 역할을 합니다.

 

  왜 이렇게 하냐? 그 이유는 변수이름을 짓기 어렵기 때문이죠. 그래서 프로그래머들은 비슷한 이름을 쓰게 되는데, 문제는 이름들끼리 충돌하기 시작한다는 것입니다. 위에 예에서도 " 자전거다!" 라고 지칭하면 누구네 자전거? 라는 의문이 따라오는 것처럼 어디에 속해 있는지가 중요한 문제이기 때문이죠. (물론 더 다양한 문제를 해결하기 위해서 도입했지만, 대략적인 이유는 이렇습니다.)

 

그렇다면 다시 돌아와서

using System;

기존에 보았던 이 코드에서 System은 System으로 되어 있는 네이스페이스에 있는 것들을 쓰겠다는 소리가 되는 거겟죠?

 

그렇다면 이렇게 다양한 네임스페이스를 외워야 하냐? 그건 아닙니다. 기본적으로 우리에게는 찾아볼 수 있도록 준비된 사전이 있습니다.

 

docs.microsoft.com/ko-kr/dotnet/api/system?view=net-5.0

 

System 네임스페이스

일반적으로 사용되는 값과 참조 데이터 형식, 이벤트와 이벤트 처리기, 인터페이스, 특성, 예외 처리 등을 정의하는 핵심 클래스 및 기본 클래스가 포함되어 있습니다. Contains fundamental classes and b

docs.microsoft.com

우리가 궁금한 내용이 있을 때마다 Docs를 찾아보면서 쓰면 됩니다. 일단은 이러한 것이 있구나 정도로 생각하면 됩니다. 

 

위의 코드에서 using System;을 빼면

 

namespace MyFirstApp
{
    class Program
    {
        static void Main(string[] args)
        {
            System.Console.WriteLine("Hello World!");
        }
    }
}

 코드가 조금 더 길어집니다. 네임스페이스를 사용하면 길어지는 현상도 줄일 수 있는 장점이 있죠.


using System;

namespace MyFirstApp
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
        }
    }
}

 자 다시 코드로 돌아와서 생각해보도록 하겠습니다.

이제 다음은

namespace MyFirstApp

이 부분은 이제 이해하기 쉽습니다. namespace는 소속을 정해주는 것이죠. 마찬가지로 앞으로 만들 클래스는 MyFirstApp 이라는 네임스페이스에 속하게 만들겠다는 것입니다. 

 

using System;

namespace MyFirstApp
{ 이 부분부터 들어가는 곳은 MyFirstApp의 네임스페이스에 속해있는 것입니다.
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
        }
    }
}

 

그 다음으로 

 

Class

class Program

  class란 기본적인 객체를 정의하는 하나의 틀을 의미합니다. 객체는 나중에 이야기하겠지만, 우리가 세상을 바라보는 물체를 객체라 부릅니다. 물론 물체 뿐 아니라 무형의 형태도 객체로 바라볼 수 있습니다. 객체지향에 대한 이야기는 이야기하면 이야기할 수록 많은 이야기가 필요하니 이후에 다시 이야기하도록 하겠습니다. 

 

  클래스는 이러한 기본이 되는 형태를 class라 부릅니다. 여기에는 변수메소드라 불리는 것이 정의되는 공간입니다. 클래스는 한 개만 존재할 수도 있고, 여러개가 존재할 수도 있습니다. 

 

class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
        }
    }

class Program 안에는 Main 이 있습니다. Main은 모든 프로그램이 흘러가는 중심이 되는 곳이라고 생각하시면 됩니다. 그래서 Main은 한 개만 있어야 하며, 두 개 이상이 되면 프로그램에서 오류가 발생합니다. 

 

Main은 실제로 프로그램이 실행되는 공간이며, 그 외에 메소드(함수)는 Main에서 불러주어야 실행이 됩니다.

 

static(정적) : static이 선언되어 있으면, 프로그램 시작시에 해당 속성이 붙어있는 클래스가 메모리에 올라가게 됩니다. 프로그램 시작과 함께 초기화되며, 메모리에 처음부터 올라가있는 상태가 됩니다. 더 자세한 이야기는 나중에 하도록 하겠습니다. 

 

  void는 자료형을 의미합니다. 컴퓨터는 자료형을 지정해줘야 합니다. 예를 들어, 12와 "12"를 보고 사람은 같은 숫자 12를 생각하지만, 컴퓨터는 이를 보고 다르게 생각합니다. 12는 숫자 12이며, "12"는 문자 12로 인식합니다. 그래서 프로그래머는 명시적으로 컴퓨터에게 어떤 자료형임을 알려주어야 합니다. 그래서 여러 자료형이 주어져 있습니다. 예를 들어, int, char, string등등 이 존재합니다. 

 

  class는 일반적으로 돌려주는 return 값이 있을 수 있습니다. 메인에서 프로그램이 실행될 때, 다양한 class를 지속적으로 호출하게 됩니다. 그러면 다른 class에 갔다가 다시 메인으로 돌와서 프로그램을 실행해야 합니다. 이러한 상황에서 다시 돌아올 때, 값을 가지고 오는 class가 있는 반면, 가지고 오는 값이 없는 class가 있습니다. 이 중에서 가지고 돌아오는 값이 없는 class에서 사용되는 것을 void라 합니다. 가지고 돌려주는 값이 정수형이면 int를 붙여서 사용합니다. (이러한 부분은 뒤에 다시 설명하도록 하겠습니다.)

 

대략적으로 설명하자면 이러한 형태가 됩니다.

  우리가 아직 많은 부분을 배우지 않아서 정확한 설명은 아니지만 대략적으로 이러한 느낌으로 흘러갑니다. Main이라는 프로그램의 큰 흐름에서 필요한 Class를 호출하고 흐름이 잠시간 넘어가는 형태로 프로그램이 진행됩니다. 이럴 때 void는 넘겨주는 값이 없는 형태이며, int는 정수를 넘겨주며, float은 실수값을 넘겨주는 것이죠. 무엇을 넘겨주는 지에 대해 알려주는 역할을 한다고 보시면 됩니다.


마지막으로 

Console.WriteLine("Hello, World!");

앞서 이야기한 Class에 대해 흐름이 넘어간다고 했죠? 여기서도 System이라는 네임스페이스에 있는 Console Class에 있는 WriteLine이라 불리는 메소드를 통해서 우리는 "Hello, World"의 문자열을 출력해줍니다. 

 

그리고 WriteLine은  출력이 끝난 후에 다음줄로 넘어갑니다. (Enter를 누르는 효과가 나옵니다.)

만약 줄 바꿈을 하고 싶지 않다면, Write라고 사용하면 됩니다.

Console.Write("Hello, World");

한번 써보신다음에 출력을 해보세요!

 


아직 static void Main(string[] args) 에서 string[] args는 이야기하지 않았습니다. 하지만 이는 나중에 이야기하도록 하겠습니다. 뒤에서 배울 내용을 먼저 배운 다음에야 이해가 됩니다. 일단은 이러한 구조를 갖는구나 생각을 하시면 됩니다. 

 

마지막 과제를 드리면서 이번 장을 마무리 짓도록 하겠습니다.

 

#1. 

안녕하세요. 저는 * * 입니다.
앞으로 우리의 프로그랭을 재밋게 해보도록 하겠습니다.
다음에 뵙겠습니다!

 

#2. 

이 줄은 첫번째 줄 입니다.

이 줄은 세번째 줄 입니다.

이 줄은 다섯번째 줄 입니다.

이 문제에 대한 답은 다음 시간에 올리도록 하겠습니다. 감사합니다.

 

+ Recent posts