참치김밥은 최고의 한식이다

[Effective C# 2판] Item 2 : 변경 가능한 데이터에는 암묵적 속성을 사용하는 것이 낫다 본문

책/C#

[Effective C# 2판] Item 2 : 변경 가능한 데이터에는 암묵적 속성을 사용하는 것이 낫다

l__j__h 2024. 2. 21. 11:27

먼저, Item 2에서 말하는 암묵적 속성, 명시적 속성이 뭘까???

아마 나처럼 속성(프로퍼티)이 뭔지만 아는 사람들을 위해 간략히 아래 예시를 준비했다.

// 암묵적 속성. 구현부가 없다
public class Person{
	public string FirstName {get; set;}
	public string LastName {get; set;}
}


// 명시적 속성. 구현부가 추가되었다
public class DerivedType : BaseType{
	public override string Name{
		get => base.Name;
		protected set{
			if(!string.IsNullOrEmpty(value))
				base.Name = value;
}
}
}

(일단 저는 이렇게 이해했는데, 혹시 잘못 이해한 부분이 있다면 언급해주시면 감사하겠습니다!!!!)

 

 

public class Person{
	public string FirstName {get; set;}
	public string LastName {get; set;}
}

 

 

위 코드는 암묵적 속성(프로퍼티)을 사용한 예시이다!

컴파일러는 위 프로퍼티의 값을 저장할 뒷단 필드(backing field)를 추가하고, 임의로 이름을 부여한다. 세터(setter)를 사용하면 이 뒷단 필드의 값을 변경할 수 있다. 하지만, 이 필드의 이름을 컴파일러가 임의로 생성하기 때문에, 같은 클래스 안에서라도 데이터 필드의 값을 직접 수정하지 못하고, 위의 프로퍼티를 이용할 수밖에 없다. 하지만 사실 이는 문제가 아니다.

 

암묵적 속성으로도 virtual을 정의하거나, virtual 속성을 재정의하거나, 인터페이스에 정의된 속성을 구현할 수 있다.

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

public class DerivedType : BaseType{
	public override string Name{
		get => base.Name;
		protected set{
			if(!string.IsNullOrEmpty(value))
				base.Name = value;
}
}
}

 

암묵적 속성의 장점은 3가지가 있다.

  • 개발자의 생산성을 높이고, 클래스의 가독성을 높인다.
  • 향후 데이터 검증 등을 위해서 암묵적 속성을 명시적 속성으로 구현부를 추가해도, 클래스의 바이너리 호환성이 유지된다. (데이터 필드만 사용하다가 프로퍼티로 변경하면 호환성이 깨진다고 한다.)
  • 여전히 프로퍼티를 사용하므로, 데이터 검증 코드를 한 군데만 두면 된다.

단, 암묵적 속성에 한 가지 제약이 있다.

※ 암묵적 프로퍼티에는 Serializable을 사용할 수 없다.

이유???

: 암묵적 프로퍼티는 컴파일러가 자동 생성한 뒷단 필드 데이터에 값을 저장한다. 이때, 뒷단 필드의 이름은 컴파일러가 임의로 생성하는데, 이 이름이 항상 같을 것이라 보장할 수가 없다. 즉, 클래스를 수정한 뒤 다시 컴파일하면 뒷단 필드의 이름이 변경될 수 있다.

 

728x90