본문 바로가기

Java/JAVA

(41)
ScheduledThreadPoolExecutor에서 주의할 점. (ThreadPool의 배신, 동작 방법을 알지 못하고 쓴 사람의 삽질) ThreadPool을 조심해라? 이 글을 쓰게 된 이유는 나의 안일함 때문이었다. 주기적으로 장비의 데이터를 수집하고 메세지를 만들어서 상위 시스템으로 데이터를 전송해야 하는 업무를 하고 있어서 ScheduledThreadPoolExecutor를 사용하게 되었다. 이미 13개월전에 Timer를 비롯해서 정확한 주기로 작업을 실행해주는 것이라며 자랑스럽게(?) 올린 포스트가 있다. 그런데 ThreadPool 단어에 낚여 오해한 채 사용하고 있었다. 그래서 그 문제를 주의하고 정리하는 차원에서 글을 작성한다. ThreadPool하면 떠오는 것 자주 보이는 것 중 생각나는 것은 DBCP나 WAS의 ThreadPool이 떠오른다. 간단하게 설명하면, 각각의 Request에 대해서 각각의 쓰레드를 생성해서 수행하..
Stream foreach 성능 테스트 (stream을 사용하지 말아야할 때는 언제일까로 시작된 간단한 테스트) Stream foreach 반복문 테스트 자바 Stream을 이용한지 꽤 됐다. 필자가 개인적으로 Stream을 사용하는 이유는 가독성이 좋아지기 때문이다. (가장 큰 이유) 예전에 Stream이 막 등장했을 시기에는 Stream이 어색하고 전통적인 for loop에 익숙한 개발자와 같이 개발할 수 있기 때문에 Stream 도입을 유의하자고 많이 했다. 근데 요즘에는 고민 없이 사용할 만큼 Stream을 많이 사용한다. 필자 또한 Stream을 잘 이용하는데 문제는 적재적소에 사용하지 못하는 점이다. 여기서 적재적소라 함은 Stream이 더 유용할 때 사용하는 것이다. 보통 map(), flatMap()등을 이용해야할 때나 이용하면 더 작업이 간결하고 성능상에도 이득이 있을 때 사용하는 것을 권장하는 것..
자바 메서드 '잘' 작성하는 방법, 알면서 못 지키는 것들(이펙티브 자바 스터디 - 메서드) 어떻게 해야 메서드 잘 만들었다고 소문이 날까? 개발을 하면서 가장 많이 하는 일이면서 가장 난해한 것이 메서드 작성이 아닐까 싶다."하나의 메서드에서는 하나의 작업만 한다!" 라는 기본 원칙을 지키려고 하면서도 잘 안된다.사소하게는 private으로 할지 public으로 해야 할지등 정해야할 것들이 너무도 많은 것이 메서드다.역시나 한 번에 제대로 작성하려고하면 어렵다. 대신 유념하면서 고치고 또 고치면서 배우는게 코딩아닐까 싶다.회사를 다닌다면 코드 리뷰를 하는 이유도 올바른, 좋은 메서드를 개발하기 위함이 아닐까 한다.결국 좋은 메서드를 만드려면 기본 원칙을 잘 알고 시도하고 리팩토링을 거쳐봐야 한다. 그래서 아래에 기본 원칙을 소개하려고 한다.메서드 작성 기본 원칙 - 파라미터가 유효한지 검사하라..
일반적인 프로그래밍 원칙(effective java 3판 스터디, 자바에서 경계해야할 것들 간단 정리) 일반적인 프로그래밍에서 하지 말아야할 것 먼저 일반적인 프로그래밍에서 하지 말아야할 것에 대해 말하기 전에 소개하고 싶은 것이 있다.이 글은 이펙티브 자바 3판을 읽으면서 처음쓰는 글이다.그런데 포스트의 내용은 첫 장에 나오는 내용이 아니라 중간에 나오는 내용이다.왜 이렇게 글을 쓰냐면 이 책은 스터디 방법이 좀 달라야한다고 생각하기 때문이다.이 책을 한 번 읽고 완전히 이해하고 적용하는 사람은 없다고 생각한다.그냥 쭉 읽고 이해한 부분을 정리하고 적용할 수 있는 건 해보면 그걸로 충분한 것 같다.이해하지 못한 부분은 또 읽으면 되니까. 좀 더 레벨업하고 와서 보면 또 다르게 이해가 되는 것도 있겠지 하는 마음의 스터디 방법이다. (추천합니다.)각설하고 간단하게 정리하며 한 번 더 공부해본다.1. 지역 ..
자바 Comparable, Comparator 하면 '정렬'을 떠올려라, 자바 객체 정렬의 '기준'을 정하는 방법! (비교랑 다릅니다!) Java Comparable, Comparator Comparable, Comparator 가 무엇인지 알아보기 전에 확실히 해야할 것이 있다.Comparable, Comparator하면 '정렬'을 떠올려야하는 것이다.Compare 하면 "비교"고 Comparable하면 "비교 가능한" 이렇게 해석할 수 있기 때문에 "비교"가 먼저 떠오를텐데 이것을 가지고 같다 혹은 크다, 작다를 구분하는 단순 비교를 할 수 있는 것은 아니다.명확하게는 "정렬할 때 비교가 가능하다.", "정렬할 때 기준을 정할 수 있다." 가 맞다.단어적인 측면에서 보았을 때 오해할 수 있는 것을 알아봤다면, Comparable과 Comparator가 언제 어떻게 쓰는지 알아보면 좋을 것이다.우선 자바에서 객체를 정렬할 때 일정한 기준..
자바 equals(), hashCode(), == 연산자 비교 및 개념 정리하기(객체 비교 구문 커스터마이징하는 방법) 자바에서 각각 객체가 동일한지 확인하는 방법 자바 프로그래밍에서 객체가 동일한지 확인하는 분기문은 상당히 많이 작성할 것이다.예를 들면 '==' 연산자로 비교할 수도 있고 'equals()', 'hashCode()' 로 비교할 수도 있다.이제 앞에서 언급한 3개의 방법의 원리를 정리하고 적용해본다.== 연산자 == 연산자는 피연산자가 primitive type(int, double, boolean, ...)일 때는 값이 같은지 비교하고, 피연산자가 그 외 객체, reference type일 때 가리키는 주소가 같은지를 검사한다.12345678String str1 = "hello";String str2 = "hello";System.out.println(str1 == str2);//trueString st..
Null Pointer Exception으로 고통 받았다면 Java Optional을 사용해보세요(더 쉽고 깔끔하게 처리할 거에요) Java8 Optional 자바8이 나온지도 3년이 되었고 오라클 JDK의 LTS 버전인 자바11도 나왔는데 웬 자바8의 기능을 소개하냐! 하는 분도 있겠지만, 이제서야 자바8을 도입하는 회사들도 많이 있고 제 공부를 위한 것이니 즐겁게 사용해봅시다.Optional은 Null Pointer Exception(이하 NPE) 처리를 돕는 Wrapper Class다.보통 자바 개발을 하면서 당연하게 객체(Object)를 만들어 사용한다.그런데 C,C++에서 사용하던 포인터를 감췄다는 자바에서도 객체에는 포인터를 사용한다. (reference)그렇기 때문에 모든 객체는 NPE에 대한 검사가 필요하고 방지하는 코드도 필요하다.12List list = getList();List listOpt = list != nu..
자바 스트림(Stream) API 정리, 스트림을 이용한 가독성 좋은 코드 만들기(feat. 자바 람다, 함수형 프로그래밍, 자바8) Java Stream 자바 공부를 하면서 Stream이 무엇인지, 어떻게 사용되고 있는지 인지는 하고 있었으나 실제 코드로 타이핑해보지 않았다.그러던 중 이번에 가볍게 API 훑어보는 식으로 공부를 하면서 코드를 쳐보면서 조금 더 익히게 되었다.Stream은 자바 8부터 추가된 기능으로 "컬렉션, 배열등의 저장 요소를 하나씩 참조하며 함수형 인터페이스(람다식)를 적용하며 반복적으로 처리할 수 있도록 해주는 기능"이다. (InputStream, OutputStream같은 I/O Stream이 아니다.)1234567891011121314List names = Arrays.asList("jeong", "pro", "jdk", "java");// 기존의 코딩 방식long count = 0;for (String ..