함수형 인터페이스 제공 람다 표현식을 쓸 수 있는 인터페이스는 오직 public 메서드 하나만 가지고 있는 인터페이스여야한다. 자바 8에서 이러한 인터페이스를 특별히 함수형 인터페이스라고 부르고, 함수형 인터페이스에서 제공하는 단 하나의 추상 메서드를 함수형 메서드라고 부른다. 인터페이스를 사용해야하는 개발자 입장에서 람다 표현식을 사용하기 위해 메서드가 하나뿐인 인터페이스를 제공해야하는 번거로움을 해결하기 위해 함수형 인터페이스를 만들고 java.util.function 패키지로 제공하고있다. 아래 예제 github 주소 : https://github.com/westssun/practicalJava8/tree/master/src/main/java/ch4/%EB%9E%8C%EB%8B%A4%EC%99%80..
들어가기전 docker에 centos7을 설치 후, 해당 컨테이너를 실행하고 그 안에 Elasticsearch와 Kibana를 설치하여 localhost:5601로 kibana를 띄어볼 것이다. 이를 위한 순서는 아래와 같다. 1) Centos 설치 2) JDK 설치 3) Elasticsearch 설치 4) Kibana 설치 1. Centos 설치 - docker 이미지 다운로드 docker pull centos - docker 이미지 조회 docker images - docker 이미지 실행 docker run -d --privileged -v /sys/fs/cgroup:/sys/fs/cgroup:ro -p 5601:5601 이미지명:이미지태그 /usr/sbin/init 여기서, -p 5601:5601..
소스코드 : https://github.com/westssun/moderninjava8/tree/master/src/main/java/ModernInJava8/ch4_5_6_stream GitHub - westssun/moderninjava8: [BOOK] 모던 인 자바8 [BOOK] 모던 인 자바8. Contribute to westssun/moderninjava8 development by creating an account on GitHub. github.com 예제 실행을 위한 DTO @Data public class SampleDto { private int idx; private String name; private String gender; } 1) 스트림 기본 /** * 기존 Java7 코..
Docker 접속 이후 1) jenkins 이미지 다운로드 docker pull jenkins 2) jenkins 컨테이너 실행 docker run -d -p 8080:8080 -v /jenkins:/var/jenkins_home --name jenkins -u root jenkins 3) 브라우저 접속 localhost:8080 4) 초기 비밀번호 입력 (1) 로그 확인 docker logs jenkins (2) 컨테이너 접속 *docker 컨테이너 접속* docker exec -it -u 0 jenkins bash *초기 비밀번호 확인 명령어* cat /var/jenkins_home/secrets/initialAdminPassword Jenkins plugin 설치 실패 해결 1) jenkins 버전..
상황 TestDto testDto = testList.get(0); 자바 List의 0번째 데이터를 set 해줘야하는 코드를 만났다. testList에는 어떤 데이터가 들어있는지 모른다. (null 일수도있고, 몇개의 row가 들어가있을 수 있다.) 위 testList.get(0) 을 실행하는 부분에서 NullPointerException을 만났다. 분석 NullPointerException이 발생하여 null 체크를 추가하였다. testList는 외부 API에서 얻어온 데이터가 들어있는 List라서 어느 특정 실행 시점에서 null인 testList에 get 메서드를 호출했기 때문에 발생하는 문제였다. if (testList != null) { TestDto testDto = testList.get(0..
LocalDate LocalDate 인스턴스는 시간을 제외한 날짜를 표현하는 불변 객체이다. 어떤 시간대 정보도 포함하지 않는다. 우리는 정적 팩토리 메서드 of로 LoalDate 인스턴스를 만들 수 있다. LocalDate date = LocalDate.of(2017, 9, 21); int year = date.getYear(); // 2017 Month month = date.getMonth(); // SEPTEMBER int day = date.getDayOfMonth(); // 21 또한 팩토리 메서드 now를 사용하여 현재 날짜 정보를 얻을 수 있다. LocalDate today = LocalDate.now(); 다른 방법으로는, get 메서드에 TemporalField를 전달해서 정보를 얻는 ..
디폴트 메서드의 등장 자바 8에서는 기본 구현을 포함하는 인터페이스를 정의하는 2가지 방법을 제공한다. 만약 인터페이스를 바꾸게 되었을때, 해당 인터페이스를 구현한 모든 클래스의 구현도 고쳐져야하는 상황이 온다면 매우 당황스러울 것이다. 이 문제점을 자바 8에서 제공된 새로운 기능으로 해결할 수 있다. 1) 정적 메서드 : 인터페이스 내부 2) 디폴트 메서드 : 인터페이스의 기본 구현을 제공 자바 8에서는 메서드 구현을 포함하는 인터페이스를 정의할 수 있다. 결과적으로 기존 인터페이스를 구현하는 클래스는 자동으로 인터페이스에 추가된 새로운 메서드의 디폴트 메서드를 상속받게 된다. 이렇게 하면 기존의 코드 구현을 바꾸지 않으면서 인터페이스를 바꿀 수 있다. 이 말은 즉, 디폴트 메서드나 정적 메서드가 추가..
전송계층 역할 네트워크 계층에서 다른 네트워크로 데이터를 전송하려면 라우터가 필요하고 라우터의 라우팅 기능을 사용하여 전송할 수 있다. 라우팅 정보가 잘못될 수도 있고, 많은 라우터를 경유하는 도중에 라우터에 문제가 생기거나 패킷이 손상된다면 데이터를 전송하더라도 목적지에 도착하지 못할 수 있다. 전송계층은 목적지에 신뢰할 수 있는 데이터를 전달하기 위해 필요하다. 전송계층에는 오류를 점검하는 기능이 있다. 오류가 발생하면 데이터를 재전송하도록 요청한다. 데이터가 어떤 애플리케이션에서 사용하는 데이터인지 판단한다. 전송계층에서는 전송된 데이터의 목적지가 어떤 애플리케이션인지 식별하는 기능이 있다. 연결형 통신과 비연결형 통신 (1) 연결형 통신 [TCP : Transmission Control Proto..
하나의 클래스를 여러 용도로의 사용 많은 클래스가 하나의 자원에 의존한다. 이렇게 여러 클래스에게 의존받는 자원은 여러 용도로 사용이 된다. 예를 들어, 사전이라는 SpellChecked 클래스가 있다. 이 클래스가 여러 사전을 사용할 수 있도록 만들어보자. 1) 정적 유틸리티의 잘못된 사용 public class SpellChecker { private static final Lexicon dictionary = ...; // 인스턴스 생성 막기 (post: https://seohae.github.io/2020/07/24/java/25_InstancePrivateUse/) private SpellChecker() {} } 2) 싱글턴의 잘못된 사용 public class SpellChecker { pr..
제네릭 public interface Comparable { int compareTo(T o); } 위 Comparable의 메소드는 Comparable, Comparable 등을 구현할 수 있다. 타입을 명시하여 String, Integer 각 타입별 중복된 메소드를 생성할 필요없이 제네릭을 사용하여 중복된 코드를 공통으로 묶을 수 있고, 타입에 자유로워질 수 있다. 형변환의 에러는 컴파일시에 나타나지 않고 런타임 오류로 발생하는데, 이 에러를 컴파일시에 발견할 수 있다는 장점도 제네릭의 큰 장점이다. 제네릭은 static 변수에 사용이 불가능하다. static 변수는 클래스 변수로, 모든 인스턴스에게 공유되는 변수이다. static 변수에 제네릭을 사용하게되면 모든 인스턴스에게 공유되는 변수가 경우에..
숫자형 스트림 reduce 메서드를 사용하여 스트림 요소의 합을 구하는 예제를 보자. int calories = menu.stream() .map(Dish::getCalories) .reduce(0, Integer::sum); 위 코드에는 박싱이 숨어져있는데, 내부적으로 합계를 계산하기 전에 Integer를 기본형(int)로 언박싱 해야한다. int calories = menu.stream() .map(Dish::getCalories) .sum(); // 호출 불가능 직접 sum 메서드를 호출한다면 훨씬 좋겠지만, 위 코드처럼 sum 메서드를 직접 호출할 수 없다. map 메서드가 Stream를 생성하기 때문이다. 이를 해결하기 위해서 스트림은 API 숫자 스트림을 효율적으로 처리할 수 있도록 기본형 특..
싱글턴 싱글턴(Singleton)이란 인스턴스를 오직 하나만 생성할 수 있는 클래스이다. 무상태(stateless) 객체나 설계상 유일해야하는 시스템 컴포넌트이다. 싱글턴을 만드는 방식은 2가지가 있다. 첫번째는 public static final 필드 방식이고, 두번째는 정적 팩터리 메서드를 public static 멤버로 제공하는 방법이다. 2가지 방식의 공통점은 생성자는 private로 감춰두고, 유일한 인스턴스에 접근할 수 있는 수단으로 public static 멤버를 하나 마련해두는 것이다. public static final 필드 방식 public class Test { public static final Test test = new Test(); private Test() { ... } //..
스트림 연산 java.util.stream.Stream 인터페이스는 많은 연산을 정의한다. 스트림 인터페이스의 연산은 2가지로 구분된다. List names = menu.stream() // 요리 리스트에서 스트림 얻기 .filter(dish -> dish.getCalories() > 300) // 중간연산 .map(Dish::getName) // 중간연산 .limit(3) // 중간연산 (쇼트서킷) .collect(toList()); // 스트림을 리스트로 변환 1) 중간 연산 : 연결할 수 있는 스트림 연산 (filter, map, limit) 2) 최종 연산 : 스트림을 닫는 연산 (collect) 중간 연산 filter나 sorted 같은 중간 연산은 다른 스트림을 반환한다. 중간 연산은 중간 연..
스트림과 컬렉션 자바의 기존 컬렉션과 새롭게 추가된 스트림 모두 연속된 요소 형식의 값을 저장하는 자료구조의 인터페이스를 제공한다. 연속된이란, 순서와 상관없이 아무 값에나 접속하는 것이 아닌 순차적으로 접근한다는 것을 의미한다. 스트림과 컬렉션의 차이는 데이터를 언제 계산하느냐이다. 1) 컬렉션 컬렉션은 현재 자료구조가 포함하는 모든 값을 메모리에 저장하는 자료구조다. 따라서 컬렉션의 모든 요소는 컬렉션에 추가하기 전에 계산되어야한다. 2) 스트림 스트림은 요청할 때만 요소를 계산하는 고정된 자료구조이다. 스트림에 요소를 추가하거나 스트림에서 요소를 제거할 수 없다. 사용자가 요청한 값만 스트림에서 추출한다. 스트림은 생산자(producer)-소비자(consumer) 관계를 형성한다. 사용자가 데이터를..
스트림 정의 스트림이란 데이터 처리 연산을 지원하도록 소스에서 추출된 연속된 요소라고 할수있다. 1) 연속된 요소 특정 요소 형식으로 이루어진 연속된 값 집합의 인터페이스를 제공한다. 요소 저장 및 접근 연산이 주를 이루는 컬렉션과 다르게, 스트림은 filter, sorted, map 처럼 표현 계산식이 주를 이룬다. 컬렉션의 주제는 데이터이고 스트림의 주제는 계산이다. 2) 소스 스트림은 컬렉션, 배열, I/O 자원 등의 데이터 제공 소스로부터 데이터를 소비한다. 정렬된 컬렉션으로 스트림을 생성하면 정렬이 그대로 유지되는 것처럼, 리스트로 스트림을 만들면 스트림의 요소는 리스트의 요소와 같은 순서를 유지한다. 3) 데이터 처리 연산 스트림은 함수형 프로그래밍 언어에서 일반적으로 지원하는 연산과 데이터베..
* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.