[Java] Optional의 Best Practice
·
Java/Optional
옵셔널이 안정성은 높지만, 그렇다고 무분별하게 쓰면 가독성과 유지보수가 구려진다.옵셔널이 왜 생겼는지 근본을 생각해보자. 제일 큰 이유는 null 여부의 명확성 + NPE 방지를 위해 등장한 개념이다.즉, 우리는 이 옵셔널을 웬만하면 반환값에 사용하도록 해야한다.Optional 의 베스트 프랙티스1. 반환 타입으로 사용 , 필드엔 쓰지 말자옵셔널은 메서드의 반환 값에 대해 값이 없을 수도 있다를 표현하기 위해 등장했기 때문에, 필드에 직접 옵셔널을 두는 것은 권장되지 않는다.private Optional name; -> 이런식으로 쓰지말고public Optional getNameWithOptional(){ return Optional.ofNullable(name)} -> 이런식으로 값을 반환할 때 쓰자옵..
[Java] orElse() 와 orElseGet() & 즉시평가 vs 지연평가
·
Java/Optional
orElse()와 orElseGet() 을 비교해보자. 비슷한것 같지만 다르다.먼저 즉시평가와 지연평가에 대해 알아보자.즉시 평가 vs 지연 평가즉시 평가는 값을 바로 생성하거나 계산하는 것이고, 지연 평가는 값이 실제로 필요할 때까지 연산을 미뤘다가 필요시점에 연산하는 방법이다.로그를 예로 들어 즉시 평가와 지연평가 예시를 보자.log.info("로그를 쓰는 방법이 개같군요 당신의 이름은 = " + name); -> 이게 즋기평가이다. log.info("로그를 쓰는 방법이 적절하군요 당신의 이름은 = {}", name); -> 이게 지연평가이다. 즉시 평가자바는 기본적으로 연산을 즉시 평가한다. 즉, 10+20 이라는 연산을 처리할 순서가 되면 즉시 평가한다.이게 왜 문제가 될까?만약 우리가 미리 e..
[Java] Optional과 생성, 값 획득 및 처리
·
Java/Optional
Optional 이란 무엇이냐옵셔널은 위와 같이 클래스가 정의 되어 있는데, T타입의 value를 감싸는 일종의 컨테이너라고 생각하면 된다.위험한 null을 직접 다루는 대신 Optional을 통해 null을 안전하게 핸들링하며 값이 없을 때는 Optional.empty() 를 반환하고, 값이 있다면 Optional.of(value)를 통해 값을 한번 감싼 상태로 관리한다. 값이 없을 수 있다는 점을 명시적으로 표현하여 NPE를 예방할 수 있고, 내 코드를 읽는 모두가 이 메서드는 NULL을 반환할 수도 있다는 사실을 알 수 있어 오류를 줄일 수 있다.요약하자면, 값이 없을 수도 있는 상황에 주로 사용하고, 항상 값이 있다면 굳이 Optional을 사용하여 리소스를 쓰기보단 바로 해당 타입을 사용하거나 ..
[Java] Optional이 필요한 이유
·
Java/Optional
미친 Null의 역습세상에서 가장 무서운 예외가 있다.그건 바로 객체가 제대로 전달되지 않아 null.메서드() 형태로 코드 흐름을 가져가버리는 NullPointerException이다. 자바에서 null == 값이 비었다를 의미하는데, 존재하지 않는 값에 대고 메서드를 호출하면 null.XX() 형태로 코드가 만들어지기에 프로그램이 예기치 않게 종료될 수 있다.만약 다음과 같이 코드를 작성했다고 했을때를 가정해보자.아직 null은 아니지만 언젠가는 null이 될 객체.method1().method2().method3()....methodN();시작은 null이 아니더라도, 중간에 널포인터예외가 발생하면 메서드 체이닝 중 어느 메서드에서 발생한 버그인지 찾기가 쉽지가 않다.또한 모든 메서드별로 if(ob..
[Java] 체크 예외, 언체크 예외
·
Java/Exception
https://bdisappointed.tistory.com/205 [Java] 예외처리 - 예외 계층 구조, 예외 처리 기본 룰이번에 스프링 예외 처리를 공부하던 중, 자바 기본 예외 처리를 복습하고자 글을 작성한다.예외처리가 왜 필요한지 간단하게 한줄 요약하자면, 자바 내부에서 로직을 처리하면서 다양한 예외bdisappointed.tistory.com이전에 말했듯, Exception 과 그 하위 예외는 모두 컴파일러가 체크하는 체크예외이다.하지만 하위 예외중 런타임 예외는 제외한다.체크예외package exception.basic.checked;//Exception을 상속받은 예외는 체크예외가 된다(컴파일러가 잡아줌)public class MyCheckedException extends Excepti..
[Java] 예외처리 - 예외 계층 구조, 예외 처리 기본 룰
·
Java/Exception
이번에 스프링 예외 처리를 공부하던 중, 자바 기본 예외 처리를 복습하고자 글을 작성한다.예외처리가 왜 필요한지 간단하게 한줄 요약하자면, 자바 내부에서 로직을 처리하면서 다양한 예외 및 상황이 발생할 수 있는데, 이때 If 문으로 모두 연결하여 작성하게 되면, 정상 흐름과 예외 방지 로직이 섞여 코드를 이해하고 유지 보수 하기 힘들다.이를 위해 예외를 처리하기 위한 매커니즘이 자바 예외 처리 기능인데, 이는 프로그램의 안정성과 신뢰성을 높이는데 중요한 역할을 한다.그래서 우리가 흔히 보는 다음 키워드들이 예외처리를 위해 존재하는 예약어들이다 -> try - catch - finally / throw , throws예외 계층 구조자바 예외는 위와 같은 계층 구조를 가졌는데, 기본적으로 예외도 객체이기 때..
[Java] LinkedList의 특징과 스스로 구현해보기
·
Java/Collections
이번에도 코테를 풀며 늘 데이터가 추가되는 상황에서 늘 ArrayList를 사용했다.자바가 제공하는 라이브러리가 분명 최적화가 잘 되어 있기 때문에 그냥 ArrayList를 쓰면 된다고는 하지만, 데이터를 앞쪽 인덱스에 삽입하는 경우가 많을 때는 확실히 LinkedList가 유리하다.평소에 LinkedList를 잘 사용을 하지 않아서, 구조를 다시금 이해 할겸 스스로 구현해보았다.참고로 LinkedList는 배열리스트처럼 인덱스만 딱 찍어 탐색할 수 없기 때문에 이전 노드의 next 필드의 값을 통해 접근 하는 방식을 사용해야한다. -> 이 사실만 알면 구현은 어렵지 않다.구현public class MyLinkedList { private Node first; private int size =..
[Java] Optional.filter() vs Stream.filter()
·
Java
거두절미하고 본론으로 넘어간다.옵셔널을 공부하다가 혼자 잘못이해하고 씩씩 대면서 배운 것에 대해 기록하고자 한다. 그래도 그냥 넘어가지 않고 알고 넘어가려는 내 스스로 칭찬해 ~지연 평가 와 즉시 평가도 적어두긴 하는데, 이건 나중에 따로 포스팅을..ㅎㅎ스트림의 filter -> 지연평가다음 예시를 간단히 보자List list = Arrays.asList(1, 2, 3, 4);List filtered = list.stream() .filter(n -> n % 2 == 0) .collect(Collectors.toList()); // [2, 4]늘 스트림을 쓸 때 주의해야할 점은 스트림 파이프라인 연산은 절..
[Java] synchronized 키워드가 필요한 이유 (예시)
·
Java/MultiThread & Concurrency
상황 가정 + 실패 예시아래 예시는 좋지 않은 예시이다.만약 두개의 스레드 각 10000번 돌려 두 스레드 값을 더하여 20000이 나오게 하는 프로그램을 작성한다고 가정하자.public class SyncTest1BadMain { public static void main(String[] args) throws InterruptedException { Counter counter = new Counter(); Runnable task = new Runnable(){ @Override public void run() { for (int i = 0; i 위 예시 결과는 아래와 같다. (운이 좋아 20000이 나..