728x90 Language/JAVA18 Optional + orElse 와 orElseGet 메서드 비교 테스트 Optional 결과가 null 이 절대 나올 수 없을 경우에는 사용하지 않는다. Null 에 의해 오류가 발생할 가능성이 매우 높을때만 반환값으로 사용한다. Optional 의 값을 확인하지 않고 접근하면 NPE 대신 NoSuchElementException 이 발생할 수 있다. [ 올바른 Optional 사용법 가이드 ] Optional 변수에 Null을 할당하지 말아라 값이 없을 때 Optional.orElseX()로 기본 값을 반환하라 단순히 값을 얻으려는 목적으로만 Optional을 사용하지 마라 생성자, 수정자, 메소드 파라미터 등으로 Optional을 넘기지 마라 Collection의 경우 Optional이 아닌 빈 Collection을 사용하라 반환 타입으로만 사용하라 https://man.. 2023. 8. 15. 스트림의 중간, 최종연산 스트림의 연산에 대해 알아보겠습니다. 프로젝트를 진행할 때, for 문과 같은 코드를 Stream 으로 리팩토링을 했는데, 자바의 정석 강의를 통해 다시 한번 정리해보고자 합니다. 자바8 이후 Stream 을 사용할 수 있게 되면서, 길고 복잡했던 코드를 단순하고 가독성 좋게 사용할 수 있기 때문에, 낯설더라도 프로젝트에 적용하면 빠르게 배울 수 있을 거 같습니다. 먼저 어떠한 종류가 있는지 확인해보겠습니다. 기본적인 메서드만 정리했으며, 많은 메서드가 있습니다. 중간 연산은 0~n 개를 사용할 수 있습니다. 중간 연산 설명 Stream distinct() 종복제거 Stream filter( 조건식 ) 조건에 안맞는 요소는 제외 Stream limit() 스트림의 일부를 잘라내기 Stream skip().. 2023. 2. 15. 스트림(Stream) 의 특징 스트림은 컬렉션이나 배열의 다양한 데이터 소스를 표준화된 방법으로 다루기 위한 것입니다. 데이터소스를 추상화하고 데이터를 다루는데 자주 사용되는 메서드 들이 정의되어 있습니다. 스트림을 이용하는 방법은 보통 3단계로 이루어집니다. 1. 스트림 만들기 2. 중간 연산 n 번 3. 최종 연산 1번 스트림의 특징을 알아보겠습니다 1. 스트림은 데이터 소스로부터 데이터를 읽기만할 뿐 변경하지 않습니다. public class StreamEx_1 { public static void main(String[] args) { List list = Arrays.asList(3, 1, 5, 4, 2); List stream = list.stream().sorted().collect(toList()); System.out.. 2023. 2. 13. 람다식과 함수형 인터페이스 람다식은 메서드를 하나의 식(expression) 으로 표현하는 것을 의미합니다. 또한 람다식은 익명 함수, 익명 객체 라고도 하는데, 자바에서는 함수와 메서드를 같은 의미로 사용합니다. 람다식의 작성법은 아래와 같습니다. 반환타입 메서드이름 (매개변수 선언) -> { ... } 기초적인 예시를 들어보겠습니다. 예시는 자바의 정석을 참고했습니다. int max(int a, int b) { return a > b ? a : b; } //변환 (a , b) -> a > b ? a : b int person(String name, int i) { System.out.println(name + "=" + i); } // 변환 (name , i) -> System.out.println(name+ "=" + i);.. 2023. 2. 13. 쓰레드 동기화(Synchronization) 멀티 쓰레드 프로세스는 다른 쓰레드의 작업에 영향을 미칠 수 있습니다. 진행 중인 작업이 다른 쓰레드에게 간섭받지 않게 하려면 동기화 작업이 필요합니다. 동기화는 한 쓰레드가 진행중인 작업을 다른 쓰레드가 간섭하지 못하도록 막는 것을 의미합니다. 동시에 접근하고 공유되는 자원에서 문제가 발생하지 않도록 보장해줘야 하는 임계영역은 락(Lock) 을 얻은 단 하나의 쓰레드만 출입이 가능합니다. 락은 객체마다 1개씩 가지고 있습니다. 임계영역을 보장해주기 위한 방법은 뮤텍스와 세마포어가 있습니다. https://josteady.tistory.com/557 [CS] 뮤텍스(Mutex) 세마포어(Semaphore) 란? 먼저 임계영역은 무엇인가? 임계영역(Critical Section) 이란? 동시접근, 공유되는.. 2023. 2. 13. Thread.sleep() 과 interrupted() 쓰레드를 일정시간동안 멈추게(잠들게) 할 수 있는 sleep() 메서드에 대해 알아보겠습니다. static void sleep (long millis) static void sleep (long millis , int nanos) 먼저 static 메서드라는 것을 잘 인지하고 있어야 합니다. sleep 은 자기 자신만을 멈추게 할 수 있습니다. 또한, 예외처리(InterruptedException) 을 필수처리 해야합니다. 어떠한 문제가 생겨서 예외를 던지는 것이 아닌, 멈춘 도중에 time up 이나 interrupted로 깨우면 해당 예외와 try - catch 문을 이용해서 잠자는 상태를 벗어나는 것입니다. try { Thread.sleep(1000); } catch (InterruptedExcep.. 2023. 2. 12. 쓰레드(Thread) 는 무엇일까? 프로세스는 프로그램을 실행 한 것을 의미합니다. 프로세스의 자원을 이용해서 실제로 작업을 수행하는 것을 쓰레드 라고 합니다. 모든 프로세스에는 1개 이상의 쓰레드가 존재하며, 둘 이상의 쓰레드를 가진 프로세스를 멀티쓰레드 프로세스라고 합니다. 멀티 쓰레드를 사용하면 하나의 프로세스에서 여러가지 작업을 동시에 진행할 수 있어 효율적으로 사용할 수 있습니다. 자바는 멀티쓰레드를 지원하므로, 고비용의 프로세스를 추가시키는 보다 멀티 쓰레드를 이용할 수 있습니다. 멀티쓰레드의 장점은 아래와 같습니다. 1. CPU의 사용율을 향상시킨다 2. 자원을 효율적으로 사용할 수 있다. 3. 사용자에 대한 응답성이 향상된다. ex) 채팅프로그램에서 파일전송을 할때 보내면서 채팅을 할 수 있다. 4. 작업이 분리되어 코드가 .. 2023. 2. 12. 열거형(Enum) 을 알아보자 열거형(Enum) 은 서로 관련된 상수를 편리하게 선언하기 위해 사용합니다. 입력해야할 값이 정해져있는 경우, ex) 회원권한, 요일(월~일) 등 이러한 경우에는 Enum 타입으로 생성하면 다른 불필요한 값이 들어올 수 없으므로 더욱 효율적인 코드를 작성할 수 있도록 도와줍니다. 클래스에서 상수를 선언하기 위해서는 아래와 같은 방법을 사용했습니다. public class Card { static final int CLOVER = 0; static final int HEART = 1; static final int DIAMOND = 2; static final int SPADE = 3; } Enum 을 사용하면 아래와 같이 변경할 수 있습니다. public class Card { enum Kind {CLO.. 2023. 2. 12. Generics (지네릭스) 를 알아보자 Generics는 다양한 타입의 객체들을 다루는 메서드나 컬렉션 클래스에 컴파일 시의 타입체크를 해주는 기능입니다. 장점으로는, 컴파일 시에 체크하기 때문에, 문법적인 오류를 바로 확인할 수 있고, 타입의 안정성을 높일 수 있습니다. 또한, 다룰(사용할) 객체 타입을 미리 명시함으로써, 형변환의 번거로움을 줄여줍니다. 지네릭는 아래와 같이 선언되어있습니다. 지네릭을 사용하지 않는 객체의 타입은 아래와 같습니다. class Box { Object item; public Object getItem() { return item; } public void setItem(Object item) { this.item = item; } } Box 으로 지네릭클래스를 설정할 수 있습니다. T는 타입 변수를 뜻하며, 원.. 2023. 2. 12. 이전 1 2 다음 728x90