'readonly' 및 'const' 키워드
Coddy C# 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 70개 중 16번째.
C#은 변경할 수 없는 값을 만들기 위해 두 가지 키워드인 const와 readonly를 제공합니다. 둘 다 수정을 방지하지만, 작동 방식이 다르며 서로 다른 용도로 사용됩니다.
const 필드는 선언 시 할당되어야 하며 그 값은 컴파일 타임에 결정됩니다. 이는 암시적으로 static이며, 인스턴스가 아닌 클래스에 속함을 의미합니다:
public class GameSettings
{
public const int MaxPlayers = 4;
public const double Gravity = 9.81;
}상수는 클래스 이름을 통해 액세스합니다: GameSettings.MaxPlayers. 컴파일러가 정확한 값을 알아야 하기 때문에 상수는 기본 형식(primitive types), 문자열 및 null에서만 작동합니다.
readonly 필드는 선언 시 또는 생성자에서 할당될 수 있으며, 그 값은 런타임에 결정됩니다:
public class Player
{
public readonly string Id;
public readonly DateTime CreatedAt = DateTime.Now;
public Player(string id)
{
Id = id;
}
}const와 달리, readonly 필드는 어떤 타입이든 가질 수 있으며 인스턴스마다 서로 다른 값을 가질 수 있습니다. 생성자가 종료되면 값을 변경할 수 없습니다.
수학적 상수와 같이 진정으로 보편적이며 절대 변하지 않는 값에는 const를 사용하세요. 한 번 설정되어야 하지만 객체마다 다를 수 있거나 런타임 계산이 필요한 값에는 readonly를 사용하세요.
챌린지
쉬움범용 상수를 위한 const와 런타임에 한 번 설정되는 값을 위한 readonly를 언제 사용하는지 보여주는 물리 시뮬레이션 설정 시스템을 구축해 보겠습니다.
코드를 정리하기 위해 두 개의 파일을 생성합니다:
PhysicsConstants.cs:Simulation네임스페이스 안에PhysicsConstants클래스를 정의합니다. 이 클래스는 절대 변하지 않고 어디서나 동일한 범용 상수를 포함해야 합니다:9.81로 설정된const필드Gravity299792458로 설정된const필드SpeedOfLight"m/s^2"로 설정된const문자열GravityUnit
Projectile.cs:Simulation네임스페이스 안에Projectile클래스를 정의합니다. 각 발사체는 생성될 때 한 번 설정되고 이후에는 수정되지 않아야 하는 값을 가집니다:readonly필드Name(string)readonly필드InitialVelocity(double)readonly필드LaunchAngle(double, 도 단위)- 세 가지 값을 모두 받아 설정하는 생성자
- 다음 공식을 사용하여 최대 높이를 계산하는
GetMaxHeight()메서드:(velocity^2 * sin^2(angle)) / (2 * gravity).Math.Sin()을 사용하고,Math.PI / 180을 곱하여 도(degrees)를 라디안(radians)으로 변환하세요.
Program.cs: 메인 파일에서 입력값을 사용하여 발사체 객체를 생성하고, 물리 상수와 함께 발사체의 계산된 최대 높이를 표시합니다.
세 가지 입력을 받게 됩니다:
- 발사체 이름 (Projectile name)
- 초기 속도 (Initial velocity, m/s 단위)
- 발사 각도 (Launch angle, 도 단위)
출력은 다음 형식을 따르세요:
Gravity: {Gravity} {GravityUnit}
Speed of Light: {SpeedOfLight} m/s
Projectile: {Name}
Initial Velocity: {InitialVelocity} m/s
Launch Angle: {LaunchAngle} degrees
Max Height: {maxHeight} mMath.Round(value, 2)를 사용하여 최대 높이를 소수점 둘째 자리까지 반올림하세요.
예를 들어, 입력값이 Rocket, 50, 45인 경우 출력은 다음과 같아야 합니다:
Gravity: 9.81 m/s^2
Speed of Light: 299792458 m/s
Projectile: Rocket
Initial Velocity: 50 m/s
Launch Angle: 45 degrees
Max Height: 63.71 m치트 시트
C#은 불변 값을 생성하기 위한 두 가지 키워드인 const와 readonly를 제공합니다.
const 필드는 선언 시점에 할당되어야 하며, 컴파일 타임에 결정되고, 암시적으로 static입니다:
public class GameSettings
{
public const int MaxPlayers = 4;
public const double Gravity = 9.81;
}상수는 클래스 이름을 통해 액세스합니다: GameSettings.MaxPlayers. 상수는 기본 형식(primitive types), 문자열 및 null에서만 작동합니다.
readonly 필드는 선언 시점이나 생성자에서 할당될 수 있으며, 그 값은 런타임에 결정됩니다:
public class Player
{
public readonly string Id;
public readonly DateTime CreatedAt = DateTime.Now;
public Player(string id)
{
Id = id;
}
}readonly 필드는 모든 형식을 가질 수 있으며 인스턴스마다 다른 값을 가질 수 있습니다. 생성자가 완료되면 값을 변경할 수 없습니다.
절대 변하지 않는 보편적인 값에는 const를 사용하세요. 한 번 설정되어야 하지만 객체마다 다를 수 있거나 런타임 계산이 필요한 값에는 readonly를 사용하세요.
직접 해보기
using System;
using Simulation;
class Program
{
public static void Main(string[] args)
{
// 입력 읽기
string name = Console.ReadLine();
double velocity = Convert.ToDouble(Console.ReadLine());
double angle = Convert.ToDouble(Console.ReadLine());
// TODO: 입력값을 사용하여 Projectile 객체 생성
// TODO: 물리 상수 출력 (단위를 포함한 Gravity, Speed of Light)
// TODO: 발사체 정보 출력 (Name, Initial Velocity, Launch Angle)
// TODO: 최대 높이를 계산하고 출력 (소수점 둘째 자리까지 반올림)
}
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.