🧩 자바의 필드(Field)와 프로퍼티(Property) 차이 완벽 정리 - getter/setter와 실제 변수, 무엇이 다를까?
자바로 객체 지향 프로그래밍을 하다 보면 "필드"와 "프로퍼티"라는 용어를 자주 접하게 됩니다.
두 용어가 비슷하게 사용되지만, 의미와 쓰임은 명확히 다릅니다.
이번 글에서는 이 둘의 개념과 차이를 정확히 정리해보겠습니다.
✅ 필드(Field)란?
필드는 클래스 내부에 정의된 멤버 변수(실제 데이터 저장소)입니다.
객체가 상태(state)를 가지기 위해 보유하는 값이며, 보통 private으로 선언됩니다.
public class Person {
private String name; // ← 이게 필드!
}
- name은 클래스 안에 존재하는 실제 데이터 공간
- 클래스 내부에서 this.name처럼 직접 접근 가능
✅ 프로퍼티(Property)란?
프로퍼티는 객체 외부에서 getter/setter 메서드를 통해 간접적으로 접근하는 속성입니다.
즉, 필드와 연결된 외부 공개 인터페이스라고 볼 수 있습니다.
public class Person {
private String name;
public String getName() {
return name; // ← 이게 name이라는 "프로퍼티"
}
public void setName(String name) {
this.name = name;
}
}
- getName()과 setName() 메서드는 name 필드의 프로퍼티 역할
- 자바빈(JavaBeans) 규약에서는 이 메서드 집합을 "name 프로퍼티"라고 부릅니다.
📊 필드 vs 프로퍼티 비교 정리
구분 | 필드(Field) | 프로퍼티(Property) |
정의 | 클래스 내부에 선언된 멤버 변수 | 필드에 접근하기 위한 getter/setter 메서드 집합 |
접근 방식 | 직접 접근 (this.name) | 간접 접근 (getName(), setName()) |
존재 유무 | 실제로 메모리에 존재 | 개념적으로 존재 (인터페이스로서의 접근 수단) |
사용 목적 | 객체의 내부 상태 저장 | 외부에서 안전하게 상태를 읽거나 수정할 수 있도록 함 |
예시 | private String name; | getName(), setName(String name) |
⚠️ 헷갈리지 마세요!
❗ "필드 = 변수", "프로퍼티 = 변수 + 접근자(getter/setter)" 개념입니다.
프로퍼티는 "상태" 자체라기보단, 상태를 다루는 접근 수단에 가까워요.
🛠️ 실무에서 왜 중요할까?
📌 예시 1: JPA에서의 접근 전략
JPA에서는 데이터를 읽고 쓸 때 어떻게 접근할지를 선택할 수 있습니다:
- 필드 접근(Field Access) → 필드에 직접 접근
- 프로퍼티 접근(Property Access) → getter/setter를 통해 접근
@Access(AccessType.PROPERTY)
@Entity
public class Member {
private String name;
@Column(name = "member_name")
public String getName() {
return name; // ← 프로퍼티 접근 방식
}
}
✔ JPA는 이 getName()을 통해 name 필드를 읽고 씁니다.
따라서 어디에 어노테이션을 붙이느냐에 따라 접근 방식이 달라집니다.
📌 예시 2: JSON 직렬화 (Jackson, Gson 등)
Jackson도 기본적으로 getter를 기준으로 직렬화/역직렬화합니다.
public class User {
private String name;
public String getName() {
return name; // ← 이걸 통해 JSON에 포함됨
}
}
✔ 필드에 직접 접근할 수도 있지만, 설정에 따라 다르기 때문에 "필드냐, 프로퍼티냐"를 명확히 구분해야 합니다.
✅ 마무리 정리
항목 | 필드 | 프로퍼티 |
존재 방식 | 실제 객체 내부의 변수 | getter/setter를 통해 노출되는 속성 |
객체 내부 사용 | this.name 등으로 직접 접근 | 내부보단 외부에서 접근 시 활용 |
프레임워크 사용 시 | JPA, Jackson 등에서 접근 방식 차이 발생 | getter/setter에 따라 매핑 방식 달라짐 |
👉 필드 = 저장소, 프로퍼티 = 인터페이스
이 구분만 정확히 기억해도 실무에서 큰 도움이 됩니다.
'Web Programming Language > JAVA' 카테고리의 다른 글
스트림(Stream) 활용 - 요소 병렬 처리(Parallel Processing) (0) | 2025.03.06 |
---|---|
스트림(Stream) 활용 - 요소 정렬, 루핑(유소 개별 처리), 매칭(조건 만족 여부) (0) | 2025.03.06 |
스트림(Stream) 활용 - 요소 정렬, 루핑(유소 개별 처리), 매칭(조건 만족 여부) (1) | 2025.03.06 |
스트림(Stream) 활용 - 리소스로부터 스트림 얻기, 요소 걸러내기(필터링), 요소 변환(매핑) (0) | 2025.03.06 |
스트림(Stream) - 스트림, 내부 반복자, 중간 처리와 최종 처리 (0) | 2025.03.06 |