단일 접근 원칙 (Uniform Access Principle) 과 캡슐화
Source
Evernote/Advanced View Required/단일 접근 원칙(Uniform Access Principle)을 통한 캡슐화-(下)完.md
Summary
단일 접근 원칙(UAP)은 객체의 속성(저장된 값)과 함수(계산된 값)를 구분하지 않고 동일한 표기법으로 접근할 수 있도록 하는 설계 원칙이다. Bertrand Meyer 가 제안한 이 원칙은 정보 은닉과 캡슐화를 강화하여, 내부 구현 방식 (저장 vs 계산) 이 변경되어도 클라이언트 코드를 수정하지 않도록 한다. Java 는 public 필드 노출 시 무조건적인 읽기/쓰기 권한 부여로 인해 UAP 를 직접 지원하지 않아 getter/setter 사용 시 가독성 저하 문제가 발생한다. 반면 C# 은 ‘프로퍼티 (Property)‘를 통해, Ruby 는 메타프로그래밍 (attr_reader 등) 과 메소드 호출 괄호 생략 기능을 통해 언어 차원에서 UAP 를 지원한다. 이를 통해 직관적인 필드 접근 문법과 메소드 기반 캡슐화의 장점을 동시에 확보할 수 있다.
Key Points
- 정의: 객체의 특징 (feature) 에 접근할 때 저장된 값인지 계산된 값인지 구분하지 않는 단일 표기법 제공.
- 목적: 내부 설계 결정 (구현 방식) 의 변경이 클라이언트 코드의 파급 효과를 최소화하기 위한 정보 은닉 및 캡슐화 강화.
- Java 의 한계: public 필드는 무조건적인 읽기/쓰기 허용, private 필드 + getter/setter 는 가독성 저하 및 인지 부하 증가.
- C# 의 해결책: ‘프로퍼티 (Property)‘를 통해 필드처럼 접근하지만 내부적으로 get/set 로직을 캡슐화하여 구현 변경 시 클라이언트 코드 수정 불필요.
- Ruby 의 해결책: 모든 인스턴스 변수는 private 이며, 메소드 호출 시 괄호 생략 가능하여 메소드를 필드처럼 호출 가능. attr_accessor 등 메타프로그래밍으로 UAP 지원.
- 설계 철학: 오용 방지를 위해 프로그래머의 주의 (care) 보다 언어 차원의 금지 (prevention) 나 구조적 지원이 더 효과적임.