본문 바로가기

JAVA79

finalizer와 cleaner 사용을 피하라 finalizer와 cleaner는 즉시 수행된다는 보장이 없다. finalizer와 cleaner는 실행되지 않을 수도 있다. finalizer 동작 중에 예외가 발생하면 정리 작업이 처리되지 않을 수도 있다. finalizer와 cleaner는 심각한 성능 문제가 있다. finalizer는 보안 문제가 있다. 반납할 자원이 있는 클래스는 AutoCloseable을 구현하고 클라이언트에서 close()를 호출하거나 try-with-resource를 사용해야 한다. 객체가 사용하는 자원을 반납하지 않는다면 반드시 오류가 발생한다. 이래서 리소스를 반납하기 위해 제공되는 것이 finalizer, cleaner를 제공한다. finalizer finalizer는 Object에서 구현하고 있는 메서드이다. @O.. 2022. 11. 7.
가변인수 가변 인수에 대한 내용은 자바스크립트를 공부하면서 rest 파라미터에 대한 내용으로 알고 있었다. 자바를 사용해 개발을 진행할 때는 잘 사용하지 않는 기능이였는데, 최근 자바에 대한 공부를 진행하면서 관련 내용이 있어 정리하려고 한다. 사실 가변인수에 대한 내 생각은 부정적이다. 그 이유는 바로 모호함이다. 모호함은 프로그래머를 고생시킨다. 가변 인수를 사용할 수 있는 메서드를 정의했다고 해도 이를 사용하는 측에서는 반드시 확인을 하게 된다. 모호하게 가변적으로 인수를 더 받을 수 있는 것보단 확실하게 파라미터 정의를 통해 알려주는 쪽이 좋다고 생각한다. 물론 이를 위해 메소드 오버 로딩 등 코드의 중복이 발생할 수 있지만 모호함으로 인해 발생하는 사이드 이펙트를 생각해보면 더 좋은 코드가 아닐까 생각한.. 2022. 11. 5.
Optional Stream의 종결처리 부분을 이해하기 위해선 Optional대한 이해가 필수적이며 Optional은 대한 이해는 범용적으로 필수적이다. NPE는 Null 상태인 오브젝트를 참조할 때 발생합니다. 이는 언체크 예외를 반환하기 때문에 런타임에 발생합니다. 따라서 컴파일 시점에 발견할 수 없습니다. Optional Class는 Null일수도 아닐 수도 있는 Object를 담은 객체입니다. Optional을 만들기 위해선 다음과 같은 static method를 사용할 수 있습니다. public static Optional of(T value); public static Optional empty(); public static Optional ofNullable(T value); static 키워드로 선언된 메.. 2022. 10. 12.
Exception 예외 기본 계층 Throwable : 최상위 예외 Error : 애플리케이션에서 복구 불가능한 시스템 예외이다. 이 예외를 잡으려고 해서는 안된다. - 상위 예외를 catch로 잡으면 그 하위 예외까지 함께 잡는다. 따라서 throwable 예외를 잡으면 안 되는데 이는 Error 예외도 함께 잡을 수 있기 때문이다. 따라서 Exception부터 필요한 예외로 생각하고 잡는다. Exception : 컴파일러가 체크하는 체크 예외이다. 애플리케이션 로직에서 사용할 수 있는 실질적인 최상위 예외로 Exception과 그 하위 예외는 모두 체크 예외이다. 단 RuntimeException은 예외로 한다. RuntimeException : 컴파일러가 예외를 던졌는지 잡앗는지 체크하지 않는 언체크 예외이다. Ru.. 2022. 9. 25.
[Java] Functional extends 자바에서도 렉시컬 스코프가 존재한다. 내부 함수가 존재하는 한 렉시컬 스코프가 존재하며 외부 함수 변수 또한 포함되어 있다. 이렇게 생성 당시의 환경을 가진 함수를 클로저라 한다. 이때 외부 함수의 변수들은 암묵적으로 final로 취급된다. 이 개념을 응용한 것이 Curry이다. 여러 개의 매개변수를 받는 함수를 중첩된 여러 개의 함수로 쪼개어 매개 변수를 한 번에 받지 않고 여러 단계에 걸쳐서 나누어 받을 수 있게 하는 기술입니다. Function curryAdd = x -> y -> x + y; Function addThree = curryAdd.apply(3); Integer result = addThree.apply(10);​ addThree는 3이라는 값을 항상 기억하고 있다가. 다음 apply.. 2022. 2. 17.
Stream (3) 1. groupingBy groupingBy는 Stream 안의 데이터에 classifier를 적용했을 때 동일한 값끼리 List로 모아서 Map의 형태로 변환해주는 Collector의 메서드이다. public static Collector groupingBy(Function 2022. 2. 16.
Stream (2) Optional과 Java.util.Function 패키지의 인터페이스들, Stream의 생성을 공부했다. 이를 통해 스트림 초기화 과정과 중간 처리 부분을 배우고 종결처리에 필요한 Optional을 배웠으니 Stream의 종결처리 메서드들을 알아보자. 1. All Match / Any Match boolean allMatch(Predicate 2022. 2. 15.
Stream Stream은 Functional Interface와 함께 자바 8에 추가되었다. Stream은 함수형 인터페이스를 적극 활용해 데이터 가공을 쉽게 할 수 있도록 도와줄 수 있다. 자바로 개발을 하다 보면 Collection을 많이 사용하며 해당 Collection들을 가공하는 부분이 상당히 많다. Stream을 사용하면 기존 loop 형식의 코드를 람다를 이용해 직관적이고 쉽게 처리가 가능하다. 이번에는 Stream Interface에 있는 메서드들의 종류와 활용을 공부해보자. 1. Stream.of() @SafeVarargs @SuppressWarnings("varargs") // Creating a stream from an array is safe public static Stream of(T.... 2022. 2. 12.
Method Reference 기존에 이미 선언되어 있는 메서드를 지정하여 인자로 넘기고 싶을 때 사용. :: 오퍼레이터 사용 사용할 메서드의 매개변수 타입과 리턴 타입을 숙지해야 생략되었을 때 혼동이 없다. 자바의 메서드 레퍼런스는 기존에 작성된 메서드를 함수형 인터페이스로 활용하기 위해 제공되는 문법처럼 느껴진다. 기존에 OOP로 작성된 코드를 혹은 패키지에 제공되는 메서드를 코드의 변경 없이 함수형 인터페이스로 변환해 사용할 수 있도록 제공해주는 것 같다. 또한 어느 정도의 자바에 익숙한 개발자여야 한다. java.util.function에 정의된 여러 함수형 인터페이스로 변환하기 위해선 기존 사용되던 메서드의 반환 타입, 파라미터의 타입을 숙지하여야 능동적으로 사용할 수 있을 것이다. 1. 클래스의 static method를 .. 2022. 2. 9.
Functional Interface (2) Functional Interface에서 자주 사용되는 몇 가지 함수형 인터페이스를 알아보자. Supplier Consumer Predicate Comparator 1. Supplier 공급자라는 뜻을 가지고 있는 Supplier는 input값을 받지 않고 리턴 값만 존재하는 함수형 인터페이스이다. @FunctionalInterface public interface Supplier { /** * Gets a result. * * @return a result */ T get(); } 이 함수형 인터페이스에는 추상 메서드인 get()이 존재하고 인자는 없고 리턴 값만 존재한다. 함수형 프로그래밍에서 함수는 1급 시민이기 때문에 인자로 사용이 가능하다. 이 Supplier를 사용해 인자를 주지않고 새로운 값.. 2022. 2. 8.