본문 바로가기

Java22

[Java] Optional은 왜 사용할까? (Feat. NullPointerException) 자바 프로그래밍을 하면서 NPE를 겪어보지 않은 사람은 없을것이다. null 처리를 하기 위해 우리는 많은 노력을 한다. 모든 객체를 null 체크, null 일 경우에 대한 처리 if(person != null){ //null이 아닐 때만 코드 수행 } ################# if(person == null){ throw new PersonNotExistException(); } 이 경우 객체의 개수 만큼 if절이 늘어나게 되어 가독성에 좋지 않다. Optional (java.util.Optional) 자바8 에서는 Optional이라는 새로운 클래스를 제공한다. 예를 들어, 위의 person 객체가 있다고 가정했을 때 Optional 처럼 객체를 감싼다. 값이 있을 경우 객체를 감싸지만, 없.. 2021. 5. 14.
[Java] parallelStream 완전분석 (feat. fork/join framework) 단순하게 stream은 순차처리, parallelStream은 병렬 처리가 된다. 그럼 무조건 parallelStream을 쓰면 빠를 텐데? 하지만 그러면 안 되는 이유가 있을 것만 같은 느낌적인 느낌 parallelStream도 분명 뭔가가 불편하거나 힘들었기 때문에 나왔을 것이다. 파헤쳐보자. 자바 7 이전의 컬렉션 데이터 병렬 처리 방식 데이터를 서브 파트로 분할 후, 분할된 서브 파트에 따라서 각각의 스레드로 할당한다. 각각의 할당된 스레드에서 경쟁상태가 발생하지 않도록 적절한 동기화를 해줘야 하며, 마지막으로 부분 결과를 다시 합쳐야 한다. 자바 7 이후의 컬렉션 데이터 병렬 처리 방식 자바 7부터 포크/조인 프레임워크 기능을 제공한다. 또한 자바 8에서는 스트림을 사용함으로써 병렬 스트림 처리.. 2021. 5. 10.
[Java] Boxing을 지양하자.(feat primitive type vs reference type) 모던 자바 인 액션을 공부하는 요즘 왜 자바에 더 집중하지 않았는가에 대한 자아성찰을 많이 하는 중이다. 흔히 말하는 Boxing, unBoxing은 다들 알고있다고 생각한다. 간단하게 말해서, Wrapper Class를 사용해서 primitive Type을 reference Type으로 변환하는 과정을 박싱(Boxing), 이 반대의 과정을 언박싱(unBoxing)이라고 한다. 자바에서는 오토박싱 기능을 제공해주기도한다. 그렇다면 왜 Boxing을 지양해야할까? 결론부터 말하자면, 비용이 추가적으로 발생 한다. 박싱한 값(Wrapper class)은 reference Type이다. 고로 Heap 영역에 저장된다. 그렇기 때문에, primitive Type을 가져오려고할 때도 Wrpper class로 인.. 2021. 4. 8.
[Java] 자바8 default, static 메소드 자바8에서의 인터페이스 기존 자바7 이하에서는 추상 메소드 선언과 상수 정의만 가능했다. 그런데 자바8부터 default 메소드와 static 메소드를 추가 정의할 수 있게됐다. 왜 생겼을까??? default 메소드 왜 생겼지? 하위호환성과 유연성 때문. 만약 자바 7에서 자바8로 업데이트하면서 인터페이스 새로운 메소드가 추가되었다면? 해당 인터페이스를 구현한 모든 클래스에서 해당 메소드를 구현해줘야한다. (너무 불편..) 객체지향의 개방폐쇄원칙에 위배된다. 그래서 default 메소드로 기본 구현을 제공해줌으로써, 새로 구현하지 않아도 된다. public interface Calculator { public int plus(int i, int j); public int minus(int i, int .. 2021. 3. 20.
[Java] 주니어 백엔드 면접 단골 질문 - 쓰레드를 생성하는 2가지 방법 면접에서 쓰레드에 대한 질문을 높은 빈도로 받았었다. 만족하실만한 대답을 못했던 것 같다. 쓰레드를 생성하는 2가지 방법 Runnable 인터페이를 확장해 run() 메소드 구현 Thread 클래스를 상속받고 run() 메소드를 오버라이딩해 구현 둘 중에 뭐가 더 좋을까?? Runnable 인터페이스를 확장하는 방법. 왜? extends과 implements의 차이점에서 알 수 있다. extends을 받으면 내가 받고 싶지 않은 메소드도 상속 받게 되는 문제가 생긴다. 또한 private가 아닌 메소드나 변수를 자식 클래스가 받게 되고 낭비가 생긴다. 따라서 인터페이스 확장 방식을 사용해 필요한 기능만 갖게 되고 결합도를 낮추는 방식이 객체지향적으로 적합하다. 쓰레드를 실행시키는 방법은? 1) exten.. 2021. 3. 20.
메일 발송시 blob 데이터 처리 blob 데이터 처리 첨부파일이 아닌, 파일을 byte 형태의 데이터로 변환해 메일을 전송해야했다. 그러기 위해서는 Oracle DB에 저장할 때 blob 타입의 칼럼을 사용해야 했다. 엄청난 삽질 끝에 알게된 내용을 미리 공유하자면, MIME에서 정의하는 전자 메일 base64는 임의의 바이트 스트림을 화면에 표시할 수 있는 ASCII 문자들로 바꾸는 인코딩 방식을 말한다. 바이트 데이터를 메일에서 사용하기 위해서는 반드시 base64로 인코딩을 해야한다. 또한, blob 칼럼의 default length는 4000이다. 아래와 같은 쿼리 방식으로 인코딩을해서 데이터를 가져올 수 있다. SELECT (UTL_ENCODE.BASE64_ENCODE(content1)) AS ATTACH1 FROM conte.. 2020. 10. 28.