본문 바로가기

자바(JAVA)

Getter, Setter를 지양하는 이유

객체 지향 프로그래밍에서는 객체의 데이터를 외부에서 직접적으로 접근하는 것을 막는다.

 

객체 데이터를 외부에서 변경하는 경우 객체의 무결성이 깨질 수 있기 때문이다.

 

Getter, Setter를 이용해서 객체 데이터를 수정하는 경우가 많은데, 사용시 편리하게 객체의 데이터를 수정 가능하다.

 

하지만 Getter와 Setter의 경우 함부로 사용하지 않는 편이 좋다는 말도 많고, 실제로 그러한 포스팅도 많다.

 

그렇다면 왜 사용하지 말라고 하는 것일까?

 

▶ Getter, Setter

사용 여부의 문제 이전에 Getter, Setter이 무엇인지 확실하게 알 필요가 있다.

 

Getter, Setter은 private를 관리하는 메서드이다.

 

private 선언시 다른 클래스에서 접근하려면 해당 클래스 안의 메서드를 이용해서 접근해야한다.

 

그러한 메서드를 보통은 직접 작성을 해야하는데 그것을 편리하게 작성하게 만들어주는 것이 Getter와 Setter이다.

 

Getter의 경우 다음과 같은 기능을 가진다.

  • 내부의 맴버 변수에 저장된 값을 외부로 리턴한다.
  • 매개변수는 없고, 리턴 값만 있는 메서드로 정의한다.
  • 메서드 명은 주로 get~~~() 메서드 형식으로 지정한다. ~~~는 해당 멤버변수의 변수명을 사용한다.

Setter

  • 외부로부터 데이터를 전달받아 멤버 변수에 저장한다.
  • 매개 변수만 있고, 리턴 값은 없는 메서드로 정의한다.

▶ 그러면 Getter, Setter를 왜 사용하지 말라는 것일까? 

Setter의 경우 다음과 같은 이유로 지양한다.

  • 사용한 의도를 파악하기 어렵다.
Post post = new Post();
post.setId(1L);
post.setUserId("member1");
post.setTitle("제목입니다.");
post.setCont("내용입니다.");

 

이러한 코드의 경우 계시글의 값을 생성하는 것인지, 변경하는 것인지 정확한 의도를 파악하기 어렵다.

게다가 객체의 내부 값이 복잡할 경우 더더욱 한눈에 알아보기 힘들다.

 

  • 일관성을 유지하기 어렵다.
public Post updatePost(Long id) {
    Post post = findById(id);
    post.setTitle("제목을 수정합니다.");
    post.setCont("내용을 수정합니다,");
    return post;
}

 

게시글을 변경하는 메소드다. public으로 작성된 setter 메소드를 통해 어디서든 접근이 가능하기에 값이 변경 가능해진다.

결국 일관성이 무너지게 된다.

 

Getter의 경우 Setter보다 지양하는 이유가 적긴 하다.

  • Getter의 경우 사용시 캡슐화가 지켜지지 않는다. private로 필드를 선언하고 getter로 아무 곳이나 값을 가져올 수 있기 때문에 상태 정보가 그대로 노출된다.

 

'자바(JAVA)' 카테고리의 다른 글

Java Collection Framework  (2) 2023.10.22