본문 바로가기

Java/JAVA

(45)
자바 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에 대한 검사가 필요하고 방지하는 코드도 필요하다. 1 2 List list = getList(); List listOpt = li..
자바 스트림(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 ..
JAVA에서 날짜,시간 제대로 사용하는 LocalDate, LocalTime, LocalDateTime (NTP 시간 서버에서 정확한 시간 받아오기, json object 받기, JPA 테스트 with LocalDateTime) 아직도 Calendar, Date 사용하니? 자바에서 아직도 Calendar.getInstance해서 시간/날짜를 표현하는 프로그래머가 있을까?처음 공부할 때나 단순하게 표현해야할 때는 사용할 수 있지만 단점이 극명한 클래스라 사용하지 않는게 좋다는 것을 미리 말한다.어떤 문제점이 있는지는 네이버 D2의 글에서 잘 설명해준다.Calendar, Date 클래스의 문제점 (출처 : https://d2.naver.com/helloworld/645609 )1. 불변 객체가 아니다.-> 즉 set으로 변경이 가능하다는 점은 누군가 악의적으로 변경할 수 있기 때문에 get/set 메서드에서 직접 Date클래스를 사용하는 것이 위험하다.2. 상수 필드 남용-> calendar.add(Calendar.SECOND, 2..
Apache POI를 이용해서 자바에서 엑셀(xls, xlsx)파일 입출력 하는 방법(엑셀 자료 정리를 matlab 대신 자바로 해버렸습니다.) Apache POI를 이용한 엑셀 파일 입출력 보통 자바에서 .log(txt), .csv, .properties, .ini 같은 파일을 자주 사용하지 엑셀파일은 잘 다루지 않는다.하지만 대량의 자료를 정리할 필요가 있어서 한 번 사용해보았다.- Apache POI 라이브러리 적용하기 메이븐을 이용해서 라이브러리를 불러왔다. pom.xml에 추가한다. (현재 3.17버전까지 나왔다.)12345 org.apache.poi poi 3.13 - 코드 보기 전 상황 요약 : 이 안에 아래의 엑셀파일 리스트들이 쭉 있음 : 년도도 파일마다 다름 : 어떤 날은 측정을 하고 어떤 날은 측정을 안한 상황 이 상황에서 원하는 결과값은?해당 디렉토리별로 엑셀 시트를 만들어서 왼쪽에 날짜와 측정값을 세로로 정렬해보자!(여기서..
자바 쓰레드를 거의 정확한 주기로 실행하는 방법!(로직 수행 시간에 관계없이 정확한 주기 만들기,Timer, ScheduledExecutorService) 자바 쓰레드를 거의 정확한 주기로 실행하는 방법 (사족) "정확한 주기"로 실행하는 방법을 쓰게된 이유는 거의 비슷할 것이다.어떤 애플리케이션을 개발할 때 백그라운드에서 일정 주기마다 어떤 값을 검사하거나 보내는 등의 특정 로직을 수행하는 기능(쓰레드)이 필요하기 때문이다.나 역시도 데이터를 짧은 주기마다 보내야하는 로직이 필요했다.그래서 쓰레드의 주기하면 단순하게 떠오르는 것이 Thread.sleep() 메소드였다. - sleep()으로 될까?단순하게 쓰레드의 run() 메소드에 sleep(1000);을 적어서 1초쉬고 해당로직을 수행하게 했다.시간(주기)이 애플리케이션에서 치명적이지 않다면 간단하면서 쉬운 방법이다.하지만 시간이 정확해야하는 애플리케이션에서는 로직 수행시간이 추가되면서 지속적인 오차 ..
자바 압축 라이브러리 비교 및 사용법을 담은 예제 (내장패키지 java.util.zip , zip4j, apache commons-compress, google snappy-java) 자바에서 압축이 필요할 때? 자바에서 압축이 필요한 경우는 언제일까?- 사용자가 요청한 데이터를 압축해서 (다운로드 가능하게) 파일로 보내줘야할 때- 로그를 파일에 쌓고 파일을 압축하거나 로그 파일의 내용(문자열)을 압축해서 DB에 저장할 때- 압축파일 내부에 .exe파일이 있는지 검사할 때 (조금 다른 예시)기타 여러 경우가 많이 있으나 생략한다.사실 리눅스에서는 crontab 과 DBMS에서 제공하는 명령어로 압축하고 저장할 수 있기도 하다. (꼭 자바(프로그래밍 단)에서 할 필요는 없다.)어떤 경우든 결국은 압축이 필요하고 압축이 필요할 때 적절히 프로그래밍할 줄 알아야 한다.압축의 용도와 성능 압축률이 엄청나게 좋아서 1/10로 크기를 줄인게 무조건 성능이 좋다고 말할 수 있을까?물론 여전히 압축..