7. ๋๋ค์ ์คํธ๋ฆผ, ๋ฉ์๋
by JiwonDev# ๋๋ค๋ณด๋ค๋ ๋ฉ์๋ ์ฐธ์กฐ๋ฅผ ์ฌ์ฉํ๋ผ
(์์) | (๋ฉ์๋ ์ฐธ์กฐ ์ด์ฉ) | (๋๋ค์ ์ด์ฉ) |
์ ์ | Integer:parseInt | str -> Integer.parseInt(str) |
ํ์ ์ | Instant.now()::isAfter | Instant then = Instant.now(); t-> then.isAfter(t); |
๋นํ์ ์ | String::toLowerCase | str -> str.toLowerCase() |
ํด๋์ค | TreeMap<K,V>::new | () -> new TreeMap<K,V> |
๋ฐฐ์ด | int[]::new | len -> new int[len] |
# ์ง์ ๋ง๋ค์ง ๋ง๊ณ ํ์ค ํจ์ํ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ผ
2021.07.12 - [๐ฑBackend/Java] - #10 Modern Java (Java8~)
# ์คํธ๋ฆผ์ ์ฃผ์ํด์ ์ฌ์ฉํ๋ผ
์คํธ๋ฆผ์ ๋ง๋ฅ์ด ์๋๋ค. ๋ง์ด ์ฌ์ฉํ๋ฉด ๊ฐ๋ ์ฑ๊ณผ ์ ์ง๋ณด์๊ฐ ์ด๋ ค์์ง๋ค. ๋ํ ๋ณ๋ ฌ์ฒ๋ฆฌ ํ๋ค๊ณ ํด์ ๋ฌด์กฐ๊ฑด ์ฑ๋ฅ์ด ์ข์์ง๋ ๊ฒ๋ ์๋๋ค.
๋ฐ๋ก ์ค๋ ๋ํ์ ๋ง๋ค์ด ์ฌ์ฉํ์ง ์๋๋ค๋ฉด, ๋ณ๋ ฌ ์คํธ๋ฆผ ํ์ดํ๋ผ์ธ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์๋ฐ์ ํฌํฌ-์กฐ์ธํ์์ ์ํ๋๋ค.
๋ณ๋ ฌ์ฒ๋ฆฌ ๋๋ฌธ์ ์๊ธด ๋ง์ ์ค๋ ๋๋ค์ด ๋ค๋ฅธ ์๋น์ค ์์คํ ์ ์ฑ๋ฅ์ ์ ์ํฅ์ ์ค ์ ์์์ ์ ์ํ์.
์คํธ๋ฆผ์ผ๋ก ํ ์ ์๋ ์ผ | ์คํธ๋ฆผ์ผ๋ก ํ๊ธฐ ์ข์ ์ผ |
- ์ฝ๋ ๋ธ๋ก { ~ } ์์์ ์ง์ญ๋ณ์๋ฅผ ์์ ํ๋ ๊ฒฝ์ฐ. - break, continue, skip ๋ฑ์ ๋ถ๊ธฐ ์์ - ๋ด๋ถ ๋ก์ง์์ ์์ธ๊ฐ ๋ฐ์ํ๋ ๊ฒฝ์ฐ |
- ํํฐ๋ง - ํน์ ์กฐ๊ฑด์์ ์ํ๋ ์์ ์ฐพ๊ธฐ - ๋ชจ๋ ์์๋ฅผ ์ผ๊ด๋๊ฒ ๋ณํ |
์ฐธ๊ณ ๋ก ํ๋ฒ ์ฌ์ฉํ ์คํธ๋ฆผ์ ์ฌ์ฌ์ฉ์ด ๋ถ๊ฐ๋ฅํ๋ค. ๊ทธ๋์ ์๋ฃ๋ ๊ฐ์ด ์๋ ์คํธ๋ฆผ์ ๋ฐํํ๋๊ฑด ์ข์ ๋ฐฉ๋ฒ์ด ์๋๋ค.
๋ํ ๋ถ์์ฉ(Side-effect)๊ฐ ์๋ ํจ์๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค. ์ฌ์ฉ๋ฒ ์ง์ง ๋๋ฝ๊ฒ ๊ตฌ๋ฆฌ๋ค.
# ๋งค๊ฐ๋ณ์๊ฐ ์ ํจํ์ง ๊ฒ์ฌํ๋ผ.
์๋น์ค ๋ฉ์๋์์ ๋งค๋ฒ ์ธ์์ ์ ํจ์ฑ์ ๊ฒ์ฌํ์ง๋ง๋ผ. ์์ฑ์์์ ์ ํจํ์ง ๊ฒ์ฌํ๊ณ , ๋๋ฉ์ธ์ ๋ถ๋ณ ์์ฑ์ ์ง์ผ๋ผ.
if ๋ฌธ์ผ๋ก ๊ฒ์ฌํด๋ ๋์ง๋ง, Assert ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ assert ํค์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๋ ์๋ฏธ๋ฅผ ํ์ ํ๊ธฐ ์ข๋ค.
// ์๋ฐ ํ์ค์๋ Assert ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์๋ค.
// java.util.Objects.requireNonNull
public int append(String a, String b){
Obejcts.requireNonNull(a, "a ๊ฐ์ null์ผ ์ ์์ต๋๋ค.");
Obejcts.requireNonNull(b, "b ๊ฐ์ null์ผ ์ ์์ต๋๋ค.");
...
}
public int sum(int a, int b, String operator){
assert a > 0;
assert b > 0; // AssertionError๋ฅผ ๋ฐ์์ํค๋ ํค์๋.
assert operator != 0;
}
# ๋ฐฉ์ด์ ์ธ ๋ณต์ฌ๋ณธ์ ๋ง๋ค์ด๋ผ.
๋ถ๋ณ(final)์ด ์๋ ๊ฐ์ฒด๋ฅผ ๊ทธ๋๋ก ์ธ์๋ก ๋ฐ๊ฑฐ๋ ๋ฐํํ๋ ๊ฑด ์ํํ ํ์์ด๋ค.
ํด๋น ๊ฐ์ฒด์ ๋ ํผ๋ฐ์ค๋ฅผ ๋ชฐ๋ ๊ฐ์ง๊ณ ์๋ค๊ฐ, ์ธ๋ถ์์ ์ํ๋ ์์ ์ ๊ฐ์ฒด๋ฅผ ์กฐ์ํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. ์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด, ๊ฐ์ฒด๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํ์ง๋ง๊ณ ๋ณต์ฌ๋ณธ์ ๋ง๋ค์ด์ ์ฌ์ฉํ์.
public class Dog {
private Date createDate;
private Date endDate;
public Dog(Date createDate, Date endDate){
this.createDate = createDate;
this.endDate = new Date(endDate.getTime());//๋ฐฉ์ด์ ๋ณต์ฌ
}
public Date getCreateDate(){
return createDate; // ๊ทธ๋ฅ ๋ฐํํ๊ธฐ
}
public Date getEndDate(){
return new Date(endDate.getTime()); // ๋ฐฉ์ด์ ๋ณต์ฌ๋ก ๋ฐํํ๊ธฐ
}
}
public void main(){
Dog dog = new Dog(new Date(), new Date());
dog.getCreateDate().setYear(2002); // ๊ฐ์ฒด ๋ด๋ถ์ Date๋ ํจ๊ป ๋ณ๊ฒฝ๋๋ค.
dog.getEndDate().setYear(2002); // ๋ฐฉ์ด์ ๋ณต์ฌ๋ฅผ ํ๊ธฐ์ ๋ด๋ถ์ Date๋ ๋ณ๊ฒฝ๋์ง ์์.
}
๋ค๋ง ๋ฐฉ์ด์ ์ธ ๋ณต์ฌ๋ ๊ฐ์ฒด๋ฅผ ๋งค๋ฒ ์๋ก๋ง๋ค์ด์ ์ฑ๋ฅ์ ์์ข์ ์ํฅ์ ๋ผ์น๋ค.
๋ง์ฝ ๋ฐฉ์ด์ ์ธ ๋ณต์ฌ๋ฅผ ํ์ง์๋๋ค๋ฉด, ํด๋น ๊ตฌ์ฑ์์๋ฅผ ์์ ํ์ ๋ ์ฑ ์์ด ์ฌ์ฉ์(ํด๋ผ์ด์ธํธ)์ ์์์ ๋ฐ๋์ ๋ฌธ์๋ Docs์ ๋ช ์ํ์.
# ๋ฉ์๋ ์๊ทธ๋์ฒ๋ฅผ ์ ์คํ ์ค๊ณํ๋ผ.
1. ๋ฉ์๋์ ์ด๋ฆ์ ๋์ถฉ ์ง๊ฑฐ๋, ํธ์์ฉ ๋ฉ์๋๋ฅผ ๋ง ๋ง๋ค์ง ๋ง์.
์ด๋ ์ฌ์ฉํ๋ ์ฌ๋๊ณผ ์ ์ง๋ณด์ ํ๋ ์ฌ๋ ๋ชจ๋๋ฅผ ํ๋ค๊ฒ ๋ง๋ ๋ค. ๊ผญ ํ์ํ ๋ฉ์๋๊ฐ ์๋๋ผ๋ฉด ์ฌ์ฉํ์ง ๋ง์.
2. ๋งค๊ฐ๋ณ์๋ ์งง๊ฒ ์ ์งํ์.
๋งค๊ฐ๋ณ์๊ฐ ๋ง๋ค๋ฉด ๋น๋ํจํด, ๋จ์ผ์ฑ ์์์น์ ๊ณ ๋ คํด๋ณด์. ํ๋์ ๋ฉ์๋์์ ์ฌ๋ฌ๊ฐ์ง ์ผ์ ํ๊ณ ์์ง๋ ์์๊ฐ?
3. ๋งค๊ฐ๋ณ์์ ํ์ ์ผ๋ก๋ ๊ตฌํ์ฒด๋ณด๋ค๋ ์ธํฐํ์ด์ค๊ฐ ๋ซ๋ค.
4. ์์๊ฐ์ ๋ํ๋ด๋ boolean ๋ณด๋ค๋ ์์ 2๊ฐ์ง๋ฆฌ enum์ด ๋ซ๋ค.
# ๋งค๊ฐ๋ณ์์ ์๊ฐ ๊ฐ์ ๋๋ ์ค๋ฒ๋ก๋ฉ์ ํผํด๋ผ.
์ ๋ค๋ฆญ์ ์ฌ์ฉํ ๋๋ ๋ง์ฐฌ๊ฐ์ง. ํ์ํ๋ฉด ๋ค๋ฅธ ์ด๋ฆ์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์. (์์ฑ์๋ผ๋ฉด ์ ์ ํฉํ ๋ฆฌ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์)
public String name(Set<?> s){
return "Set";
}
public String name(List<?> s){
return "List";
}
public String name(Collection<?> s){
return "Collection";
}
public void main(){
// ์๋ ์ฝ๋๋ ์ด๋ค name ํจ์๋ฅผ ํธ์ถํ ๊น..? ์ถฉ๋ถํ ํท๊ฐ๋ฆด ์ ์๋ค.
String name = name(Collection collection = new ArrayList<>());
}
# ๊ฐ๋ณ์ธ์(int...)๋ ์ ์คํ๊ฒ ์ฌ์ฉํ๋ผ
์ธ์ ๊ฐ์๊ฐ ์ ํด์ง์ง ์์์ ๋, ์์ฃผ ์ ์ฉํ๊ฒ ์ฌ์ฉํ ์ ์๋๊ฒ ๊ฐ๋ณ์ธ์์ด๋ค.
ํ์ง๋ง ๊ฐ๋ณ์ธ์ ๋ฉ์๋๋ ํธ์ถ ๋ ๋ ๋ง๋ค ๋ฐฐ์ด์ ์๋ก ํ ๋นํ๊ณ , ์ด๊ธฐํํ๋ ๊ณผ์ ์ ๊ฑฐ์น๋ค. ์ฑ๋ฅ์ ์ข์ง์๋ค.
์ด ๊ฒฝ์ฐ ์ฑ๋ฅ์ ์ต์ ํํ๊ธฐ์ํด ์๋์ ๊ฐ์ด ์ฌ์ฉํ ์ ์๋ค.
public void foo(int a){}
public void foo(int a, int b){}
public void foo(int a, int b, int c){}
public void foo(int a, int b ,int c, int d){}
public void foo(){int... a} // 5๊ฐ ์ด์๋ง ๊ฐ๋ณ์ธ์๋ฅผ ์ฌ์ฉ.
# null ์ด ์๋ ๋น ์ปฌ๋ ์ ์ด๋ ๋ฐฐ์ด์ ๋ฐํํ๋ผ.
null์ ๊ณต๋ฐฑ, 0๊ฐ๋ฅผ ์๋ฏธํ์ง ์๋๋ค. ๋ํ null์ NullPointException์ ์ผ์ผํฌ ์ ์๋ค.
๋น ์ปฌ๋ ์ ์ ๋ฐํํ ๊ฐ์ด ์์์ ์๋ฏธํ๊ณ ์ ์์ ์ธ ๋์์ด ์งํ๋๋ค.
# Optiona ์ ๋ฐํ๊ฐ ์ด์ธ์ ์ฌ์ฉํ์ง๋ง๋ผ.
Optional์ ๋ํผ ํด๋์ค์ด๋ค. ๋ฌด์กฐ๊ฑด์ ์ธ ์ฌ์ฉ์ ์ฑ๋ฅ์ ์ ์ํฅ์ ๋ผ์นจ์ ์ ์ํ์.
์๋ฅผ ๋ค์ด ์ปฌ๋ ์ ์ ๊ฐ๋ค์ ์ ๋ถ Optional๋ก ๋ฃ๋๋ค๋ฉด? ๋งค์ฐ ๋์ฐํ ์ฑ๋ฅ์ ๋ง๋ณผ ์ ์๋ค. (์ ์คํธ๋ฆผ API๊ฐ ๊ธฐ๋ณธํ์ IntStream๋ฑ์ ๋ฐ๋ก ์ ๊ณตํ๋์ง ์๊ฐํด๋ณด์.) ์ฑ๋ฅ์ ๋ฏผ๊ฐํ๋ค๋ฉด ์ฐจ๋ผ๋ฆฌ ์์ธ๋ฅผ ๋์ง๋๊ฒ ๋์ ์ ์๋ค.
# ๊ณต๊ฐ๋ API ์์์๋ ํญ์ ๋ฌธ์ํ(Docs)๋ฅผ ์์ฑํ๋ผ. ์๋๋ฉด ๋น๊ณต๊ฐ๋ก ์ ํํด๋ผ.
javadocs์ ์ฌ์ฉ์ ์ํํํ์. public์ผ๋ก ๊ณต๊ฐ๋ ๋ฉ์๋๋ผ๋ฉด ๋ฐ๋์ ์ฒ์๋ด๋ ์ฌ์ฉํ ์ ์๊ฒ ์ฃผ์์ด ์์ด์ผํ๋ค.
/**
* ๋๊ฐ์ ์๋ฅผ ๋ํด์ ๋ฐํํ๋ค.
*
* @param a ์ ์๊ฐ //๋ง์นจํ๋ฅผ ๋ถ์ด์ง ์๋๋ค
* @param b ์ ์๊ฐ //๋ง์นจํ๋ฅผ ๋ถ์ด์ง ์๋๋ค
* @return a์ b๋ฅผ ๋ํ ๊ฐ //๋ง์นจํ๋ฅผ ๋ถ์ด์ง ์๋๋ค
*/
public int sum(int a, int b) {
return a + b;
}
'๐ฑBackend > Effective-Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
9. ์์ธ(Exception) ์ ๋์์ฑ(๋ฉํฐ์ค๋ ๋) (0) | 2021.10.06 |
---|---|
8. ์ผ๋ฐ์ ์ธ ํ๋ก๊ทธ๋๋ฐ ์์น (0) | 2021.10.06 |
6-1 Enum๊ณผ @์ ๋ํ ์ด์ ์ ์ฌ์ฉํ๋ผ. (0) | 2021.10.06 |
5-2 ์ ๋ค๋ฆญ, ๋ฐฐ์ด๋ณด๋ค๋ ๋ฆฌ์คํธ๋ฅผ ์ฌ์ฉํ๋ผ, (+์ํผํ์ ๊ตฌํ๋ฐฉ๋ฒ) (0) | 2021.09.15 |
5-1 ์ ๋ค๋ฆญ์ ๊ทธ๋ฅ Raw ๋ก ์ฌ์ฉํ์ง ๋ง๋ผ(+ ๋น๊ฒ์ฌ ๊ฒฝ๊ณ ์ ๊ฑฐ) (0) | 2021.09.15 |
๋ธ๋ก๊ทธ์ ์ ๋ณด
JiwonDev
JiwonDev