본문 바로가기

Java76

[Java] Strategy Pattern(전략패턴)[feat. Interface] 안녕하세요~ 잭코딩입니다! 이번에는 인터페이스의 활용에 대해 글을 써보려고 합니다! 요즘 글쓴이는 우아한테크캠프 Pro라는 교육과정을 듣고 있습니다 이번 미션에서 Strategy Pattern을 적용해보라는 코드리뷰를 받아서 수정해보았습니다 Interface를 이용해 전략 패턴을 사용하였는데 어떤 점에서 코드가 좋아졌을까요? Strategy Pattern(전략 패턴) ? 전략 패턴이란 무엇일까요? 같은 기능이지만 서로 다른 전략을 가진 클래스들을 각각 캡슐화하여 상호교환할 수 있도록 하는 패턴입니다 Strategy Pattern 예시 (feat. CoffeeMachine) 예를 들어서 설명해보겠습니다 커피머신에는 각자가 커피를 내리는 전략이 있습니다 '커피를 내린다'라는 같은 기능이지만 서로 다른 전략으.. 2020. 12. 6.
[Java] First Class Collection(일급 컬렉션) 안녕하세요~ 잭코딩입니다! 이번에는 일급 컬렉션에 대해 글을 써보려고 합니다! 요즘 글쓴이는 우아한테크캠프 Pro라는 교육과정을 듣고 있습니다 이번 미션에서 일급 컬렉션을 적용해보라는 코드리뷰를 받아서 관련 내용을 학습할 수 있었습니다 일급 컬렉션을 쓰면 무엇이 좋은지 살펴볼까요? First Class Collection(일급 컬렉션) ? 간단히 설명하면 Collection들을 한번 Wrapping한 컬렉션입니다 예를 들어 Car라는 객체가 있습니다 public class Car { private int position; public void move(MovingStrategy movingStrategy) { if (movingStrategy.isMove()) { position++; } } public.. 2020. 12. 6.
[이펙티브자바 3판] ITEM46. 스트림에는 부작용 없는 함수를 사용하라 이번장의 핵심은... 스트림 파이프 라인 프로그래밍 핵심은 부작용 없는 함수 객체입니다 forEach는 스트림이 수행한 계산 결과를 보고할 때만 이용하자 (계산 자체에는 이용하지 말자) 가장 중요한 수집기 팩터리는 [ toList, toSet, toMap, groupingBy, joining ] 스트림 패러다임 스트림 패러다임의 핵심은 계산을 일련의 변환으로 재구성하는 것입니다 이때 변환은 입력만이 결과에 영향을 주는 순수 함수여야 합니다 잘못된 스트림 연산의 예시를 볼까요? Map freq = new HashMap(); try (Stream words = new Scanner(file).tokens()){ words.forEach(word -> { freq.merge(word.toLowerCase(),.. 2020. 12. 5.
[이펙티브자바 3판] ITEM45. 스트림은 주의해서 사용하라 이번장의 핵심은... 스트림과 반복 중 어느 쪽이 나은지 확신하기 어렵다면 둘 다 해보고 더 나은 쪽을 택해라 스트림 API 다량의 데이터 처리 작업을 돕고자 추가되었습니다 스트림 핵심 2가지 1. 스트림은 데이터 원소의 유한 혹은 무한 시퀀스를 뜻합니다 2. 스트림 파이프라인은 이 원소들로 수행하는 연산 단계를 표현하는 개념입니다 스트림 원소들은 어디로부터든 올 수 있습니다 ex) 컬렉션, 배열, 파일, 정규표현식 패턴 매처, 난수 생성기 스트림 파이프 라인 myList.stream() //소스 스트림 .filter(s -> s.startsWith("c")) //중간 연산 .forEach(System.out::println); //종단 연산 소스 스트림에서 시작해 종단 연산으로 끝나며, 그 사이에 하나.. 2020. 12. 2.
[이펙티브자바 3판] ITEM44. 표준 함수형 인터페이스를 사용하라 이번장의 핵심은... 입력값과 반환값에 함수형 인터페이스 타입을 활용하라 보통은 java.util.function 패키지의 표준 함수형 인터페이스를 사용하는 것이 가장 좋은 선택이다 단, 흔지는 않지만 직접 새로운 함수형 인터페이스를 만들어 쓰는 편이 나을 수 있음을 잊지 말자 함수형 매개변수 타입을 올바르게 선택하자 템플릿 메서드 패턴의 매력은 크게 줄었습니다 이를 대체하는 요즘 스타일은 같은 효과의 함수 객체를 받는 정적 팩터리나 생성자를 제공하는 것입니다 그러니까 함수 객체를 매개변수로 받는 생성자와 메서드를 더 많이 만들어야 합니다 ex) LinkedHashMap // 맵에 원소가 100개가 될 때까지 커지다가, 그 이상이 되면 맵에서 가장 오래된 원소를 제거 // 즉, 가장 최근 원소 100개 .. 2020. 12. 2.
[이펙티브자바 3판] ITEM43. 람다보다는 메서드 참조를 사용하라 이번장의 핵심은... 메서드 참조는 람다의 간단명료한 대안이 될 수 있다 메서드 참조 쪽이 짧고 명확하다면 메서드 참조를 쓰고, 그렇지 않을 때만 람다를 사용하라 메서드 참조 함수 객체를 람다보다 더 간결하게 만드는 방법입니다 메서드 참조를 사용하는 편이 보통은 더 짧고 간결하므로, 람다로 구현했을 때 너무 길거나 복잡하다면 메서드 참조가 좋은 대안입니다 기능을 잘 드러내는 이름을 짓거나 친절한 설명을 문서로 남길 수도 있습니다 IDE들은 람다를 메서드 참조로 대체하라고 권하고 있습니다 보통은 이득이지만 항상은 아닙니다 때로는 람다가 더 간결할 수 있습니다 // 메서드 참조 service.execute(GoshThisClassNameIsHumongous::action); // lamda service.e.. 2020. 12. 1.
[이펙티브자바 3판] ITEM42. 익명 클래스보다는 람다를 사용하라 이번장의 핵심은... 익명 클래스는 (함수형 인터페이스가 아닌) 타입의 인스턴스를 만들 때만 사용하라 함수 객체(function object) 추상 메서드 하나만 담은 인터페이스(Functional Interface)의 인스턴스 예제) 문자열을 길이순으로 정렬 List words = Arrays.asList(args); // 코드 42-1 익명 클래스의 인스턴스를 함수 객체로 사용 - 낡은 기법이다! (254쪽) Collections.sort(words, new Comparator() { public int compare(String s1, String s2) { return Integer.compare(s1.length(), s2.length()); } }); → 익명 클래스 방식은 코드가 너무 길기 .. 2020. 12. 1.