ํด๋น ๊ธ์ Robert C.Martin ํด๋ฆฐ ์ฝ๋ ๋ผ๋ ์ฑ ์ ์ฝ๊ณ ํ์ตํ ๋ด์ฉ์ ์ ๋ฆฌ ๋ฐ ํ๊ณ ํ๋ ๊ธ ์ ๋๋ค. ์์ธํ ์ฌํญ์ YES 24 ํด๋ฆฐ ์ฝ๋ - ์ ์์ผ ์ํํธ์จ์ด ์ฅ์ธ ์ ์ ์์ ํ์ธํด์ฃผ์ธ์.
ํด๋ฆฐ ์ฝ๋ - ์ ์์ผ ์ํํธ์จ์ด ์ฅ์ธ ์ ์ (Uncle Bob)
- ์ํค๋ถ์ค
- ์ง์์ด: Robert C.Martin (Uncle Bob)
- ์ฎ๊ธด์ด: ๋ฐ์ฌํธ, ์ดํด์
์ด๋ฒ ์ฅ์์ ์ด์ผ๊ธฐํ๊ณ ์ ํ๋ ๊ฒ
- ์๋ฃ ์ถ์ํ
- private ์ผ๋ก ์ฐ๋ฆฌ๊ฐ ๋๋ ์ด์ ๋ ๋ฌด์์ผ๊น?
- private ์ผ๋ก ๋ณ์ ์ ๊ทผ์ ์ ํํ์ฌ ๋ฐ์ดํฐ (๋ณ์)์ ์์กดํ์ง ์๋๋ก ๊ฐ๋ฐํ ์ ์๋๋ก ํ๋ค.
- ๋ณ์๋ฅผ private ์ผ๋ก ๊ฐ์ถ์ด๋ ์กฐํ ํจ์์ ์ค์ ํจ์
getter/setter
๋ฅผ ์ ๊ณตํ๋ค๋๊ฒ ๋ง์ผ๋ก๋ ์ธ๋ถ๋ก ๋ ธ์ถํ๋ ๊ฒ๊ณผ ๊ฐ๋ค. - ๋น์ฐํ๊ฒ ๋ณ์์ ์ ๊ทผํ๋ ๋ฐฉ๋ฒ์ ์ค๋ก์ง ํจ์๋ผ๋ ๊ณ์ธต์ ๋ฃ๋๋ค๊ณ ํด์ ๊ฐ์ถฐ์ง๋ ๊ฒ์ด ์๋๋ค.
- ์ถ์ ์ธํฐํ์ด์ค๋ฅผ ํตํด์ ์ฌ์ฉ์๊ฐ ๊ตฌํ์ ๋ชจ๋ฅธ ์ฑ ํต์ฌ์ ์กฐ์ํ ์ ์์ด์ผ ํ๋ค.
- ์๋ฃ๋ฅผ ์ธ์ธํ๊ฒ ๊ณต๊ฐํ๋ ๊ฒ๋ณด๋ค ์ถ์์ ์ธ ๊ฐ๋ ์ผ๋ก ํํํ๋ ๊ฒ์ด ์ข๋ค
- ์ค์ํ ๊ฒ์ ํน์ ํ๋์ ์ถ๊ฐํ๋๋ผ๋ ๊ธฐ์กด์
- private ์ผ๋ก ์ฐ๋ฆฌ๊ฐ ๋๋ ์ด์ ๋ ๋ฌด์์ผ๊น?
interface Person {
String getInformation();
}
class Teacher implements Person {
private String name;
private int age;
public String getName() {} // getter => public ๊ณผ ๊ฐ๋ค
public int getAge() {}
@Override
public String getInformation() { // => ๊ตฌํ์ ๋ชจ๋ฅธ์ฑ ํต์ฌ์ ์กฐ์ํ ์ ์๊ฒ ํ๋ค.
return name + " " + age; // ๋ฐ์ดํฐ์ ์์กด์ ์ด์ง ์๊ฒ ๋๋ค
}
}
์ ์ฐจ์งํฅ๊ณผ ๊ฐ์ฒด์งํฅ
- ์ ์ฐจ์งํฅ
- ์ฐธ์กฐ ์ฐ์์ฌ๋ฅผ ํตํด์ ์ด๋ ํ ํจ์๋ ์ถ๊ฐ์ ์ผ๋ก ๊ตฌํํ๋๋ผ๋ ๋ฌด๋ฆฌ๊ฐ ์๋ค.
- ์ฆ, ๊ธฐ์กด์ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ์ง ์์ผ๋ฉฐ ์ ํจ์๋ฅผ ์ถ๊ฐํ๊ธฐ ์ฝ๋ค.
- ๋ํ ์๋ก์ด ํ์ ์ถ๊ฐํ๊ธฐ ์ด๋ ต๋ค
public class Square {
public int width;
public int height;
}
public class Circle {
public int radius;
public int circle;
}
public class Main {
Square s = new Square();
public int ares(String type) {
if (type.equals("Square")) {
return s.width * s.height;
} else if (type.equals("Circle")) {
return PI * radius * radius;
}
// ...
}
}
- ๊ฐ์ฒด์งํฅ
- Polymorphic ์ ํตํด ์๋ก์ด ํด๋์ค๋ฅผ ์ถ๊ฐํ๋๋ฐ ์ ์ฝ์ด ์๋ค.
- ํจ์๋ฅผ ์ถ๊ฐํ๊ณ ์ถ๋ค๋ฉด Shape ์ ๊ตฌํ์ฒด ๋ชจ๋์๊ฒ ํจ์๋ฅผ ์ถ๊ฐํด์ผํ๋ค
- ์ฆ, ๊ธฐ์กด์ ํจ์๋ฅผ ๋ณ๊ฒฝํ์ง ์์ผ๋ฉด์ ์ ํด๋์ค๋ฅผ ์ถ๊ฐํ๊ธฐ ์ฝ๋ค.
- ๋ํ ์๋ก์ด ํจ์๋ฅผ ์ถ๊ฐํ๊ธฐ ์ด๋ ต๋ค
public class Shape {
public int area();
}
public class Square implements Shape {
@Override
public int area() {
return // ..
}
}
public class Circle implements Shape {
@Override
public int area() {
return // ..
}
}
์์ ๋ด์ฉ์ผ๋ก ๋ฏธ๋ฃจ์ด ๋ณด์์ ๋, ๋ชจ๋ ์ฝ๋๊ฐ ๊ฐ์ฒด์งํฅ์ด๋ผ๊ณ ํด์ ์ข์ ๊ฒ์ ์๋๋ค.
์ ์ฐจ์งํฅ์ ์ฝ๋๊ฐ ํจ์จ์ ์ธ ๊ณณ์ด ์กด์ฌํ๋ค.
๋๋ฏธํฐ ๋ฒ์น
- ๋๋ฏธํฐ ๋ฒ์น
- ๊ฐ์ฒด์งํฅ์ ๊ธฐ๋ณธ์ผ๋ก ํ ์ค์ ํ ์ ์ฐ๊ธฐ๋ก ์ ๋ช ํ ๋ฒ์น
- ๊ฐ์ฒด๋ ์ค์ค๋ก๊ฐ ๋ณด์ ํ ์ ๋ณด๋ก๋ง ๊ฐ์ง๊ณ ์์ฌ ๊ฒฐ์ ์ ํด์ผํ๋ค.
- ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ํ์ํด ๋ฌด์ธ๊ฐ๋ฅผ ์์๋ด์๋ ์๋๋ค.
- ๊ธฐ์ฐจ ์ถฉ๋
- ๋๋ฏธํฐ ๋ฒ์น์ ์ด๊ธด ๋ํ์ ์ธ ์ฌ๋ก
- ์ฌ๋ฌ ๊ฐ์ฒด๋ค์ด ํ ์ค๋ก ์ด์ด์ง ํํ์ ๋ฐฉ์์ ๊ฐ๋ฐ์ ์ผ์ปซ๋๋ค.
- ํ์ง๋ง ๋จ์ ์๋ฃ ๊ตฌ์กฐ (DTO) ์ธ ๊ฒฝ์ฐ ๋๋ฏธํฐ ๋ฒ์น์ด ์ ์ฉ๋์ง ์๋๋ค.
- ๊ฐ์ฒด์ ๊ฒฝ์ฐ๋ผ๋ฉด ๋๋ฏธํฐ ๋ฒ์น์ด ์ ์ฉ๋๋ค.
// ๊ธฐ์ฐจ ์ถฉ๋ ์ฝ๋์ง๋ง ๋จ์ ์๋ฃ ๊ตฌ์กฐ์ด๊ธฐ ๋๋ฌธ์ ๋๋ฏธํฐ ๋ฒ์น์ด ์ ์ฉ๋์ง ์์
String title = envelopeNotification.getNotification().getSubject().getValue();
// ๊ธฐ์ฐจ ์ถฉ๋ ์ฝ๋์ด๋ฉฐ ๊ฐ์ฒด์ด๊ธฐ ๋๋ฌธ์ ๋๋ฏธํฐ ๋ฒ์น์ ๋ฒ์ด๋จ
String title = boardService.findPostingById(1004L).getBody().getTitle();
๋์ ํด์๊ณผ ํ๊ณ
์ด๋ค ํ๋ก์ ํธ๋ฅผ ์งํํ ๋, ์ธ๋ป ๋ณด๊ธฐ์ ์๋ฃ ๊ตฌ์กฐ์ฒ๋ผ ์๊ธด ๊ฐ์ฒด๊ฐ ์์๋ค.
ํด๋น ๊ฐ์ฒด๋ ์ฌ๋ฌ ๊ตฌํ์ฒด๋ค์ด ์กด์ฌํ๋ฉฐ ๊ตฌํ์ฒด๋ค๋ง๋ค ๊ฐ๊ฐ ํํํ๊ณ ์ ํ๋ ์ธ๋ถ ๋ด์ฉ์ด ์กฐ๊ธ ๋ฌ๋๋ค.
๊ทธ ๊ฐ์ฒด์์๋ ์ถ์ ์ธํฐํ์ด์ค๋ฅผ ํตํด์ Client ๋ ๊ตฌํ์ ์์ง ๋ชปํ ์ฑ, ํต์ฌ๋ง ์กฐ์ํ๋๋ก ํ๋ ์ฝ๋๊ฐ ์กด์ฌํ๋ค.
์ฌ์ค ๋๋ ์ฒ์ ์ฝ๋๋ฅผ ๋ณด์์ ๋, ์ง๊ด์ ์ผ๋ก ์ดํด๊ฐ ๊ฐ์ง ์์์๊ณ ํฌ๊ฒ ์๋ฟ์ง ์์๋ค.
ํ์ง๋ง ์ด์ ์์ผ ๊ทธ๊ฒ์ด ์ด๋ค ์๋ฏธ์ธ์ง, Client ๋ ๊ตฌํ์ ์์ง ๋ชปํ ์ฑ, ํต์ฌ๋ง ์กฐ์ํ๋๋ก ํ๋ ์ฝ๋๊ฐ ๋ฌด์์ธ์ง ์ดํดํ ์ ์๊ฒ ๋์๋ค.
๊ฐ๋จํ ๋ด์ฉ์ ์ค๋ช ํ์๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
interface ResultTarget {
String getId();
}
class KakaoResultTarget implements ResultTarget {
private String username;
private LocalDateTime createdAt;
@Override
public String getId() {
return username + createdAt.toString() + Math.random();
}
}
class NaverResultTarget implements ResultTarget {
private String nickname;
private Long userId;
@Override
public String getId() {
return nickname + "&" + userId + Math.random();
}
}
์ด๋ ๊ฒ ํด๋ผ์ด์ธํธ๋ ๊ตฌํ์ ์์ง ๋ชปํ ์ฑ, ํต์ฌ๋ง ์กฐ์ํ๋๋ก ํ๋ ์ฝ๋๊ฐ ๋๋ค.
์ฆ, ํด๋ผ์ด์ธํธ๋ Kakao ์ด๋ Naver ์ด๋ ์๊ด ์์ด Id ๋ผ๋ ํ๋๋ง์ ์ํ๋ ์ํฉ์ด๊ณ ์ด๋ฅผ ์ถ์ํ ํ ๊ฒ์ด ๋ฐ๋ก ๊ฐ์ฒด๊ฐ ๊ฐ์ ธ์ผ ํ ๊ธฐ๋ณธ์ ์ธ ์์์ด ์๋๊น ์ถ๋ค.
๋๊ธ