C#

Property

Game_The_Diver 2023. 1. 31. 12:01

오늘의 양식은 Property 이다

얌얌

 

Property 가 무엇인지 살펴보기에 앞서, Getter와 Setter라는 놈을 먼저 알아야 한다

 

Getter Setter...?

뭔가 가져오는 놈, 설정하는 놈 이라고 직역할 수 있을까?

 

Getter  = 읽기 전용 메소드(함수)

Setter = 쓰기 전용 메소드

 

라고 생각하면 된다.

정의만 보면 뭔소린지 모를것이다 고로...예시를 살펴보자!

 

가령 아래와 같은 코드가 있다고 해보자

 

 

현재 캐릭터 클라스의 hp와 mp는 각각 10과 5로 초기화가 되어있고, private 접근한정자로 설정해두었다

private으로 설정해두었기 때문에, 아래와 같이 Main()함수내에서 접근할 수가 없다

 

애초에 다른 클래스에서 접근할 수 없게 하기 위해 private 으로 설정해두었기 때문에, 접근할수가 없는것이긴 한데....

 

근데도 그냥 뭔가 저 hp라는 놈을 가져오거나 수정해주고 싶다

 

그럴 때 쓸수 있는게 바로 Getter와 Setter 함수이다

쓸수 있는 방법은 간단하다

 

바로 캐릭터 클라스 내에서 Getter와 Setter 함수를 아래와 같이 정의해주면 된다

 

그리고 이 함수들을 Main에서 사용하게 되면?

 

짜잔!

Getter와 Setter 함수를 이용해, private 으로 설정된 필드의 값을 가져오고, 수정할수도 있다!

 

자 그러면 이제 Property에 대해 이야기 해보겠다

 

가령 필드(클래스내에서 선언된 변수를 말함)가 한두개가 아니라 엄청 많다면...?

그럼 저 필드 하나에 getter와 setter함수를 2개씩 만들어줘야하니까...
위 이미지에서 필드는 10개였고... 그러면 getter setter 둘다 포함해서 총 20개의 함수를 만들어줘야한다...

 

귀찮다!!! 나는 그렇게 시간이 남아나는 사람이 아니다!!!! 

 

우리의 귀차니즘을 해결해주기 위해 c#에서 지원하는 기능이 바로 property다

Property는 Getter와 Setter를 동시에 쓸 수 있는 아름다운 기능이다!

 

아래의 예시를 보자

getter와 setter를 20개를 만들어주는 것 대신 10개의 프로퍼티로 작성하였다!(작업이 절반이 준 것이다!)


뭔가 변수처럼 생겼지만 사실은 메소드이다!

 

자 그럼 여기서 "뭐야 만들어주긴 했는데 값이 없잖아요..?" 라고 할 수 있는데
어차피 우리는 Main()에서 Getter로 값을 가져오고 Setter로 값을 넣어주었다

 

프로퍼티를 사실 자세히 뜯어보면 아래와 같다

위 빨간 박스안 2개의 코드는 같은 것이다 (다만 우리눈에 안보이게끔 편하게 생략된 것일 뿐!)

 

자 이제 Property로 Main()에서 값을 가져오고 넣어보자


짜란!
값을 가져오고 넣어줬다! 프로퍼티를 사용해서 말이다!

 

그러면 여기서 조금 더 생각을 꼬아보자

만약

 

Property를 쓰긴 쓰는데

읽기전용인 Getter 메소드는 안쓰고

쓰기전용인 Setter 메소드만 쓰고싶으면 어떡해요??

 

라고 할 수 있는데

그때는 프로퍼티 내에서 접근한정자를 사용해주면 된다


어떻게?

 

이렇게!

get 앞에 private을 다 붙여줬다


그리고 Main에서 Console.WriteLine()을 이용해 출력하려 했더니

get에 접근할 수 없으므로 읽어올수가 없다고 컴파일 에러가 뜬다!

그럼 반대로?

 

프로퍼티를 쓰긴 쓰되

읽기전용인 Get은 쓰고싶은데

쓰기전용인 Set 은 쓰고싶지 않아요!

 

라면?

아래와 같이 해주면 된다

Main() 함수로 돌아가보자!

 

돌아갔더니 반대로 읽는 건 문제가 안되는데, 쓰는부분에서 컴파일 에러가 난다!

 

이런식으로 프로퍼티를 사용하되 ,어느 한쪽의 기능을 못쓰게 하고싶다면 접근한정자로 혼내주면 된다!

 

 

<정리>

 

1. Getter란?

= 읽기 전용 메소드(함수)

 

2. Setter란?

= 쓰기 전용 메소드

 

3. Property란?

= Getter와 Setter 함수를 필드마다 지정해주기 귀찮아서, C# 에서 지원해주는 한꺼번에 쓸 수 있는 기능