코드잇 부트캠프 진행하면서 기록하는위클리 페이퍼~,,~ 한달 정도 밀린 관계로 눈물흘리며 꾸준히 업로드해볼게요(to me from me)
🆀 객체지향 프로그래밍에서 '단일 책임 원칙(SRP)'과 '개방-폐쇄 원칙(OCP)'에 대해 설명하고, 각각의 원칙을 적용한 코드 예시를 들어주세요.
객체지향 설계 원칙 중 '단일책임 원칙'과 '개방-폐쇄 원칙'은 소프트웨어를 유지보수하기 쉽고, 확장 가능한 구조로 만드는 데 매우 중요한 역할을 한다.
단일 책임 원칙(SRP: Single Responsibility Principle)
-하나의 클래스는 하나의 책임만 가져야 한다.
SRP는 클래스 하나가 하나의 변경 이유만을 가져야 한다는 의미이다. (유지보수 용이성을 위해)
<❌SRP가 잘 지켜지지 않은 예시❌>
public class Report {
public String generateReport() {
return "Report Content";
}
public void saveToFile(String content) {
// 파일 저장 로직
}
public void printReport(String content) {
// 출력 로직
}
}
➡️ 이 클래스는 보고서의 생성, 파일 저장, 출력까지 투머치 책임을 갖고 있다.
<👍SRP가 잘 지켜진 예시👍>
// 책임 1: 보고서 생성
public class ReportGenerator {
public String generate() {
return "Report Content";
}
}
// 책임 2: 파일 저장
public class ReportSaver {
public void save(String content) {
// 파일 저장 로직
}
}
// 책임 3: 출력
public class ReportPrinter {
public void print(String content) {
// 출력 로직
}
}
➡️ 각 클래스가 하나의 역할만을 담당하므로, 변경 및 확장이 쉬워진다.
개방-폐쇄 원칙(OCP: Open/Closed Principle)
-확장에는 열려 있어야 하고, 변경에는 닫혀 있어야 한다.
OCP는 기존 코드를 변경하지 않고도 기능을 확장할 수 있어야 한다는 원칙이다. 즉, 기존의 코드를 건드리지 않고도 새로운 기능을 추가할 수 있는 구조가 이상적이라는 것이다.
<❌OCP가 잘 지켜지지 않은 예시❌>
public class PaymentProcessor {
public void pay(String method) {
if (method.equals("KAKAO")) {
// 카카오페이 로직
} else if (method.equals("NAVER")) {
// 네이버페이 로직
}
}
}
➡️ 새로운 결제 방식이 추가되면 if-else에 계속 코드를 추가해야 해서 OCP를 위반하게 된다.
<👍OCP가 잘 지켜진 예시👍>
// 결제 방식 인터페이스
public interface Payment {
void pay();
}
// 카카오페이
public class KakaoPay implements Payment {
public void pay() {
System.out.println("카카오페이 결제");
}
}
// 네이버페이
public class NaverPay implements Payment {
public void pay() {
System.out.println("네이버페이 결제");
}
}
// 결제 처리
public class PaymentProcessor {
public void process(Payment payment) {
payment.pay();
}
}
➡️ Payment 인터페이스를 구현하여 새로운 클래스만 추가하면 되고, PaymentProcessor는 변경하지 않아도 된다.
🆀 Stream API의 map과 flatMap의 차이점을 설명하고, 각각의 활용 사례를 예시 코드와 함께 설명해주세요.
Stream API는 컬렉션을 함수형 스타일로 다루기 위해 도입된 기능이다. map()과 flatMap()은 자주 사용되지남 헷갈리기 쉬운 메서드라고...
map()
-각 요소에 함수를 적용한 결과로 구성된 새로운 Stream을 반환한다.
즉, map()은 요소를 변환(매핑) 할 때 사용된다.
<예제: 문자열 리스트를 대문자로 반환하기>
List<String> words = List.of("apple", "banana", "cherry");
List<String> upperWords = words.stream()
.map(String::toUpperCase)
.collect(Collectors.toList());
System.out.println(upperWords); // [APPLE, BANANA, CHERRY]
flatMap()
-각 요소에 Stream을 반환하는 함수를 적용한 뒤, 그 중첩된 Stream을 평탄화(flatten)합니다.
즉, flatMap()은 Stream<Stream> ➡️ Stream(이게 핵심..!)의 형태로 바꿔주는 역할을 한다.
<예제: 문자열 리스트를 문자 단위로 분리>
List<String> words = List.of("apple", "banana");
List<String> characters = words.stream()
.flatMap(word -> Arrays.stream(word.split("")))
.collect(Collectors.toList());
System.out.println(characters); // [a, p, p, l, e, b, a, n, a, n, a]
📍map()을 사용할 경우 Stream<Stream<String>>형태가 되어 중첩된다. 그러나 flatMap()을 사용하면 중첩 없이 평탄한 스트림으로 만들어 줄 수 있다.
끗
'📖위클리 페이퍼' 카테고리의 다른 글
| [👾코드잇] 위클리 페이퍼(4) (5) | 2025.07.09 |
|---|---|
| [👾코드잇] 위클리 페이퍼 (3) (0) | 2025.07.07 |
| [👾코드잇] 위클리 페이퍼 (2) (0) | 2025.06.24 |