1. OCP, SRP
- SRP(단일 책임 원칙) : 하나의 클래스는 하나의 책임만 가져야 한다는 원칙
코드의 이해가 쉬워지고 유지보수가 용이해짐 - OCP(개방 폐쇄 원칙) : 확장 시 새로운 요구사항이 생겼을 때 기능을 추가할 수 있어야 하고, 기능 추가 떄문에 기존 클래스의 코드를 수정하지 않아야 한다
OCP, SRP 위반
// SRP, OCP 둘다 위반
class PaymentService {
public int pay(String type, int price) {
int discount = 0;
if (type.equals("RATE")) {
discount = price * 10 / 100;
} else if (type.equals("FIXED")) {
discount = 1000;
}
int result = price - discount;
System.out.println("결제 금액: " + result);
return result;
}
}
OCP, SRP 적용
// SRP, OCP 적용 코드
interface DiscountPolicy {
int discount(int price);
}
class RateDiscountPolicy implements DiscountPolicy {
@Override
public int discount(int price) {
return price * 10 / 100;
}
}
class FixedDiscountPolicy implements DiscountPolicy {
@Override
public int discount(int price) {
return 1000;
}
}
// 계산 책임
class PaymentCalculator {
public int calculate(int price, DiscountPolicy policy) {
return price - policy.discount(price);
}
}
// 출력 책임
class PaymentPrinter {
public void print(int price) {
System.out.println("결제 금액: " + price);
}
}
class PaymentService {
private final PaymentCalculator calculator = new PaymentCalculator();
private final PaymentPrinter printer = new PaymentPrinter();
public int pay(int price, DiscountPolicy policy) {
int result = calculator.calculate(price, policy);
printer.print(result);
return result;
}
}
// 사용
PaymentService service = new PaymentService();
service.pay(10000, new RateDiscountPolicy());
service.pay(10000, new FixedDiscountPolicy());
2. map vs flatMap
- map : 입력 요소가 하나의 출력 요소로 바뀌는 1:1 변환, 이 때문에 결과 스트림이 중첩구조가 될 수 있음
- flatMap : 요소를 여러개의 요소로 변환한 뒤 생기는 중첩 구조를 제거하고 스트림으로 변환. 1:N 변환 수행
map은 변환만 수행하고 구조 유지, flatMap은 변환 후 중첩 구조 제거함
map 예시
List<String> sentences = List.of(
"I love Java",
"Java stream is powerful"
);
List<List<String>> result = sentences.stream()
.map(s -> Arrays.asList(s.split(" ")))
.toList();
// 결과 List<List<String>>
[
["I", "love", "Java"],
["Java", "stream", "is", "powerful"]
]
flatMap
// 결과 List<String>
List<String> result = sentences.stream()
.flatMap(s -> Arrays.stream(s.split(" ")))
.toList();
["I", "love", "Java", "Java", "stream", "is", "powerful"]'Weekly Paper' 카테고리의 다른 글
| Weekly Paper #9 (0) | 2026.03.23 |
|---|---|
| Weekly Paper #7 (0) | 2026.02.27 |
| Weekly Paper #6 (0) | 2026.02.09 |
| Weekly Paper#5 (0) | 2026.02.02 |
| Weekly Paper#3 (0) | 2026.01.19 |