내일배움캠프

내일배움캠프 12일차: const와 readonly

pracumj 2024. 9. 27. 22:43
 

오늘의 공부: const와 readonly 📝

오늘은 팀원 분께서 가르쳐주신 const와 readonly 키워드에 대해 추가적으로 공부해보았다. const와 readonly는 모두 값을 변경할 수 없도록 설정하는 키워드이지만, 각각의 사용 시점과 용도가 다르다.

const란?

const 키워드는 상수(Constant)를 정의할 때 사용됩니다. 상수는 선언과 동시에 값을 지정해야 하며, 이후에 값을 변경할 수 없습니다. const는 컴파일 타임에 결정되는 상수로, 기본형 타입(정수, 실수, 문자열 등)이나 불변적인 값에 주로 사용됩니다. 클래스 내에서 const는 암시적으로 static이므로, 인스턴스가 아닌 클래스 자체와 연관되어 사용됩니다.

 

const 특징

  1. 반드시 초기화 시 값을 할당해야 함:
    • const 변수는 선언과 동시에 초기화해야 하며, 초기화 후에는 값을 변경할 수 없습니다.
    • 값을 할당하지 않으면 컴파일 오류가 발생합니다.
    public const int MaxValue = 100;
  2. 기본형 타입 및 불변 값에 주로 사용:
    • const는 컴파일 타임에 값이 결정되어야 하기 때문에, 기본형 타입(int, float, double 등)불변적인 값(문자열, 상수)에 주로 사용된다.
    • 참조형 타입(예: 클래스, 배열, 리스트 등)은 런타임에 메모리 할당이 이루어지므로 const로 사용할 수 없다.
  3. 암시적으로 static이며, 인스턴스 없이 클래스 자체와 연관되어 있음:
    • const는 암시적으로 static이기 때문에, 클래스의 인스턴스와 관계없이 클래스 자체와 연관된다. 이는 const 변수가 인스턴스가 아닌 클래스 레벨에서 사용된다는 의미다.
    • 따라서, const 변수를 사용할 때는 인스턴스를 생성하지 않고도 클래스명.상수명 형태로 접근할 수 있다.
    public class GameSettings 
    {
    	public const int MaxPlayers = 4; // 암시적으로 static  // 접근 방식
    }
    
    int players = GameSettings.MaxPlayers; // 인스턴스 없이 클래스명으로 접근 가능
     
    • const는 값 타입(Value Type)과 문자열 같은 불변 데이터에만 사용 가능
    • 참조형 타입(Reference Type)이나 변경 가능한 객체(예: 리스트, 배열 등)는 런타임에 메모리 할당이 이루어지기 때문에 const로 선언할 수 없다. 대신 참조형 타입에서는 readonly를 사용한다. 참조형 타입에서는 사용 불가
  4.  불가능한 예시
public const List<int> Numbers = new List<int>(); // 컴파일 오류 발생 
public static readonly List<int> Numbers = new List<int> { 1, 2, 3 };// 올바른 예시 (readonly 사용)

 

const 정리

  • const는 기본형 타입 및 불변 값에 사용되고, 선언과 동시에 초기화가 필요
  • const는 암시적으로 static이므로 인스턴스 없이 클래스명으로 접근 가능
  • 참조형 타입에서는 const를 사용할 수 없으며, 대신 readonly 키워드를 사용 해야함

readonly란?

readonly 키워드는 변수의 값을 런타임에 한 번만 설정할 수 있도록 제한하는 키워드이다. readonly 필드는 생성자에서 값을 할당할 수 있으므로, 객체가 생성될 때 설정된다. readonly는 인스턴스 수준에서 사용되거나, static과 함께 사용하여 클래스 수준에서도 사용할 수 있다.

readonly 특징

  1. 초기화 시 또는 생성자에서 값을 할당할 수 있음:
    • readonly 필드는 선언과 동시에 초기화하거나, 생성자에서 초기화 가능
    • 선언 시 값을 할당하지 않더라도, 생성자에서 값을 할당할 수 있기 때문에, 생성 시점에 값을 동적으로 설정 가능
    public class Player
    {
        public readonly string Name = "Default"; // 선언 시 초기화
        public readonly int Health;
    
        public Player(int health)
        {
            Health = health; // 생성자에서 초기화
        }
    }
    • readonly로 선언된 필드는 초기화 후 값 변경이 불가능
    • 선언 시나 생성자에서 값을 한 번 할당한 후에는 해당 값을 변경할 수 없으므로, readonly 필드는 불변성을 가지며, 안정적인 데이터를 보장이후 값 변경 불가

  2. 객체의 인스턴스 수준이나 클래스 수준 모두 사용 가능:
    • readonly는 인스턴스 필드와 static 필드 모두에 사용할 수 있습니다.
    • 인스턴스 수준에서는 개별 객체마다 독립적으로 값을 가질 수 있고, static과 함께 사용할 경우 클래스 수준에서 하나의 고정된 값을 가질 수 있습니다
     
public class GameSettings
{
    public readonly int MaxScore = 500; // 인스턴스 수준의 readonly 필드
    public static readonly string Version = "1.0.0"; // 클래스 수준의 readonly 필드
}

 

  • MaxScore는 객체마다 독립적인 값을 가질 수 있는 반면, Version은 클래스 자체와 연관되므로 모든 객체에서 동일한 값을 참조합니다.

readonly  정리

  • readonly는 선언 시 초기화하거나, 생성자에서 초기화할 수 있으며, 초기화 이후 값 변경이 불가능 하다. 또한, 인스턴스 수준이나 클래스 수준 모두에서 사용될 수 있다. 이러한 특성으로 인해, readonly는 객체가 생성된 이후에는 변경되지 않는 불변 데이터를 정의할 때 유용하다.

const와 readonly의 차이점

  • 값의 결정 시점:
    • const: 컴파일 타임에 값이 결정되며, 선언과 동시에 초기화가 필수
    • readonly: 런타임(객체 생성 시점)에 값이 설정될 수 있으며, 필드 선언 시나 생성자에서 초기화가 가능
  • 사용 가능 타입:
    • const: 기본형 타입(int, float, double 등) 및 문자열(string) 같은 불변 값에 사용
    • readonly: 참조형 타입(클래스, 배열, 리스트 등) 및 값 타입(구조체 등)을 모두 사용 가능
  • 초기화 방식:
    • const: 반드시 선언과 동시에 초기화해야 하며, 초기화 후 값을 변경 불가능
    • readonly: 필드 선언 시 초기화하거나, 생성자에서 초기화할 수 있으며, 이후에는 값을 변경 불가능
  • static 여부:
    • const: 암시적으로 static으로 간주되므로, 인스턴스 없이 클래스명으로 접근 가능
    • readonly: 클래스 수준에서 사용하려면 명시적으로 static으로 선언해야 하며, 그렇지 않은 경우 인스턴스가 필요
  • 참조형 타입의 변경 여부:
    • const: 참조형 타입(예: 클래스, 배열, 리스트 등)을 사용할 수 없으므로, 참조된 값의 변경이 불가능
    • readonly: 참조형 타입을 사용할 수 있지만, 참조 자체는 변경할 수 없습니다. 그러나 참조된 객체의 내부 값은 변경 될 수 있음

마무리 😺

이번에 const와 readonly를 비교해보면서, 두 키워드의 차이점과 활용 사례를 확실하게 이해할 수 있었다. const는 변경되지 않는 상수를 정의할 때 유용하고, readonly는 객체가 생성된 이후에도 변경되지 않는 데이터를 설정할 때 사용된다는 것을 알았다. 앞으로 이 두 가지 키워드를 적절하게 활용하여 코드의 안정성과 가독성을 높여야겠다.