JAVA/JAVA8 관련
-
Optional API 사용JAVA/JAVA8 관련 2022. 4. 17. 16:38
Optional API를 주로 어떻게 사용하는지 살펴보았다. 1. NULL 체크 List springClasses = new ArrayList(); springClasses.add(new OnlineClass(1, "spring boot", true)); springClasses.add(new OnlineClass(5, "rest api development", false)); Optional spring = springClasses.stream() .filter(oc-> oc.getTitle().startsWith("spring")) .findFirst(); // 1. spring이 값이 있는지 체크 true이면 값이 있음. (null 체크) boolean present = spring.isPresen..
-
[더 자바8] Opitonal 소개JAVA/JAVA8 관련 2022. 4. 5. 22:24
Optional 소개 자바 프로그래밍에서 NullPointerException을 많이 보게 됨. -> null을 리턴하거나 Null 체크를 빼먹었기 때문임. 메소드에서 작업 중 특별한 상황에서 값을 제대로 리턴할 수 없는 경우 선택할 수 있는 방법 1. 예외(throw)를 던진다. 단점 : 리소스 소모가 많이 됨. 2. null을 리턴한다. 단점 : 비용 문제가 없지만, 그 코드를 사용하는 Client 코드가 주의해야 한다. 3. (자바 8 ~) Optional을 리턴한다. (클라이언트에 코드에게 명시적으로 빈 값일 수도 있다는 걸 알려주고, 빈 값인 경우에 대한 처리를 강제한다.) Optional : 오직 값 한 개가 들어있을 수도 없을 수도 있는 컨네이너. 주의할 것 리턴값으로만 쓰기를 권장 (메소드..
-
[더 자바8] STREAM APIJAVA/JAVA8 관련 2022. 3. 20. 16:49
Stream 자바 8에서 추가된 스트림(Stream)은 람다를 활용할 수 있는 기술중 하나이다. 스트림은 '데이터의 흐름'으로, 배열 또는 컬렉션 인스턴스에 함수 여러 개를 조합해서 원하는 결과를 필터링하고 가공된 결과를 얻을 수 있다. public class App { public static void main(String[] args) { List names = new ArrayList(); names.add("jump"); names.add("jumplope"); names.add("ff"); names.add("gg"); Stream stringStream = names.stream().map(String::toUpperCase); stringStream.forEach(System.out::pri..
-
[더 자바8] 인터페이스 기본 메소드와 스태틱 메소드JAVA/JAVA8 관련 2022. 2. 13. 16:05
기본적으로 인터페이스에서는 추상메서드만 선언이 가능하였다. JAVA8에서는 인터페이스에서 기본메소드와 스태틱 메소드를 선언할 수 있도록 변경되었다. 기본 메소드 - 인터페이스에 메소드 선인이 아니라 구현체를 제공하는 방식 - 기본 메소드는 구현체가 모르게 추가된 기능으로 그만큼 리스크가 존재함. -> 컴파일 에러는 아니지만 구현체에 따라 런타임 에러가 발생할 수 있는 위험이 존재 -> 반드시 문서화 필요(@implSpec 자바독 태그 사용) - Object가 제공하는 기능 (equals, hasCode)는 기본 메소드로 제공할 수 없다. (구현체가 재정의해야 함.) - 본인이 수정할 수 있는 인터페이스에만 기본 메소드를 제공할 수 있다. - 인터페이스를 상속받는 인터페이스에서 다시 추상 메소드로 변경할 ..
-
[더 자바 8] 메소드 레퍼런스JAVA/JAVA8 관련 2022. 2. 13. 14:32
메소드 레퍼런스 : 람다가 하는 일이 기존 메소드 또는 생성자를 호출하는 거라면, 메소드 레퍼런스를 사용해서 매우 간결하게 표현할 수 있다. 메소드 참조하는 방법 스태틱 메소드 참조 타입::스태틱 메소드 ex:) UnaryOperator hi = Greeting::hi; 특정 객체의 인스턴스 메소드 참조 개체 레퍼런스::인스턴스 메소드 ex:) Greeting greeting = new Greeting(); UnaryOperator hello2 = greeting::hello; 임의 객체의 인스턴스 메소드 참조 타입::인스턴스 메소드 생성자 참조 타입::new ex:) Supplier newGreeting = Greeting::new; public class App { public static void ..
-
[더 자바 8] 람다 표현식JAVA/JAVA8 관련 2022. 2. 6. 00:50
람다 (인자 리스트) -> (반디) //인자 // 바디(한줄일때는 바디 {} 생략 가능) Supplier get10 = ()->10; System.out.println(get10.get()); Supplier get11 = () ->{11}; System.out.println(get11.get()); 인자 리스트 인자가 없을 때 : {} 인자가 한개일 때 : (one) 또는 one 인자가 여러개 일때 : (one, two) 인자의 타입은 생략 가능, 컴파일러가 추론하지만 명시할 수도 있다. 변수 캡처(Variable Capture) 로컬 변수 캡처 final 이거나 effective final인 경우에만 참조할 수 있다. 그렇지 않을 경우 concurrency 문제가 생길 수 있어서 컴파일 방지가 된다...
-
[더 자바 8] 함수형 인터페이스와 람다 표현식JAVA/JAVA8 관련 2022. 2. 4. 00:48
1. 함수형 인터페이스 - 추상메서드가 하나만 존재하는 인터페이스 - 다른 Static / default 메서드는 있어도 됨. - @FunctionalInterface를 선언하여 함수형 인터페이스를 견고하게 관리 가능하다. (함수형 인터페이스 아닐 시에 컴파일 에러를 냄) // 함수형 인터페이스 // -> 추상 메서드를 인터페이스당 1개만 사용가능 @FunctionalInterface public interface RunSomething { void doIt(); // void doitAgain(); } 2. 익명 내부 클래스 public class Foo { public static void main(String[] args) { // 자바 8 이전에 사용하던 방식 // 익명 내부 클래스 - anoym..