[πŸ“° μœ„ν΄λ¦¬νŽ˜μ΄νΌ] SRP vs OCP & map vs flatMap

han91Β·2026λ…„ 1μ›” 12일

[μœ„ν΄λ¦¬νŽ˜μ΄νΌ]

λͺ©λ‘ 보기
2/11

πŸ“Œ SRP vs OCP

🧐 SRP?

SRP(Single Responsibility Principle)
"단일 μ±…μž„ 원칙" μ΄λΌλŠ” 뜻으둜 ν΄λž˜μŠ€λŠ” ν•˜λ‚˜μ˜ μ±…μž„λ§Œ κ°€μ Έμ•Ό ν•œλ‹€λŠ” 의미

  • ν•˜λ‚˜μ˜ ν΄λž˜μŠ€κ°€ μ—¬λŸ¬ 역할을 ν•˜λ©΄ μ•ˆλ¨
  • "이 ν΄λž˜μŠ€κ°€ μ™œ λ°”λ€ŒλŠ”κ°€?"λ₯Ό λ¬Όμ—ˆμ„ λ•Œ 닡이 2개 이상이면 SRP μœ„λ°˜

❌ μœ„λ°˜ μ˜ˆμ‹œ μ½”λ“œ

class UserService {

    public void saveUser(User user) {
        // DB에 μ €μž₯
        System.out.println("Saving user to DB");
    }

    public void sendEmail(User user) {
        // 이메일 전솑
        System.out.println("Sending email to user");
    }
}

βœ… μ˜¬λ°”λ₯Έ μ˜ˆμ‹œ μ½”λ“œ

class UserRepository {
    public void save(User user) {
        System.out.println("Saving user to DB");
    }
}

class EmailService {
    public void send(User user) {
        System.out.println("Sending email to user");
    }
}

class UserService {
    private final UserRepository userRepository;
    private final EmailService emailService;

    public UserService(UserRepository userRepository, EmailService emailService) {
        this.userRepository = userRepository;
        this.emailService = emailService;
    }

    public void register(User user) {
        userRepository.save(user);
        emailService.send(user);
    }
}

🧐 OCP?

OCP(Open-Closed Principle)
"개방-폐쇄 원칙" μ΄λΌλŠ” 뜻으둜 ν™•μž₯μ—λŠ” μ—΄λ €μžˆκ³ , μˆ˜μ •μ—λŠ” λ‹«ν˜€μžˆμ–΄μ•Ό 함

포인트

  • κΈ°μ‘΄ μ½”λ“œλ₯Ό μˆ˜μ •ν•˜μ§€ μ•Šκ³  μƒˆ κΈ°λŠ₯을 μΆ”κ°€ν•  수 μžˆμ–΄μ•Ό 함
  • 주둜 좔상화(μΈν„°νŽ˜μ΄μŠ€, 상속)둜 해결함

βœ… μ½”λ“œ μ˜ˆμ‹œ

interface Payment {
    void pay(int amount);
}

class CardPayment implements Payment {
    public void pay(int amount) {
        System.out.println("Pay by card");
    }
}

class KakaoPayment implements Payment {
    public void pay(int amount) {
        System.out.println("Pay by KakaoPay");
    }
}

class PaymentService {
    private final Payment payment;

    public PaymentService(Payment payment) {
        this.payment = payment;
    }

    public void pay(int amount) {
        payment.pay(amount);
    }
}

πŸ’» SRP vc OCP 차이

SRP

  • μ±…μž„ 뢄리가 초점
  • λ³€κ²½ 이유λ₯Ό ν•˜λ‚˜λ‘œ λ§Œλ“€κΈ° μœ„ν•¨
  • μ£Όμš” μˆ˜λ‹¨: 클래슀 뢄리

OCP

  • ν™•μž₯ 방식이 초점
  • μˆ˜μ • 없이 ν™•μž₯ ν•˜κΈ° μœ„ν•¨
  • μ£Όμš” μˆ˜λ‹¨: μΈν„°νŽ˜μ΄μŠ€, 상속


πŸ“Œ map vs flatMap

🧐 map?

Stream<T> -> Stream<R>
μš”μ†Œλ₯Ό 1:1둜 λ°˜ν™˜ν•˜λŠ” 것, 각 μš”μ†Œλ₯Ό λ§€μΉ­ν•΄ λ‹€λ₯Έ κ°’μœΌλ‘œ λ³€ν™˜

  • 슀트림의 ꡬ쑰(개수)λŠ” μœ μ§€λ¨
  • 내뢀에 μ»¬λ ‰μ…˜μ΄ μžˆμ–΄λ„ 쀑첩 κ΅¬μ‘°λŠ” κ·ΈλŒ€λ‘œ

πŸ” μ˜ˆμ‹œ μ½”λ“œ

List<String> names = List.of("kim", "lee", "park");

names.stream()
     .map(String::toUpperCase)
     .forEach(System.out::println);

μ‹€ν–‰ κ²°κ³Ό

KIM
LEE
PARK

🧐 flatMap?

Stream<Stream<T>> -> Stream<T>
μš”μ†Œλ₯Ό ν’€μ–΄μ„œ ν•˜λ‚˜μ˜ 슀트림으둜 ν•©μΉ˜λŠ” 것

  • 쀑첩 ꡬ쑰λ₯Ό 평탄화(flatten)
  • μ»¬λ ‰μ…˜ μ•ˆμ˜ μ»¬λ ‰μ…˜μ„ ν•œ μ€„λ‘œ 펼침
  • κ²°κ³Ό 슀트림의 μš”μ†Œ κ°œμˆ˜λŠ” λ‹¬λΌμ§ˆ 수 있음

πŸ’» map vs flatMap

🧐 ꡬ쑰 차이

map

[ [a, b], [c, d] ]
   ↓ map
[ Stream(a,b), Stream(c,d) ]

flatMap

[ [a, b], [c, d] ]
   ↓ flatMap
[ a, b, c, d ]

map μ‚¬μš© κΈ°μ€€

  • μš”μ†Œ ν•˜λ‚˜ -> κ²°κ³Ό ν•˜λ‚˜
  • κ°’ λ³€ν™˜, ν•„λ“œ μΆ”μΆœ
  • ꡬ쑰 μœ μ§€

flatMap μ‚¬μš© κΈ°μ€€

μš”μ†Œ ν•˜λ‚˜ -> μ—¬λŸ¬ μš”μ†Œ

  • μ»¬λ ‰μ…˜ / λ°°μ—΄ / 슀트림 λ°˜ν™˜
  • 쀑첩 ꡬ쑰 제거
profile
μ²œλ°©μ§€μΆ•μ–΄λ¦¬λ‘₯μ ˆλΉ™κΈ€λΉ™κΈ€λŒμ•„κ°€λŠ”κ°œλ°œμž

0개의 λŒ“κΈ€