카테고리 보관물: 게임개발

C# 코드의 작동방법

여기 한줄의 코드가 있습니다.

Console.WriteLine("Hello World!");

리터럴문자열

코드를 실행하면 Hello World! 메시지가 출력 창에 출력되었습니다. C# 코드에서 큰따옴표로 묶인 문구를 리터럴 문자열 이라고 합니다. 즉, H, e, l, l, o 등의 문자를 문자 그대로 출력으로 보내려고 했습니다. 리터럴 문자열은 쓴 그대로 화면에 출력됩니다. 프로그래밍 내에 예약어나 명령어가 아닌 있는 그대로를 프린트하는 것입니다.

메서드

WriteLine() 을 메서드 라고 합니다. 메서드 뒤에는 괄호 집합이 있으므로 항상 메서드를 쉽게 찾을 수 있습니다. 각 메서드에는 하나의 작업이 있습니다. WriteLine() 메서드의 작업은 한 줄의 데이터를 출력 창에 쓰는 것입니다. 출력된 데이터는 여는 괄호와 닫는 괄호 사이에 포함되어 입력 매개 변수로 전송됩니다. 일부 메서드는 입력 매개 변수가 필요하지만, 그렇지 않은 메서드도 있습니다.

하지만 메서드를 호출하려면 항상 메서드 이름 뒤에 괄호를 사용해야 합니다. 괄호를 ‘메서드 호출 연산자’라고 합니다.

클래스

Console 파트를 클래스 라고 합니다. 클래스는 메서드보다 큰 집합으로 모든 메서드는 하나의 클래스에 속한다고 보면 됩니다. 더 적절한 표현으로 메서드가 클래스 내부에 있습니다.

메서드에 액세스하려면 메서드가 있는 클래스를 알아야 합니다. 하나의 클래스에는 자주 사용하고 유사한 작업을 수행하는 모든 메서드을 취합하여 구성하고 있습니다. 어떤 메서드를 사용하고 싶다면 그 클래스를 임포트 해와야 합니다. 레고로 보면 바퀴 조립을 위해 바퀴 키트를 가지고 오는거라고 생각하면 됩니다.

클래스 이름 Console과 메서드 이름 WriteLine()을 구분하는 점(.)도 있습니다. 마침표(.)는 ‘멤버 액세스 연산자’입니다. 즉, 점을 통해 클래스에서 해당 메서드 중 하나로 “탐색”하는 것입니다. 레고 바퀴 키트에서 찾고자 하는 바퀴를 찾는 거라고 생각하시면 됩니다. (CTRL + F)

문장의 종결자 세미콜론

마지막으로, 세미콜론(;)은 ‘FINISH 연산자’입니다. C#에서 문 은 전체 명령입니다. 세미콜론은 명령 입력을 마쳤음을 컴파일러에 알립니다.

마치며

출력문 한줄로 기본적은 내용을 훑어봅니다. 물론 지금 알아야하는 내용은 아닙니다. 저 내용을 암기하는 건 2000페이지 백과사전을 암기하겠다는 것과 같습니다. 엉덩이로 체득하고 코딩으로 삽잘하다보면 자연히 알게되는 내용입니다.

저것들이 뭉친 것들의 집합을 알고리즘이라고나 할까요? 알고리즘 이해되면 개발 끝난거죠.

최신글

닷넷

마이크로소프트 닷넷이란?

닷넷은 애플리케이션 개발을 위한 에코시스템

에코시스템이라는 용어는 애플리케이션 개발 환경의 다중 패싯 영역과 이 환경을 둘러싼 커뮤니티를 말합니다. 결합된 여러 패싯은 닷넷에서 애플리케이션을 학습하고 빌드하는 데 투자해야 할 이유가 됩니다.

애플리케이션을 실행

개발자는 C#, F# 같은 닷넷 언어를 사용하여 소스 코드를 작성합니다. 작성하는 각 코드 줄은 프로그램이 실행되는 동안 컴퓨터에서 수행할 명령을 나타냅니다.

개발자가 코드를 실행하려면 먼저 코드를 컴파일해야 합니다. 닷넷 컴파일러는 소스 코드를 중간 언어(IL)라는 특수 언어로 변환하는 프로그램입니다. 닷넷 컴파일러는 IL 코드를 닷넷 어셈블리라는 파일에 저장합니다. “중간” 형식으로 코드를 컴파일하면 Windows나 Linux 또는 32비트나 64비트 컴퓨터 하드웨어 등 코드 실행 위치와 관계없이 동일한 코드 베이스를 사용할 수 있습니다.

닷넷 런타임 은 컴파일된 닷넷 어셈블리의 실행 환경입니다. 다시 말해서 닷넷 런타임은 호스트 운영 체제에서 실행되어 애플리케이션을 실행하고 관리합니다.

이러한 메커니즘은 처음에는 몰라도 상관없습니다. 경험을 통해 닷넷 언어, 컴파일러, 런타임의 기본 기능들은 파악이 가능해집니다.

C# 이 곧 닷넷이 아닙니다. C#은 프로그래밍 언어 구문입니다. 구문의 일부로 닷넷 코드 라이브러리 또는 어셈블리에 정의된 메서드를 참조하고 호출할 수 있습니다. 또한 닷넷  SDK와 함께 설치된 C# 컴파일러를 사용하여 C# 코드에서 어셈블리를 만듭니다. 닷넷 런타임은 닷넷 어셈블리를 실행합니다. 차이를 이해하기 시작하면 한단계 성숙된 프로그래머가 될 수 있습니다.

닷넷의 활용

MS 언어를 사용하여 애플리케이션을 개발한다면 닷넷은 무조건 사용하게 됩니다. 모든 프로그램 언어를 구동시키는 프레임워크 역할을 하는게 닷넷이거든요.

굳이 개발자가 아니어도 윈도우를 사용하는 엔드유저의 모든 컴퓨터에는 닷넷이 설치되어 있습니다. 온라인게임을 하나 구동하려고 해도 닷넷이 설치되어야하거든요. 닷넷을 모르고 MS 개발자가 될 수는 없습니다. 한글 모르는 한국인가 같다고 할까요.

최신글

프로그래밍 언어란 무엇인가?

프로그래밍 언어란

C#과 같은 프로그래밍 언어를 사용하면 컴퓨터에서 수행하려는 명령을 작성하고 실행할 수 있습니다. 프로그래밍 언어마다 구문이 다르지만, 첫 번째 프로그래밍 언어를 배운 뒤 다른 프로그래밍 언어는 쉽게 배울 수 있습니다. 프로그래밍 언어의 작업은 사람이 읽고 이해할 수 있는 방식으로 명령을 작성할 수 있도록 하는 것입니다. 프로그래밍 언어로 작성하는 명령을 “소스코드” 라고 합니다.

작성된 소스코드는 개발자만이 알 수 있는 구문입니다. 이것을 컴퓨터가 알 수 있게 하는 것이 컴파일입니다. 컴파일을 해야만 컴퓨터가 알 수 있는 형식이 되고 인식할 수 있습니다.

컴파일이란

컴파일러 라는 특수 프로그램은 컴퓨터 CPU에서 실행할 수 있는 다른 형식으로 소스 코드를 컴퓨터가 알아 볼 수 있는 형식으로 변환합니다. 개발 툴을 이용하면 버튼 1클릭으로 쉽게 컴파일 할 수 있습니다.

소스코드를 컴파일해야 하는 이유는 대부분의 프로그래밍 언어는 처음보는 사람은 암호처럼 보이겠지만 컴퓨터 조차 그렇게 본다는 것입니다. 수천 또는 수백만 개의 작은 스위치를 설정하거나 해제하여 표현되는 컴퓨터 언어로 변경하는 것이 컴파일이 기본이라고 보시면 됩니다.

가령 인간이 이해하는 코드와 컴퓨터가 이해하는 형식을 연결하는 브릿지로 생각하면 되겠습니다.

구문이란

프로그래밍 언어의 구문에는 키워드, 연산자(세미콜론 또는 괄호와 같은 특수 키보드 문자), 컴파일러에서 적용하는 기타 문법 규칙 등이 포함됩니다. 모두가 합의한 규칙대로 정해시 치기만 하면 되는 것입니다. 가령 구문을 끝낼 때는 ; 문자로 마친다든지 하는 것들이죠.

개발 툴(대표적으로 비쥬얼 스튜디오)에 코드를 입력하면 여러 단어와 기호의 색이 약간 변경되는 것을 확인할 수 있습니다. 구문 강조 표시는 C#의 구문 규칙을 따르지 않는 코드 오류를 쉽게 파악하는 데 사용할 수 있는 유용한 기능입니다. 한글에서 타자를 칠 때 맞춤법 틀리면 아래 빨간실선 생기는 것과 같습니다.

Visual Studio Code와 Visual Studio IDE같은 개발툴에서는 이런 기능과 비슷하고 훨씬 더 강력한 여러가지 옵션을 사용할 수 있습니다.

최신글

C#이 대세, C#으로 할 수 있는 것들

C#을 사용하면 다음과 같이 다양한 유형의 애플리케이션을 빌드할 수 있습니다.

  • 데이터를 캡처, 분석, 처리하는 비즈니스 애플리케이션
  • 웹 브라우저에서 액세스할 수 있는 동적 웹 애플리케이션
  • 2D 및 3D 게임
  • 금융 및 공학용 애플리케이션
  • 클라우드 기반 애플리케이션
  • 모바일 애플리케이션

프로그래밍 언어를 배우는 가장 좋은 방법은 최대한 많이 코딩을 해보는 것입니다. 인터넷에 찾아보면 수없이 많은 오픈 소스와 예제들이 많습니다. 본인에게 알맞은 툴을 설치하고 많이코딩해 볼수록, 삽질이 많아질수록 실력은 좋아집니다.

차근차근 진행하다보면 위의 애플리케이션들을 개발하는데 어느 정도 감을 찾을 수 있을 것입니다. 처음에는 무조건 삽질이지요.

관련 전공서적을 공부하거나 이론을 먼저 선행하여 기초를 탄탄히 하는 것도 중요합니다만 무조건 닥 코딩 삽질보다 빠르게 프로그래밍 언어를 배울 수는 없습니다.

기초가 탄탄하지 않아 어느 수준에서 막힌다면 그때 이론을 찾아보면 될 일!

C#이 대세가 되지 않을까

C#으로 모든 언어를 대체할 수 있습니다. 자바는 물론 C++도 가능합니다. 그 보다 쉬운 상위 언어들이야 말할 것도 없다고 봅니다.

닷넷이라는 좋은 프레임워크를 가지고 있고 웹 언어로서도 많은 퍼포먼스를 보여주고 있습니다. 응용프로그래밍 언어의 한 종류로서 게임개발이나 각종 애플리케이션 개발도 우리나라는 아니지만 해외에서는 다양하게 사용 중입니다.

자바는 서자

논외로 자바는 오라클의 자식인데 돈은 벌어서 구글에 바치고 있죠. 오라클이 자바를 인수한 순간부터 약간 혼외자의 자식의 느낌이 나는 건 어쩔 수 없죠.

오라클 입장에서야 자바가 달갑겠습니까. 그에비해 C#은 MS의 우수한 첫째아들 느낌이니 앞으로도 총망받은 언어가 될 것이란게 자명한 수순이겠지요.

딥러닝, AI, 핀테크, 블록체인 등등 자바로 개발이 가능하겠습니까?

C#의 친구 VS

C#을 개발한다면 VS이라는 툴을 모두 사용할겁니다. 물론 공짜입니다. 기가 막힌 툴이지요. 저는 전 자바개발자로써 현재는 개발업을 한동안 중단한 상태이지만 VS의 기가막힌 성능에 대해선 잘 압니다. 자바도 개발이 가능하니 ~

이런 든든한 친구가 있는 C#이 촉망받는 언어가 되지 않을 수 없습니다. 애초에 C#개발자가 될 것 그랬습니다. 선배님들의 말에 자바가 취직이 잘된다하여…

C# 공부

C#으로 다양한 것들을 할 수 있지만 저는 게임을 만들어보면 어떨가합니다. 게임을 좋아하기도 하고 이 웹사이트는 게임리뷰를 위한 공간이기도 하지만 게임 개발도 병행해보면 좋을 듯 합니다. 물론 매우 느린 속도로 업데이트 되겠지만 아는 만큼 족족 써보도록 하겠습니다.

최신글

자마린(Xamarin) 이란?

자마린은 오픈 소스 UI 프레임워크입니다. 개발자는 자마린을 사용하며 단일한 공유 코드베이스에서 안드로이드, iOS, 윈도우 애플리케이션을 빌드할 수 있습니다.

개발자는 Xamarin.Forms로 C#의 코드 숨김이 있는 XAML에서 사용자 인터페이스를 만들 수 있습니다. 이러한 인터페이스는 각 플랫폼에서 성능 네이티브 컨트롤로서 렌더링됩니다.

자마린 사용대상

자마린의 사용 대상은 다음을 목표로 하는 개발자입니다

  • .플랫폼 전반에서 UI 레이아웃과 디자인을 공유합니다.
  • 플랫폼 전반에서 코드, 테스트 및 비즈니스 논리를 공유합니다.
  • Visual Studio로 C#의 플랫폼 간 앱을 작성합니다.

자마린 작동방법

자마린은 플랫폼 전반에서 UI 요소를 만들기 위한 일관된 API를 제공합니다. 이 API는 XAML이나 C#으로 구현이 가능하며 MVVM(Model-View-ViewModel) 같은 패턴에 대한 데이터 바인딩을 지원합니다.

런타임에서 자마린은 플랫폼 렌더러를 사용하여 플랫폼 간 UI 요소를 Xamarin.Android, Xamarin.iOS, UWP의 네이티브 컨트롤로 변환합니다. 따라서 개발자는 여러 플랫폼 간에 코드를 공유하면서도 네이티브한 모양과 느낌, 성능을 얻을 수 있습니다.

자마린 애플리케이션은 일반적으로 공유된 .NET Standard 라이브러리와 개별 플랫폼 프로젝트로 구성됩니다. 공유 라이브러리에는 XAML 또는 C# 뷰와 서비스, 모델 또는 기타 코드와 같은 비즈니스 논리가 포함되어 있습니다. 플랫폼 프로젝트에는 애플리케이션에 필요한 플랫폼별 논리 또는 패키지가 포함됩니다.

자마린 플랫폼을 사용하여 플랫폼 전반에서 .NET 애플리케이션을 기본적으로 실행합니다.

라이브러리

애플리케이션에 다양한 기능을 추가하는 라이브러리의 대규모 에코시스템이 있습니다. 대표적으로 Xamarin.Essentials이 있습니다.

Xamarin.Essentials

Xamarin.Essentials는 네이티브 디바이스 기능을 대상으로 플랫폼 간 API를 제공하는 라이브러리입니다. Xamarin와 마찬가지로 Xamarin.Essentials 또한 일종의 추상화로서 네이티브 유틸리티 액세스 프로세스를 간소화합니다. Xamarin.Essentials에서 제공하는 유틸리티의 예로는 다음 몇 가지를 들 수 있습니다.

  • 디바이스 정보
  • 파일 시스템
  • 가속도계
  • 전화 걸기
  • 텍스트 음성 변환
  • 화면 잠금

최신글

C# 프로그램의 구조

C#의 핵심 조직

C#의 핵심 조직 개념은 ‘프로그램’, ‘네임스페이스’, ‘형식’, ‘멤버’, ‘어셈블리’입니다. 프로그램은 멤버를 포함하고 네임스페이스로 구성될 수 있는 형식을 선언합니다. 클래스, 구조체 및 인터페이스는 형식의 하나 입니다. 필드, 메서드, 속성 및 이벤트는 멤버의 하나 입니다.

C# 프로그램을 컴파일하면 실제로 어셈블리로 패키지됩니다. 어셈블리는 일반적으로 애플리케이션을 구현하는지 또는 *라이브러리**를 구현하는지에 따라 각각 파일 확장명 .exe 또는 .dll을 갖습니다.

어셈블리 예제

간단한 예로, 다음 코드를 포함하는 어셈블리를 생각해 볼 수 있습니다.

using System; 

namespace Acme.Collections 
{
     public class Stack<T>
     {
         Entry _top;
         
         public void Push(T data)
         {       
              _top = new Entry(_top, data);
         }

         public T Pop()
         {
             if (_top == null)
             {
                 throw new InvalidOperationException();
             }

             T result = _top.Data;
             _top = _top.Next;
             
             return result;
         }

         class Entry
         {
             public Entry Next { get; set; }
             public T Data { get; set; }
             
             public Entry(Entry next, T data)
             {
                 Next = next;
                 Data = data;
             }
         }
     }
 }

이 클래스의 정규화된 이름은 Acme.Collections.Stack입니다. 클래스에는 필드 top, 2개의 메서드 Push 및 Pop, 중첩된 클래스 Entry 등의 여러 멤버가 포함됩니다. Entry 클래스는 필드 next 및 필드 data, 생성자의 세 멤버가 포함됩니다. Stack은 제네릭 클래스입니다. 이는 사용 시 구체적인 형식으로 대체되는 T 형식 매개 변수 하나를 포함합니다.

어셈블리에는 IL(중간 언어) 명령 형식의 실행 코드와 메타데이터 형식의 기호 정보가 포함됩니다. 어셈블리가 실행되기 전에, .NET 공용 언어 런타임의 JIT(Just-In-Time) 컴파일러가 어셈블리 안의 IL 코드를 해당 프로세서에 맞는 코드로 변환합니다.

어셈블리는 코드와 메타데이터를 모두 포함하는 기능의 자체 설명 단위이므로 C#에서는 #include 지시문과 헤더 파일이 필요하지 않습니다. 특정 어셈블리에 포함된 공용 형식 및 멤버는 프로그램을 컴파일할 때 해당 어셈블리를 참조하는 것만으로 C# 프로그램에서 사용 가능해집니다. 예를 들어 이 프로그램에서는 acme.dll 어셈블리의 Acme.Collections.Stack 클래스를 사용합니다.

Acme.Collections.Stack를 사용하는 프로그램 예제

using System; 
using Acme.Collections;

class Example 
{
     public static void Main()
     {
         var s = new Stack<int>();
         s.Push(1); // stack contains 1
         s.Push(10); // stack contains 1, 10
         s.Push(100); // stack contains 1, 10, 100
         Console.WriteLine(s.Pop()); // stack contains 1, 10
         Console.WriteLine(s.Pop()); // stack contains 1
         Console.WriteLine(s.Pop()); // stack is empty
     }
 }

이 프로그램을 컴파일하려면 위의 예제에 정의된 스택 클래스를 포함하는 어셈블리를 참조해야 합니다.

C# 프로그램은 여러 원본 파일에 저장될 수 있습니다. C# 프로그램을 컴파일하면 모든 원본 파일이 함께 처리되고 서로를 제약 없이 참조할 수 있습니다. 개념적으로 처리되기 전에 모든 원본 파일이 하나의 대량 파일에 연결된 것과 같습니다. 소수의 경우를 제외하고 선언 순서는 중요하지 않으므로 C#에서는 정방향 선언이 필요한 경우가 없습니다. C#은 소스 파일을 하나의 공용 형식만 선언하도록 제한하거나 소스 파일 이름이 소스 파일에 선언된 형식과 일치하도록 요구하지 않습니다.

이점은 객체지향 프로그램이 좋은점이기도 합니다.

최신글

C# 필드 및 메서드

필드

필드 는 클래스 또는 클래스의 인스턴스와 연결된 변수입니다.

static 한정자를 사용하여 선언된 필드는 정적 필드를 정의합니다. 정적 필드는 정확히 하나의 스토리지 위치를 식별합니다. 클래스의 인스턴스가 몇 개나 만들어졌는지에 관계없이 정적 필드의 복사본은 하나뿐입니다.

static 한정자 없이 선언된 필드는 인스턴스 필드를 정의합니다. 클래스의 모든 인스턴스는 해당 클래스의 모든 인스턴스 필드의 별도 복사본을 포함합니다.

다음 예제에서 Color 클래스의 각 인스턴스는 R, G 및 B 인스턴스 필드의 별도 복사본을 갖지만 Black, White, Red, Green 및 Blue 정적 필드의 복사본은 하나뿐입니다.

public class Color 
{
     public static readonly Color Black = new Color(0, 0, 0);
     public static readonly Color White = new Color(255, 255, 255);
     public static readonly Color Red = new Color(255, 0, 0);
     public static readonly Color Green = new Color(0, 255, 0);
     public static readonly Color Blue = new Color(0, 0, 255);

     public byte R;
     public byte G;
     public byte B;

     public Color(byte r, byte g, byte b)
     {
         R = r;
         G = g;
         B = b;
     } 
}

위 예제와 같이 읽기 전용 필드 는 readonly 한정자를 사용하여 선언될 수 있습니다. 읽기 전용 필드에 대한 할당은 필드 선언의 일부로 또는 동일한 클래스의 생성자에서만 발생할 수 있습니다.

메서드

메서드 는 개체 또는 클래스에서 수행할 수 있는 계산이나 작업을 구현하는 멤버입니다. 정적 메서드 는 클래스를 통해 액세스됩니다. 인스턴스 메서드 는 클래스의 인스턴스를 통해 액세스됩니다.

메서드에는 메서드로 전달되는 값 또는 변수 참조를 나타내는 ‘매개 변수’ 목록이 있을 수 있습니다. 메서드에는 메서드에 의해 계산되고 반환되는 값의 형식을 지정하는 ‘반환 형식’이 있습니다. 메서드가 값을 반환하지 않을 경우 반환 형식은 void입니다.

형식과 마찬가지로 메서드에는 메서드가 호출될 때 형식 인수가 지정되어야 하는 형식 매개 변수 집합도 있을 수 있습니다. 형식과 달리 형식 인수는 종종 메서드 호출의 인수에서 유추될 수 있으므로 명시적으로 지정할 필요가 없습니다.

메서드의 시그니처 는 메서드가 선언되는 클래스에서 고유해야 합니다. 메서드 시그니처는 메서드의 이름, 형식 매개 변수의 수, 해당 매개 변수의 수, 한정자 및 형식으로 구성됩니다. 메서드 시그니처는 반환 형식을 포함하지 않습니다.

메서드 본문이 단일 식인 경우 메서드는 다음 예제와 같이 간결한 식 형식을 사용하여 정의할 수 있습니다.

public override string ToString() => "This is an object";

최신글

C# 구조체와 인터페이스

클래스는 상속과 다형성을 지원하는 형식을 정의합니다. 이를 통해 파생 클래스의 계층 구조를 기반으로 정교한 동작을 만들 수 있습니다. 이와 대조적으로 ‘구조체’ 형식은 보다 단순한 형식으로, 기본 용도는 데이터 값을 저장하는 것입니다.* 구조체는 기본 형식을 선언할 수 없으며, System.ValueType에서 암시적으로 파생됩니다. struct 형식에서 다른 struct 형식을 파생할 수 없으며 암시적으로 봉인됩니다.

public struct Point 
{
     public double X { get; }
     public double Y { get; }

     public Point(double x, double y) => (X, Y) = (x, y); 
}

‘인터페이스’는 클래스 및 구조체로 구현할 수 있는 계약을 정의합니다. 인터페이스는 메서드, 속성, 이벤트 및 인덱서를 포함할 수 있습니다. 인터페이스는 일반적으로 해당 인터페이스가 정의하는 멤버의 구현을 제공하지 않으며 단지 해당 인터페이스를 구현하는 클래스 또는 구조체에서 제공해야 하는 멤버를 지정합니다.

인터페이스는 ‘다중 상속’을 사용할 수 있습니다. 다음 예제에서 인터페이스 IComboBox는 ITextBox 및 IListBox를 둘 다 상속합니다.

interface IControl 
{
     void Paint(); 
} 

interface ITextBox : IControl 
{
     void SetText(string text); 
} 

interface IListBox : IControl 
{
     void SetItems(string[] items); 
} 

interface IComboBox : ITextBox, IListBox { }

클래스 및 구조체는 여러 인터페이스를 구현할 수 있습니다. 다음 예제에서 클래스 EditBox는 IControl 및 IDataBound를 둘 다 구현합니다.

interface IDataBound 
{
     void Bind(Binder b); 
} 

public class EditBox : IControl, IDataBound 
{
     public void Paint() { }
     public void Bind(Binder b) { } 
}

클래스 또는 구조체가 특정 인터페이스를 구현하는 경우 해당 클래스 또는 구조체의 인스턴스를 해당 인터페이스 형식으로 암시적으로 변환할 수 있습니다. 예를 들면 다음과 같습니다.

EditBox editBox = new EditBox();
IControl control = editBox; 
IDataBound dataBound = editBox;

최신글

C#의 클래스 및 객체

클래스

클래스 는 C#의 가장 기본적인 형식입니다. 클래스는 상태(필드)와 작업(메서드 및 기타 함수 멤버)을 하나의 단위로 결합하는 데이터 구조입니다. 클래스는 해당 클래스의 ‘인스턴스’(‘개체’라고도 함)에 대한 정의를 제공합니다. 클래스는 상속 및 다형성 과 파생된 클래스 가 기본 클래스 를 확장하고 특수화할 수 있는 메커니즘을 지원합니다.

새 클래스는 클래스 선언을 사용하여 만들어집니다. 클래스 선언은 헤더로 시작합니다. 헤더는 다음을 지정합니다.

  • 클래스의 특성 및 한정자
  • 클래스의 이름
  • 기본 클래스(기본 클래스에서 상속하는 경우)
  • 이 클래스에서 구현한 인터페이스

헤더 다음에는 구분 기호 { 및 } 간에 작성되는 멤버 선언 목록으로 구성되는 클래스 본문이 나옵니다. 다음 코드는 Point라는 간단한 클래스의 선언입니다.

public class Point 
{
  public int X { get; }
  public int Y { get; }

    public Point(int x, int y) => (X, Y) = (x, y);
}

클래스의 인스턴스는 새 인스턴스에 대한 메모리를 할당하고, 인스턴스를 초기화하는 생성자를 호출하고, 인스턴스에 대한 참조를 반환하는 new 연산자를 사용하여 만들어집니다. 다음 문은 두 개의 Point 개체를 만들고 해당 개체에 대한 참조를 두 변수에 저장합니다.

var p1 = new Point(0, 0);
var p2 = new Point(10, 20);

개체

개체가 차지하는 메모리는 개체에 더 이상 연결할 수 없을 때 자동으로 회수됩니다. C#에서는 개체를 명시적으로 할당 취소할 필요가 없으며 가능하지도 않습니다.

기본 클래스

클래스 선언은 기본 클래스를 지정할 수 있습니다. 클래스 이름 및 형식 매개 변수 뒤에 콜론과 기본 클래스의 이름을 사용하면 됩니다. 기본 클래스 지정을 생략하면 object 형식에서 파생되는 클래스와 같습니다. 다음 예제에서 Point3D의 기본 클래스는 Point입니다. 첫 번째 예제에서 Point의 기본 클래스는 object입니다.

public class Point3D : Point 
{     
  public int Z { get; set; }
  public Point3D(int x, int y, int z) : base(x, y)
  {
    Z = z;
  }
}

클래스는 기본 클래스의 멤버를 상속합니다. 상속은 클래스가 기본 클래스의 거의 모든 멤버를 암시적으로 포함함을 의미합니다. 클래스는 인스턴스 및 정적 생성자와 종결자는 상속하지 않습니다. 파생 클래스는 해당 파생된 클래스를 상속하는 멤버에 새 멤버를 추가할 수 있지만 상속된 멤버의 정의를 제거할 수 없습니다. 앞의 예제에서 Point3D는 Point에서 X 및 Y 멤버를 상속하고 모든 Point3D 인스턴스는 세 개의 속성, 즉 X, Y 및 Z를 포함합니다.

클래스 형식에서 해당 기본 클래스 형식 간에 암시적 변환이 존재합니다. 클래스 형식의 변수는 해당 클래스의 인스턴스 또는 모든 파생 클래스의 인스턴스를 참조할 수 있습니다. 예를 들어 이전 클래스 선언에서 형식 Point의 변수는 Point 또는 Point3D를 참조할 수 있습니다.

Point a = new Point(10, 20);
Point b = new Point3D(10, 20, 30);

최신글

C# Hello World 작성법

“Hello World”는 프로그래밍 언어를 배울 때 제일 처음 공부하는데 일반적으로 사용됩니다. C#에서는 다음과 같이 코딩하면 됩니다.

using System; 
class Hello
  { 
    static void Main()
      { Console.WriteLine("Hello, World");}
  }

“Hello World”는 System 네임스페이스를 참조하는 using 지시문으로 시작합니다. 네임스페이스는 계층적으로 C# 프로그램 및 라이브러리를 구성하는 방법을 제공하는 집합입니다.. 네임스페이스에는 형식 및 다른 네임스페이스가 포함됩니다. 예를 들어 System 네임스페이스에는 많은 형식(예: 프로그램에 참조되는 Console 클래스) 및 많은 다른 네임스페이스(예: IO 및 Collections)가 포함되어 있습니다.

지정된 네임스페이스를 참조하는 using 지시문을 사용하여 해당 네임스페이스의 멤버인 형식을 정규화되지 않은 방식으로 사용할 수 있습니다. using 지시문 때문에, 프로그램은 Console.WriteLine을 System.Console.WriteLine의 약식으로 사용할 수 있습니다.

“Hello World” 프로그램에서 선언된 Hello 클래스에는 단일 멤버인 Main 메서드가 있습니다. Main 메서드는 static 한정자로 선언됩니다. 인스턴스 메서드는 this 명령어를 사용하여 특정 바깥쪽 개체 인스턴스를 참조할 수 있지만 정적 메서드는 특정 개체에 대한 참조 없이 작동합니다. 관례상 Main이라는 정적 메서드가 C# 프로그램의 진입점으로 사용됩니다.

“Hello World” 출력은 System 네임스페이스에 있는 Console 클래스의 WriteLine 메서드에 의해 생성됩니다. 이 클래스는 기본적으로는 컴파일러에서 자동으로 참조되는 표준 클래스 라이브러리를 통해 제공됩니다.