자기개발

· BE/Java
이 포스팅에서 작성하는 내용은 EFFECTIVE JAVA(이펙티브자바) 에서 발췌하였습니다. 아이템 46. 스트림에서는 부작용 없는 함수를 사용하라 스트림 패러다임 스트림 패러다임의 핵심은 계산을 일련의 변환으로 재구성 하는 부분이다. 이 때, 각 변환 단계는 가능한 한 이전 단계의 결과를 받아 처리하는 순수 함수여야 한다. 순수 함수 오직 입력만이 결과에 영향을 주는 함수 다른 가변 상태를 참조하지 않고, 함수 스스로도 다른 상태를 변경하지 않는다. 이렇게 하려면 중간 단계든 종단 단계든 스트림 연산에 건네는 함수 객체는 모두 부작용이 없어야 한다. ex 1) 스트림 패러다임을 이해하지 못한 예 Map freq = new HashMap(); try (Stream words = new Scanner(fi..
· BE/Java
이 포스팅에서 작성하는 내용은 EFFECTIVE JAVA(이펙티브자바) 에서 발췌하였습니다. 아이템 45. 스트림은 주의해서 사용하라 스트림 다량의 데이터 처리 작업(순차 or 병렬)을 돕고자 자바 8에 추가되었다. 스트림(stream)은 데이터 원소의 유한 혹은 무한 시퀀스를 뜻한다. 스트림 파이프라인(stream pipeline)은 이 원소들로 수행하는 연산 단계를 표현하는 개념이다. 스트림의 원소들은 어디서로부터 올 수 있다. ex) 컬렉션, 배열, 파일, 정규표현식 패턴 matcher, 난수생성기 등 스트림 안의 데이터 원소들은 객체 참조나 기본 타입 값이다. 기본 타입 값으로는 int, long, double 세 가지를 지원한다. 스트림 파이프라인 소스 스트림에서 시작해 종단 연산으로 끝나며, ..
· BE/Java
이 포스팅에서 작성하는 내용은 EFFECTIVE JAVA(이펙티브자바) 에서 발췌하였습니다. 아이템 44. 표준 함수형 인터페이스를 사용하라 자바가 람다를 지원하면서 API를 작성하는 모범 사례가 바뀌었다. 상위 클래스의 기본 메서드를 재정의해 원하는 동작을 구현하는 템플릿 메서드 패턴의 매력이 크게 줄었다. 이를 대체하는 현대적인 해법은 같은 효과의 함수 객체를 받는 정적 팩터리나 생성자를 제공하는 것이다. 이 내용을 일반화해서 말하면 함수 객체를 매개 변수로 받는 생성자와 메서드를 더 많이 만들어야 하는데, 이 때 함수형 매개변수 타입을 올바르게 선택해야 한다. ex 1) LinkedHashMap의 removeEldestEntry protected boolean removeEldestEntry(Map..
· BE/Java
이 포스팅에서 작성하는 내용은 EFFECTIVE JAVA(이펙티브자바) 에서 발췌하였습니다. 아이템 43. 람다보다는 메서드 참조를 사용하라 메서드 참조(method Reference) ex 1) 임의의 키와 Integer 값의 매핑을 관리하는 프로그램의 일부 map.merge(key, 1, (count, incr) -> count + incr); 이 코드는 키가 맵 안에 없다면 키와 숫자 1을 매핑하고, 있다면 기존 매핑값을 증가시킨다. 값이 키의 인스턴스 개수로 해석된다면, 이 프로그램은 멀티셋을 구현한게 된다. merge : 키, 값, 함수를 인수로 받으며 주어진 키가 맵 안에 없다면 주어진 {키, 값} 쌍을 그대로 저장한다. 반대로, 키가 있다면 인자로 받은 함수를 현재 값과 주어진 값에 적용한 ..
· BE/Java
이 포스팅에서 작성하는 내용은 EFFECTIVE JAVA(이펙티브자바) 에서 발췌하였습니다. 아이템 42. 익명 클래스보다는 람다를 사용하라 익명 클래스 ex 1) 익명 클래스의 인스턴스를 함수 객체로 사용(예전 기법) Collection.sort(words, new Comparator() { public int compare(String s1, String s2){ return Integer.compare(s1.length(), s2.length()); } }); 전략 패턴처럼 함수 객체를 사용하는 과거 객체 지향 디자인 패턴에는 익명 클래스면 충분했다. 이 코드에서 Comparator 인터페이스가 정렬을 담당하는 추상 전략을 뜻하며, 문자열을 정렬하는 구체적인 전략을 익명 클래스로 구현한 것이다. 익..
· BE/Java
이 포스팅에서 작성하는 내용은 EFFECTIVE JAVA(이펙티브자바) 에서 발췌하였습니다. 아이템 41. 정의하려는 것이 타입이라면 마커 인터페이스를 사용하라 마커 인터페이스 아무 메서드도 담고 있지 않고, 단지 자신을 구현하는 클래스가 특정 속성을 가졌다는 것을 표시해주는 인터페이스를 마커 인터페이스라고 한다. 예로 Serializable 인터페이스 를 들면, Serializable은 자신을 구현한 클래스의 인스턴스는 ObjectOutputStream을 통해 사용(직렬화)할 수 있다고 알려준다. 마커 인터페이스가 마커 애너테이션보다 좋은 이유 마커 인터페이스는 이를 구현한 클래스의 인스턴스들을 구분하는 타입으로 쓸 수 있으나, 마커 애너테이션은 그렇지 않다. 마커 애너테이션을 사용했다면 런타임에 발견..
· Algorithm
- 알고리즘 분류 : 구현 및 정렬 - 사용 언어 : JAVA - 문제 요점 - Comparable 인터페이스를 구현해서 정렬하였음. 소스 설명은 주석을 참고해주세요. import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.PriorityQueue; public class Main { // Comparable 인터페이스를 구현해서 커스텀 정렬 순서 정의 static class CustomInt implements Comparable{ int num; public CustomInt(int num) { this.num = num; } @Override public in..
· Algorithm
- 알고리즘 분류 : DFS와 DP 이용 - 사용 언어 : JAVA - 문제 요점 - DFS와 백트래킹으로만 풀이했더니, 시간초과 발생함. - 도움받은 블로그 : https://velog.io/@mulgyeol/백준-1520-내리막길-Java 소스 설명은 주석을 참고해주세요. import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.StringTokenizer; // Link : https://www.acmicpc.net/problem/1520 // 도움받은 블로그 : https://velog.io/@mulgyeol/백준-1520-내리막길-Java public cla..
멍목
'자기개발' 태그의 글 목록 (3 Page)