๐ Dart์์ Getter์ Setter
์ฌ๋๋์ ๊ฐ์ด Peach-Tri
์์ ์คํฐ๋๋ฅผ ์งํ์ค์ด์๋ค. ์งํ ๋์ค์ riverpod
์์์ฝ๋๋ค์ getter setter ์ธํ
์ด ์ ํ ์๋ค๋ ์ ์ ํ์์ด ์ด์ํ๊ฒ ๋๊ผ๊ณ , ๊ทธ๊ฑธ ๊ธฐ์ ์ผ๋ก Dart
๋ผ๋ ์ธ์ด์ ์งํฅ์ ์ด ์ด๋์ง์ ๋ํด์ ์๋ฌธ์ ํ๊ฒ ๋์๋ค. ๋๋ฌด๋๋ ๋น์ฐํ๊ฒ Java
์คํ์ผ๋ก Getter Setter๋ฅผ ์ ํด๋๋ ์ฐ๋ฆฌ๋ ์ฝ๋ ์์ฑ ์๊ฐ๋ณด๋ค ๋์์ธ ํจํด ํ์
์ ๊ธด ์๊ฐ์ ์์ ๊ฒฐ๊ณผ, Dart
์ ๋ํ๋จผํธ์ ๋ช๋ช ๊ธ๋ค์ ์๊ฒ ๋์๊ณ , ์์์ Dart
์ง๋ง ์๋ง ์ด ๋ด์ฉ์ ์ ๋ฐ์ ์ธ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ํ๋ฆ์ ๋ํด์ ์ผ ์๋ ์์ ๊ฒ ๊ฐ๋ค.
๐ Getter? Setter?
โ In Java
Java
์์ Getter์ Setter๋ ํ์์ ์ด๋ค. Lombok
์ด๋ผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํ์ฉํด์๋ผ๋, ์ด ๋ถํธํ accessor๋ฅผ ์ฌ์ฉํ๊ฒ ํ๋ค. ์ด๋ OOP
์ ์์น ์ค ํ๋์ธ ์บก์ํ
๋ฅผ ์ด๋ค๋ด๊ธฐ ์ํจ์ด๋ฉฐ, CLASS ๋ด๋ถ์ ์ผ๋ก private๋ก ์ ์ธํ field๋ค์ ๋ํด์ ์ ๊ทผ์ ์ปจํธ๋กค ํ ์ ์๋ ํ๋์ ์
์ถ๊ตฌ๋ก ์๊ฐํ๋ฉด ์ดํดํ ์ ์๋ค. ํ๋ถ์์ ๋์์, ๊ทธ๋ฆฌ๊ณ ๊น์ง ์์ ํ๋ก๊ทธ๋๋ฐ ๊ณต๋ถ์์๋ DTO๋ Entity์ ์ญํ ์ ํ๋ ํด๋์ค๋ค์ด ์ค์ค์ด getter์ setter๋ฅผ, ๊ทธ์ ๋จ์์ ๊ทผ์ ์ ์ดํ๊ธฐ ์ํด
๋ผ๋ ๋ชฉ์ ํ์ ์ค์ค์ด ๋ฌ๋ ค์๋ ๊ฒ์ ์ ์ ์๋ค. ๋ค๋ง ์ด๋ฐ ์ ๊ทผ์๋ค์ด ์ง์ง๋ก ํ์ํ์ง์ ๋ํด์ ์ฌ๊ณ ํด์ผํ๋ค.
๊ณผ์ฐ ๊ทธ์ ๋ชจ๋ field๋ค์ getter์ setter๋ฅผ ๋ถ์ด๋ ๊ฒ ๋ง์ผ๋ก ์บก์ํ
๋ผ๋ ๋ชฉํ๋ฅผ ์ด๋ฃฉํ ์ ์๋ ๊ฒ์ผ๊น?
๐ฏ In Dart
๋คํธ๋ ์ด๋ฐ ๋จ์์ ๊ทผ์๋ค์ ์ฌ์ฉํ๋๊ฒ์ ์ง์ํ๋ผ๊ณ ๋์์๋ค.
AVOID wrapping fields in getters and setters just to be โsafeโ.
๋จ์ํ ์์ ์ ์ํด์, getter์ setter๋ฅผ ํตํด์ ํ๋๋ค์ ๋งคํํ๋๊ฒ์ ์๋ฏธ๊ฐ ์๋ค๋ ๋ง์ด๋ค
๐คฆ ๊ทผ๋ฐ ์ด์ ์์ ์ ์ฐ๋ฆฌ๋ ์ฌ์ฉํ์ง ์๋๊ฑธ๊น?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Example {
private String name;
private int age;
public void setName (String name) {
this.name = name;
}
public String getName (String name) {
return this.name;
}
public void set age (int age) {
this.age = age;
}
public int getAge (int age) {
return age;
}
}
๋ค์๊ณผ ๊ฐ์ ์๋ฐ ์ฝ๋๊ฐ ์๋ค๊ณ ๊ฐ์ ํ ๋, ๊ณผ์ฐ ์บก์ํ
๋์ด ์๋์ง ์๊ฐํด๋ณด์, ํด๋์ค์ ๋ด๋ถ field๋ค์ private ์ํ์ด๋ค. ํ์ง๋ง ์ ์ ๋ชจ๋ field๋ค์ด public getter์ setter๋ก ์ธํด์ ๋
ธ์ถ๋์ด ์๋ ์ํ์ด๋ค. ์ธ๋ถ์์ ์ด class๋ฅผ ํ์ฉํ๋ ค๊ณ ํ๋ค๋ฉด, ๋ด๋ถ์ ์ผ๋ก ์ด๋ค ๊ตฌ์กฐ๋ฅผ ํ๊ณ ์๋์ง, ์ด๋ค ํํ๋ฅผ ๋๊ณ ์๋์ง ์์์ผ ํ๊ณ , ์ด๋ฐ ๊ตฌ์กฐ๋ getter setter์์ด ๊ทธ๋ฅ .
์ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ๋ณ๋ฐ ๋ค๋ฅผ ๋ฐ ์๋ ๊ตฌ์กฐ๋ฅผ ๊ฐ๊ฒ ๋๋ ๊ฒ์ด๋ค. ์ด๊ฒ์ ์ธ๋ป ๋๋ผ๊ธฐ์๋ ์บก์ํ
๋ฅผ ๋ฌ์ฑํ ๊ฒ ๊ฐ์ ๋ณด์ธ๋ค. ํ์ง๋ง ๊ถ๊ทน์ ์ผ๋ก ์ถ์ํ
๋ฅผ ๋ชฉํ๋ก ํ๋ OOP
์์๋ ์คํ๋ ค ์ถ์ํ๋ฅผ ํด์น๊ณ ๋ด๋ถ ๊ตฌ์กฐ๋ฅผ ๋๋ฌ๋ธ ๊ฒ๊ณผ ๋ค๋ฅผ๋ฐ ์๋ ์ฝ๋๊ฐ ๋์ด ๋ฒ๋ฆฐ๋ค. ๋จ์ ๋ฐ์ดํฐ ์ ๋ฌ ๋ชฉ์ ์ด ์๋, ๋๋ฆ์ ์ญํ ๊ณผ ์ฑ
์์ ๊ฐ์ง ํด๋์ค๊ฐ ์ด๋ฌํ ์ํ๋ผ๋ฉด ์บก์ํ๊ฐ ์ ์์ ์ผ๋ก ์๋ํ๋ค๊ณ ๋ณด๊ธฐ ์ด๋ ต๋ค.
1
2
3
4
5
...
public boolean isSame(Example example) {
return (example.age == someAge) ? true : false;
}
...
์ ๊ทผ์ ์ด์๋ค์ API ์ฆ ์ธํฐํ์ด์ค๋ค์ด๊ณ ์ธํฐํ์ด์ค๋ ๋ด๋ถ๋ก์ง
์ ์จ๊ธฐ๊ณ ๊ฐ์ฒด์๊ฒ ์ญํ ์ ๋ถ์ฌํ๋ฉฐ, ์ธ๋ถ์์ ๋ค๋ฅธ ํด๋์ค๋ค์ด ๋ด๋ถ ๊ฐ์ ๊ฐ์ ธ๊ฐ ๋น๊ตํ๊ฑฐ๋ ๋ณํํ๋๊ฒ์ด ์๋, ํด๋น๊ฐ์ฒด์๊ฒ ๊ฐ์ ์ฃผ๋ฉด์ ์ง๋ฌธ
์ ํด์ผํ๋ค๋ ๊ฒ์ด ํต์ฌ์ด๋ค. ์๋์ ๋ฉ์๋๋ Example๋ด๋ถ์ ์กด์ฌํ๋ฉฐ, privateํ ๊ฐ์ ๋ฐํํ์ง ์๊ณ ๋, ๊ฐ์ ๋น๊ตํ ์ ์๊ฒ ๋๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
class Example {
...
public boolean isSame (int age) {
return (age == this.age) ? true : false;
}
public boolean isSame (Stirng name) {
return (name == this.name) ? true : false;
}
...
}
์์ ์์๋ค์ ๊ทน๋๋ก ๋จ์ํ์ฌ ์ฐจ๋ผ๋ฆฌ getter setter์์ด field๋ฅผ ๋ฐ๋ก ๊ฐ์ ธ์ค๋๊ฒ ๋ ์ค์ฉ์ ์ด๊ฒ ์ง๋ง, ๋ ๋ณต์กํ๊ณ , ํน์ ๋ ๋ค์ํ ์๊ฐ๋ค์์ ๋จ์ํ ๊ฐ ์ ๋ฌ์ ์ข ๋ ํ์คํ๊ฒ
ํ๊ธฐ ์ํด์ getter์ setter๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์คํ๋ ค ์บก์ํ๋ฅผ ํ๊ณ ์๋ค๋ ์ฐฉ๊ฐ์ ์ฌ๋ก์กํ ์ ์๋ ๊ฒ์ด๋ค.
์บก์ํ๋ ์ ๋ณด์๋, ๊ทธ๋ฆฌ๊ณ ๋ ๋์๊ฐ์ OOP
์ ๊ถ๊ทน์ ๋ชฉํ์ธ ์ถ์ํ์ ๋๋ฌํ๊ธฐ ์ํด, ๊ทธ๋ฆฌ๊ณ ๊ฐ ํด๋์ค์ ์ญํ ๊ณผ ์ฑ
์์ ๋ถ์ฌํ๊ธฐ ์ํด์ ๊ฐ ๊ฐ์ฒด๋ค์ด ์๋ก ์ปค๋ฎค๋์ผ์ด์
์ ์ํด์ ๊ตฌ์กฐ๋ฅผ ์์์ผ ํ๋ ๊ฒ์ด ์๋๋ผ, ๊ฐ ๊ฐ์ฒด๋ค์ด ์๋ก์๊ฒ ์ง๋ฌธ์ ๋์ง๊ณ ๋ต๋ณ์ ๋ค์ผ๋ฉฐ ์ปค๋ฎค๋์ผ์ด์
์ ํ๋ค๊ณ ์๊ฐํ๋ฉด ํธํ๋ค.
๐ ๊ทธ๋ ๋ค๋ฉด ์ ์ ํ Accessor์ ์ฌ์ฉ์ ์ด๋ค ๋ ์ผ๊น?
Accessor๋ค์ ํ์ฉํ๊ธฐ ๊ฐ์ฅ ์ ํฉํ ์์น๋ ๋ฐ๋ก ์ถ๊ฐ์ ์ธ ์ฐ์ฐ
์ด๋ ๋ฐ์ดํฐ์ ๋ณ๋
์ด ํ์ํ ๋์ด๋ค. getter๋ setter๋ฅผ ํตํด์ ๊ฐ์ด ๋ฐ๋ก ๋ค์ด๊ฐ๋ ๊ฒ์ด ์๋๋ผ, ๊ทธ ์ค๊ฐ์ ๊ฐ์ ๋นผ์จ๋ค๋์ง, ๋ฐ์ดํฐ์ ๋ฐ๋ผ์ ๋ฐ๋ก ๊ฐ๊ณต์ด ํ์ํ ์ผ์ด์ค์ ๊ฒฝ์ฐ์๋ ์ด๋ฐ getter setter๋ฅผ ํตํด์ ์ค๊ฐ๋ค๋ฆฌ ์ญํ ์ ํด์ค ์ ์๋ค. ์ด๋ฐ๊ฒฝ์ฐ๋ ์์ฌ์น ์๊ณ getter setter๋ฅผ ํ์ฉํ๋ ๊ฒ์ด ๋์์ด ๋ ๊ฒ์ด๋ค. ํน์ ์
๋ ฅ๊ฐ์ ๋ฐ๋ผ์ Data๋ด๋ถ์ ์๋ Type์ผ๋ก ๋ณํํ๋ ๊ฒฝ์ฐ๋ ์์ ์ ์๋ค. Data๊ฐ ํ๊ณ ์๋ ๊ฐ์ String
์ผ๋ก ์
๋ ฅ๋ ์ด๋ฆ์ผ๋ก ๊ฐ์ ธ์ค๊ณ ์ถ๋ค๋์งํ๋ ๊ฒฝ์ฐ๋ getter setter๋ฅผ ํ์ฉํ ์ฌ์ง๊ฐ ์ถฉ๋ถํ ์กด์ฌํ๋ค.
์ง์ ์ ์ผ๋ก ์๋ฃํ ๊ทธ๋๋ก ๊ฐ์ ธ์ค๋ ค๊ณ ํ์ง ๋ง๊ณ , ๊ทธ ๋ฐ์ดํฐ๋ฅผ ํตํด ๋ฌด์์ ํ๊ณ ์ถ์์ง๋ฅผ ๋ถ๋ฆฌํด๋ด์
์ฌ์ค ์์ ๊ฐ์ ๋ถ๋ถ์์๋ getter๋ฅผ ์ฌ์ฉํ๊ธฐ ์ ๋งคํ ๋ถ๋ถ์ด ๋ถ๋ช ํ ์กด์ฌํ๋ค. ์ ๋ง ๋จ์ํ (ex: ์ ํ๋ฒํธ ํ์ฑ์ด๋ผ๋์ง) ํ๋ ๋ถ๋ถ์ด ์๋๋ผ๋ฉด, ์ด๋ค ์ผ์ ํ ์ง์ ๋ ์ค์ ์ ๋๊ณ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ๋ฐ๋์ง ํ๋ค.
DONT
1
2
3
4
5
6
class ์๋น์ค ๊ฐ์ฒด {
fun addThisToExampleListClass(example: Example) {
exampleListClassInstance.getNames.add(example.name)
exampleListClassInstance.getAges.add(example.age)
}
}
DO
1
2
3
4
5
6
7
8
9
10
11
12
class ์๋น์ค ๊ฐ์ฒด {
fun addThisToExampleListClass(example: Example) {
exampleListClassInstance.addExample(example)
}
}
class ExampleListClass {
fun addExample(example: Example) {
this.exampleList.put(example)
}
}
์์ ์์๊ฐ ์์ฑ๋ ๋์ง๋ ์์ง๋ง, ์์์ฒ๋ผ, ์๋น์ค ๊ฐ์ฒด์์ ์ง์ ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ๊ฐ์ ธ์ ๋ด๋ถ์ getter setter๋ฅผ ํตํด์ ๋ฒ๋ฌด๋ฆฌ๋ ๊ฒ์ด ์๋๋ผ, ๊ฐ์ฒด์ ์๋ publicํจ์๋ฅผ ํตํด ์ด๋ค ๋์์ ํ๋๋ก ๋ฉ์์ง
๋ฅผ ๋ณด๋ด๊ณ , ํด๋นํ๋ ๊ฐ์ฒด๋ ์์ฒญ์ ๋ง๋ ํ๋์ ํ๋๋ก ํ๋ ๊ฒ์ด ๋ ๋ฐ๋์งํ ์บก์ํ๊ฐ ๋๋ค.
๐ ์ฐธ๊ณ ์๋ฃ
https://erik-engheim.medium.com/to-hell-with-setters-and-getters-7814e7b2f949
https://dart-lang.github.io/linter/lints/unnecessary_getters_setters.html
https://stackoverflow.com/questions/61720221/why-should-i-avoid-wrapping-fields-in-getters-and-setters
https://stackoverflow.com/questions/1568091/why-use-getters-and-setters-accessors