관리 메뉴

생각하는 개발자

Java :: 게터와 세터 :: getter 와 setter 본문

Programming/Java

Java :: 게터와 세터 :: getter 와 setter

생각하는 디빌리 2018.08.20 18:50



게터와 세터(getter and setter)

getter와 setter는 말 그대로 어떤 오브젝트 혹은 변수의 값을 가져오거나, 설정해주는 역할을 하는 메소드를 말한다.

이들은 다음과 같은 규칙을 가지고 있다.

  • getter
    • return type은 참조할 맴버변수의 자료형과 일치해야 한다.
    • 이름 앞에 get 을 붙이고 뒤에는 리턴할 맴버변수의 이름 혹은 해당 변수를 직관적으로 표현하는 단어가 와야한다.
    • ex) int getLength();

  • setter
    • return type은 void 혹은 값의 설정 결과를 알려줄 수 있는 type이어야 한다.
    • argument는 수정할 맴버변수와 같은 type이어야 한다.
    • 이름 앞에 set을 붙이고 뒤에는 수정할 맴버변수의 이름 혹은 해당 변수를 직관적으로 표현하는 단어이어야 한다.
    • ex) void setLength(int length);

이들은 단순히 값을 설정하고 리턴하는 역할만 할 뿐이지만 이들을 사용할 때 생겨나는 이점들이 많다.

가장 큰 이점은 재사용을 위한 캡슐화가 가능해진다는 것이다.

예를들어 개발자 A가 점을 그려주는 기능을 가진 배포판 라이브러리를 프로젝트에 적용했다고 가정해보자.

해당 라이브러리로 점을 그리던 중, 상사가 점의 사이즈를 알아내는 알고리즘과 수정하는 알고리즘을 구현하라고 했다.

업무를 받은 A는 점의 사이즈를 참조하기 위해 라이브러리를 열어봤다. 그리고 스파게티 소스와 마주했다.

public class DotInfo {
    public double apple;
    public double samsung;
    public double welcome_to_the_hell;
    .
    .
    .
    .
}

점의 정보를 저장하는 클레스는 불필요한 코드도 많고 주석도 없어서 어떤 변수가 점의 사이즈를 저장하는지 알아내는대 오랜 시간이 걸렸다.

그리고 A는 회사에서 짤렸다. 

-

이러한 형태로 작성된 라이브러리는 올바른 캡슐화가 되었다고 할 수 없다.

특정 값 참조를 위해서는 반드시 라이브러리 코드를 열어봐야 한다니?

라이브러리 배포자가 getter와 setter만 잘 구현해 놨어도 A는 즐거운 회사생활을 이어갈 수 있었을 것이다. 아래와 같이 말이다.

public class DotInfo {
    public double apple;
    public double samsung;
    public double welcome_to_the_hell;
    .
    .
   
    public double getDotSize() {
        return apple;
    }
    public void setDotSize(double size) {
        apple = size;
    }
}

 


게터와 세터의 활용

다음과 같은 사각형의 길이를 저장하는 클래스가 있다고 가정해보자.

public class RectangleView {
    public double mRectangle_x;
    public double mRectangle_y;
}

맴버변수인 mRectangle_x mRectangle_y는 화면에 사각형을 그려주는 컨트롤러 의해서만 수정되어야 한다.

하지만 개발 과정에서 해당 값을 참조해야 하는 경우가 있기 때문에 변수를 public으로 선언했다.

이런 형태는 잠재적 문제를 안고있다. 누구든지 해당 변수에 직접 접근해서 값을 변경할 수 있기 때문이다.

그리고 이러한 예외상황은 시스템을 다운시킬 수 도 있다.

이럴 때 getter를 활용하면 예외상황을 사전에 차단할 수 있다.

public class RectangleView {
    private double mRectangle_x;
    private double mRectangle_y;
    
    public double getWidth() {
        return mRectangle_x;
    }

    public double getHeight() {
        return mRectangle_y;
    }
}

변수 접근자가 public에서 private로 바뀐 것에 주목하라.

이러한 구현을 통해 해당 클레스의 메서드만 확인하는 것으로 어떤 변수를 참조할 수 있고, 변경할 수 있는지 알 수 있다.



마치며

필자는 MVC 패턴을 활용해 개발을 하는 경우라면 게터와 세터를 활용해 휴먼장애 확률을 줄이는 것을 추천한다.

또한 게터와 세터를 활용하면 클래스 재사용 시 용이하고 공동 작업 시에는 필수이다.


0 Comments
댓글쓰기 폼