
"하나의 모듈은 하나의, 오직 하나의 액터에 대해서만 책임져야 한다."
- 이는 SOLID 원칙을 창시한 로버트C마틴이 한 말이다.
- 이때 액터(Actor)는 한 명일수도 있고, 여러 명이 될 수도 있다.
예를 들어, 음악 스트리밍 사이트에서는 음악을 재생하는 로직과 음악을 다운로드하는 로직 등이 서로 다른 책임이므로 분리하는 것이 SRP를 적용하는 것이다.
장점
단점
💡 예시 코드
// 음악 재생 책임
public class SongPlayer {
public void play(String title) {
System.out.println(title + "을 재생합니다.");
}
}
// 음악 저장 책임
public class SongStorage {
public void saveToFile(String title) {
System.out.println(title + "을 파일에 저장합니다.");
}
}
public interface PlayList {
public void playSong(String title);
}
public class kpopSong implements PlayList {
public void playSong(String title) {
System.out.println("(KPOP) "+title+"을 플레이합니다.");
}
}
public class jpopSong implements PlayList {
public void playSong(String title) {
System.out.println("(JPOP) "+title+"을 플레이합니다.");
}
}
// 추후 기능 확장
public class popSong implements PlayList {
public void playSong(String title) {
System.out.println("(POP) "+title+"을 플레이합니다.");
}
}
map
map() 메서드는 스트림의 각 요소를 1:1로 변환(매핑)하는 중간연산이다.💡 예시 코드
List<List<Integer>> nestedList = Arrays.asList(
Arrays.asList(1,2),
Arrays.asList(3,4)
);
// map()
nestedList.stream()
.map(List::stream)
.forEach(e -> e.forEach(i -> System.out.print(i + " "))); // 두 번째 forEach로 내부 스트림을 순회
// 1 2 3 4
flatMap
flatMap() 메서드는 중첩된 리스트를 펼쳐서 하나의 평면적인 스트림으로 펼쳐주는 중간 연산이다.(평면화) (1:N 매핑)
List<List<Integer>> nestedList = Arrays.asList(
Arrays.asList(1,2),
Arrays.asList(3,4)
);
// flatMap()
nestedList.stream()
.flatMap(List::stream)
.forEach(e -> System.out.print(e + " "));
//1 2 3 4
flatMap은 결과를 스트림으로 반환하기 때문에 flatMap의 결과를 가지고 바로 forEach 메서드를 체이닝하여 모든 요소를 출력할 수 있다.flatMap은 내부적으로 여러 스트림을 병합하는 과정이 필요하므로, map()에 비해 메모리 사용량이 더 많을 수 있다.flatMap()을 쓰는것이 가독성과 효율면에서 더 좋다.