처리중입니다. 잠시만 기다려주세요.
TTJ 코딩클래스
정규반 단과 자료실 테크 뉴스 코딩 퀴즈
테크 뉴스
Hacker News 2026.04.12 42

프로그래밍에서 '프로퍼티'란 도대체 뭘까? — 언어마다 다른 그 개념을 제대로 정리해봤어요

Hacker News 원문 보기

우리가 매일 쓰는 '프로퍼티', 정확히 뭔지 설명할 수 있나요?

개발하다 보면 "프로퍼티(property)"라는 단어를 정말 자주 만나게 되죠. Python에서는 @property 데코레이터를 쓰고, JavaScript에서는 객체의 프로퍼티를 이야기하고, C#에서는 get/set이 달린 프로퍼티를 선언하고요. 그런데 누군가 "프로퍼티가 정확히 뭐야?"라고 물으면, 명쾌하게 대답하기가 의외로 쉽지 않아요. 왜냐하면 언어마다 프로퍼티가 의미하는 바가 조금씩 다르거든요.

최근 Alperen Keles라는 개발자가 이 질문을 깊이 파고드는 글을 올렸는데요, 프로퍼티라는 개념이 프로그래밍 언어 설계에서 어떤 위치에 있는지, 그리고 왜 이렇게 다양한 형태로 존재하는지를 체계적으로 정리하고 있어서 흥미로웠어요.

필드, 메서드, 그리고 그 사이 어딘가

프로퍼티를 이해하려면 먼저 "필드"와 "메서드"의 차이부터 짚어야 해요. 필드(field)는 객체가 가지고 있는 데이터 그 자체예요. 예를 들어 user.name에서 name은 그냥 문자열 데이터가 저장된 공간이죠. 반면 메서드(method)는 객체가 할 수 있는 동작이에요. user.getName()처럼 괄호를 붙여서 호출하는 함수인 거죠.

그런데 프로퍼티는 이 둘의 중간 지대에 있어요. 겉으로 보기에는 필드처럼 user.name으로 접근하는데, 실제로는 뒤에서 함수가 돌아가고 있는 거예요. 이게 뭐냐면, 마치 자동문 같은 거라고 생각하면 돼요. 문을 밀면 그냥 열리는 것 같지만(필드처럼 보이지만), 실제로는 센서가 감지하고 모터가 작동해서 문이 열리는 것처럼(메서드가 실행되는 것처럼) 동작하는 거죠.

언어마다 다른 프로퍼티의 모습

이 개념이 재미있는 건 프로그래밍 언어마다 프로퍼티를 구현하는 방식이 꽤 다르다는 점이에요.

Python에서는 @property 데코레이터를 사용해요. 클래스 안에서 메서드를 정의하되, 그 위에 @property를 붙이면 외부에서는 마치 일반 속성에 접근하듯 사용할 수 있어요. 값을 설정할 때는 @name.setter를 추가로 정의하고요. Python의 철학이 잘 드러나는 부분인데, "처음에는 그냥 필드로 만들고, 나중에 로직이 필요해지면 프로퍼티로 바꿔라"라는 거예요. 호출하는 쪽 코드를 바꿀 필요 없이 내부 구현만 바꿀 수 있으니까요.

C#은 프로퍼티를 언어 차원에서 공식 지원하는 대표적인 언어예요. public string Name { get; set; } 이렇게 간결하게 선언할 수 있고, 자동 프로퍼티(auto-property)라는 문법 설탕도 제공해요. Java 개발자들이 Lombok 같은 라이브러리를 써서 getter/setter 보일러플레이트를 줄이려고 하는 것과 비교하면, C#은 언어 자체에서 이 문제를 해결한 셈이에요.

JavaScript/TypeScript에서는 또 다른 접근법을 써요. Object.defineProperty를 통해 프로퍼티를 정의할 수도 있고, 클래스 문법에서 get/set 키워드를 쓸 수도 있어요. 그리고 ES6의 Proxy 객체를 활용하면 객체의 모든 프로퍼티 접근을 가로채서 커스텀 동작을 넣을 수도 있죠. Vue.js나 MobX 같은 반응형 프레임워크가 바로 이 메커니즘을 활용해서 데이터 변경을 감지하는 거예요.

프로퍼티가 중요한 진짜 이유: 캡슐화

프로퍼티가 존재하는 근본적인 이유는 캡슐화(encapsulation) 때문이에요. 캡슐화라는 건 내부 구현을 숨기고 외부에는 깔끔한 인터페이스만 보여주자는 객체지향의 핵심 원칙인데요, 프로퍼티가 바로 이걸 우아하게 달성하는 도구예요.

예를 들어볼게요. 온도를 저장하는 객체가 있다고 합시다. 처음에는 섭씨 온도를 그냥 필드로 저장했어요. 그런데 나중에 요구사항이 바뀌어서 "음수 온도는 저장하면 안 된다"거나 "화씨로도 변환해서 제공해야 한다"는 조건이 추가됐어요. 필드를 직접 노출했다면 이 변경이 어렵지만, 프로퍼티를 사용했다면 getter/setter 안에 검증 로직이나 변환 로직을 넣으면 끝이에요. 외부 코드는 전혀 바꿀 필요가 없고요.

이게 바로 "균일 접근 원칙(Uniform Access Principle)"이라고 불리는 개념이에요. Bertrand Meyer가 제안한 이 원칙은, 데이터가 저장된 것이든 계산된 것이든 접근하는 방법은 동일해야 한다는 거예요. 프로퍼티는 이 원칙을 코드에서 실현하는 가장 실용적인 방법이죠.

다른 패러다임에서의 프로퍼티

객체지향 언어에서만 프로퍼티가 있는 건 아니에요. Rust에서는 프로퍼티 문법이 따로 없지만, 트레이트(trait)를 통해 비슷한 패턴을 구현하고요. Kotlin은 모든 필드가 기본적으로 프로퍼티예요 — backing field라는 개념을 통해 자동으로 getter/setter가 생성되는 구조죠. Swift도 저장 프로퍼티(stored property)와 계산 프로퍼티(computed property)를 명확히 구분해서 제공해요.

함수형 프로그래밍 쪽에서는 "렌즈(lens)"라는 개념이 프로퍼티와 비슷한 역할을 해요. 렌즈는 불변 데이터 구조에서 특정 부분을 읽고 수정하는 추상화인데, 이게 뭐냐면 돋보기로 데이터의 한 부분만 들여다보고 그 부분만 바꾼 새 데이터를 만드는 것과 같아요.

한국 개발자에게 주는 시사점

실무에서 프로퍼티를 제대로 활용하는 건 코드 품질에 직접적인 영향을 줘요. 특히 API 설계를 할 때, 외부에 노출할 인터페이스를 프로퍼티로 잘 감싸두면 나중에 내부 구현이 바뀌어도 호환성을 유지할 수 있어요. 이건 라이브러리나 SDK를 만드는 개발자에게 특히 중요한 포인트예요.

또한 프레임워크를 쓸 때도 프로퍼티의 동작 원리를 알면 디버깅이 훨씬 수월해져요. Vue 3의 반응형 시스템이 왜 Proxy 기반으로 바뀌었는지, Django의 모델 필드가 내부적으로 어떻게 동작하는지 이해하려면 프로퍼티의 개념을 정확히 알고 있어야 하거든요.

마무리

프로퍼티는 단순한 문법 설탕이 아니라, 객체의 인터페이스와 구현을 분리하는 핵심 메커니즘이에요. 언어마다 형태는 다르지만, 결국 "데이터 접근에 동작을 끼워 넣자"는 같은 목표를 향하고 있죠.

여러분은 현재 사용하는 언어에서 프로퍼티를 얼마나 적극적으로 활용하고 계신가요? 처음부터 프로퍼티로 감싸는 편인가요, 아니면 필요해질 때 리팩터링하는 편인가요?


🔗 출처: Hacker News

이 뉴스가 유용했나요?

이 기술을 직접 배워보세요

파이썬으로 자동화를 시작해보세요

파이썬 기초부터 자동화까지 실전 강의.

파이썬 강의 보기

"비전공 직장인인데 반년 만에 수익 파이프라인을 여러 개 만들었습니다"

실제 수강생 후기
  • 비전공자도 6개월이면 첫 수익
  • 20년 경력 개발자 직강
  • 자동화 프로그램 + 소스코드 제공

매일 AI·개발 뉴스를 받아보세요

주요 테크 뉴스를 매일 아침 이메일로 전해드립니다.

스팸 없이, 언제든 구독 취소 가능합니다.