본문 바로가기

Language/JAVA11

Null , isEmpty , isBlank 비교 요약 Null : 인스턴스가 생성되지 않은 상태 ( 참조 타입 발생 ) isEmpty : 길이가 0 인 상태면 true isBlank : 문자열이 비어있거나, 빈 공백으로 이루어져 있는 상태면 true 참고 : 검색조건 등 (유효성검사) 에는 StringUtils 의 hasText를 유용하게 사용한다. -> 스프링에서 지원 null 체크, 빈문자열 , 포함여부 모두 && 조건으로 확인한다. null - 참조형의 기본값 - 어떠한 값으로도 초기화 되지 않는 상태 참조형(Reference Type) 은 값을 설정하지 않으면 초기화가 자동으로 null 로 진행된다. 참조타입 : 원시타입을 제외한 타입으로, 객체의 주소를 저장하는 타입. 따라서 아래 테스트 처럼 NPE 를 발생시킨다. @Test @Display.. 2024. 3. 20.
[JAVA] 깊은 복사 vs 얕은 복사 깊은 복사 vs 얕은 복사 #Java 참고 : [Java] - 깊은 복사(Deep Copy) vs 얕은 복사(Shallow Copy) 깊은 복사 : ‘실제 값’을 새로운 메모리 공간에 복사하는 것 얕은 복사 : ‘주소 값’을 복사 → 참조하고 있는 실제값은 같다. Collection 은 clone() 이라는 메서드를 이용해서 얕은 복사를 만들 수 있다. 깊은 복사를 구현하는 방법은 여러가지 Cloneable 인터페이스 구현 복사 생성자 복사 팩터리 Cloneable 을 사용하지 말자. Cloneable 인터페이스는 복제해도 되는 클래스임을 명시하는 용도의 믹스인 인터페이스지만, 아쉽게도 의도한 목적을 제대로 이루지 못했다. 여기서 큰 문제점은 clone 메서드가 선언된 곳이 Cloneable이 아닌 OB.. 2023. 8. 20.
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.