이번엔 유니티에서 볼 수 있는
Public
Private
Protected 등 변수의 제일 앞쪽에 선언되는 키워드들인
접근 제한자에 대해 알아봅시다.
접근제한자란?
스크립트의 변수나 함수, 클래스등의 접근 정도를 제한 해주는 키워드들로
예를들어 A스크립트에서 B스크립트를 불러올때
A의 a만 불러오고, A의 b는 불러오지 못하도록 구현하기위해
아래처럼 다르게 선언하여 제한해줄 수 있도록하는 문법입니다.
public int a;
private int b;
가장 기본적인 키워드로는 public과 private가 있는데
public
- 해당 변수나 함수가 다른 스크립트나 객체에서 자유롭게 접근할 수 있도록 합니다.
- 해당 변수나 함수를 호출하거나 값을 변경할 수 있습니다.
private
- 해당 변수나 함수가 정의된 스크립트 내에서만 접근 가능하도록 합니다.
- 해당 변수나 함수에 접근하기 위해서는 같은 스크립트 내에서 getter와 setter 메서드를 통해 접근해야 합니다.
(아래 부분은 조금 있다가 설명하겠습니다.)
간단히 요약하면
public은 누구나 사용가능하게!
private는 선언한 사람만!
접근할 수 있도록 제한합니다.
protected
- 해당 변수나 함수가 정의된 스크립트와 파생된 클래스에서 접근할 수 있도록 합니다.
- 다른 스크립트나 객체에서는 접근할 수 없으며, 상속 관계에 있는 클래스에서만 접근이 가능합니다.
>>>>> 상속된 하위 스크립트에서만 사용가능하다!
internal
- 해당 변수나 함수가 정의된 어셈블리(Assembly) 내에서만 접근 가능하도록 합니다.
>> 유니티 프로젝트는 일반적으로 하나의 어셈블리로 구성됩니다.
그렇기에 프로젝트 내에서 변수나 함수를 공유한다고 생각 하시면 될 것 같습니다!
마지막으로
protected internal
- 같은 어셈블리 내에서는 모든 클래스에서, 다른 어셈블리에서는 상속 관계에 있는 클래스에서만 접근 가능
- internal에서 약간 확장된 개념으로 protected와 internal을 개념적으로 합쳐놓은것이라 생각할 수 있습니다.
유니티에서는 이렇게 5가지를 주로 사용합니다.
그럼 이것들이 왜 사용되나??
>> 정보은닉과 캡슐화 특성을 활용하기 위해 사용됩니다.
어떠한 정보에 대해 어디까지 허용할 것이고, 수정이 가능한지를 정해주기 위해 사용됩니다.
여기서 ++ 접근 제한자는 아니지만 변수/ 함수에 대한 접근 방법을 정의해 주는 추가적인 키워드들!
static
- 클래스의 인스턴스가 아닌 해당 클래스 자체에 대한 멤버를 정의
- 클래스의 인스턴스 없이도 접근가능
>> 모든 스크립에서
[class이름].[스태틱 변수명]= ~~ 으로 값 변경 가능
public이였으면 클래스 선언 필요
const
- 변수를 상수로 정의하여 값을 변경 할 수 없도록해주는 키워드
아래처럼 출력을 값을 변경해주기만 해도 오류가 발생
public const int Variable = 10;
Variable=20 (x)
readonly
마지막으로
- 읽기만 되는 읽기 전용 키워드
public static int staticVariable = 10;
public const float Pi = 3.14159f;
public readonly string readOnlyString;
const 와 readonly가 머가 다르지???
>> 비슷합니다.... 하지만 언제 어디에 저장하는지 등등 다른 점들이 있습니다.
자세한 내용은 아래 블로그에 정리되어 있으니 한번 보는게 좋을 것 같습니다.
여기까지... 변수의 접근에 대해 선언해주는 키워드들을 정리해 보았습니다.
그런데 어떠한 변수에 대해 다른 스크립에서 참조가 가능하지만
어느 부분에서는 숨길수 있는... 그런 변수를 만들 수 없을까...
이럴때 저희는 한가지 방법을 생각해낼 수 있습니다. (이전글에서!)
[HideInInspector]
public GameObject d;
hideInInspector을 이용하여 public 변수를 사용하며 숨겨주기!
하지만 여기서 조금 더 나아가 변수에 대한 값이 정의 될시 함수를 실행 하고 싶다거나 값에 대해 검증을 하고 싶다!
>> 프로퍼티! 를 사용할 수 있습니다.
프로퍼티?
private 변수에 대해 따로 public 변수를 하나 더 두어 스크립트 내부에서 값을 변경하게끔 구성된 기능입니다.
전체적인 구성은 아래와 같습니다.
private int testC = 0;
public int c
{
get { return testC; }
set { testC = value; }
}
private로 선언된 testC의 값을 get을 이용하여 C에 적용시켜주고
현재스크립이나 다른 스크립에서
C의 값이 변경되는 순간 testC 또한 value를 전달하여 값을 변경 시키는 구조!
구조만 보면 단순합니다.
근데 이렇게 사용하는 이유가.....?
>> 위는 매우 간단한 예로 private를 public 변수와 연결하여 구성될 수 있다는 것을 알 수 있습니다.
여기서 get/ set을 좀더 활용한다면?
get은 c의 값을 불러올때 실행!
set은 c의 값이 변경될때 실행!
된다고 생각하고
다음과 같이 구성해 봅시다.
private int testC = 0;
public int c
{
get {
return testC;
}
set {
if (value < 100)
{
testC = value;
}
else
{
print("값이 너무 커요.... 50으로 적용 시키겠습니다.");
Change();
}
}
}
void Change()
{
c = 50;
}
위처럼 프로퍼티를 사용하면
1. 내부에 조건을 넣어 값에 제한을 둘 수 있고
2. 값이 변경됨에 따라 함수를 실행 시킬 수 도 있습니다.
좀 더 실용성 있게 사용할 수 있습니다!
여기서 아래를 실행해 주면
void Start()
{
c = 10;
print("c : "+ c);
print("testC : "+ testC);
c = 100;
print("c : " + c);
print("testC : "+ testC);
}
값이 수정되고 값의 제한에 따른 함수도 실행 하는것을 볼 수 있습니다!
이처럼 프로퍼티는 유용하게 사용될 수 있는 기능으로
1. 캡슐화와 정보은닉
2. 검증 및 유효성 확인
3. 변수의 변경에 따른 함수 실행
4. 디버깅
등의 목적으로 사용가능합니다!
이번 글은 여기까지!
접근 제한자 부분은 유니티 코드를 짜며 어느정도 감으로 알고 있었는데 정리해보니
약간 몰랐던 부분에 대해서 도움이 된것 같습니다.
프로퍼티 부분은 private 변수를 public 으로 사용할 수 있다는 점 외에도
변수의 값 제한, 함수 실행 부분에서 매우 유용하게 사용할 수 있겠다는 생각이 드네요!
틀린 내용이나 추가적인 내용에 대해서는 계속해서 보완하도록 하겠습니다!
틀린 점이 있다면 댓 달아주세요!
'유니티 최고 > 유니티 개념' 카테고리의 다른 글
유니티(Unity) 의 가장 기본/기초 클래스[Class]에 대해서 (0) | 2023.06.09 |
---|---|
유니티(Unity) 인스펙터창 관리 / [HideInInspector] ? , [SerializeField] ? (1) | 2023.06.08 |
유니티(Unity) async await이란 & 동기식, 비동기식 작업 (0) | 2023.06.01 |
유니티(Unity) 코루틴(Coroutine) 이란 & 사용해보기 (1) | 2023.05.30 |
유니티(Unity) 싱글톤(Singleton) 이란 & 사용해보기 (씬이동시 데이터 유지방식) (0) | 2023.05.25 |
댓글