[Java] ๊ฐ์ฒด์งํฅ ์ํ์ฒด์กฐ ์์น 9๊ฐ์ง์ ๋ํด ์์๋ณด์
by rlaehddnd0422๊ฐ์ฒด์งํฅ ์ํ์ฒด์กฐ 9๊ฐ์ง ์์น
์ฑ ์ํธ์์ค ์ค์๋ฌ์ง์ ๋์ค๋ '๊ฐ์ฒด์งํฅ ์ํ์ฒด์กฐ ์์น'์ ๋ํด ์์๋ด ์๋ค.
๋๊ตฌ๋ ๊ฐ์ฒด์งํฅ ์ค๊ณ๋ฅผ ์ํ๊ณ ์๋ค๊ณ ์๊ฐํ ์ ์์ง๋ง, ๋ฌด์์์ ์ผ๋ก ๋ฒ๋ฆฌ๊ธฐ ํ๋ ์ต๊ด๋ค๋ก ์ธํด '์ข์ ์ค๊ณ'์ ๋ฐํ์ด ๋๋ ํต์ฌ ๊ฐ๋ ๋ค(์์ง๋, ๊ฒฐํฉ๋, ์ค๋ณต, ์บก์ํ, ํ ์คํธ ๊ฐ๋ฅ์ฑ, ๊ฐ๋ ์ฑ, ์ด์ )์ ๋์น๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค.
์ฑ ์ ์์ ๋ ์์น๋ค์ ํตํด ์ข์ ๊ฐ์ฒด์งํฅ ์ค๊ณ์ ์์น์ ์์๋ณด๊ฒ ์ต๋๋ค.
์ฑ ์๋ ์ด 9๊ฐ์ง์ ์์น์ด ์์ ๋์ด ์์ต๋๋ค.
<๊ท์น>
- ํ ๋ฉ์๋์๋ ์ค์ง ํ ๋จ๊ณ์ ๋ค์ฌ์ฐ๊ธฐ๋ง ํ๋ค.
- else ์์ฝ์ด๋ฅผ ์ฐ์ง ์๋๋ค.
- ๋ชจ๋ ์์ ๊ฐ๊ณผ ๋ฌธ์์ด์ ํฌ์ฅํ๋ค.
- ํ ์ค์ ์ ์ ํ๋๋ง ์ฐ๋๋ค.
- ์ค์ฌ์ฐ์ง ์๋๋ค(์ถ์ฝ ๊ธ์ง).
- ๋ชจ๋ ์ํฐํฐ๋ฅผ ์๊ฒ ์ ์งํ๋ค.
- 3๊ฐ ์ด์์ ์ธ์คํด์ค ๋ณ์๋ฅผ ๊ฐ์ง ํด๋์ค๋ฅผ ์ฐ์ง ์๋๋ค.
- ์ผ๊ธ ์ปฌ๋ ์ ์ ์ฌ์ฉํ๋ค.
- getter, setter, property๋ฅผ ์ฐ์ง ์๋๋ค.
1. ํ ๋ฉ์๋์๋ ์ค์ง ํ ๋จ๊ณ์ ๋ค์ฌ์ฐ๊ธฐ๋ง ํ๋ค.
๋ณผ๋ฅจ์ด ํฐ ๋ฉ์๋๋ ์์ง๋๊ฐ ๋จ์ด์ง๊ธฐ ๋ง๋ จ์ ๋๋ค. ๋ฐ๋ผ์ ํ๋์ ๋ฉ์๋๋ ํ๋์ ์ผ๋ง ๋ด๋นํ๋๋ก ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
๋ฉ์๋์ ํ ๊ฐ์ง ์ผ๋ง ๋ด๋นํ๋๋ก ์ค์ ํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ๋์ด ๋ ์์์ง์ ๋ฐ๋ผ ์ฌ์ฌ์ฉ์ ์์ค์ ์ฌ๋ผ๊ฐ๊ณ , ์ ์ง๋ณด์์ ์ฅ์ ๋ ๊ฐ์ ธ๊ฐ ์ ์์ต๋๋ค.
- 1๊ฐ์ ๋ฉ์๋ ์์์ if / for / while ๋ฑ์ 2 depth ์ด์ ์ฌ์ฉํ์ง ์๊ธฐ
์๋ชป๋ ์์ ์ฝ๋
public class Book {
private char[][] data = new char[10][10];
public Book(char[][] data) {
this.data = data;
}
private String readBook() {
StringBuffer buf = new StringBuffer();
for (int i = 0; i < 10; i++) { // 1
for (int j = 0; j < 10; j++) { // 2
buf.append(data[i][j]);
}
}
return buf.toString();
}
}
- readBook() ๋ฉ์๋๋ฅผ ๋ณด๋ฉด for๋ฌธ์์ ๋ค์ฌ์ฐ๊ธฐ๊ฐ 2 depth ๊น์ง ์ฌ๋ผ๊ฐ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
์์ ๋ ์์ ์ฝ๋
public class Book {
private char[][] data = new char[10][10];
public Book(char[][] data) {
this.data = data;
}
private String readBook() {
StringBuffer buf = new StringBuffer();
for (int i = 0; i < 10; i++) { // 1
readLine(buf, i);
}
return buf.toString();
}
private void readLine(StringBuffer buf, int i) {
for (int j = 0; j < 10; j++) { // 2
buf.append(data[i][j]);
}
}
}
- ์ด๋ ๊ฒ ๊ฐ๊ฐ์ ๋ฉ์๋์ ๋ค์ฌ์ฐ๊ธฐ๊ฐ 1 depth ๋ฅผ ๋์ด๊ฐ์ง ์๋๋ก ํจ์ผ๋ก์จ, ๋์ ๊ฐ๋ ์ฑ๊ณผ ์ฌ์ฌ์ฉ์ฑ์ ๊ฐ์ ธ๊ฐ ์ ์์ต๋๋ค.
- ๋ฟ๋ง ์๋๋ผ ์ด์ ๊ฐ์ด ๋ฆฌํํ ๋งํ๋ฉด ์ฝ๋์ ๋ฒ๊ทธ๋ฅผ ์ฐพ๊ธฐ๋ ๋์ฒด๋ก ์ฌ์์ง๋๋ค.
>>>>>>>>>> indent๋ 1 depth๋ฅผ ๋์ด๊ฐ์ง ์๋๋ก ํ์.
2. else ์์ฝ์ด๋ฅผ ์ฐ์ง ์๋๋ค.
if/else ๊ตฌ๋ฌธ์ ๋ชจ๋ ์ธ์ด๊ฐ ๊ฐ์ง๊ณ ์์ง๋ง, ์ฌ๋ฌ ๊ฒน์ผ๋ก ์ค์ฒฉ๋ ์กฐ๊ฑด๋ฌธ์ ์ ํ ๊ฒฝ์ฐ else๊ฐ ์๋ ์ฝ๋๋ ์๋๋ฅผ ํ์ ํ๊ธฐ ์ด๋ ต์ต๋๋ค.
์ด๋ฌํ ๊ฒฝ์ฐ์ ๋๋นํ์ฌ else๋ฌธ์ ์ฌ์ฉํ์ง ์๊ณ if ์กฐ๊ฑด์ ๋ง์กฑํ๋ฉด if ์คํ๋ฌธ์ผ๋ก ๋ฉ์๋๋ฅผ ์ข ๋ฃ๋๊ณ , ๋๋จธ์ง ์ฝ๋๋ ๊ธฐ๋ณธ ๋ก์ง์ ๋ฐ๋ผ๊ฐ๋ ๋ฐฉ๋ฒ์ ์ธ ์ ์์ต๋๋ค.
์๋ชป๋ ์์ ์ฝ๋
public void login(String username, String password) {
if (userRepository.isValid(username, password)) {
redirect("homePage");
} else {
redirect("errorPage");
}
}
public class Calculator {
private int calculate(int a, int b, String op) {
if (op.equals("*")) {
return a * b;
} else {
return a + b;
}
}
}
์์ ๊ฐ์ ์ฝ๋์ else๋ฌธ์ early return ๋ฌธ์ ํตํด ์๋์ ๊ฐ์ด ํด๊ฒฐํ ์ ์์ต๋๋ค.
์์ ํ ์์ ์ฝ๋
public void login(String username, String password) {
if (userRepository.isValid(username, password)) {
redirect("homePage");
}
redirect("errorPage");
}
public class Calculator {
private int calculate(int a, int b, String op) {
if (op.equals("*")) {
return a * b;
}
return a + b;
}
}
- ์ด๋ ๊ฒ ๋ฆฌํํ ๋งํ์ฌ ์์ฐ์ค๋ฝ๊ฒ ๊ฐ๋ ์ฑ์ด ์ฆ๊ฐํ๊ณ , ์ดํดํ๊ธฐ๋ ์ฌ์์ก์ต๋๋ค.
- ๋ฟ๋ง ์๋๋ผ ์ด๋ ๊ฒ else๋ฌธ์ ์ฌ์ฉํ์ง ์์ผ๋ฉด, optimistic(if๋ฌธ์ ํตํด ๊ธฐ๋ณธ ์๋๋ฆฌ์ค๋ฅผ ๋ฐ๋ฅด๊ฒ ํ๋ ์กฐ๊ฑด์ ์ค์ )ํ๊ณ , defensive(๊ธฐ๋ณธ ์๋๋ฆฌ์ค์ ์ถฉ์กฑํ์ง ์์ผ๋ฉด ์ค๋ฅ ์ํ๋ฅผ ๋ฐํํ๋๋ก)ํ๊ฒ ์ ๊ทผํ ์ ์์ต๋๋ค.
>>>>>>>>>>> else ํค์๋ ์ฌ์ฉ๊ธ์ง
3. ๋ชจ๋ ์์๊ฐ๊ณผ ๋ฌธ์์ด์ ํฌ์ฅํ๋ค.
๋ชจ๋ ์์๊ฐ(primitive)์ ๊ฐ์ฒด๋ก ํฌ์ฅ(wrapper)ํ๋ ๊ฒ์ด๋ค. ์์ํ ๋ฐ์ดํฐ๋ ๋ณ์๋ช ์ผ๋ก์๋ง ๊ทธ ์๋ฏธ๋ฅผ ์ถ๋ก ํ ์ ์๊ณ ์๋ฌด๋ฐ ์๋ฏธ๋ฅผ ๋ด๊ณ ์์ง ์์ต๋๋ค. ํ์ง๋ง ์์๊ฐ์ ํด๋์ค๋ก ๊ฐ์ผ๋ค๋ฉด ๊ทธ ๋ฐ์ดํฐ๊ฐ ๋ฌด์์ธ์ง, ๊ทธ๋ฆฌ๊ณ ์ ์ฌ์ฉํด์ผ ํ๋์ง๋ฅผ ๋ณด๋ค ๋ช ํํ๊ฒ ์ ๋ฌํ ์ ์๋ค.
์๋ฅผ ๋ค๋ฉด, int ๊ฐ ํ๋ ์์ฒด๋ ์๋ฌด ์๋ฏธ์๋ ์ค์นผ๋ผ ๊ฐ์ผ ๋ฟ์ด์ง๋ง ์ด ๋ณ์๋ฅผ ๊ฐ์ฒด๋ก ๋ํํ๋ฉด ์ป์ ์ ์๋ ์ด์ ์ด ๋ง์ต๋๋ค.
๊ธฐ์กด ์ฝ๋
private static int sum(int[] numArray) {
int result = 0;
for(int i = 0; i < numArray.length; i++) {
int num = numArray[i];
if(num < 0) {
throw new RuntimeException();
}
result += num;
}
return result;
}
์์ ๋ ์ฝ๋
public class Positive {
private int number;
public Positive(int number) {
if (number < 0) {
throw new RuntimeException();
}
this.number = number;
}
public Positive add(Positive other) {
return new Positive(this.number + other.number);
}
public int getNumber() {
return number;
}
}
private static Positive[] toPositives(int[] values) {
Positive[] numbers = new Positive[values.length];
for (int i = 0; i < values.length; i++) {
numbers[i] = new Positive(values[i]);
}
return numbers;
}
private static int sum(Positive[] numbers) {
Positive result = new Positive(0);
for (Positive number : numbers) {
result = result.add(number);
}
return result.getNumber();
}
- ์์ํ์ ์ธ int๋ฅผ Positive ๊ฐ์ฒด๋ก ๋ํํจ์ผ๋ก์จ, ๋๋ฉ์ธ์์ ๊ฐ์ ์ค์ค๋ก๋ฅผ ๊ฒ์ฆํ๋๋ก ํ ์ ์์ต๋๋ค. ์ด์ ๊ฐ์ ๋ํ์ ์์ ํด๋์ค์ ๊ณผ๋ํ ์ฑ ์์ ์ฃผ๋ ๊ฒ์ ๋ง๊ณ ์ถ๊ฐ์ ์ธ ์๊ตฌ์ฌํญ์ ๋์ํ๊ธฐ ํธ๋ฆฌํด๋๋ก ํฉ๋๋ค.
- ์ด๋ฌํ ํด๋์ค ๋ถ๋ฆฌ๋ ๊ฐ์ฒด ์งํฅ์ ์ธ ์ฝ๋๋ฅผ ์ ๋ํ๊ณ SOLID์ SRP, OCP๋ ๋ง์กฑํ ์ ์๊ฒ ๋์ต๋๋ค.
>>>>>>>>>>> ์์์ ์ธ ํ์ ์ฌ์ฉ์ ์ง์ํ๊ณ , ๋ํํ์ฌ ๊ฐ์ฒด๋ก ์ฌ์ฉํ๋ ๊ฒ์ ์งํฅํ์.
4. ํ ์ค์ ์ ํ๋๋ง ์ฐ๋๋ค.
์ ์ ์๋ฐ์์ ๋ฉ์๋๋ฅผ ํธ์ถํ ๋ ์ฌ์ฉํ๋ ํค์๋์ ๋๋ค. ์ ์ ์ด์ฉํด ๋ฉ์๋๋ฅผ ํธ์ถํ ๋, ๊ฐ์ฒด ๊ทธ๋ํ๋ฅผ ๋ฐ๋ผ ๋ฉ๋ฆฌ ๋จ์ด์ง ๊ฐ์ฒด์๊ฒ ๋ฉ์์ง๋ฅผ ๋ณด๋ด๋ ์ค๊ณ๋ฅผ ์ง์ํ๋ผ๋ ์์น์ ๋๋ค.
์ด์ ๊ฐ์ ์ค๊ณ๋ ๊ฑฐ์ ๋ชจ๋ ๊ฐ์ฒด๊ฐ ๊ฒฐํฉ๋๊ฐ ์๊ธฐ๊ฒ ๋๊ณ ์บก์ํ๊ฐ ๊นจ์ง๊ฒ ๋ฉ๋๋ค.
๊ธฐ์กด ์ฝ๋
if(user.getMoney().getValue() > 100_000L) {
throw new IllegalArgumentException("์์ง๊ธ์ 100_000์์ ์ด๊ณผํ ์ ์์ต๋๋ค.");
}
์ด ์ฝ๋์์๋ User, Money ๋ ๊ฐ์ฒด์ ์์กดํ๊ฒ ๋ฉ๋๋ค.
์์ ๋ ์ฝ๋
if(user.hasMoney(100_000L)) {
throw new IllegalArgumentException("์์ง๊ธ์ 100_000์์ ์ด๊ณผํ ์ ์์ต๋๋ค.");
}
- ์ด์ ๊ฐ์ด ๋ฆฌํํ ๋งํ๋ฉด User ๊ฐ์ฒด์๊ฒ๋ง ์์กดํ๊ฒ ํ์ฌ, ์ด ์ฝ๋์์ getMoney๋ฅผ ์ง์ ์ํํ๋ ๊ฒ์ด ์๋ ๋จ์ง User์๊ฒ ๋ฌผ์ด๋ณด๊ฒ ํ ์ ์์ต๋๋ค.
๊ธฐ์กด ์ฝ๋
private boolean isEqualToPostWriter(Member receiver, Post post) {
return post.getMember().getNickname().equals(receiver.getNickname());
}
- ํด๋น ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ ์๋น์ค ํด๋์ค์์๋ post ๋ฟ๋ง ์๋๋ผ, member์๋ ์์กดํ๊ฒ ๋ฉ๋๋ค.
์์ ํ ์ฝ๋
public boolean isOwnerEqualToNickname(String nickname) {
return this.getMember().getNickname().equals(nickname);
}
Post Entity์ ์์ ๊ฐ์ด ๋ฉ์๋๋ฅผ ์์ฑํ์ฌ ์ฑ ์์ ๋ถ๋ฆฌํ ์ ์์ต๋๋ค.
private boolean isEqualToPostWriter(Member receiver, Post post) {
return post.isOwnerEqualToNickname(receiver.getNickname());
}
์ฑ ์์ ๋ถ๋ฆฌํ์ฌ ์๋น์ค ํด๋์ค์์๋ post์๋ง ์์กดํ๊ฒ ํ์ฌ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ ์ ์์ต๋๋ค.
>>>>>>>>>>> ๊ฐ์ฒด๋ฅผ ํตํด ๋๋ฌด ๋จผ ๊ฐ์ฒด๋ฅผ ๋ถ๋ฌ์์ ์ฌ์ฉํ๋ ๊ฒ์ ์ง์ํ๋ ์ต๊ด์ ๊ฐ์ง์.
5. ์ค์ฌ์ฐ์ง ์๋๋ค. (์ถ์ฝ ๊ธ์ง)
๋ง์ฝ ํด๋์ค๋ ๋ฉ์๋์ ๋ถ์ผ ์ ๋นํ ์ด๋ฆ์ ์ฐพ์ง ๋ชปํ๋ค๋ฉด ๋ญ๊ฐ ์๋ชป๋์์ ๊ฐ๋ฅ์ฑ์ด ๋๋ค.
์ฆ ํด๋์ค๋ ๋ฉ์๋์ ๋ช ํํ ์ด๋ฆ์ ๋ถ์ผ ์ ์์ผ๋ ค๋ฉด ๊ทธ ์ญํ ๊ณผ ์ฑ ์์ด ๋จ์ํด์ผ ํ๋ค.
ํด๋์ค, ๋ฉ์๋, ๋ณ์ ๋ช ๋ช ์ ์ถ์ฝ์ ํ์ง ๋ง์๋ ๊ท์น์ ๋๋ค.
๊ฐ์ฒด์งํฅ ์ธ๊ณ์์๋ ํด๋์ค๋ช ์ด๋ ํ๋๋ช , ๋ฉ์๋๋ช ์ ์ถ์ฝํ ํ์๊ฐ ์์ต๋๋ค.
์ถ์ฝํ๋ ค๋ ์ด์ ๋ ๋ฉ์๋์ ์ด๋ฆ์ด ๊ธธ์ด์ง๊ธฐ ๋๋ฌธ์ด๋ผ๊ณ ํ ์ ์๋๋ฐ, ์๋ง ๊ทธ๋ ๋ค๋ฉด ๊ทธ ๋ฉ์๋๋ ๋ง์ ์ฑ ์์ ์๊ณ ์์ ํ๋ฅ ์ด ๋์ต๋๋ค.
์ฑ ์์ ๋ถ๋ฆฌํ๋ ์ต๊ด์ ๊ฐ์ง์๋ค.
๊ธฐ์กด ์ฝ๋
public void example() {
Customer customer = new Customer();
customer.modifyNameAndAge("๋ณ๊ฒฝํ์ด๋ฆ", 20);
}
์์ ๋ ์ฝ๋
public void example() {
Customer customer = new Customer();
customer.modifyName("๋ณ๊ฒฝํ์ด๋ฆ");
customer.modifyAge(20);
}
>>>>>>>>>>> ์ฑ ์์ ๋ถ๋ฆฌํ๋ค๋ฉด, ์ด๋ฆ์ ๊ตณ์ด ์ถ์ฝํ๋ ค๊ณ ํ์ง ์์๋ ์ด๋ฆ์ด ๊น๋ํด์ง๋ค. ์ฑ ์์ ๋ถ๋ฆฌํ๋ ์ต๊ด์ ๊ฐ์ง์.
6. ๋ชจ๋ Entity๋ ์๊ฒ ์ ์งํ๋ค.
์ํฐํฐ๋ฅผ ์์ฑํ ๋ ํ๋์ ๋ชฉ์ ์ ์ผ๋ํ๊ณ ์ค๊ณํ๋ผ๋ ์๋ฏธ์ ๋๋ค. SOLID ์์น์ค ๋จ์ผ ์ค๊ณ ์์น์ธ SRP์ ์ฐ๊ณ๋๋ ๊ท์น์ ๋๋ค.
ํด๋์ค์ ํฌ๊ธฐ๋ฅผ ์ค์ฌ ๋ถ๋ฆฌํ๊ธฐ ์์ํ๋ฉด, ์์ ์ญํ ์ ํ๊ฒ ๋ ๊ฒ์ ๋๋ค.
ํ๋์ Class๋ 50์ค์ ๋๊ธฐ์ง ์๊ธฐ๋ฅผ ๊ถ์ฅํฉ๋๋ค. ๊ตฌํ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๊ฒ ์ง๋ง, ํ๋์ ํด๋์ค๊ฐ 100 line์ ๋์ด๊ฐ๋ค๋ฉด ๋ถ๋ช ๋ถ๋ฆฌํด๋ผ ์ ์์ ๊ฒ์ ๋๋ค. ๋ํ ํ๋์ ํจํค์ง์๋ 10๊ฐ ์ด์์ ํ์ผ์ด ๋ด๊ธฐ์ง ์๊ธฐ๋ฅผ ๊ถ์ฅํฉ๋๋ค. ํด๋์ค ๋ฟ๋ง ์๋๋ผ ํจํค์ง๋ ํด๋์ค์ฒ๋ผ ์์ง๋ ฅ ์๊ณ ๋จ์ผํ ๋ชฉํ๊ฐ ์์ด์ผ ํฉ๋๋ค. ํจํค์ง๋ฅผ ์๊ฒ ์ ์งํจ์ผ๋ก ํจํค์ง ์์ฒด๋ก ์ ์ฒด์ฑ์ ์ง๋ ์ ์๊ฒ ๋ฉ๋๋ค.
>>>>>>>>>>> ํ๋์ ํด๋์ค๋ 50 line ์ด์, ํ๋์ ํจํค์ง๋ 10๊ฐ ์ด์์ ํ์ผ์ด ๋ฌถ์ด์ง ์๋๋ก ํ์. ํด๋์ค ๋ถ๋ฆฌ๋ฅผ ๋๋ ค์ํ์ง ๋ง์.
7. 3๊ฐ ์ด์์ ์ธ์คํด์ค ๋ณ์๋ฅผ ๊ฐ์ง ํด๋์ค๋ฅผ ์ฐ์ง ์๋๋ค.
ํด๋์ค์ ์ธ์คํด์ค ๋ณ์๋ฅผ ์ ํํ๋ผ๋ ์๋ฏธ์ ๋๋ค. ์ฌ๊ธฐ์ ์ธ์คํด์ค ๋ณ์๋ ์์(primitive)ํ์ ์ด๋ ์ปฌ๋ ์ ๊ณผ ๊ฐ์ด ๊ธฐ๋ณธ ๋๋ ์๋ฃ๊ตฌ์กฐํ์ ๋ณ์๋ฅผ ์๋ฏธํฉ๋๋ค.
๋๋ฉ์ธ ์์๋ค์ ์ด๋ป๊ฒ ๋ฌถ๊ณ ๊ตฌ์ฑํ ๊ฒ์ธ์ง ๊ทธ ์ค๊ณ์ ๋ํด ์ถฉ๋ถํ ๊ณ ๋ฏผํ์ฌ ํด๋์ค๋ฅผ ๊ตฌ์ฑํ๊ณ , ๋ฆฌํฉํ ๋ง ํ๋ผ๋ ๊ท์น์ ๋๋ค.
์ด ์ง์นจ์ 3๋ฒ ๊ท์น๊ณผ๋ ํตํ๋ ๊ท์น์ผ๋ก, ์์๊ฐ์ ๊ฐ์ฒด๋ก ํฌ์ฅํ์ฌ ๋๋ฉ์ธ์ ์๋ฏธ๋ฅผ ๋ถ์ฌํ๋ผ๋ ๊ฐ์ด๋๋ผ๊ณ ํ ์ ์์ต๋๋ค.
๊ธฐ์กด ์ฝ๋
class Name {
String firstName;
String lastName;
// ... ์ฑ๊ณผ ์ด๋ฆ์ ๋ํ ๊ธฐ๋ฅ
}
์์ ๋ ์ฝ๋
public class Name {
FirstName firstName;
LastName lastName;
}
class FirstName {
String name;
// ... ์ด๋ฆ์ ๋ํ ๊ธฐ๋ฅ
}
class LastName {
String name;
// ... ์ฑ์ ๋ํ ๊ธฐ๋ฅ
}
์ด ํจ๊ณผ๋ก 6๋ฒ ๊ท์น์ ์งํค๋ ๊ฒ๊ณผ ๊ฐ์ ํจ๊ณผ๋ ์ป์ ์ ์์ต๋๋ค.
>>>>>>>>>>> ํด๋์ค๋ ๋ถ๋ฅํ ์ ์์ผ๋ฉด ์ต๋ํ ๋ถ๋ฅํ์.
8. ์ผ๊ธ ์ปฌ๋ ์ ์ ์ฌ์ฉํ์.
์ปฌ๋ ์ ์ Wrappingํ๋ฉด์ Collection ์ธ ๋ค๋ฅธ ํ๋๋ฅผ ๊ฐ์ง๊ณ ์์ง ์์ ํด๋์ค๋ฅผ ์ผ๊ธ์ปฌ๋ ์ ์ด๋ผ๊ณ ํฉ๋๋ค.
public class Store {
private Set<Brand> brands; // ์ปฌ๋ ์
public Store(List<Brand> brands) {
validSize(brands);
this.brands = brands;
}
private void validSize(List<Brand> brands) {
if(brands.size() >= 10) {
throw new IllegalArgumentException("๋ธ๋๋๋ 10๊ฐ ์ด๊ณผ๋ก ์
์ ํ ์ ์์ต๋๋ค.");
}
}
}
Store์ ๊ฐ์ด ์ผ๊ธ ์ปฌ๋ ์ ์ ์ฌ์ฉํ๋ฉด, ์ปฌ๋ ์ ์ ์ฌ์ฉํ๋ ํด๋์ค Brand์์ ๊ฒ์ฆํ์ง ์๊ณ ์์ ๊ฐ์ด ์ผ๊ธ ์ปฌ๋ ์ Store์์ ์์จ์ ์ผ๋ก ๊ฒ์ฆํ ์ ์์ต๋๋ค.
๋ฟ๋ง ์๋๋ผ ์ผ๊ธ ์ปฌ๋ ์ ์ ์ฌ์ฉํ๋ฉด
Set<Brand> brands; -> Store store; ๋ก ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ฐ, ํด๋์ค ํ์ ์ ๋ช ์ํด์ค์ผ๋ก์จ, ๋น์ฆ๋์ค์ ์๋ฏธ๋ฅผ ํํํ ์ ์์ ๋ฟ๋๋ฌ, ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ ์ฝ๋์ Set์ด ์๋ Store๋ก ๋ช ์ํจ์ผ๋ก ์๊ทธ๋์ฒ๋ก ์ ์ฝ์ ์ค ์ ์์ต๋๋ค. ์ฆ, ๋์ฑ ๋ช ํํ ๋น์ฆ๋์ค์ ํํ์ ํ ์ ์์ต๋๋ค.
>>>>>>>>>> ์ผ๊ธ์ปฌ๋ ์ ์ '๋ณต์ํ ํด๋์ค' ๋ฅผ ํํํ๊ธฐ ์ํ ์ข์ ๋ฐฉ๋ฒ์ ์ ์ํฉ๋๋ค. ๋จ์ผ ์ธ์คํด์ค๊ฐ ์งํฉ์ ์ด๋ฃจ๋ฉด์ ๊ฐ์ง ์ ์๋ ๋น์ฆ๋์ค์ ์๋ฏธ์ ๋ํด ๊ณ ๋ฏผํด๋ณด๋ฉด ๋์ฑ ๋ค์ฑ๋ก์ด ์ค๊ณ๋ฅผ ํ ์ ์์ ๊ฒ์ ๋๋ค.
9. setter, getter, property๋ฅผ ์ฐ์ง ์๋๋ค.
Entity์ getter/setter/property ์ฌ์ฉ์ ์ง์ํด ๊ฐ์ฒด ์ํ ๋ ธ์ถ์ ์ต์ํ ํ๋ผ๋ ๊ท์น์ ๋๋ค.
์ฆ, ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ํต์ฌ ๊ฐ๋ ์ค ์บก์ํ๋ฅผ ์งํค๋ฉด์ ๊ฐ์ฒด์ ๋ฉ์์ง๋ฅผ ๋ณด๋ด ์ค์ค๋ก ์ํ์ ๋ํ ์ฒ๋ฆฌ๋ก์ง์ ์ํํ๋๋ก ํ๋ผ๋ ์๋ฏธ๋ก ๊ฐ์ฒด์ ์ํ๋ฅผ ๊ฐ์ ธ์ค๋ ์ ๊ทผ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ด์ฐฎ์ง๋ง, ๊ทธ ์ํ๋ฅผ ๊ฐ์ฒด ๋ฐ๊นฅ์์ ๋ณ๊ฒฝํ๋ฉด ์๋๋ค๋ ๊ฒ์ ๋๋ค. ํ ๊ฐ์ฒด์ ์ํ์ ๋ํ ๊ฒฐ์ ์ ๋ฐ๋์ ๊ฐ์ฒด ์์์ ์ด๋ฃจ์ด์ ธ์ผ ํฉ๋๋ค.
์ฃผ์ : ์ด ์ง์นจ์ ๋ฐ์ดํฐ ์ ๋ฌ์ ๋ชฉ์ ์ผ๋ก ํ๋ DTO๋ ํ๋ก์ธ์ค ์ฒ๋ฆฌ๋ฅผ ๋ชฉ์ ์ผ๋ก ํ๋ ์ปจํธ๋กค๋ฌ, ์๋น์ค ๋น ํด๋์ค๋ฅผ ๋์์ผ๋ก ํ์ง ์๋๋ค.
๊ธฐ์กด ์ฝ๋
public class VipMemberService {
private static final BigDecimal VIP_DEPOSIT_AMOUNT = new BigDecimal("1000000000");
public void saveBenefit(Member member) {
if (VIP_DEPOSIT_AMOUNT.compareTo(member.getTotalDepositAmount()) > 0) {
throw new IllegalStateException("VIP ๊ณ ๊ฐ์ด ์๋๋๋ค.");
}
// ...
}
}
- ์ ์ฝ๋์ ๋ฌธ์
- Member ํด๋์ค๊ฐ ๊ฐ์ง ์ ๋ณด๋ฅผ ์ง์ ๊บผ๋ด ํ๋จ์ ์ํ ๊ทผ๊ฑฐ๋ก ์ฌ์ฉ๋จ.
- ์ฝ๋๋ฅผ ์ด๋ ๊ฒ ๊ตฌํํ ๊ฒฝ์ฐ, VIP ํ๋ณ ๊ธฐ์ค์ด DepositAmount์ด ์๋ ๋ค๋ฅธ ํ๋กํผํฐ๋ก ๋ณ๊ฒฝ๋๋ฉด ์๋น์ค ๊ณ์ธต์์ member.getTotalDepositAmount() ๋ถ๋ถ์ ์ ๋ถ ๋ค ๋ณ๊ฒฝ์ฃผ์ด์ผ ํ๋ค๋ ๊ฒ์ ๋๋ค.
- ๋ฟ๋ง ์๋๋ผ Member ํด๋์ค์ ์ ๋ณด๋ฅผ ๊บผ๋ด ๋น๊ตํ๋ ๊ฒ ์ธ์ ์ด๋ค ๋น์ฆ๋์ค์ ์๋ฏธ๋ฅผ ํํํ์ง ๋ชปํ๋ค๋ ๊ฒ์ ๋๋ค. (๊ฐ๋ ์ฑ์ด ๋ฎ์์ง๋ค.)
์์ ํ ์ฝ๋
public class VipMemberService {
public void saveBenefit(Member member) {
if (!member.isVip()) {
throw new IllegalStateException("VIP ๊ณ ๊ฐ์ด ์๋๋๋ค.");
}
// ...
}
}
- getter๋ฅผ ์ ๊ฑฐํ ์ฝ๋.
- ์กฐ๊ฑด๋ฌธ์ ๋ฌธ์ฅ์ ๊ตณ์ด ํด์ํ ํ์๊ฐ ์์ด์ก๊ณ , ์ฝ๋๊ฐ ์ง๊ด์ ์ผ๋ก ๋ณ๊ฒฝ๋จ.
๊ฐ์ฒด์ ์ ๋ณด๋ ์ด๋ ๊ฒ ๊ฐ์ฒด์์ ์ง์ ์ฒ๋ฆฌํ๋๋ก ๊ตฌํํ์ฌ์ผ ํฉ๋๋ค. ํนํ ์กฐ๊ฑด๋ฌธ์ ํ์ฉ์์ ์ด์ ๊ฐ์ ์ค์๊ฐ ๋ง์๋ฐ, ์กฐ๊ฑด๋ฌธ์ ์ฌ์ฉํ๋ ค๋ ๋ณธ๋์ ๋ชฉ์ ์ ์ง์คํ๋ค๋ฉด, ์์ฐ์ค๋ฝ๊ฒ ์กฐ๊ฑด๋ฌธ์ ํ๋ณ ๊ธฐ์ค์ด ํด๋์ค์ ๋ด๋ถ๋ก ์ด๋ํ ๊ฒ์ ๋๋ค.
>>>>>>>>>>> getter, setter๋ฅผ ์ง์ํ๊ณ ๊ฐ์ฒด์ ์ํ๋ ๊ฐ์ฒด ๋ด๋ถ์์ ์ฒ๋ฆฌํ๋๋ก ์งํฅํ์.
<์ฐธ๊ณ ์๋ฃ>
'๐ Backend > Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๊ฐ์ฒด์งํฅ์ ์ฌ์ค๊ณผ ์คํด - 2-1. ์ํ์ ํ๋, ์๋ณ์์ ๊ดํ์ฌ (0) | 2023.11.29 |
---|---|
๊ฐ์ฒด์งํฅ์ ์ฌ์ค๊ณผ ์คํด - 1. ์ญํ ๊ณผ ์ฑ ์, ํ๋ ฅ์ ๊ดํ์ฌ (1) | 2023.11.29 |
[Java] Collection Framework - Queue Interface (0) | 2023.10.05 |
[Java] Collection Framework - List Interface (1) | 2023.10.04 |
[Java] ์ปฌ๋ ์ ํ๋ ์์ํฌ์ Collection Interface์ ๋ํด (0) | 2023.10.04 |
๋ธ๋ก๊ทธ์ ์ ๋ณด
Study Repository
rlaehddnd0422