1. 개요
Java 개발에서 getters
와 setters
를 사용하면 불필요한 코드처럼 느껴질 수 있지만, 이는 중요한 소프트웨어 설계 원칙인 **캡슐화(encapsulation)**를 준수하기 위한 핵심 요소입니다. 이 글에서는 왜 필드를 직접 공개(public)하는 대신, get
과 set
메서드를 사용하는 것이 더 나은 선택인지 구체적으로 설명합니다.
2. Getters와 Setters의 기본 정의
2.1 직접 필드 접근
public String name; // 필드 직접 공개
- 장점: 코드가 간결하고 이해하기 쉽습니다.
- 단점: 데이터 무결성 및 보안 유지가 어려워지고, 유지보수가 복잡해질 수 있습니다.
2.2 Getters와 Setters 사용
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
- 장점: 데이터 접근을 제어하고 변경 가능성을 열어 둡니다.
- 단점: 초기에는 다소 번거로운 코드가 필요합니다.
3. Getters와 Setters를 사용하는 이유
3.1 데이터 무결성 유지
set
메서드를 사용하면 입력 값에 대한 검증(validation) 로직을 추가하여 잘못된 데이터를 방지할 수 있습니다.
public void setAge(int age) {
if (age < 0) {
throw new IllegalArgumentException("Age cannot be negative");
}
this.age = age;
}
3.2 캡슐화를 통한 구현 세부사항 숨기기
클래스 내부 구현 방식을 외부에 노출하지 않고, 인터페이스만 공개합니다.
이를 통해 구현 변경이 필요한 경우에도 외부 코드에 영향을 미치지 않습니다.
// 내부적으로 milliseconds를 저장하지만, 외부에는 초 단위로 노출
private long timestamp;
public void setTimestamp(long seconds) {
this.timestamp = seconds * 1000;
}
public long getTimestamp() {
return timestamp / 1000;
}
3.3 클래스 안정성 및 유지보수성 향상
- 추후 필드 접근 방식을 변경해야 할 때,
getters
와setters
가 없다면 모든 호출 코드를 수정해야 합니다. getters
와setters
를 사용하면 인터페이스를 유지하면서 내부 구현만 수정할 수 있습니다.
4. Getters와 Setters의 장점
4.1 접근 제어 가능
// 읽기 전용 속성
private int id;
public int getId() {
return id;
}
4.2 상속을 활용한 동작 확장
하위 클래스에서 get
또는 set
메서드를 재정의하여 동작을 확장할 수 있습니다.
@Override
public void setName(String name) {
super.setName(name.trim()); // 자동으로 공백 제거
}
4.3 디버깅과 로깅 지원
필드 접근 시 특정 동작(예: 로그 기록)을 추가할 수 있습니다.
public void setName(String name) {
System.out.println("Setting name to " + name);
this.name = name;
}
5. Getters와 Setters를 사용하지 않아도 되는 경우
5.1 불변 객체 (Immutable Object)
불변 객체에서는 모든 필드를 final
로 선언하고, 생성자에서 초기화한 후 수정하지 않도록 설계합니다.
public final class Person {
private final String name;
private final int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
6. 실무에서의 활용 팁
6.1 Lombok을 활용한 코드 간소화
@Getter
와 @Setter
어노테이션을 사용하여 번거로운 메서드 작성을 줄일 수 있습니다.
@Getter
@Setter
public class Employee {
private String name;
private int age;
}
6.2 데이터 검증이 필요한 경우
특정 비즈니스 로직이 추가되는 경우에는 직접 getters
와 setters
를 구현하는 것이 바람직합니다.
7. 결론
getters
와 setters
는 객체 지향 설계 원칙을 준수하고, 유지보수성 및 확장성을 보장하는 데 필수적인 도구입니다. 초기 구현은 다소 번거로울 수 있지만, 장기적으로 안정적인 코드베이스를 유지하는 데 큰 역할을 합니다. 필요에 따라 Lombok이나 불변 객체를 사용해 효율성을 더할 수도 있습니다.
Reference
https://stackoverflow.com/questions/1568091/why-use-getters-and-setters-accessors
Why use getters and setters/accessors?
What's the advantage of using getters and setters - that only get and set - instead of simply using public fields for those variables? If getters and setters are ever doing more than just the simpl...
stackoverflow.com