C# - 속성과 최적화

양규빈·2023년 11월 22일
0

C# 공부

목록 보기
24/30

속성

C#에서 속성이란 전용 필드의 값을 읽거나 쓰거나 계산하는 유연한 메커니즘을 제공하는 멤버이다.
데이터를 저장하는 저장소를 속성을 이용하여 감싸는 방식은 일반적인 패턴이기도 하다.

이때, 게터와 세터에서 값의 유효성을 추가하는 것도 가능하다.

문서 링크

사진은 마이크로소프트 문서에서 제공하는 C# 속성에 대한 예제 코드이다.


컴파일러는 private 필드를 자동으로 생성해주기 때문에, 암묵적인 속성 문법을 사용하면 코드의 양을 줄일 수 있다.

속성은 내부 데이터에 접근하거나 그 값을 수정하기 위해서 메서드 기능을 확장한 C# 언어의 기본 요소이다.

public class Student
{
	public virtual string Name
    {
    	get;
        protected set;
    }
}

속성의 접근자는 두 개의 독립된 메서드로 컴파일 되며, get과 set에 각각 다른 접근 한정자를 지정하는 것도 가능하다.


인덱서

어떤 타입이 여러 개의 요소(배열, 리스트 등)를 포함하는 경우라면, 매개변수를 활용하는 속성인 인덱서를 사용할 수 있다.

인덱서를 활용한 예시는 아래와 같다.

public class Student
{
	private int[] Values = new int[10];
    public int this[int index]
	{
		get => Values[index];
    	set => Values[index] = value;
	}
}

// 인덱서 접근
Student student = new Student();
result = student[2];

인덱서는 접근해야 할 요소가 하나뿐인 일반적인 속성이 제공하는 기능을 모두 지원한다.
엔덕서 내부에서 값의 유효성을 검증하거나 계산을 수행할 수 있으며, 가상 메서드(virtual) 혹은 추상 메서드(abstract)로 선언하는 것도 가능하다.

인덱서는 1차원 인덱서만이 가능한 것이 아니다.

public int this[int x, int y] => Position(x,y);
public int this[int x, string name] => Position(x, name);

다차원 인덱서 또한 가능하며, 각 차원을 나타내는 매개변수를 동일 타입으로 지정할 수 있지만, 서로 다른 타입도 가능하다.


최적화

유니티 엔진의 C# 컴파일러는 JIT(Just-In-Time) 컴파일하는 Mono 런타임을 사용한다.

Mono는 오픈 소스의 .NET 구현으로서, Unity에서는 C# 스크립트의 실행을 위해 Mono 런타임을 통합한다.

Mono는 JIT 컴파일러를 사용하여 C# 코드를 중간 언어로 변환한 뒤, 실행 시에 이를 목적 코드로 컴파일하여 실행한다.

JIT 컴파일러는 속성 접근자를 포함하여 일부 메서드 호출코드를 인라인화 한다.
속성 접근자가 인라인화되면 데이터 멤버를 사용했을 때와 성능이 같아지며, 성능면에서 크게 차이가 나지 않는다.

속성 접근자를 호출하는 코드는 마치 데이터 필드에 직접 접근하는 것처럼 보이므로 성능 면에서도 직접 데이터에 접근하는 것과 크게 차이를 보여서는 안 된다.

따라서 속성 접근자 내에서는 시간이 오래 걸리는 연산을 수행하면 안 된다.
(예를 들면 다른 애플리케이션이나 데이터 쿼리를 호출하는 작업)

public이나 protected로 데이터를 노출할 때는 항상 속성을 사용하면 효과적이다.
시퀀스나 딕셔너리 자료구조를 노출할 때는 인덱서를 사용하고, 모든 데이터 멤버는 private로 선언해야 한다.

이렇게 하면 즉시 데이터 바인딩을 지원할 수 있어, 코드의 유지 보수에도 유리하다.

profile
훌륭한 개발자를 꿈꾸는 중입니다

0개의 댓글