Programming/Java 36

[Java] Optional 올바르게 사용하기

Intro 자바가 8버전으로 넘어오며 추가된 기능들이 굉장히 많이 있습니다. 보통 가장 먼저 언급되는 Lamdba와 Stream API 뿐만 아니라 조금의 차이는 있지만 Joda-Time을 그대로 가져온듯한 날짜와 시간 API, 인터페이스에 추가된 Default 메서드와 static 메서드 등 지금까지 이 기능들 없이 어떻게 코드를 짰을까 싶은 요소들이 굉장히 많습니다. 그중에서도 둘째로 치면 서러워 할 클래스가 있으니 바로 Optional 입니다. Optional java.util.Optional.java 자바 아키텍트인 Brian Goetz는 결과 값이 없음을 명확하게 표현 하려는 의도로 Optional을 추가했다고 합니다. 자바8 이전까지는 null이 그 역할을 해 왔지만, null을 사용할 경우에..

Programming/Java 2022.07.21

[Java] switch 문이 if-else 보다 효율적인 이유

Intro 코드를 작성하다 보면 switch 문으로 작성할지, 혹은 if-else 를 사용할 지 고민될때가 자주 있습니다. 개인적으로는 보통 elseif 가 두개이상 붙게되는 시점부터는 보통 코드의 가독성이나 문맥에 따라 switch 문을 사용 하려 하고 있습니다. if.java void function(String args) { if ("a".equals(args)) { // A logic } else if ("b".equals(args)) { // B logic } else { // C logic } } switch.java void function(String args) { switch (args) { case "a": // A logic break; case "b": // B logic break..

Programming/Java 2022.07.09

[JAVA] zxing 활용해 QR코드 생성하기

Intro COVID 19 이후로 정말 많은것이 달라졌습니다. 하나하나 나열하기도 힘든 만큼 일상 생활 속에서 달라진 것 들이 많지만 그 중 하나의 기술을 뽑자면 QR 코드가 아닐까 싶습니다. 아주 오래전부터 있었지만 별다른 주목을 받지 못했고 그렇게 잊혀지는가 했는데 코로나로 인한 방문 기록, 전자문진표 등 조금씩 많이 쓰이는가 싶더니 카카오페이를 비롯한 여러가지 간편결제 서비스가 많아지면서 없어서는 안 될 기술이 되었습니다. 어플리케이션을 만들 때에도 곳곳에 QR코드를 활용 할 일이 많아졌는데요, QR코드 생성 한다면 크게 두가지 방법이 있습니다. 구글의 QR Codes API 에 요청 QR 코드를 작성하는 OpenSource를 활용해 로컬에서 생성 얼핏 보면 외부 API를 활용 하는게 간단해 보이는..

Programming/Java 2022.06.30

JAVA) 자바에서는 Call By Reference가 불가능 합니다.

Intro 사실 자바를 처음 배우고나서 최근까지도 함수를 호출 하여 파라미터가 전달 될 때에 primitive 타입인 경우에는 value가, 그 외에는 reference가 전달 된다 라고 알고 있었습니다. 자바에서의 Primitive 데이터 타입들 byte short int long float double boolean char String의 경우에만 String pool을 통해 immutable로 관리되기 때문에 primitive가 아님에도 call by reference가 되지 않지만 Java) String의 Immutable이 의미하는 것 그 외에는 reference가 넘어간다고 알고 있었는데요 그 개념 하에서는 LinkedNode 나 Trie 등을 다루는 메서드를 짤 때 마다 뭔가 생각한 대로 동..

Programming/Java 2022.06.06

JAVA) Date 를 LocalDateTime 으로, 혹은 그 반대로 변환하기

Intro 제법 오래된 프로젝트를 유지보수 하고 개선하다보니, Date 타입을 다루어야 할 일이 제법 많이 있습니다. Date API는 JDK 1.0 부터 제공된 유구한 역사를 가진 클래스인데요, 워낙 문제가 많다보니 JDK 1.1에서 바로 Calendar 클래스가 추가 되며 Date의 많은 메서드들을 @Deprecated 시켜버렸지만 여전히 오랜기간 꾸준히 애용되어 왔습니다. 그러다 마침내 JDK 1.8 버전에서 JodaTime 의 날짜와 시간 API가 추가되면서 LocalDateTime 이나 LocalDate를 사용 할 수 있게 되었습니다. 기존에 있는 Date를 걷어낼 수 있으면 참 좋겠지만, 그럴 여유가 없을 경우에는 일단 새로 작성하는 코드들에서 최대한 Date 사용을 피하지만, 어쩔 수 없이 ..

Programming/Java 2022.05.23

Java) HashMap에서 특정 value를 제거하기

Intro Map에서 특정 key를 가진 EntrySet을 제거하는건 어렵지 않습니다. map.remove(삭제할key객체) key로 제거 하는 것 뿐만 아니라, key와 value를 모두 인자로 넘겨서 해당하는 key-value 쌍이 있을때에만 제거하는 방법도 있습니다. 그렇다면 특정 값만 제거 하고 싶다면 어떻게 해야 할까요? values().remove(Object value) 단순 궁금증에 values()로 값들이 들어있는 컬렉션 객체를 불러 온 뒤에, 거기에서 remove 메서드를 호출 해 보았는데 정말 감쪽같이 key, value 쌍이 모두 사라졌습니다. values는 제거가 될 거라고 생각했지만, keySet은 변화가 있기 때문에 오류가 발생하거나 혹은 문제가 생길 거라고 예상 했는데 기대한..

Programming/Java 2022.05.13

JAVA) Private method를 테스트 하는법

Intro 간단하게 만든 private 메서드가 잘 작동하는지 궁금했습니다. 기존에 이미 작동하고 로직의 계속 반복되던 부분을 private 메서드로 따로 추출해서 반복을 제거 하려는 의도 였는데.. 이게 쏘아올린 작은 공이 생각보다 많은 생각을 하게 만들었습니다. 일단, 일반적인 방법으로는 private 메서드를 테스트 해 볼 수 없었는데요, 애초에 호출을 하지 못하니 테스트도 불가능한게 당연합니다. private method를 테스트 해야할까? TDD의 아버지이자, Junit의 창시자인 켄트벡은 2020년 어느날 트위터에 아래의 링크를 남겼습니다. http://shoulditestprivatemethods.com/ 해당 링크에 방문 해 보면, 하얀 바탕의 한 가운데에 NO라고 96px의 큰 글자만을 ..

Programming/Java 2022.05.09

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

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

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

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

Programming/Java 2022.04.10

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

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

Programming/Java 2022.03.20

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