본문 바로가기

Java/이전블로그

getter 와 setter

반응형

아래의 내용 중 메서드를 사용하기 때문에 느리다는 식의 이야기는 지금에 와서는 큰 의미가 없다는 것을 알게 되었다.

사실 그렇게 따지면 JVM을 쓰는 것 자체가 C보다는 리소스를 더 쓰고 더 무겁다. 하지만 이것은 상대적인 것이지 클라이언트 컴퓨팅 파워 마저 옛 서버 PC이상의 성능을 내고 있는 요즘 세대에 와서는 큰 고려 대상이 아닌 것으로 보인다. 만약 당신이 극한상황의 Embedd 프로그램을 만드는 것이라면 애초에 JVM보단 다른 선택을 할 것이기 때문에 아래의 Getter, Setter는 성능과 연결지어 생각하는 것보다는 원래의 목적에 포커스를 맞추는 것이 좋을 듯 하다.

 

Getter, Setter에 대해 사람 몸으로 예시를 들자면, 입을 통해 음식을 씹어 삼켜서 소화를 시켜야 정상적으로 영양분을 섭취할 수 있는 것이지, 단백질이 필요하다고 삼겹살을 믹서에 갈아서 혈관에 직접 주사하는 사람은 없다는 것이다.

 

또 실무에서 이야기 해보면 특정 객체(DTO)를 세팅할 때 기본적으로 변수는 private으로 설정하게 된다. 그걸 사용하려면 Getter와 Setter를 사용해야한다. 물론 그 방법만 있는 것은 아니며, 의도적으로 Getter나 Setter를 막는 경우도 있지만 우선은 값 자체를 직접 접근하게 허용하는 케이스는 거의 없다고 보면 된다. 이 부분은 다른 언어들에서도 많이 나타나는 형식인데, private 키워드를 제공하지 않고 있었던 JS에서도 _와 같은 것을 변수명prefix 이용해 직접 접근하지 않도록 권장하는 변수를 만들기도 했었다(물론 요즘에 와서는 별도로 기능이 나온 것으로 보여서 추후 따로 글을 작성할 예정이다).

 

그리고 무엇보다 작명 규칙을 잘 지켜주어야 하는데, 나중에 롬복이나 스프링과 같은 것들을 사용하게 된다면 자동으로 생성 관리되기도 하는 이러한 메서드들은 작명을 지키지 않으면 여러 문제를 볼 수 있기 때문이다. 작명 규칙에 대한 글은 별도로 작성할 예정이다.

 

아래의 내용은 2020년도 공부당시 정리했던 https://blog.naver.com/csound93/221809209621 블로그의 내용을 옮겼습니다. 지금와서 돌아보면 그냥 난잡하게 글을 썼던 것 같네요. 추후 포스트를 통해 이전블로그에서 작성했던 내용들을 다시 정리해 보는 시간도 갖도록 하겠습니다.

 

은닉화에 관한 내용인데, 객체 변수를 public으로 설정하면 외부에서 내용을 마음대로 사용할 수 있다.

의도하지 않은 범위의 값을 강제로 넣거나 데이터타입도 강제로 바꿔서 넣을 수 있다.

하지만 우리의 자바는 그딴건 용납 못 한다. 제네릭만 봐도 그렇지 않은가? 그 때 쓰는 것이 private이다.

그렇지만 private은 반대로 같은 클래스를 제외하면 접근 자체가 불가능하다... 그럼 뭘 어찌해야할까?

그 때 필요한 것이 getter, setter이다. private한 곳에 딱 필요한 것만 넣고 받을 수 있게 쪽문을 열어주는 녀석이다.

Systax를 보자.( 이클립스는 변수만 선택하고 Source 탭에서 getter, setter를 선택하면 틀이 자동으로 만들어진다. )

class SimpleBox{

    private int num;

    SimpleBox(int num){

        this.num = num;

    }

    public int getNum(){

        return num;

    }

    public void setNum(int num){

        this.num = num + 1;

    }

}

public class ThisUseEx{

    public static void main(String[] args){

        SimpleBox box = new SimpleBox( 5 );

        box.setNum( 10 );

        System.out.println(box.getNum());

    }

}

여기서 우리가 발견할 수 있는 것은 private으로 설정되어 있는 맴버 변수 num이다.

우리가 외부로부터 보호하고자 할 때 private를 쓰는데 정작 이곳에 접근할 방법이 없다.

이 때 쓰이는 게 getter이다. (위에서의 getNum() 메서드)

외부에서 이 num을 가져다가 쓰고 싶을 때 public 으로 지정된 메서드를 이용하는 것이다.

getNum 메서드는 해당 클레스의 맴버 메서드이니까 private num에도 접근이 가능한 것이다.

하지만 box.num으로 접근하고자 할 때는 애초에 해당 변수가 보이지를 않는다.

그럼 setter 는? getter 는 이미 담겨 있는 private 한 데이터를 가져올 때 쓰인다고 했다.

그럼 가져오기만 할 것인가? 당연히 값을 세팅할 때도 접근을 해야한다. setting을 도와주는 친구가 setter이다.

또한 우리가 원하는 값의 설정을 넣어줄 수도 있다.

예를 들어 우리가 각 학생의 성적점수를 받아오는 객체를 만들고자 할 때,

0보다 크거나 같고 100보다 작거나 같은 수를 받아와야 하는데,

늘 강조하듯 우리가 개발을 할 때 프로그램을 사용하는 사용자는 어디로 튈지 모르는 공이라고 생각해야한다.

어떤 수가 입력이 될 지 알 수 없기에 그 범위를 설정해줘야한다.

기존에는 객체를 불러올 때 if 함수를 통해 걸러준 뒤 정보를 입력했다.

그럼 문제가 무엇이겠는가? 매번 객체를 사용하는 개발자가 알아서 파악하고 세팅해줘야한다.

그러다보면 세팅해주는 것을 잊을 수도 있고 아무생각 없이 사용할 수도 있다.

사람이란 게 실수를 전혀 안하는 완벽한 사람은 없지 않은가?

여기서 값의 범위를 setter를 사용해 정리해주게 된다면,

우리는 개발자도 정의된 값이 무엇인지 한 눈에 알 수 있게 해주고,

사용자도 정상적인 값을 입력할 수 밖에 없게 해준다.

또한 그 범위가 변경되거나 추가 가공이 필요할 경우는 setter의 부분만 수정해주면 된다.

그렇게 하는 와중에도 은닉화를 통해 우리가 보호하고자 하는 것들을 보호해줄 수 있는 것이다.

단지 큰 단점이라면 하나의 메서드를 거쳐가는 것이니 변수에 직접 접근하는 것보다 느릴 수 밖에 없다.

그래서 안드로이드 쪽 개발하시는 분들이 getter setter에 대해 안좋게 이야기하는 것을 간간히 볼 수 있었다.

'Java > 이전블로그' 카테고리의 다른 글

JAVA Study Memo 1  (0) 2023.03.28