클래스 디자인 및 사용
OOP(개체 지향 프로그래밍)에서 클래스는 애플리케이션의 구성 요소입니다. 클래스와 개체의 관계를 이해하는 것은 필수적입니다.
- 클래스는 개발자가 개체의 속성(데이터)과 메서드(동작)를 정의하는 데 사용하는 청사진입니다. 클래스는 데이터와 동작을 캡슐화하는 방법을 제공하여 코드를 보다 쉽게 구성하고 관리할 수 있도록 합니다.
- 개체는 클래스의 인스턴스입니다. 클래스가 인스턴스화되면 메모리에 개체가 만들어집니다. 각 개체는 고유한 속성과 메서드 집합을 갖지만 클래스에서 정의한 것과 동일한 구조를 공유합니다.
주변의 실제 개체를 살펴보면 프로그래밍에서 클래스와 개체가 어떻게 작동하는지 이해하는 데 도움이 될 수 있습니다. 실제 세계의 개체에는 목적과 기능을 정의하는 특성(속성)과 동작(메서드)이 있습니다. 예를 들어, 자동차는 제조사, 모델, 색과 같은 특성을 가지고 있고, 운전과 중지와 같은 동작을 가지는 개체입니다.
실제 개체
사람들은 일상생활 속에서 끊임없이 개체와 상호 작용합니다. 사실, 우리가 상호 작용하는 거의 모든 것을 개체로 생각할 수 있습니다.
실제 세계의 개체를 정의하는 데 사용할 수 있는 기준은 다음과 같습니다.
- 개체는 우리가 보고 만질 수 있는 것들입니다.
- 개체에는 목적이 있습니다.
- 개체에는 해당 용도를 지원하는 부분이 있습니다.
연필은 실제 개체의 한 예입니다. 연필의 목적은 메모나 그림을 그리는 것입니다. 연필의 구성 요소는 몸체, 촉, 그리고 지우개로 구성됩니다. 각 부품은 함께 작동하여 연필의 의도된 목적을 달성합니다.
다른 개체의 집합으로 존재하는 실제 개체도 있습니다. 다음 목록은 다른 개체로 구성된 개체의 예를 보여 줍니다.
- 자동차: 자동차의 목적은 개인과 가족을 위한 지상 전송수단을 제공하는 것입니다. 자동차의 부품에는 엔진, 휠, 스티어링 휠 등 여러 가지가 있습니다. 자동차의 부품들은 함께 작동하여 지상 전송을 가능하게 합니다.
- 집: 집의 목적은 거주 공간을 제공하는 것입니다. 집의 구성 요소에는 기초, 외벽, 지붕, 방이 포함됩니다. 이러한 부분들이 함께 작용하여 생활공간을 형성합니다.
- 스마트폰: 스마트폰의 목적은 사용자의 일상 업무와 작업을 돕는 것입니다. 스마트폰의 구성품으로는 화면, 마이크로프로세서, 메모리 및 스토리지, 배터리, 카메라, 단추 등이 있습니다. 이러한 부분들이 함께 작동하여 통신, 엔터테인먼트, 생산성 기능을 가능하게 합니다.
자동차, 주택, 스마트폰의 각 부분은 자체적인 목적을 가진 개체이며, 개체의 어셈블리체일 수도 있습니다.
실제 개체의 특성 및 기능
잠시 시간을 내어 연필의 예를 생각해 보세요. 연필에는 부품(몸체, 촉, 지우개)이 있고 용도(메모나 그림을 그리는 용도)가 있습니다. 연필은 이러한 기본적인 특성을 공유합니다. 하지만 모든 연필이 똑같은 것은 아닙니다.
어떤 연필은 짧고, 어떤 연필은 깁니다. 어떤 연필은 노란색이고, 어떤 연필은 검은색입니다. 어떤 연필은 끝이 둔하고, 어떤 연필은 끝이 뾰족합니다. 어떤 연필에는 지우개가 있고, 어떤 연필에는 지우개가 없습니다.
개체의 특성은 종종 다음과 같은 실제 및 동작적 범주로 구분됩니다.
- 실제: 실제 특성은 눈으로 볼 수 있거나 측정할 수 있는 개체의 측면입니다.
- 동작: 동작 특성은 개체의 기능이나 다른 개체와의 상호 작용을 설명하는 측면입니다.
연필의 경우 실제 특성에는 연필 몸체의 길이, 연필 몸체의 색, 연필 끝의 날카로움, 연필에 지우개가 있는지 여부 등이 포함됩니다. 동작적 특성에는 글을 쓸 수 있는 기능, 지울 수 있는 기능, 깎을 수 있는 기능이 포함됩니다. 연필은 글을 쓰거나 그림을 그릴 수 있는 종이나 다른 단단한 개체와 상호 작용합니다.
실제 특성은 종종 속성이라고 불리고, 동작 특성은 종종 함수(C# 프로그래밍에서는 메서드)라고 불립니다.
C# 프로그래밍의 코드 클래스와 개체
C# 프로그래밍 세계에서는 개체 속성과 메서드가 클래스에 의해 정의됩니다. 클래스는 개체(클래스의 인스턴스)가 무엇을 할 수 있는지에 대한 청사진을 제공합니다. 클래스에 대한 청사진을 클래스 정의라고 합니다.
앱이 실행될 때 컴퓨터는 클래스 정의를 사용하여 개체(클래스의 인스턴스)에 대한 메모리를 할당합니다. 컴퓨터는 청사진을 사용하여 개체에 맞는 크기의 메모리 블록을 구성합니다. 개체는 기본적으로 메모리 블록입니다.
코드 개체는 실제 개체와 마찬가지로 속성에 서로 다른 값을 할당할 수 있습니다.
클래스는 데이터와 동작을 캡슐화합니다.
클래스는 데이터와 동작을 캡슐화하는 방법을 제공합니다. 캡슐화는 데이터와 동작을 단일 단위로 결합하는 프로세스입니다. 클래스는 속성을 사용하여 데이터에 액세스하고 메서드를 사용하여 동작을 사용하도록 설정합니다.
클래스 속성
클래스 속성은 동일한 형식의 개체(클래스 인스턴스)와 다른 개체를 구별하는 데이터를 관리하는 데 사용됩니다.
클래스 속성을 사용하면 개체가 클래스 내에 정의된 변수(데이터 필드)의 값을 읽고, 쓰고, 컴퓨팅할 수 있습니다. 속성은 공용 데이터 멤버로 나타나지만 접근자라는 특수 메서드로 구현됩니다. 이 기능을 사용하면 발신자가 데이터에 쉽게 액세스할 수 있으며, 데이터 안전성과 유연성을 높이는 데에도 도움이 됩니다.
속성 값은 get 접근자를 사용하여 읽을 수 있으며 set 접근자를 사용하여 할당할 수 있습니다.
클래스 메서드
클래스 메서드는 클래스가 수행할 수 있는 작업(동작)을 정의합니다.
메서드는 입력 데이터를 제공하는 매개 변수를 취할 수 있으며, 매개 변수를 통해 출력 데이터를 반환할 수 있습니다. 메서드는 매개 변수를 사용하지 않고도 값을 직접 반환할 수 있습니다.
예를 들어, Console 클래스에는 WriteLine, ReadLine, Clear 메서드 등이 포함됩니다. 이러한 방법은 Console 클래스의 의도된 동작을 사용하도록 설정하는 데 도움이 됩니다. 메서드는 계산, 데이터 조작 또는 다른 개체와의 상호 작용과 같은 작업을 수행하는 데 사용할 수 있습니다.
메서드는 종종 하나 이상의 메서드 인수를 허용하도록 설계됩니다. 메서드 인수는 메서드를 호출하는 데 사용되는 호출 문의 매개 변수로 메서드에 전달됩니다. 예를 들어, Console 클래스의 WriteLine 메서드는 호출하는 문에서 제공되는 문자열 인수를 받을 수 있습니다.
C# 코드의 클래스 정의
다음 예는 C#의 간단한 클래스를 보여 줍니다. Phone 클래스에는 Brand, Model, Year에 대한 속성이 있습니다. 이 클래스에는 Call 및 Text에 대한 메서드도 포함되어 있습니다.
public class Phone
{
public string? Brand { get; set; }
public string? Model { get; set; }
public int Year { get; set; }
public void Call(string phoneNumber)
{
Console.WriteLine($"Calling {phoneNumber}...");
}
public void Text(string phoneNumber, string message)
{
Console.WriteLine($"Texting {phoneNumber}: {message}");
}
}
네임스페이스 사용
C# 프로그래밍에서 네임스페이스는 두 가지 방식으로 사용됩니다.
- .NET 클래스 라이브러리는 네임스페이스를 사용하여 많은 클래스를 구성합니다.
- 개발자는 대규모 프로그래밍 프로젝트에서 클래스와 메서드 이름의 범위를 제어하는 데 도움이 되는 자체 네임스페이스를 선언합니다.
.NET 클래스 라이브러리의 네임스페이스
네임스페이스는 .NET 클래스 라이브러리에서 관련 형식을 그룹화하여 더 쉽게 찾고 사용할 수 있도록 하는 데 사용됩니다.
다음 코드 조각을 살펴봅니다.
System.Console.WriteLine("Hello World!");
이 예에서 System은 네임스페이스이고 Console은 해당 네임스페이스의 클래스입니다.
클래스의 정규화된 이름(System.Console)을 제공하면 올바른 클래스가 사용됩니다. 하지만 동일한 네임스페이스의 여러 클래스를 사용하는 경우 완전히 정규화된 이름을 사용하는 것은 번거로울 수 있습니다. 코드 가독성을 개선하려면 using 지시문을 사용할 수 있습니다. using 지시문을 사용하면 해당 형식의 완전히 정규화된 네임스페이스를 지정하지 않고도 네임스페이스에 정의된 형식을 사용할 수 있습니다.
다음 코드 조각은 코드 가독성을 개선하기 위해 using 지시문을 구현합니다.
using System;
Console.WriteLine("Hello World!");
비고
.NET 6부터 암시적global using 지시문이 새 C# 프로젝트에 추가됩니다. 즉, 정규화된 이름을 지정하거나 using 지시문을 수동으로 추가하지 않고도 이러한 네임스페이스에 정의된 형식을 사용할 수 있습니다. 암시적 측면은 글로벌 using 지시문이 프로젝트의 obj 디렉터리에 생성된 파일에 추가된다는 사실을 나타냅니다. 이 기능을 사용하면 .NET 버전 6.0 이상에서 앱을 개발할 때 using System을 명시적으로 선언하지 않고도 Console.WriteLine을 사용할 수 있습니다.
네임스페이스를 사용하여 클래스 구성
자체 네임스페이스를 선언하면 대규모 프로그래밍 프로젝트에서 클래스와 메서드 이름의 범위를 제어하는 데 도움이 될 수 있습니다. namespace 키워드를 사용하여 네임스페이스를 선언합니다.
다음 코드 조각을 살펴봅니다.
namespace SampleNamespace
{
class SampleClass
{
public void SampleMethod()
{
System.Console.WriteLine("SampleMethod inside SampleNamespace");
}
}
}
네임스페이스의 이름은 유효한 C# 식별자 이름이어야 합니다.
다음 코드 조각에서 볼 수 있듯이 해당 파일에 정의된 모든 형식에 대한 네임스페이스를 선언할 수 있습니다.
namespace SampleNamespace;
class SampleClass
{
public void SampleMethod()
{
System.Console.WriteLine("SampleMethod inside SampleNamespace");
}
}
class AnotherSampleClass
{
public void AnotherSampleMethod()
{
System.Console.WriteLine("AnotherSampleMethod inside SampleNamespace");
}
}
이 새로운 구문의 장점은 더 단순하여 수평 공간과 중괄호를 절약할 수 있다는 것입니다. 그러면 코드를 더 쉽게 읽을 수 있습니다.
네임스페이스 개요
네임스페이스에는 다음과 같은 속성이 있습니다.
- 대규모 코드 프로젝트를 조직합니다.
.연산자를 사용하여 구분합니다.using지시문은 모든 클래스에 대해 네임스페이스 이름을 지정할 필요가 없습니다.- 글로벌 네임스페이스는 "루트" 네임스페이스입니다.
global::System은 항상 .NET 시스템 네임스페이스를 참조하세요.
네임스페이스를 사용하여 관련 형식을 함께 그룹화하면 해당 형식을 더 쉽게 찾고 사용할 수 있습니다.