정적 필드와 메서드
Coddy C# 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 70개 중 12번째.
지금까지 우리가 생성한 모든 필드와 메서드는 개별 객체에 속해 있었습니다. 하지만 때로는 모든 인스턴스에서 공유되는, 클래스 자체에 속하는 데이터나 동작이 필요할 때가 있습니다. 바로 그럴 때 static 키워드를 사용합니다.
정적 필드(static field)는 클래스의 모든 객체에 의해 공유됩니다. 인스턴스를 얼마나 많이 생성하든 상관없이 복사본은 단 하나만 존재합니다:
public class Player
{
public static int TotalPlayers = 0;
public string Name { get; set; }
public Player(string name)
{
Name = name;
TotalPlayers++;
}
}새로운 Player가 생성될 때마다 TotalPlayers가 증가합니다. 모든 플레이어는 이 동일한 카운터를 공유합니다.
정적 메서드는 클래스에 속하며 객체를 생성하지 않고도 호출할 수 있습니다:
public class Calculator
{
public static int Add(int a, int b)
{
return a + b;
}
}
// 인스턴스가 아닌 클래스에서 호출됨
int result = Calculator.Add(5, 3);정적 멤버는 객체 참조가 아닌 클래스 이름을 사용하여 액세스한다는 점에 유의하세요. 정적 메서드는 특정 객체에 속하지 않으므로 인스턴스 필드에 액세스하거나 this를 사용할 수 없습니다.
여러분은 이미 자신도 모르게 정적 멤버를 사용해 왔습니다. Console.WriteLine()은 정적 메서드이며, Math.PI는 정적 필드입니다.
챌린지
쉬움애플리케이션 전체에서 발생하는 모든 주문을 추적하기 위해 정적 멤버(static members)를 사용하는 주문 추적 시스템을 구축해 보겠습니다.
코드를 정리하기 위해 두 개의 파일을 생성합니다:
Order.cs:OrderSystem네임스페이스 안에Order클래스를 정의합니다. 각 주문은 인스턴스 속성인OrderId(int)와CustomerName(string)을 가져야 합니다. 또한 이 클래스는 정적 필드인TotalOrders를 사용하여 생성된 총 주문 수를 추적해야 하며, 다음으로 사용 가능한 주문 ID(1부터 시작)를 반환하는 정적 메서드GetNextOrderId()를 제공해야 합니다. 생성자는 고객 이름을 매개변수로 받아야 하며, 정적 메서드를 사용하여 주문 ID를 자동으로 할당하고 총 주문 수를 증가시켜야 합니다.Program.cs: 메인 파일에서 입력받은 데이터를 기반으로 주문을 생성하고, 각 주문의 상세 정보와 총 주문 수를 출력합니다.
두 개의 서로 다른 주문에 대한 고객 이름을 나타내는 두 개의 입력을 받게 됩니다.
각 주문에 대해 다음 형식으로 상세 정보를 출력하세요:
Order #{OrderId} - Customer: {CustomerName}두 주문을 모두 생성한 후, 총 주문 수를 출력하세요:
Total Orders: {TotalOrders}예를 들어, 입력값이 Alice와 Bob인 경우 출력은 다음과 같아야 합니다:
Order #1 - Customer: Alice
Order #2 - Customer: Bob
Total Orders: 2치트 시트
static 키워드는 개별 인스턴스가 아닌 클래스 자체에 속하는 멤버를 생성합니다.
정적 필드(Static fields)는 클래스의 모든 객체에서 공유됩니다. 생성된 인스턴스 수에 관계없이 단 하나의 복사본만 존재합니다:
public class Player
{
public static int TotalPlayers = 0;
public string Name { get; set; }
public Player(string name)
{
Name = name;
TotalPlayers++;
}
}정적 메서드(Static methods)는 클래스에 속하며 객체를 생성하지 않고도 호출할 수 있습니다:
public class Calculator
{
public static int Add(int a, int b)
{
return a + b;
}
}
// 인스턴스가 아닌 클래스에서 호출됨
int result = Calculator.Add(5, 3);정적 멤버는 객체 참조가 아닌 클래스 이름을 사용하여 액세스합니다. 정적 메서드는 특정 객체에 속하지 않으므로 인스턴스 필드에 액세스하거나 this를 사용할 수 없습니다.
정적 멤버의 일반적인 예로는 Console.WriteLine()(정적 메서드)과 Math.PI(정적 필드)가 있습니다.
직접 해보기
using System;
using OrderSystem;
class Program
{
public static void Main(string[] args)
{
// 고객 이름을 읽습니다
string customer1 = Console.ReadLine();
string customer2 = Console.ReadLine();
// TODO: 고객 이름으로 두 개의 Order 객체를 생성합니다
// TODO: 각 주문의 상세 정보를 다음 형식으로 출력합니다:
// Order #{OrderId} - Customer: {CustomerName}
// TODO: 총 주문 수를 다음 형식으로 출력합니다:
// Total Orders: {TotalOrders}
}
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.