brunch

You can make anything
by writing

C.S.Lewis

by 서준수 Mar 12. 2020

다트 Getter & Setter

플러터를 위한 다트 프로그래밍

다트의 Getter와 Setter

클래스의 멤버 변수를 private이 아닌 public으로 선언하면 아무 곳에서나 접근이 가능하다. 아무데서나 막 쓸 수 있으니까 우와 너무 편하다!!라고 생각할 문제가 아니다. 왜냐하면 의도하지 않은 곳에서 접근하여 값을 변경하는 일이 발생할 수 있다. 또한 만약 그런 일이 발생하면 수정하는 게 쉽지 않다. 여기저기서 참조하고 있으면 어디서 잘못된 값으로 변경했는지 모두 확인해야 되기 때문이다. 멤버 변수뿐만 아니라 메서드도 마찬가지다.


이런 일을 방지하고자 클래스의 내부 정보를 공개하지 않도록 하는 것이 정보 은닉 방법 중 한 가지이다. 이러한 정보 은닉은 바로 캡슐화를 통해서 이뤄진다. 어떻게? 특정 멤버 변수에 접근할 수 있는 특별한 기능을 하는 메서드를 만들면 된다.


멤버 변수를 private로 선언하고 해당 변수에 접근할 수 있는 메서드는 public으로 선언하면 멤버 변수에 직접적으로 접근하는 것을 막을 수 있다.


그런 특별한 메서드가 바로 이번에 살펴볼 Getter와 Setter이다.


Getter는 멤버 변수의 값을 가져오는 역할을 하고 Setter는 값을 쓰는 역할을 한다. 다트에서는 getter와 setter 메서드를 각각 get과 set이라는 키워드로 사용한다.

기본 형태는 다음과 같다.


class Person {

 String _name;

 String get name => _name;

 set name(String name) => _name = name;

}


private 멤버 변수인 _name에는 직접 접근이 불가능하지만 public인 getter를 통해서 접근 가능하다. 이때 get name에서 name이 접근할 때 사용할 이름이다. set도 get과 마찬가지로 public이라 _name에 값을 할당하기 위해 접근 가능하며 set name에서 name 접근할 때 사용되는 이름이다. 즉 다음과 같이 사용한다.

getter와 setter를 추가하여 name이란 이름으로 자연스럽게 _name에 접근하고 있다. name은 _name에서 _를 빼고 써야 되는 규칙 같은 게 아니다. 단순히 임의로 지정해준 이름이기 때문에 다음과 같이 해도 된다.

getter를 hello로 하고 setter를 setName이라고 하면 각각 해당 이름을 통해서 _name에 접근하는 것이다. 다만 name으로 쓰면 의미 파악이 쉽게 되니 가독성 측면에서 좋을 수 있다.


그런데 여기까지 보면 어차피 _name을 name으로 wrapping 된 것일 뿐이라 어디서든 name으로 참조하여 값을 변경할 수 있지 않느냐는 생각이 든다. 하지만 getter와 setter 사용하면 어느 정도 제어가 가능하다.


예를 들어 _name이 절대 null이 되지 않아야 하는 상황이라면 다음과 같이 null인 경우에 대한 제어가 가능하다.

get을 살펴보면 _name이 null일 때 값에 접근하면 Lee라는 값을 가져온다. set을 보면 _name에 null을 할당하려고 하면 Park라는 값을 할당하여 _name이 null이 되는 경우가 없도록 한다. 이런 식으로 필요에 따라 적절히 활용할 수 있다.

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari