ShovelingLife
A Game Programmer
ShovelingLife
전체 방문자
오늘
어제
  • 분류 전체보기 (1067)
    • 그래픽스 (57)
      • 공통 (19)
      • 수학 물리 (22)
      • OpenGL & Vulkan (1)
      • DirectX (14)
    • 게임엔진 (180)
      • Unreal (69)
      • Unity (100)
      • Cocos2D-X (3)
      • 개인 플젝 (8)
    • 코딩테스트 (221)
      • 공통 (7)
      • 프로그래머스 (22)
      • 백준 (162)
      • LeetCode (19)
      • HackerRank (2)
      • 코딩테스트 알고리즘 (8)
    • CS (235)
      • 공통 (21)
      • 네트워크 (44)
      • OS & 하드웨어 (55)
      • 자료구조 & 알고리즘 (98)
      • 디자인패턴 (6)
      • UML (4)
      • 데이터베이스 (7)
    • 프로그래밍 언어 (346)
      • C++ (167)
      • C# (88)
      • Java (9)
      • Python (33)
      • SQL (30)
      • JavaScript (8)
      • React (7)
    • 그 외 (9)
      • Math (5)
      • 일상 (5)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • Source Code 좌측 상단에 복사 버튼 추가 완료
  • 언리얼 엔진 C++ 빌드시간 단축 꿀팁
  • 게임 업계 코딩테스트 관련
  • 1인칭 시점으로 써내려가는 글들

인기 글

태그

  • 포인터
  • 그래픽스
  • SQL
  • 백준
  • 티스토리챌린지
  • Unity
  • 알고리즘
  • 함수
  • 배열
  • C
  • 파이썬
  • 오블완
  • string
  • C++
  • 프로그래머스
  • c#
  • 유니티
  • 클래스
  • 언리얼
  • 문자열

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
ShovelingLife

A Game Programmer

프로그래밍 언어/C#

C# 읽기 전용 (readonly)

2022. 7. 21. 11:29

readonly 키워드는 다음 네 가지 컨텍스트에서 사용할 수 있는 한정자다.

  • 필드 선언에서 필드에 대한 할당을 나타내는 readonly는 선언의 일부로 또는 동일한 클래스의 생성자에서만 발생할 수 있다. 필드 선언과 생성자 내에서 읽기 전용 필드를 여러 번 할당 및 재할당할 수 있다.
    • 값 형식은 해당 데이터를 직접 포함하므로 값 형식인 readonly 필드는 변경할 수 없다.
    • 참조 형식에는 해당 데이터에 대한 참조가 포함되므로, readonly 참조 형식인 필드는 항상 같은 개체를 참조해야해당 개체를 변경할 수 있다.
  • 생성자가 종료된 후에는 readonly 필드를 할당할 수 없다. 이 규칙의 의미는 값 형식과 참조 형식에서 서로 다르다.
  • readonly struct 형식 정의에서 readonly는 구조체 형식을 변경할 수 없음을 나타낸다. 자세한 내용은 구조체 형식 문서의 readonly 구조체 섹션을 참조.
  • 구조체 형식 내 인스턴스 멤버 선언에서 readonly는 인스턴스 멤버가 구조체의 상태를 수정하지 않음을 나타낸다. 자세한 내용은 구조체 형식 문서의 readonly 인스턴스 멤버 섹션을 참조.
  • ref readonly 메서드 반환에서 readonly 한정자는 메서드가 참조를 반환하고 해당 참조에 쓰기가 허용되지 않음을 나타낸다.

readonly struct 및 ref readonly 컨텍스트는 C# 7.2에서 추가되었다. readonly 구조체 멤버는 C# 8.0에서 추가되었다.

읽기 전용 필드 예제

이 예제에서 year 필드의 값은 클래스 생성자에서 할당되었지만 ChangeYear 메서드에서 변경할 수 없다.

class Age
{
    private readonly int _year;
    Age(int year)
    {
        _year = year;
    }
    void ChangeYear()
    {
        //_year = 1967; // Compile error if uncommented.
    }
}

다음 컨텍스트에서만 readonly 필드에 값을 할당할 수 있다.

  • 변수가 선언에서 초기화될 때. 예를 들면 다음과 같다.
    public readonly int y = 5;
    
  • 인스턴스 필드 선언을 포함하는 클래스의 인스턴스 생성자.
  • 정적 필드 선언을 포함하는 클래스의 정적 생성자.

또한 이러한 생성자 컨텍스트에서는 readonly 필드를 out 또는 ref 매개 변수로 전달하는 것이 유효하다. readonly 키워드와 const 키워드와 다르다. const 필드는 필드 선언에서만 초기화될 수 있다. readonly 필드는 사용된 생성자에 따라 다른 값을 가질 수 있다. 또한 const 필드는 컴파일 시간 상수인 반면, readonly 필드는 다음 예제와 같이 런타임 상수에 사용될 수 있다.

public static readonly uint timeStamp = (uint)DateTime.Now.Ticks;
public class SamplePoint
{
    public int x;
    // Initialize a readonly field
    public readonly int y = 25;
    public readonly int z;

    public SamplePoint()
    {
        // Initialize a readonly instance field
        z = 24;
    }

    public SamplePoint(int p1, int p2, int p3)
    {
        x = p1;
        y = p2;
        z = p3;
    }

    public static void Main()
    {
        SamplePoint p1 = new SamplePoint(11, 21, 32);   // OK
        Console.WriteLine($"p1: x={p1.x}, y={p1.y}, z={p1.z}");
        SamplePoint p2 = new SamplePoint();
        p2.x = 55;   // OK
        Console.WriteLine($"p2: x={p2.x}, y={p2.y}, z={p2.z}");
    }
    /*
     Output:
        p1: x=11, y=21, z=32
        p2: x=55, y=25, z=24
    */
}

위 예제에서 다음 예제와 같은 명령문을 사용하는 경우

p2.y = 66;        // Error

읽기 전용 필드에는 할당할 수 없다. 단 생성자 또는 변수 이니셜라이저에서는 예외다.

참조 읽기 전용 반환 예

ref return의 readonly 한정자는 반환된 참조를 수정할 수 없음을 나타낸다. 

private static readonly SamplePoint s_origin = new SamplePoint(0, 0, 0);
public static ref readonly SamplePoint Origin => ref s_origin;

반환된 유형은 readonly struct일 필요는 없다. ref readonly를 통해 ref에서 반환될 수 있는 모든 형식을 반환할 수 있다.

 

참고 : https://docs.microsoft.com/ko-kr/dotnet/csharp/language-reference/keywords/readonly

저작자표시 (새창열림)

'프로그래밍 언어 > C#' 카테고리의 다른 글

C# 구조체 (struct) 클래스 (class) 차이  (0) 2022.07.26
C# 클래스 타입 업/다운 캐스팅 (Up-DownCasting)  (0) 2022.07.22
C# 클래스 상속 불가 및 함수 오버라이딩 불가 (sealed)  (0) 2022.07.21
C# 중첩 클래스 (Nested Class)  (0) 2022.07.20
C# 부분 클래스 (partial)  (0) 2022.07.19
    '프로그래밍 언어/C#' 카테고리의 다른 글
    • C# 구조체 (struct) 클래스 (class) 차이
    • C# 클래스 타입 업/다운 캐스팅 (Up-DownCasting)
    • C# 클래스 상속 불가 및 함수 오버라이딩 불가 (sealed)
    • C# 중첩 클래스 (Nested Class)
    ShovelingLife
    ShovelingLife
    Main skill stack => Unity C# / Unreal C++ Studying Front / BackEnd, Java Python

    티스토리툴바