프로그래밍 언어/자바 & 코틀린
-
[java, kotlin] DecimalFormat은 Thread safe하지 않다.프로그래밍 언어/자바 & 코틀린 2023. 12. 9. 14:16
회사에서 외부로 api 요청을 하는데, 말도 안되는 값이 들어가서 외부 서비스에서 sql 에러가 발생했다. LocalDate로 타입을 아예 정해뒀는데, 로그를 확인해보니 들어간 값이 예를 들어, "-E3498230"로 들어간 것이다. 응? 타입이 정해져있는데 이런 값 자체가 어떻게 넘어갔지하고 디버깅, 테스트, 구글링해보니 원인은 DecimalFormat에 있었다. 결론부터 말하면 DecimalFormat(NumberFormat 또한 같다)은 제목에 적힌것처럼 Thread safe하지 않다. 동시성 이슈는 재연이 어려워서 놓치기 쉽고 발견도 쉽지 않다. 다행인건 빨리 찾아서 이슈를 해결했다는 것이었다. 재연해보기 당시 이슈가 생긴 코드 object ExampleFormatUtils // top-level..
-
[Kotlin] Kotlin 시작하기 전 - 특성, 장점 그리고 철학프로그래밍 언어/자바 & 코틀린 2019. 11. 28. 23:41
코틀린을 카카오에서 처음 사용해봤는데, 그 간결성과 편리함에 완전 빠졌다. 코틀린의 특징, 장점 그리고 철학들을 정리해두자. 특성 1. 대상 플랫폼 : 서버, 안드로이드 등 자바가 실행되는 모든 곳 서버상의 코드(특히 웹 애플리케이션의 백엔드) 안드로이드 디바이스에서 실행되는 모바일 애플리케이션 2. 정적 타입 지정 언어 정적 타입 지정이라는 말은 모든 프로그램 구성 요소의 타입을 컴파일 시점에 알 수 있고 프로그램 안에서 객체의 필드나 메소드를 사용할 때마다 컴파일러가 타입을 검증해준다는 뜻이다. 동적 타입(dynamically typed) 지정 언어는 Groovy, JRuby, Javascript 등이 있는데, 타입과 관계없이 모든 값을 변수에 넣을 수 있고, 메소드나 필드 접근에 대한 검증이 실행 ..
-
[Java] array(배열)과 arrayList(리스트)의 차이(arrayList는 어떻게 동적으로 늘어나는가?)프로그래밍 언어/자바 & 코틀린 2019. 11. 27. 15:56
array(배열)과 arrayList(리스트)의 차이 arrayList는 사이즈가 동적으로 알아서 늘어나주니 찾아볼 생각을 못하다가 어떻게 내부적으로 size가 늘어나는지 코드를 분석해봤다. 일단 기본적인 차이부터 살펴보자 1. Implementation of array is simple fixed sized array but Implementation of ArrayList is dynamic sized array. 배열은 크기가 고정되어있지만 arrayList는 사이즈가 동적인 배열이다. 2. Array can contain both primitives and objects but ArrayList can contain only object elements 배열은 primitive type(int, ..
-
[Java] java8에서 생긴 람다(Lambda)를 쓰는 이유는 뭘까?(짧음 주의)프로그래밍 언어/자바 & 코틀린 2019. 9. 7. 17:43
java 7까지만 써오던 내가 새로운 회사의 기술 스택으로 람다, 함수형 프로그래밍을 이해해야할 이유가 생겼다. 왜 람다를 사용할까? 주로 인터넷에서 본 이유는 아래와 같다. 1. 간결성 2. 불필요한 코드 증가의 감소 3. 가독성 4. 코드의 재사용성 5. 적은 보일러플레이트 코드(정렬 알고리즘 풀 때 느끼는 @Override comparator...) 6. 병렬 프로세싱의 기회 개인적으로, 간결성에 강조를 하는게 람다였던 것 같다. 솔직히 나처럼 람다를 처음 접하는 사람은 람다의 흐름을 캐치하기가 무척 힘들다. 익숙해지면 함수형 프로그래밍이 읽기 수월하고 코드가 짧아서 좋다고 하는데 그때까지는 코드를 읽는데 어려움이 있다. 그렇다면 기능적으로는? 모든 람다의 핵심은 지연실행(deferred execu..
-
[Java] 왜 private 상수는 관습적으로 private static final로 선언할까?프로그래밍 언어/자바 & 코틀린 2019. 7. 30. 13:09
private static final과 private final의 차이 public으로 사용하는 상수 타입은 enum을 이용하고 있다. 클래스 내부에서만 간단하게 사용할 상수를 만들 때, 아무 생각 없이 private static final을 사용하고 있는 나 자신을 보며 미리 초기화 값을 넣고 상수로 쓸거면 private final만 써도 되지 않나? 라는 의문을 갖기 시작했다. 예를 들면 아래의 예시처럼 일반적으로 사용하고 있었다. public class ChocolateController { // logger를 선언할 때 private static final Logger logger = LoggerFactory.getLogger(ChocolateController.class); // 연차의 코드 값..
-
[Java] 터미널(terminal)로 war 파일 만들고 푸는 법프로그래밍 언어/자바 & 코틀린 2019. 3. 17. 14:46
war 파일 만드는 방법.md war파일로 묶는 법 - terminal로 war로 만들고자 하는 디렉토리로 이동한다. - 만들고자하는 war 파일이름으로 아래와 같이 커맨드를 입력한다. jar cvf [만들고자하는 war파일명].war * 이런식으로 war 파일로 압축한다. war파일 푸는 법 - terminal에서 war파일이 있는 곳으로 디렉토리를 이동한다. - 풀고자하는 war 파일 이름으로 아래와 같이 커맨드를 입력한다. jar xvf [풀고자하는 war파일명].war 요런식으로 war파일을 풀어준다. 출처: https://yangyag.tistory.com/427
-
[Java] java 파일을 class 파일로 컴파일 하는 방법(한글 인코딩 포함)프로그래밍 언어/자바 & 코틀린 2019. 1. 30. 08:48
스프링 프로젝트에서 특정 파일만 class 파일로 컴파일 하려고 했는데, import 되는 대상이 없으면 error가 났다. 컴파일을 위해서는 import 되는 파일이 모두 포함되어 있어야 하는 것 같았는데, 기본적인 java만 class로 만드는 건 어떻게 할까하는 궁금증에 찾아봤다. 요렇게 생긴 java 클래스를 만들었다. HelloWorld.javapackage com.concept; public class HelloWorld { public static void main(String[] args) { System.out.println("안녕? 세계야"); } } java를 class파일로 컴파일 하는 건 간단하다. 해당 경로를 찾아가서 아래처럼 javac 명령어에 java 클래스 명만 불러주면 된..
-
[java] 두 날짜간 월 차이 구하기프로그래밍 언어/자바 & 코틀린 2018. 12. 10. 22:54
두 날짜간의 월 차이 구하기 자동으로 월차를 생성해주는 스케줄러를 구현 중이다. 두 날짜간의 월 차이를 알아내는 함수를 구현해야 했다. 예를 들어, 2018년 12월 1일에 스프링 스케줄러가 실행되면 2018년 7월 16일에 입사한 사람은 8월 1일부터 월차가 발생한다고 가정했을 때, 8월, 9월, 10월, 11월, 12월까지 총 5개의 월차가 발생해야 한다. 그래서 일(day)은 상관없이 월끼리만 계산해주면 된다. 아래는 구현한 함수다. 참 쉽죠잉? ㅎ /** * 두 날짜간의 월 차이 구하기 * */ private int getMonthsDifference(Date date1, Date date2){ /* 해당년도에 12를 곱해서 총 개월수를 구하고 해당 월을 더 한다. */ int month1 = d..