Game Tech Blog

C# - 프로퍼티 본문

IT Study/C#

C# - 프로퍼티

jonghow 2022. 1. 11. 01:02
반응형

 접근제어자 Public 과 ... 들

변수의 선언에는 외부에서 참조할 수 있는 Public, Protected, Private 등을 같이 사용할 수 있다.

단, Public 과 같이 어디에서나 참조할 수 있도록 제어를 풀게되면, 데이터는 무분별한 곳에서 오염(변경)될 가능성이 높다.

 

 Public 대신 Get(), Set()

- 내가 C++을 사용할 때는 따로 프로퍼티라는 개념이 없었고, Private 한 변수들을 선언한 후, 접근할 수 있도록 Get(),Set() 메소드 들을 따로 작성해서 세팅하고, 사용했다.

 

ex)

    class TestCode
    {
        private int x, y;

        public int GetX() { return x; }
        public int GetY() { return y; }
        public void SetX(int x) { this.x = x; }
        public void SetY(int y) { this.y = y; }
    }

 

 Get(), Set() 대신 프로퍼티

-  C++ 을 배우기전 C# 을 독학했었는데, 나는 위 Get,Set이 프로퍼티로 알고 있었다. 

쓰기 전용,  읽기 전용으로 만들 수 있다는건 아는 개념이고, 형식은 다음과 같다.

 

    class TestCode
    {
        private int x, y;

        public int ReferenceX
        {
            set
            {
                this.x = value;
            }
            get
            {
                return x;
            }
        }

        public int ReferenceY
        {
            set
            {
                this.y = value;
            }
            get
            {
                return y;
            }
        }
    }

 

 자동구현 프로퍼티?

- 자동구현 프로퍼티는 말 그대로 간결하게 사용할 수 있도록 MS에서 제공해준 것이다. 

이점으로는 필드를 선언할 필요가 없고, 프로퍼티 작성도 꽤나 짧아진다.

 

    class TestCode
    {
        public int ReferenceX        {            set; get;        }
        public int ReferenceY        {            set; get;        }
    }

 

작성해보니 많이 짧아졌다... 자동구현 프로퍼티 좋네..

 

 자동구현 프로퍼티의 백필드에서 일어나는 일

일단, 백필드 상태를 보기전에 솔루션 탐색기에서 차이점을 볼 수 있다.

빨간색 네모 영역 파란 마름모로 된 x : int 는 직접 변수를 선언한 경우,

녹색 네모 영역 스패너? 모양으로 된 Ref? : int 들은 자동구현 프로퍼티로 선언한 것이다.

[이미지0. 솔루션 탐색기]

백 필드를 확인하기 위해선 "ildasm.exe" 라는 유틸리티를 이용해야 한다.

ildasm.exe 는 간단하게 "실행 파일 내부의 .NET 기계어 코드(CIL)을 분석해서 클래스 내용을 보여 주는 유틸리티" 다.

 

올바른 경로를 찾아 실행 했으나, 오류가 떠서 확인할 수 없었다. 젠장...

[이미지1. ildasm.exe "clr error"]

그래서 인터넷에서 다른 참고 자료로 대신 설명한다.

[이미지2. ildasm.exe]

 [이미지2] 에서 <Name>k_BackingField 항목이 생겼다. Name 이란 필드는 선언하지 않았는데도 불구하고 C# 컴파일러가 내부적으로 작성해 준 것이다.

 

CLRError 해결 방법은 발견하면 다시 포스팅 하도록 하겠다...

 

 프로퍼티와 생성자

- 생성할때 프로퍼티를 초기화 하는방법은 아래와 같다.

[이미지3. PropertyClass 생성자]

저런식으로 모든 프로퍼티에 대한 초기화를 할 수도 있고, 아래 처럼 하고싶은것만 할 수 도 있다.

[이미지4. 부분 Property 초기화 및 생성]

 

무명 형식

- 무명형식은 형식의 선언과 동시에 인스턴스를 올린다. 

그러니까, 한번 사용하고 두번다시 같은 형식을 만들 필요가 없을때 사용한다.2번 이상 쓸려면 구조체나 클래스로 개체에 대한 형식을 만들어놓는게 덜 번거롭기도하고 찍어낼 수 있으니 적합하지않다.

 

형식은 다음과 같이 쓸수 있다.

[이미지5. 무명형식 프로퍼티]

인터페이스의 프로퍼티

- 프로퍼티 또한 인터페이스를 가질 수 있다. 인터페이스는 구현이 따로없으며 상속받는다면 상속자 클래스는 반드시 구현해야한다.(자동구현 프로퍼티로 가능)

아래처럼 사용할 수 있다.

[이미지6. 인터페이스 프로퍼티]

여기서, 알아야할 것은 일반적 자동구현 프로퍼티는 위에 역어셈블로 확인해보면 C# 컴파일러가 자동구현해주지만, 인터페이스는 구현해주지 않는다. 이유는 인터페이스는 어떠한 구현도 가지지 않기 때문이다.

 

추상 클래스와 프로퍼티

- 추상 클래스는 구현된 프로퍼티를 가질 수 있기도하고, 구현되지 않은 프로퍼티도 가질 수 있다. (= 추상 프로퍼티)

이 또한 상속자 클래스가 구현하도록 강제하는것과 다를게 없다.

C# 컴파일러가 구현을 하지못하도록 하기위해 abstract 키워드를 붙여서 사용하면 된다.

[이미지7. 추상클래스 프로퍼티]

추상 클래스는 AbsClass.Name 처럼 자동구현 프로퍼티, AbsClass.Age 처럼 추상 프로퍼티를 가질 수 있고, 상속자 클래스는 추상형식에 대한 메소드, 프로퍼티 등에대한 구현만 따라주면 문제없이 사용할 수 있다.

 

반응형

'IT Study > C#' 카테고리의 다른 글

C# - Boxing, UnBoxing  (0) 2022.04.08
C# - Enum To String ( 열거형 내용을 문자열로 변환)  (0) 2022.04.05
C# - Invoke  (0) 2021.12.29
C# - Class, Struct  (0) 2021.11.11
C# - String, Stringbuilder  (0) 2021.02.04
Comments