인스턴스 vs 정적 데이터
Coddy C# 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 70개 중 15번째.
이제 정적 멤버를 이해했으므로, 인스턴스 데이터와 정적 데이터를 각각 언제 사용해야 하는지 명확히 알아봅시다. 이 결정은 클래스가 정보를 저장하고 공유하는 방식을 결정합니다.
인스턴스 데이터는 각 객체에 개별적으로 속합니다. 모든 객체는 자신만의 복사본을 가지며, 한 객체의 변경 사항은 다른 객체에 영향을 주지 않습니다:
public class BankAccount
{
public string Owner { get; set; } // 인스턴스 - 계좌별로 고유함
public decimal Balance { get; set; } // 인스턴스 - 계좌별로 고유함
}각 BankAccount는 고유한 소유자와 잔액을 가집니다. 서로 다른 계좌는 서로 다른 사람들을 위해 서로 다른 금액을 보유하므로 이는 타당합니다.
정적 데이터는 클래스 자체에 속하며 모든 인스턴스 간에 공유됩니다:
public class BankAccount
{
public static decimal InterestRate = 0.05m; // 정적(Static) - 모든 계좌에 동일하게 적용
public static int TotalAccounts = 0; // 정적(Static) - 모든 계좌의 수를 추적
public string Owner { get; set; }
public decimal Balance { get; set; }
}이자율은 모든 계좌에 동일하게 적용되므로, static으로 설정하는 것이 적절합니다. 전체 계좌 카운터는 개별 계좌 데이터가 아닌 클래스 전체의 정보를 추적합니다.
간단한 규칙: 데이터가 특정 객체를 설명한다면 인스턴스(instance)로 만드세요. 클래스 전체를 설명하거나 공유되어야 한다면 정적(static)으로 만드세요. 이들을 잘못 혼용하면 데이터가 여러 객체 사이에서 예기치 않게 변경되거나 필요할 때 접근할 수 없는 버그가 발생할 수 있습니다.
챌린지
쉬움개별 플레이어에게 속한 데이터와 전체 게임에서 공유되는 데이터의 차이점을 보여주는 게임 세션 추적기를 만들어 보겠습니다.
코드를 구성하기 위해 두 개의 파일을 생성합니다:
Player.cs:GameSession네임스페이스 내에Player클래스를 정의합니다. 각 플레이어는 자신만의Username(string)과Score(int)를 가집니다 - 이들은 각 플레이어마다 고유합니다. 또한 클래스는 모든 플레이어에게 적용되는 정보를 추적해야 합니다: 모든 사람이 플레이 중인 게임의 이름을 저장하는 정적 필드GameName(string)과, 참여한 플레이어 수를 세는 정적 필드TotalPlayers(int)입니다. 사용자 이름과 시작 점수를 매개변수로 받고, 전체 플레이어 수를 자동으로 증가시키는 생성자를 포함하세요. 게임 이름을 설정하기 위한 정적 메서드SetGameName(string name)을 추가하세요.Program.cs: 메인 파일에서 게임을 설정하고 입력에 따라 플레이어를 생성합니다. 먼저 게임 이름을 설정한 다음, 두 명의 플레이어를 생성하고 공유된 게임 데이터와 함께 각 플레이어의 개별 정보를 표시합니다.
다섯 개의 입력을 받게 됩니다:
- 게임 이름
- 첫 번째 플레이어의 사용자 이름
- 첫 번째 플레이어의 시작 점수
- 두 번째 플레이어의 사용자 이름
- 두 번째 플레이어의 시작 점수
출력은 다음 형식으로 인쇄하십시오:
Game: {GameName}
Player: {Username}, Score: {Score}
Player: {Username}, Score: {Score}
Total Players: {TotalPlayers}예를 들어, 입력값이 BattleArena, DragonSlayer, 1500, ShadowNinja, 2200인 경우 출력은 다음과 같아야 합니다:
Game: BattleArena
Player: DragonSlayer, Score: 1500
Player: ShadowNinja, Score: 2200
Total Players: 2어떤 데이터가 인스턴스 기반(각 플레이어마다 다름)이어야 하고 어떤 데이터가 정적(모든 플레이어 간에 공유됨)이어야 하는지 신중하게 생각하세요. 게임 이름과 총 플레이어 수는 세션 전체를 설명하는 반면, 사용자 이름과 점수는 각 개인에게 고유합니다.
치트 시트
각 객체에 고유한 속성에는 인스턴스 데이터를 사용하세요:
public class BankAccount
{
public string Owner { get; set; } // 각 계좌는 고유한 소유자를 가집니다
public decimal Balance { get; set; } // 각 계좌는 고유한 잔액을 가집니다
}클래스의 모든 인스턴스에서 공유되는 속성에는 정적 데이터를 사용하세요:
public class BankAccount
{
public static decimal InterestRate = 0.05m; // 모든 계좌에 동일하게 적용됩니다
public static int TotalAccounts = 0; // 모든 계좌를 추적합니다
public string Owner { get; set; }
public decimal Balance { get; set; }
}결정 규칙: 데이터가 특정 객체를 설명한다면 인스턴스 데이터를 사용하세요. 클래스 전체를 설명하거나 공유되어야 한다면 정적 데이터를 사용하세요.
직접 해보기
using System;
namespace GameSession
{
class Program
{
public static void Main(string[] args)
{
// 입력 읽기
string gameName = Console.ReadLine();
string username1 = Console.ReadLine();
int score1 = Convert.ToInt32(Console.ReadLine());
string username2 = Console.ReadLine();
int score2 = Convert.ToInt32(Console.ReadLine());
// TODO: 정적 메서드를 사용하여 게임 이름 설정
// TODO: 입력 데이터를 사용하여 두 개의 Player 객체 생성
// TODO: 요구된 형식으로 출력 인쇄
// Game: {GameName}
// Player: {Username}, Score: {Score}
// Player: {Username}, Score: {Score}
// Total Players: {TotalPlayers}
}
}
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.