본문 바로가기

728x90
반응형

책리뷰/모던자바인액션

(8)
모던자바인액션 13강 디폴트 메서드 ❓ 디폴트 메서드가 나온 배경 자바 8이전에 자바에서는 인터페이스를 구현하는 클래스는 인터페이스에서 정의하는 모든 메서드를 구현하여 제공하거나 슈퍼클래스의 구현을 상속받아야 한다. 그런데 인터페이스에 새로운 메서드를 추가하는 경우가 있으면 해당 인터페이스를 구현했던 모든 클래스의 구현을 고쳐야 한다. 자바8 API에서 List 인터페이스에 sort같은 메서드를 추가했기 때문에 문제가 발생할 수 있다. 자바 8에서 기본 구현을 포함하는 인터페이스를 정의하는 두 가지 방법을 제공하는데 첫 번째, 인터페이스 내부에 정적 메서드를 사용하는 것 두 번째, 인터페이스의 기본 구현을 제공할 수 있도록 디폴트 메서드 기능을 사용하는 것 기존 인터페이스를 구현하는 클래스는 자동으로 인터페이스에 추가된 새로운 메서드의 디..
모던자바인액션 12강 Date, Calendar 날짜와 시간 API ❓ 기존 자바에서 날짜 표현 자바 1.0에서는 java.util.Date클래스 하나로 날짜와 시간 기능을 제공했다. Date클래스는 밀리초단위로 표현이 된다. Date date = new Date(117, 8, 21); // 출력 결과 Thu Sep 21 00:00:00 CET 2017 Date클래스의 출력은 직관적이지 않고 JVM기본 시간대인 CET 즉, 중앙 유럽시간대를 사용했다. 자바 1.1에서 Date클래스의 대안으로 java.util.Calendar클래스를 제공했다. 하지만 Calendar역시 달의 인덱스는 0부터 시작하는 등의 설계 문제가 있었다. DateFormat같은 일부 기능을 제공했지만 Date클래스에만 작동했기에 개발자들에게 더 혼란을 가중시켰다. DateFormat은 스레드에 안전하..
모던자바인액션 12강 Date, Calendar 날짜와 시간 API ❓ 기존 자바에서 날짜 표현 자바 1.0에서는 java.util.Date클래스 하나로 날짜와 시간 기능을 제공했다. Date클래스는 밀리초단위로 표현이 된다. Date date = new Date(117, 8, 21); // 출력 결과 Thu Sep 21 00:00:00 CET 2017 Date클래스의 출력은 직관적이지 않고 JVM기본 시간대인 CET 즉, 중앙 유럽시간대를 사용했다. 자바 1.1에서 Date클래스의 대안으로 java.util.Calendar클래스를 제공했다. 하지만 Calendar역시 달의 인덱스는 0부터 시작하는 등의 설계 문제가 있었다. DateFormat같은 일부 기능을 제공했지만 Date클래스에만 작동했기에 개발자들에게 더 혼란을 가중시켰다. DateFormat은 스레드에 안전하..
모던자바인액션 11강 Optional Optional 클래스 소개 java.util.Optional Optional은 선택형값을 캡슐화하는 클래스다. 위의 그림처럼 Car가 null이 아니라 값이 없음을 나타낸다. Optional 클래스로 감쌀 경우 null이 아닌 Optional.empty 메서드로 Optional을 반환한다. Optional.empty는 싱글턴 인스턴스를 반환하는 정적 팩토리 메서드다. null은 NullPointerException이 발생하지만 Optional.empty()는 Optional객체이다. 그렇다고 모든 Null참조를 Optional로 대치하는 것은 바람직하지 않다. 메서드의 시그니처만 보고 선택형값인지를 구별해서 값이 없을 수 있는 상황에 적절하게 대응하도록 강제하는 효과가 있다. Optional적용 패턴 ..
컬렉션 API 개선 자바9에서 작은 컬렉션 객체를 쉽게 만들 수 있는 방법을 제공한다. String List를 만들 때 List friends = Arrays.asList("Rophael", "Olivia", "Thibau"); 고정 크기의 리스트를 만들었지만 요소를 추가하거나 삭제할 수 없다. UnsupportedOperationException 예외 발생 위의 List에 friends.add("aaaa"); 이런식으로 요소를 추가할 경우 예외가 발생한다. 내부적으로 고정된 크기의 변환할 수 있는 배열로 구현되어 있기 때문이다. List friends = List.of("Raphel", "Olivia", "Thibaut"); friends.add("Chih-Chun"); List.of 팩토리 메소드를 이용해 리스트를 만들..
JAVA 병렬 스트림 사용시 고려할 점 1. 확신이 서지 않으면 직접 측정하라. 병렬스트림이 순차 스트림보다 언제나 빠른 것은 아니다. 병렬스트림의 수행과정이 투명하지 않을 수도 있고 공유된 가변상태가 있을 경우 올바르게 동작하지 않을 수도 있다.(스레드에서 공유하는 객체의 상태를 바꾸는 경우가 있을 때) 순차스트림과 병렬스트림 중 어떤것이 좋은지 모를 때는 벤치마크로 직접 성능을 측정해라. (JMH를 이용하여 jar로 만들어서 벤치마크) 2. 박싱을 주의하라. 자동박싱과 언박싱은 성능을 크게 저하시킬 수 있다. 박싱동작을 피할 수 있도록 기본형 특화 스트림(IntStream, LongStream, DoubleStream)을 사용하는 것이 좋다. 3. 순차스트림보다 성능이 떨어지는 연산이 있다. 병렬스트림에서 limit, findFirst처럼..
람다란 무엇인가 람다표현식 메서드로 전달할 수 있는 익명함수를 단순화 한 것. 이름은 없지만 파라미터 리스트, 바디, 반환 형식, 발생할 수 있는 예외리스트를 가질 수 있다. 보통 메서드와 달리 이름이 없기때문에 구현해야할 코드의 걱정거리가 줄어든다. 특정 클래스에 종속되지 않기 때문에 함수라고 부른다. 람다 표현식을 메서드 인수로 전달하거나 변수로 저장할 수 있으며 익명 클래스처럼 자질구레한 코드를 구현할 필요가 없다. 람다 문법 람다는 파라미터, 화살표, 바디 세 부분으로 이루어진다. (Apple a1, Apple a2) -> a1.getWeight().compareTo(a2.getWeight()); - 파라미터 : Comparator의 compare메서드 파라미터(사과 두 개) - 화살표 : 람다의 파라미터 리스트..
자바 스트림 처리 스트림이란? 한 번에 한개씩 만들어지는 연속적인 데이터 항목들의 모임. 입력스트림에서 데이터를 한 개씩 읽어들어 출력스트림으로 데이터를 한 개씩 기록한다. 어떤 프로그램의 출력 스트림은 다른 프로그램의 입력스트림이 될 수 있다. 예를 들어, 자동차 생산 공장 라인은 여러 자동차로 구성된 스트림을 처리하는데, 각각의 작업장에서 자동차를 받아서 수리한 후 다른 작업장이 처리할 수 있도록 넘겨준다. 즉, 조립라인은 자동차를 물리적인 순서로 한 개씩 운반하지만 각각의 작업장에서는 동시에 작업을 처리한다. 자바8에서 java.util.stream패키지에 스트림API가 추가되었다. 스트림API는 조립라인처럼 어떤항목을 연속으로 제공하는 어떤 기능이라고 생각한다. 스트림은 스트림 내의 요소를 쉽게 병렬로 처리할 수 ..

728x90
반응형