상세 컨텐츠

본문 제목

생활코딩 C#03: 첫번째 프로그램 만들어 보고 코딩 기본 구조 파악하기

코딩

by Simple Runner 2022. 5. 1. 06:52

본문

생활코딩CS03.md

생활코딩 C#03

미션:

  • 첫번째 프로그램인 "콘솔 화면에 문자를 출력"해보고
  • 프로그램 구조를 배우고,
  • 객체 지향 프로그래밍에 대한 맛을 보자.

앞글: 생활코딩 C#02: 코딩과 글쓰기 유사점, C#의 주요 특징, 컴파일 과정

첫번째 프로그램

컴퓨터 화면에 "Hello World!"라는 문장을 출력해 보자.

컴퓨터 화면에 문자를 출력하는 방법에는 여러가지가 있지만, 가장 간단한 콘솔(Console)을 이용하자.

콘솔(Console)이란?

콘솔은 컴퓨터와 운영자 간의 작업과 상호 작용을 제공하는 다양한 장치 세트이다. 좀더 쉽게 이야기하면 컴퓨터와 직접 연결된 모든 대화형 장치이다.

윈도우에서는 cmd.exe를 실행시키면 나오는 검은 화면의 프로그램으로 명령프롬프트라고도 하며, 리눅스에서는 쉘(Shell)이 있다.

일반적으로 키보드로 명령을 내리는 공간으로, 그 명령에 대한 결과가 한 줄씩 나타나며 화면이 스크롤 된다.

두가지 프로그래밍 방법론

프로그래밍 방법론은 크게 다음과 같은 두가지가 있다.

  • 절차지향 프로그래밍: 명령을 순차적으로 입력하여 원하는 기능을 수행하게 하는 프로그램을 절차지향 프로그래밍이라고 하고, 이러한 것에 특화된 언어를 절차지향 언어 (Procedure Programming Language)라고 하고 C언어가 대표적이다.
  • 객체지향 프로그래밍: 우리가 사용할 C#은 객체지향 언어 (Object Oriented Programming Language)이다. 객체 또는 대상을 선정하여 거기에 해당하는 특성과 기능을 구현하는 방식이다.

그러면 객체지향에서 객체란 무엇인가?

  • 오브젝트(Object, 객체 또는 개체): 추상적이거나 구체적인 대상 (ex. 콘솔)
  • 오브젝트에서 중요한 두가지
    • 속성: 외부에 나타나는 특징 또는 상태 (ex. 사용가능 여부)
    • 기능: 뭘 하는 것, 객체 외부와의 상호작용 (ex. 문자열 입출력 하기)

객체지향 방법론으로 명령해 보기

C#의 문법을 모르는 상태에서 콘솔 화면에 "Hello World!"를 출력하는 프로그램을 짜기 위한 명령을 컴퓨터가 알아들을 수 있는 언어로 구체화 해보자.

단계 명령
1 컴퓨터 콘솔 화면에 "Hello World!"를 출력하라.
2 콘솔이라고 정의된 오브젝트(대상)에 "Hello World!"라는 문자열을 나타내라.
3 콘솔이라는 오브젝트의 기능 중 하나인 문자열을 출력하는 메소드에 "Hello World!"라는 문자열을 파라미터로 전달하여 그 기능을 수행하게 하라.
4 프로그램이 시작되면 처음으로 수행되는 곳(Main 메소드)에서 콘솔이라는 오브젝트에 내장된 문자열을 인자로 전달받아 콘솔에 출력하는 메소드를 호출하라.

아직 C# 언어, 객체지향 방법론 등에 익숙치 않으면 위의 1단계에서 4단계로 구체화가 쉽지는 않을 것이다. 하지만 계속 코딩을 공부하다 보면 자연스럽게 익숙질 것이다.

위의 4단계 명령을 C#으로 구현해 보자.

Program.cs 파일 (C# 9 이하 기준)

using System;

namespace MyApp
{
    internal class Program
    {
        static void Main()
        {
            Console.WriteLine("Hello World!");
        }
    }
}

위의 코드를 한 문장으로 말하면, MyApp이라는 네임스페이스 내에 Program이라는 클래스 내에 있는 Main함수에서 System 네임스페이스에서 이미 정의된 Console이라는 오브젝트의 WriteLIne이라는 함수를 사용하여 "Hello World!"라는 문자열을 파라미터로 하여 호출한 것이다.

한 줄씩 분석해 보자.

  • using System;
    • Console이라는 오브젝트의 정의를 가지고 있는 System이라는 네임스페이스(namespace)를 사용하다고 선언하는 것이다.
    • 마이크로소프트의 C# 개발자들이 Console이라는 객체를 미리 만들어 놓고, System이라는 네임스페이스에 포함 시켜 놓았다.
    • 따라서 우리는 가져다 쓰기만 하면된다. 대신 System이라는 네임스페이스를 쓴다고 미리 선언만하면 된다.
    • 네임스페이스는 유사한 종류의 객체의 선언(클래스, class) 들을 모아놓은 곳이다.
    • using은 네임스페이스를 사용한다는 것을 알려주는 C#의 키워드(keyword)이다.
  • namespace MyApp { }
    • 이 프로그램은 내가 만든 것이기 때문에, 내 프로그램을 위한 네임스페이스를 선언하고, 그 안에 내용을 채우는 것이다.
    • namespace라는 키워드를 쓰고 그 뒤에 원하는 네임스페이스 이름(여기서는 MyApp)을 쓰면 된다.
    • 그 이름은 대문자로 시작하도록 하는 것이 일반적인 룰이다. 꼭 안따라도 되지만 가능하면 따르는 것이 좋다.
    • 그 뒤에는 {} 중괄호로 여러 줄로 된 하기 내용을 감싼다.
  • internal class Program { }
    • internal은 외부 노출 여부(Access)를 결정하는 한정자(Modifier) 라고 한다.
      • 객체지향에서는 객체 외부에서 내부의 속성이나 기능 등을 엑세스 할 수 있는지 여부가 매우 중요하다.
      • internal은 이 클래스가 선언된 네임스페이스 안에서는 모두 엑세스하여 사용할 수있다.
      • 또 다른 한정자로는 public이 있는데, 이는 네임스페이스 밖에서도 항상 사용이 가능하다는 뜻이다.
    • class는 클래스를 선언하는 키워드이다.
      • 클래스는 사용자가 임의로 정의해서 사용하는 오브젝트를 담을 본(형틀)을 정의하는 것이다.
      • C#에서는 언어 내에서 이미 정의된 형(Type, 타입)이 있고, 사용자가 필요에 따라 정의해서 사용할 수 있는 타입이 있다. 이에 관해서는 매우 중요하기 때문에 나중에 상세하게 배울 것이다.
    • 이 키워드 뒤에서 원하는 클래스 이름을 쓰는데,
      • 일반적으로 대문자로 시작하고
      • 파일 이름(*.cs로 여기서는 Program.cs)과 같다.
      • 그 뒤에는 {} 중괄호로 정의 내용을 감싼다.
  • static void Main() { }
    • Main이라는 이름의 특수한 기능을 하는 메서드 정의하는 부분이다.
    • Main함수는 프로그램의 시작점이 되는 부분이다. 따라서 코드 내에서 한 개만 있어야 하고, 컴파일된 소스내에서도 한 개만 존재해야 하기 때문에 static이라는 한정자가 꼭 앞에 붙어야 한다.
  • Console.WriteLine("Hello World!");
    • Console이라는 오브젝트의 WriteLine이라는 메소드를 호출하는 것이다.
    • 문자열은 따옴표로 감싸서 나타내는데, WriteLine함수는 문자열을 파라미터로 받아서, 위에서 언급한 기능을 수행한다.
    • 명령문은 항상 세미콜론 ;으로 끝난다.

C# 10 이상에서는 간단하게

위의 코딩은 간단한 기능을 하는 프로그램을 만드는데 여러 내용을 써 넣어야 하여, 파이썬과 같은 언어에 비해 너무 번잡하다. 따라서 마이크로소프트에서는 최상위문(Top-level Statement)이라는 것을 만들어 Main함수에서 하는 기능만 간단하게 써넣으면 위와 동일한 일을 하는 프로그램을 한 줄로 만들 수 있게 하였다.

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

최상위문을 활용하여 위와 같은 작성한 코드는 컴파일시 자동으로 Main함수를 생성해서 C# 9이하에서 사용한 문법과 동일하게 만들어 준다.

일반적인 프로그램 구조

이제 일반적인 프로그램 구조를 알아보자. C#에서는 프로그램은 하나 이상의 파일로 구성되는데, 각 파일은 아래와 같은 구조를 갖는다. 하기 소스는 마이크로소프트 닷넷 사이트에서 가져옴

// A skeleton of a C# program
using System;
namespace YourNamespace
{
    class YourClass
    {
    }

    struct YourStruct
    {
    }

    interface IYourInterface
    {
    }

    delegate int YourDelegate();

    enum YourEnum
    {
    }

    namespace YourNestedNamespace
    {
        struct YourStruct
        {
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            //Your program starts here...
            Console.WriteLine("Hello world!");
        }
    }
}

프로그램 구조를 다이어그램으로 표현하면 아래와 같다. 핵심 개념이기 때문에 한글로 번역된 용어보다는 영어를 그대로 받아들여 개념화 시키는 것이, 향후 혼자서 더 깊이 있는 공부를 해나갈 때 도움이 된다. 한글화 하면 그 의미가 약간 다르게 다가오거나 그 핵심을 짚지 못하는 경우가 있다. 아직 간단한 설명도 못한 struc, interface, delegate 등에 대해서는 다른 것들과 함께 앞으로 상세히 배우게 될 것이다.

classDiagram-v2 Assembly --> Namespace선언 : has Namespace선언 --> Type선언 : has Type선언 --> Member선언 : has class Assembly { + Namespace + Type } class Namespace선언 { + Type + NestedNamespace } class Type선언 { + class + struct + interface + enum + delegate } class Member선언 { + constant + field + method + property + event + indexer + operator + constructor + static_constructor + destructor + NestedType }

위의 다이어그램을 보면 어느 정도 눈치를 챘겠지만, C#에서 코딩은 타입(Type)를 선언하는 것이 전부이다라고 말할 수 있다. 이제부터 한가지씩 차근차근 알아가 보자.

관련글 더보기