Programming 138

Java) new int[Integer.MAX_VALUE]

Large arrays public static void main(String[] args) { int[] arr = new int[Integer.MAX_VALUE]; } 카운팅 정렬(Counting sort)를 실습해 보려고 이것 저것 배열을 만들어 보던 도중, 위의 코드를 실행하자 에러가 발생 했습니다. Exception in thread "main" java.lang.OutOfMemoryError: Requested array size exceeds VM limit 2,147,483,647 의 크기로 생성을 시도 했는데, Java Virtual Machine이 배열의 크기에 제한을 걸어 두었다며 에러가 던져졌습니다. 실제 openjdk 의 코드를 조금 살펴보니, VM마다 각기 다른 배열 크기 제한을..

Programming/Java 2022.04.29

SpringBoot의 JSON 직렬화시 날짜 처리

Intro SpringBoot 버전을 1.5에서 2.5로 마이그레이션 한 이후로 인지하지 못했던 여러가지 변화 들이 하나 둘 씩 더 발견되고 있습니다. 이번에 발견된 변화는 꽤나 당황스러웠는데.. Date 객체를 JSON으로 직렬화 할 때, 그 형태가 달라졌다는 겁니다. API 를 제공하는 입장에서는 일관적인 포맷으로 제공해주는게 굉장히 중요한데 API 스펙 자체가 변경되어 버릴 수 있는 큰 문제 입니다. 비교를 해 보면 Spring Boot 1.5 에 의존하는 프로젝트 Spring Boot 2.5 에 의존하는 프로젝트 스프링 부트 버전이 달라졌을 뿐인데 반환하던 API의 포맷이 변경 되어 버렸습니다. 이 변경을 추적 해 보겠습니다. 다소 내용이 길기 때문에 과정을 건너 띄고 설정 방법만 보려면 Spri..

Gradle 소개 및 Maven 프로젝트를 Gradle로 변경하기

Gradle 소개 Gradle은 다양한 프로그래밍 언어를 지원하는 빌드 자동화 도구 입니다. 빌드는 소스코드로 작성된 파일을 컴퓨터나 휴대폰 등 에서 실행가능한 소프트웨어 가공물로 변환하는 과정을 말하는데요, 자바의 예를 들면 아래의 과정을 거칩니다. 소스 코드 작성 자바 컴파일러가 소스코드.java를 -> 바이트코드.class로 컴파일 테스트 소스 컴파일 테스트 실행(유닛테스트, 통합테스트 등) jar 혹은 war 파일로 패키징 헬스체크 후 빌드 결과 출력 Apache Ant 및 Apache Maven의 컨셉을 기반으로 하지만, XML로 설정파일을 작성하는 Maven과는 대조적으로 훨씬 간단한 Groovy 언어를 사용 합니다. 또한 Gradle은 Apache License 2.0 기반의 오픈소스 이며 ..

Programming/Java 2022.04.23

가볍게 읽어보는 Kotlin) 3. 제어문

안녕하세요. 지난 글에 이어서 이번에는 코틀린에서의 제어문에 대해 알아보려고 합니다. 기존에 이미 자바에 대해 알고있는 개발자들을 대상으로, 코틀린이 java와 다르다고 하는데 얼마나 많이 그리고 어떤것들이 다른지를 알기 쉽게 간단하게 안내하는걸 목표로 한 시리즈 입니다. 기본적으로 자바의 문법을 알고 있음을 전제로 하고 어떤 점들이 다른지 간략하게 코틀린의 제어문에 대해 알아보겠습니다. 조건문 IF if 의 사용은 사실 특별할 게 없기 때문에 거의 같습니다. 자바에서 처럼 if와 else를 활용해서 다양한 조건을 걸어 줄 수 있습니다. val a1 = 5 if (a1 10) { print("a1 > 10") } if (a1 =..

Programming/Kotlin 2022.04.10

java) 래퍼 클래스의 동등 연산자 사용을 피해야 하는 이유

Intro 매주 일요일 11시 30분부터 오후 1시까지, Leetcode에서 진행하는 Contest에 참여하고 있습니다. 여느 날처럼 문제를 풀고 있었고, 로직상 분명 통과 할 거라고 생각했는데, 생각지도 못한 엉뚱한 곳에서 자꾸 무한 루프가 발생하는 일이 생겼습니다. 그래서 디버깅을 진행 하던 중 눈으로 보고도 믿기 힘든 상황이 발생 했습니다. 디버거의 Variables 를 보면, poll 의 value도 128, peek의 value도 128 이지만, 둘의 동등 비교 결과인 same의 결과가 false 로 되어 있습니다. 이 때문에 if 문에서 조건 만족 상황의 블럭에 들어가지 않고 else 구문을 타고 있습니다. 순간적으로 당황을 하긴 했지만, 예전에 같은 경우가 한번 있었고, 그때는 단순 버그나 ..

Programming/Java 2022.04.10

가볍게 읽어보는 Kotlin) 2. 함수와 연산자

Function 기본 함수호출 자바에서는 메서드를 사용하지만, 코틀린에서는 다른 프로그래밍 언어에서 처럼 함수 개념이 존재합니다. 일반적인 함수 사용법은 fun 함수명(파라미터){내용} 이며, 자바 코드로 변환될때는 클래스 내의 메서드로 바뀌게 됩니다. fun main() { printHello() } fun printHello() { println("Hello Kotlin") } 실행 결과 Parameter 함수에 파라미터를 넣을때는 자바와는 반대로 변수명:자료형 으로 작성 합니다. 재밌게도 자바에서 int a 라고 썼지만, 코틀린에서는 a: Int라고 작성 해야 합니다. fun main() { var a = 1 var b = 2 print("a + b = ${plus(a,b)}") } fun plus..

Programming/Kotlin 2022.04.07

가볍게 읽어보는 Kotlin) 1.기본 문법 및 변수와 자료형

Intro 코틀린은 Intelli IDEA를 개발한 JetBrains 사에서 공개한 오픈 소스 프로그래밍 언어 입니다. JVM 위에서 돌아가며 자바와 유사 하지만 간결한 문법과 다양한 기능 추가로 굉장히 호평을 받고 있습니다. 처음 공개된 2011년 에는 그렇게 큰 관심을 받지 못했지만, 오라클이 Java API 저작권으로 좋지 않은 신호를 계속 보이자 Google에서는 2017년 안드로이드의 공식 언어로 Kotlin을 추가 하였습니다. 그 때 부터 비약적인 관심을 받기 시작한 코틀린은 간결한 문법, 예외처리를 강제하지 않음, Null 안정성 등 으로 비약적인 생산성과 코드량 감소로 입소문을 타기 시작하였고, 이제는 흔히 네카라쿠배로 불리는 대기업 IT회사들을 필두로 여러가지 신규 서비스들이 코틀린으로 ..

Programming/Kotlin 2022.04.07

java) 151개의 포켓몬을 모두 모으려면 몇개의 포켓몬빵을 사먹어야 하는가

Intro 출처: 온라인 커뮤니티 포켓몬 빵으로 인해 간만에 온라인이 시끌벅쩍 합니다. 몇 해 마다 이런 특정 아이템의 품귀 현상이 반복되는데, 꼬꼬면과 허니버터칩에 이어 포켓몬까지 셋 다 전혀 다른 성격의 객체들이지만 잠깐의 유행에 그치고 말 것이란건 모두가 경험을 통해 잘 알고 있습니다. 20여년 전에는 맛 없는 빵을 먹는 것도 좋았고 스티커를 모으는 것도 설레였지만 아쉽게도 이제 둘 모두에 흥미를 잃었습니다. 다만 이번 상황을 접하며 모든 스티커를 다 모으려면 평균 몇개의 빵을 사야 하는지가 궁금해졌습니다. 실제 수많은 스트리머들이 수백개씩 빵을 벌크로 구매해서는 모든 스티커 모으기 컨텐츠를 진행하기도 합니다. 수학적인 풀이 방법도 있겠지만 컴퓨터에게 잘만 부탁하면 원하는 정보를 모두 계산해서 알려..

Programming/Java 2022.03.20

Spring Boot 1.5 -> 2.5 마이그레이션 회고

Intro 최근 스프링 부트 1.5 버전으로 작성된 프로젝트를 Spring Boot: 2.5.10 버전으로 올리는 작업을 진행 하였습니다. 스프링부트 앞자리 버전 차이가 굉장히 큰데, 온라인 게임에 비유한다면 메이플스토리에서의 빅뱅 혹은 와우의 대격변 전후를 생각하면 이해가 빠르겠습니다. 단순히 pom.xml에서 버전 명시를 변경한다고 뿅 하고 바뀌는건 아니고, 스프링 부트 변경에 따라 여러가지 클래스가 사라지고 새로 생겨났으며 각종 메서드들의 변화도 상당합니다. 스프링 설정 하는 방법도 달라지고, 구석구석 영향이 가지 않는 곳이 거의 없기 때문에 프로젝트가 크면 클수록 그 여파가 상당합니다. 제가 이번에 마이그레이션을 진행한 프로젝트도 몇년간 진행되며 몇번의 고도화를 거친 프로젝트이다 보니 규모도 제법..

HikariCP) Connection Pool 설정 및 확인하기

Intro 실제 사용하는 커넥션 수에 비해서 커넥션 풀을 넉넉하게 잡고 있었는데, 해당 DB를 여기저기서 다 사용하다 보니 커넥션 풀을 조금 타이트하게 가져가 달라는 요청을 받았습니다. Connection Pool을 조절하고, 실제로 DB에서 커넥션을 몇개나 물고 있는지 확인 해 보도록 하겠습니다. 설정 application.yml 스프링 부트에서 Hikari 설정은 spring.datasource.hikari 에 합니다. 변경 전 spring: datasource: type: com.zaxxer.hikari.HikariDataSource driver-class-name: org.postgresql.Driver url: jdbc:postgresql://localhost:5432/postgres usern..

Java) 클립보드에 텍스트 복사 / 붙여넣기

Intro 저에게 필요한 기능이 있어 쉘에서 간단하게 만들어 보려고 했는데.. shell script에는 제가 익숙하지가 않아서 자바로 프로그램을 작성 하고 alias로 등록 해서 사용하기로 했습니다. 해당 기능을 구현하며 클립보드로 텍스트를 복사해내거나 클립보드에 있는 텍스트를 꺼내오는 기능을 사용 해야 했는데 굉장히 생소해서 해당 내용을 정리 해 보았습니다. 복사, 붙여넣기 코드만 확인 하실분은 복사의 경우 Copy to the clipboard 부분의 코드를, 붙여넣기가 필요한 분은 맨 아래의 argument 없이 실행 부분의 코드만 확인 하시면 됩니다. Requirements 저는 LeetCode 문제풀이를 할 때 테스트 코드 작성이나 디버깅등을 위해 IDE로 옮겨와 작업을 합니다. 매번 적당한 ..

Programming/Java 2022.02.26

JAVA) Equals를 override 할 경우 hashCode도 오버라이드 해야 하는 이유

Intro 몇일 전 Equals를 Override 해서 사용 하던 중, hashCode를 오버라이드 하지 않아 문제가 있었습니다. 많은 java 관련 책들에서는 equals의 오버라이드 시에는 hashCode도 꼭 함께 오버라이드 해야한다고 말하고 있는데, 정작 그 이유를 알지 못해 여태 간과 하고 있었습니다. 그러다 마침내 해당 문제에 봉착 했습니다. equals로 비교 했을 때 같은 값 이라면 Set에 담을 때에는, 별개로 담기지 않아야 하는데 각기 다른 객체로 인식하며 각각 담기는 것 이었습니다. 이로인해 약간의 혼란을 겪은 후로 왜 Equals를 오버라이드 할 때에는 hashCode도 함께 오버라이드 해 줘야 하는 이유에 대해 확실하게 깨달을 수 있었습니다. 이번 경험을 통해 익힌 내용을 쉽고 간..

Programming/Java 2022.02.13

Java) String의 Immutable이 의미하는 것

Intro 자바 개발자들은 Java에서의 String이 immutable 하다는 사실을 대부분 잘 알고 있습니다. 하지만 그 불변의 속성이라는게 이해하기에는 마냥 쉬운게 아닌데요, 혹자는 String temp = "abc"; temp = "123" 의 예를 들며, String 타입 변수인 temp의 값이 변했는데요! 라고 주장 하기도 합니다. 또한, String은 primitive Type(기본 타입)이 아닌 Reference Type(참조 타입) 인데요, 이게 참 헷갈리게 만들때가 많습니다. 참조타입이라서 String을 call by reference로 이용해보려고 하면 그건 또 안되거든요. 그래서 이번에는 String의 불변이 의미하는 것에 대해 자세히 알아보겠습니다. String Object의 생성..

Programming/Java 2022.02.06

JAVA) String 순회 - 배열만들기 vs charAt

Intro 오래전부터 String 을 파싱할 때 마다 고민이 있었습니다. charAt으로 인덱스를 순회하며 해당 위치에 있는 문자를 확인 할 것인가. 아니면 해당 스트링을 캐릭터 배열로 만들어 둔 다음에 배열의 인덱스로 순회 할 것인가. 사실 개인적으로는 배열 인덱스를 찾아 가는게 빠를 거라고 생각해서 charAt을 잘 안썼었는데요. 문득 의문이 들어서 테스트를 해 봐야 겠다는 생각이 들었습니다. 코드 확인 chatAt(index) 먼저 String의 charAt 함수를 확인 해 보았습니다. 코드를 보는순간 너무 부끄러웠습니다. 분명 자바 기초를 처음 학습 할 때, String은 사실 캐릭터 배열이라는걸 배웠었습니다. 배웠다는건 기억 하는데 정작 String의 작동 원리를 여태 잊고 사용 해 왔다는게 내..

Programming/Java 2022.01.29

Java) 컬렉션이나 배열같은 참조 변수의 캡슐화

Intro 행정안전부 소프트웨어 개발보안 가이드 https://www.mois.go.kr/frt/bbs/type001/commonSelectBoardArticle.do;jsessionid=TjAX2IwVk6hpONx8dKSZ4VTj.node10?bbsId=BBSMSTR_000000000015&nttId=88956 지난 주에 행정안전부의 소프트웨어 개발 보안 가이드를 읽다 보니 꽤나 인상적인 부분이 있었습니다. 자바의 캡슐화에 대해 단순히 private으로 변수를 생성하고 그에대해 Setter만 막아 두면, 해당 변수는 외부에서 변경이 불가능 하다고 너무나도 당연하게 여기고 있었는데 해당 문구를 보고 잠깐 고민을 해보니 자바의 캡슐화에 대해 너무 안일하게 생각하고 있었구나 싶었습니다. 캡슐화의 허점 Pub..

Programming/Java 2022.01.23