해당 포스팅은 해당 게시글을 토대로 서술되었습니다. Java 8 에서는 컬렉션을 데이터 스트림으로 쉽게 반복할 수 있는 Stream API를 도입했습니다. Stream은 병렬로 실행할 수 있고 여러 프로세서 코어를 사용하는 것도 매우 쉽습니다. 그에 따라 더 많은 코어에 작업을 할당하여 나누는 것이 항상 더 빠르다고 생각하기 쉽습니다. 하지만 그렇지 않은 경우도 있습니다. 해당 포스팅에서는 순차 스트림과 병렬 스트림의 차이점에 대해서 살펴보겠습니다. 먼저 병렬 스트림에서 사용하는 default fork-join pool을 살펴보겠습니다. 또한, 메모리 지역 및 분할/병합 비용을 포함하여 병렬 스트림 사용의 성능 영향을 다뤄보겠습니다. 마지막으로 순차 스트림을 병렬 스트림으로 변환하는 것이 합리적인 경우를..
회사업무에서 특정 요건을 처리한 후 서버에 배포하였다. 그런데 내가 배포한 이후에 QA 담당자께서 되던 기능이 안된다고 하시는데... 불길한 맘으로 서버 로그를 확인한 결과 잉?? NullPointerException이 떨어져 있었다... 아무리 생각해도 해당 라인에서는 NullPointerException이 발생할 여지가 전혀 없는 코드였는데 배포가 잘 안된건가? 하고 팀장님께 해당 라인의 코드와 배포상황을 말씀드렸고 배포는 정상적으로 진행되었음을 확인했다. 그렇다면 실제로 해당 코드에서 NullPointerException이 발생했다는 건데.. 예제 코드로 상황을 재현해 보겠다. 삼항연산자 NullPointerException 예제 class Scratch { public static void mai..
안녕하세요. 오늘은 모던자바 인 액션이라는 책을 읽으면서 확인한 동작의 파라미터화라는 키워드에 대해서 이야기해보려고 합니다. 모던 자바 인 액션이라는 책을 간단히 소개하자면 자바 8 이후에 등장하는 드라마틱한 자바 프로그래밍의 패러다임을 정리하여 전달해주고 있습니다. 현업에서 이미 자바8은 너무나도 깊게 자리잡게 되었고 그 원리를 이해하고 그로인해 어플리케이션의 전체적인 성능까지도 고려할 줄 아는 프로그래밍을 위해 자바개발자 독자들에게 그 원리를 전달해주고 있습니다. http://www.yes24.com/Product/Goods/77125987 모던 자바 인 액션 자바 1.0이 나온 이후 18년을 통틀어 가장 큰 변화가 자바 8 이후 이어지고 있다. 자바 8 이후 모던 자바를 이용하면 기존의 자바 코드 ..
최근 Modern Java In Action 이라는 책을 보면서 예제를 작성하여 깃에 커밋하고 있었다. 이참에 Java 8 버전을 벗어나서 개인적으로 파격적이었던 Java 11로 코딩을 해보고 싶어서(물론 익숙한 방법을 쓰게된다) Modern Java In Action 혹은 이 블로그를 채우면서 새롭게 알아가는 내용들을 Java 11로 예제를 짜보기로 했다. 자바 8 이후에 등장한 내게 있어서 가장 써보고싶었던 기능은 LIst.of() 라는 메소드였다. 단지 Arrays.asList() 메소드가 있는데 괜스리 내가 쓰던 버전보다 진보적인 기능의 등장은 "이건 못참지" 수준이었고, 마침 컬렉션 정렬예제가 있길래 바로 써봤는데... 웬걸... Exception in thread "main" java.lang..
안녕하세요. 이번 포스팅은 자바 프로젝트를 진행할때 시간대를 매번 계산하기 어려워서 시간대 설정이 필요한 부분에 대해서 전체적으로 프로젝트의 시간대를 설정하는 방법과 원리에 대해서 소개해보고자 합니다. 일단 시간대는 기본적으로 시스템 default를 따르게 됩니다. 대한민국에서 이 블로그를 보고 있으시면 그냥 KST 한국 표준시라고 생각하시면 됩니다. 하지만 다국어 및 다양한 시간대를 제공해야하는 어플리케이션의 경우 기본적으로 UTC 시간대를 기준으로 잡고 해당 시간대를 기준으로 날짜/시간 객체를 처리하곤 할 것입니다. 일단 먼저 프로젝트의 전체 시간대를 시스템 default 시간대가 아닌 UTC 시간대를 바라보도록 수정해보겠습니다. 프로젝트 UTC 시간대 바라보기 TimeZone.setDefault(T..
안녕하세요. 오늘은 코틀린 문법공부 1일차 : 코틀린의 주석, 변수와 자료형을 선언하는 방법들에 대해서 정리해보겠습니다. 변수, 자료형 문법은 가장 기본이 되는 요소이기 때문에 다양한 케이스를 알아야 하고 반드시 기초를 잡아야합니다. 주석 코틀린은 자바와 비슷한 주석체계를 가지고 있습니다. 예를 들어 하나의 라인의 주석을 사용하는 것은" // " 이며, 여러 라인의 주석을 사용하는 것은 " /* */ " 입니다. 주석은 아래의 예제를 설명하는 첨언으로 사용해보면서 나가겠습니다. 변수 코틀린의 변수선언은 많은 자바개발자들이 사용하고 있는 자바8버전(jdk 1.8)과는 많이 상이합니다.(고버전 자바와는 흐름이 비슷하기도 합니다.) 일단 두가지 선언방법이 존재합니다. var a: Int =1 val b:Int..
기존에는 stop() 메소드를 활용해서 현재 진행중인 스레드를 종료시켰었나봅니다. 하지만 해당 메소드가 Deprecated 되어 있습니다. 왜 그럴까 생각해보았을땐 대충 공유객체에 대한 자원관리와 갑작스런 스레드 종료에 따른 어플리케이션 불안 정도를 꼽을 수 있었는데요. Thread 클래스에 존재하는 stop 메소드의 주석을 우선 뜯어보았습니다. 이 메소드는 본질적으로 안전하지 않습니다. Thread의 stop 메소드로 스레드를 종료하는 것은 스레드가 가진 모든 자원이 해제됩니다. 예를 들어, 공유객체입니다. 공유객체를 특정 스레드가 점유하여 처리하고 있을 때, 갑작스럽게 종료하게 된다면 해당 공유객체는 미완료처리된 불완전 객체로써 메모리에 남게됩니다. 그로인해 시스템은 의도하지 않은 행동을 취할 수 있..
문제 설명 클래스 TreeNode가 다음과 같이 있을때 class TreeNode { int val; TreeNode left, right; public TreeNode(int x) { this.val = x; } } 다음과 같은 트리노드를 구현한 매개변수로 TreeNode 인스턴스를 받고 다음의 배열로 표현되도록 하시오. 결과 : [[33], [22, 44], [3, 26, 77], [55]] 나의 풀이 public List solution(TreeNode root) { List result = new ArrayList(); if(root == null) return result; Queue queue = new LinkedList(); queue.offer(root); while(!queue.isEm..