프로그래밍VB.NET 개발자

Visual Basic에서 계산된 속성(Calculated Properties)을 지원하는 속성을 어떻게 구현하며, 속성 내에서 비공개 필드와 안전하게 상호작용할 수 있습니까?

Hintsage AI 어시스턴트로 면접 통과

응답.

질문의 역사
Visual Basic의 속성은 값의 접근 및 할당에 대한 로직을 캡슐화할 수 있습니다. 속성이 도입됨에 따라 코드는 더 읽기 쉬워지고 안전해지며, 클래스 필드에 직접 접근할 필요가 없어지고 유효성 검사 또는 계산 로직을 객체 내에서 구현하기가 쉬워집니다.

문제
초보자들은 종종 필드를 공개적으로 만들거나 로직을 포함하지 않은 자동 속성을 사용하여 캡슐화를 해치거나 계산된 값을 구현할 수 없는 상태가 됩니다. 또 다른 문제는 속성이 자기 자신을 재귀적으로 호출하면 StackOverflow가 발생하는 것입니다.

해결책
Visual Basic에서는 비공개 필드를 선언하고, 속성에는 필요한 로직이 포함된 Get 및 Set 블록이 있습니다. 계산된 속성은 오직 Get만 사용하여 비공식 필드를 기반으로 계산된 값을 반환합니다. set 블록 내에서는 항상 비공식 필드에 접근하여 무한 재귀를 피해야 합니다.

코드 예시:

Private _price As Decimal Private _quantity As Integer Public Property Total As Decimal Get Return _price * _quantity ' 계산된 속성 End Get End Property Public Property Price As Decimal Get Return _price End Get Set(value As Decimal) If value < 0 Then Throw New ArgumentException("가격은 양수여야 합니다") _price = value End Set End Property

주요 특징:

  • 내부 데이터 접근 캡슐화.
  • 가져오기/할당 시 유효성 검사 또는 추가 처리를 위해 로직 추가 가능.
  • 읽기 전용 속성과 쓰기 속성 간의 차이.

함정 질문.

Set Price 내에서 비공식 필드를 통해 속성 Name에 접근할 수 있습니까?

네, Set 블록 내에서 다른 속성(Name 등)에 접근하는 것은 허용됩니다. 서로 다른 비공식 필드에 대한 접근은 재귀를 발생시키지 않기 때문입니다. 하지만 자기 자신에게 접근하는 것은 피해야 합니다: Set Price 내에서 Price를 호출하면 재귀가 발생합니다.

코드 예시:

Public Property Name As String Get Return _name End Get Set(value As String) _name = value End Set End Property Public Property Price As Decimal Get Return _price End Get Set(value As Decimal) If Name Is Nothing Then _name = "기본값" _price = value End Set End Property

Get 블록 내에서 이 속성을 다시 호출하면 어떻게 됩니까?

이 경우 무한 재귀가 발생하고 StackOverflow가 발생합니다. get 블록 내에서는 항상 비공식 필드를 사용해야 하며, 그렇지 않으면 속성이 자기 자신을 호출하게 됩니다.

Public Property Amount As Decimal Get Return Amount ' 무한 재귀로 이어질 수 있음 End Get Set(value As Decimal) _amount = value End Set End Property

쓰기가만 가능한 속성(WriteOnly)으로 선언할 수 있으며, 이 점은 무엇이 위험합니까?

쓰기가만 가능한 속성이 존재하지만, 사용하지 않는 것이 좋습니다. 객체가 값을 반환할 수 없게 되므로 읽기 쉽고 예측 가능한 특성을 잃게 됩니다. 단지 쓰기만 필요하다면 아키텍처를 재검토하는 것이 좋습니다.

Private _secret As String Public WriteOnly Property Secret As String Set(value As String) _secret = value ' 기록 가능하지만, 읽을 수 없음. End Set End Property

일반적인 오류 및 안티 패턴

  • 자신 내부에서 속성을 재귀적으로 호출하여 비공식 필드에 접근하는 대신.
  • 속성 대신 공개 필드를 사용하는 것은 캡슐화를 해칩니다.
  • 명확한 필요 없이 쓰기가만 가능한 속성을 생성합니다.
  • set 블록에서 입력 데이터 검사가 없습니다.

실제 사례

부정적인 케이스

프로그래머가 Price 필드를 공개로 만들고 직접 작업하기로 결정했습니다. 그 결과 Price가 때때로 잘못되어 음수가 되는 경우가 발생했습니다.

장점:

  • 빠른 구현, 최소한의 코드.

단점:

  • 캡슐화 없음.
  • 유효성 검사가 불가능.
  • 부적합한 값을 쉽게 입력할 수 있습니다.

긍정적인 케이스

동료는 Price를 비공개 필드와 set 블록에서 유효성 검사가 있는 속성으로 교체하여 잘못된 값을 방지했습니다.

장점:

  • 데이터 안전성.
  • 코드 발전을 위한 유연성.

단점:

  • 코드 양이 조금 증가했습니다.