Java & Spring

Getter/Setter와 관리 규약

승주우에요 2026. 1. 6. 21:54

1. Getter/Setter

필드에 접근하지 못하게 하고 메서드를 통해서 접근할 수 있도록 만드는 방식

  • Getter: 필드 값 조회
  • Setter: 필드 값 변경

-> 이를 통해 객체는 자신의 상태를 스스로 통제할 수 있음

class User {
    private int age;

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

외부에서는 age 필드에 접근할 수 없음.

 

2. 불변 규약

불변 객체는 생성 이후 상태가 절대 변하지 않는 객체이다.

 

특징

  • Setter 없음 -> 불변이기 때문
  • 모든 필드는 private
  • 생성자에서만 초기화
  • 상태 변경 메서드 없음

-> 동시성 문제에 안전하고, Value Object에 적합하다

 

class Point {
    private final int x;
    private final int y;

    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }

    public int getX() {
        return x;
    }

    public int getY() {
        return y;
    }
}

 

3. 참조 타입과 불변 규약 주의점

불변 객체를 설계할 때 참조 타입 필드를 그대로 받는 경우에 얕은 복사 문제가 발생한다.

class Team {
    private final List<String> members;

    public Team(List<String> members) {
        this.members = members; // 얕은 복사
    }

    public List<String> getMembers() {
        return members;
    }
}

List<String> list = new ArrayList<>();
list.add("A");

Team team = new Team(list);
list.add("B");   // 외부에서 변경

System.out.println(team.getMembers());

출력 결과
[A, B]

 

-> 이때 Team 객체는 아무것도 하지 않았는데 내부 상태가 변경되었다. 불변 객체가 깨진 상태가 되었다

 

4. 깊은 복사 (방어적 복사)

새로운 객체를 만들어 내부 데이터를 복사하는 것이다. 외부 객체와 참조를 완전히 분리함

class Team {
    private final List<String> members;

    public Team(List<String> members) {
        this.members = new ArrayList<>(members); // 깊은 복사
    }

    public List<String> getMembers() {
        return new ArrayList<>(members); // 방어적 복사
    }
}

List<String> list = new ArrayList<>();
list.add("A");

Team team = new Team(list);
list.add("B");

System.out.println(team.getMembers());

출력결과
[A]

 

5. Java Bean 규약

객체 설계를 위한 관례적 규약이고, Spring Bean과는 다른 개념이다. 

  • 기본 생성자 존재
  • 필드는 private
  • Getter/Setter 제공
  • 직렬화 가능 구조
class Person {
    private String name;
    private int age;

    public Person() {
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

 

6. 정리

  • Getter / Setter는 객체 상태 접근을 통제함
  • Setter는 유효성 검사의 핵심 지점
  • 불변 객체는 생성 이후 상태가 변하지 않는 객체이다.
  • 참조 타입 필드는 방어적 복사가 필요하다.
  • Java Bean은 관리적 객체 설계 규약이다.

'Java & Spring' 카테고리의 다른 글

오버라이딩(Overriding)과 super  (0) 2026.01.06