본문 바로가기
Language/Java

[JAVA] Getter와 Setter를 사용하는 이유 : 객체지향의 꽃, 캡슐화 완성하기

by Papa Martino V 2026. 1. 16.
728x90

Getter와 Setter
Getter/Setter

 

자바 프로그래밍을 시작하면 가장 먼저 접하는 관습 중 하나가 바로 필드를 private으로 선언하고, public 메서드인 GetterSetter를 만드는 것입니다. "귀찮게 왜 직접 변수에 접근하지 않고 메서드를 거쳐야 할까?"라는 의문이 든다면, 당신은 이미 객체지향 설계의 핵심인 캡슐화(Encapsulation)의 문턱에 도달한 것입니다. 오늘은 단순히 문법적인 설명을 넘어, 실무적인 관점에서 Getter와 Setter가 소프트웨어의 유지보수성과 안정성에 어떤 혁신을 가져오는지 깊이 있게 다뤄보겠습니다.

 

--- ## 1. 캡슐화(Encapsulation)란 무엇인가?

캡슐화는 데이터(속성)와 그 데이터를 처리하는 함수(메서드)를 하나로 묶고, 외부에서 내부 데이터에 직접 접근하는 것을 제한하는 원칙입니다. 알약(Capsule) 속에 든 가루약이 무엇인지 외부에서는 알 수 없고, 오직 정해진 복용법을 통해서만 효과를 내는 것과 같은 이치입니다. 자바에서 이를 구현하는 구체적인 수단이 바로 접근 제어자(Access Modifier)Getter/Setter입니다.

 

--- ## 2. 왜 Getter와 Setter를 써야 하는가? (핵심 가치)

 

### ① 데이터 무결성 보장 (Validation)

직접 변수에 접근하면 잘못된 값이 들어오는 것을 막을 방법이 없습니다. 하지만 Setter를 사용하면 조건문을 통해 데이터를 검증할 수 있습니다.

예: 사람의 나이(Age) 필드에 -5살이 입력되는 것을 Setter 내부에서 차단할 수 있습니다.

 

### ② 구현의 은닉화 (Implementation Hiding)

내부 데이터 저장 방식이 변경되어도 외부에 노출된 메서드 형태만 유지하면, 이 클래스를 사용하는 다른 코드들을 수정할 필요가 없습니다. 즉, 결합도(Coupling)를 낮추는 효과가 있습니다.

 

### ③ 읽기 전용/쓰기 전용 필드 생성

Getter만 제공하면 해당 필드는 외부에서 수정할 수 없는 '읽기 전용'이 됩니다. 클래스의 불변성을 유지하는 데 필수적입니다.

 

### ④ 지연 로딩 (Lazy Loading) 및 로깅

데이터가 실제로 필요할 때 로딩하거나, 값이 변경될 때마다 로그를 남기는 등의 추가 작업을 메서드 내부에서 수행할 수 있습니다.

 

--- ## 3. Getter/Setter 사용 유무에 따른 비교

데이터 접근 방식에 따른 차이점을 표를 통해 한눈에 비교해 보겠습니다.

구분 직접 변수 접근 (Public Field) Getter/Setter 접근 (Encapsulation)
데이터 제어 제어 불가 (아무 값이나 할당 가능) 필터링 및 유효성 검사 가능
보안성 낮음 (내부 구조 노출) 높음 (내부 로직 은닉)
유지보수성 어려움 (변수명 변경 시 전체 수정) 용이 (메서드 내부만 수정)
설계 원칙 절차지향적 성격 객체지향적 성격 (정보 은닉)
읽기/쓰기 권한 구분 불가 선택적 부여 가능 (Getter/Setter 택일)

 

--- ## 4. 실전 예시 코드

다음은 사용자의 점수를 관리하는 클래스에서 Setter를 통해 어떻게 데이터 무결성을 지키는지 보여주는 예시입니다.


public class Player {
    private int score;

    // Getter
    public int getScore() {
        return score;
    }

    // Setter: 음수 점수가 들어오지 못하게 방어함
    public void setScore(int score) {
        if (score < 0) {
            System.out.println("오류: 점수는 0보다 작을 수 없습니다.");
            this.score = 0;
        } else {
            this.score = score;
        }
    }
}

 

--- ## 5. 결론: 좋은 설계를 위한 첫걸음

최근에는 Lombok 라이브러리의 @Getter, @Setter 어노테이션을 사용하여 코드를 간결하게 작성하기도 합니다. 하지만 중요한 것은 도구가 아니라 '왜' 사용하는지에 대한 철학입니다. 객체의 상태는 객체 스스로가 책임져야 한다는 사실, 그것이 바로 Getter와 Setter가 존재하는 본질적인 이유입니다.

물론 모든 필드에 기계적으로 Getter/Setter를 만드는 것보다, 객체에게 '메시지를 던지는' 방식의 설계를 고민하는 것이 더 고차원적인 객체지향으로 나아가는 길입니다.


출처 및 참고 문헌:

  • Effective Java 3rd Edition (Joshua Bloch 저)
  • Clean Code (Robert C. Martin 저)
  • Oracle Java Documentation: Private Members in Classes
728x90