Weekly paper2 객체지향 & Stream API ex code
위클리 페이퍼 – 객체지향 & Stream API
1️⃣ 단일 책임 원칙(SRP)
개념
- 하나의 클래스는 하나의 책임만 가져야 한다
- 클래스가 바뀌는 이유는 하나여야 한다
왜 필요한가
- 기능이 섞이면 수정할 때 영향 범위가 커진다
- 코드 이해와 유지보수가 어려워진다
❌ SRP 위반 예시
class UserService {
void saveUser() {
// 사용자 저장
}
void sendEmail() {
// 이메일 전송
}
}
- 사용자 저장 + 이메일 전송
- 책임이 2개 → SRP 위반
✅ SRP 적용 예시
class UserService {
void saveUser() {
// 사용자 저장
}
}
class EmailService {
void sendEmail() {
// 이메일 전송
}
}
- 클래스마다 책임이 명확
- 수정 시 영향 범위 최소화
2️⃣ 개방-폐쇄 원칙(OCP)
개념
- 기능 확장에는 열려 있고(Open)
- 기존 코드 수정에는 닫혀 있어야 한다(Closed)
왜 필요한가
- 요구사항이 늘어날 때 if/else 지옥 방지
- 기존 코드 안정성 유지
❌ OCP 위반 예시
class DiscountService {
int discount(String grade) {
if (grade.equals("VIP")) return 20;
if (grade.equals("NORMAL")) return 10;
return 0;
}
}
- 등급 추가 시 if문 계속 수정 필요
✅ OCP 적용 예시
interface DiscountPolicy {
int discount();
}
class VipDiscount implements DiscountPolicy {
public int discount() {
return 20;
}
}
class NormalDiscount implements DiscountPolicy {
public int discount() {
return 10;
}
}
- 새로운 할인 정책 = 클래스 추가
- 기존 코드 수정 없음
3️⃣ Stream API – map
개념
- 하나의 값을 다른 값 하나로 변환
- 구조는 유지된다
예시
List<String> names = List.of("kim", "lee", "park");
List<String> result = names.stream()
.map(name -> name.toUpperCase())
.toList();
흐름 설명
- “kim” → “KIM”
- “lee” → “LEE”
- “park” → “PARK”
- 입력 1개 → 출력 1개
4️⃣ Stream API – flatMap
개념
- 여러 값을 평평하게 펼쳐서 하나의 스트림으로 만든다
- 중첩 구조 제거용
예시
List<List<String>> data = List.of(
List.of("A", "B"),
List.of("C", "D")
);
List<String> result = data.stream()
.flatMap(list -> list.stream())
.toList();
흐름 설명
- List.of(“A”,”B”) → “A”,”B”
- List.of(“C”,”D”) → “C”,”D”
- 결과: [“A”,”B”,”C”,”D”]
5️⃣ map vs flatMap 핵심 차이
- map
- 값 변환
- 구조 유지
- flatMap
- 구조 펼침 + 값 변환
- List 안에 List가 있을 때 사용
✍️ 최종 요약
- SRP: 클래스는 하나의 책임만 가진다
- OCP: 기존 코드는 건드리지 않고 확장한다
- map: 값 변환
- flatMap: 구조 평탄화