Programming/Java 31

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

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

CSV 포맷 소개 및 자바로 CSV 파일 작성 하기

CSV 파일형식 소개 CSV(Comma Separated Values)는 몇 가지 필드를 단순히 쉼표(,)로 구분한 텍스트 데이터 및 텍스트 파일 입니다. 장점으로는 표의 형태를 직관적으로 나타내는 간단한 형식이기 때문에 이해하기가 쉬우며, 소프트웨어로 처리하는 것 또 한 쉽습니다. 데이터에 , 가 포함되지 않았다면 간단한 코드 한 만으로도 구현이 가능 할 정도 입니다. 또한 쉼표만으로 구분하며 이스케이프 문자는 선택 사양이니 매우 경량입니다. 이름, 나이, 주소 Shane, 10, ThornHill Jenny, 20, Devonport Ann, 30, Queenstown 한눈에 보기에도 정말 간단합니다. 그 단점으로는 데이터에 쉼표가 포함된다면 곤란해 진 다는 것 입니다. 예를 들어 데이터중에 금액 데..

Programming/Java 2021.11.17

자바에서 YAML 파일 작성하기

YAML https://yaml.org YAML 이란 YAML은 사람이 읽을 수 있는(human-friendly) 데이터 직렬화 언어 입니다. 모든 프로그래밍 언어 사이에서 호환 됩니다. 서로 다른 시스템 간에 데이터를 주고 받기 위해서는 데이터 직렬화 뿐만 아니라, 데이터 포맷에 대한 약속이 필요한데요, 우리가 흔히 사용하고 있는 XML 이나 Json 등도 그 중 일부 입니다. 이전까지 xml이 많이 쓰였지만, json이 뜨면서 xml은 대부분 사장되었는데요, 아무래도 xml이 json 형태에 비해 굉장히 거추장 스럽고 한눈에 들어오지도 않았기 때문 이라고 생각합니다. XML에서 JSON으로 발전 한 것 처럼, YAML은 json 보다도 더 비교적 직관적이고 읽기 편리합니다. XML, JSON과의 비교..

Programming/Java 2021.11.16

java) 여러개의 파일 압축해 zip파일 생성

압축파일 생성 java에서도 파일을 압축 하고 압축을 해제 할 수 있습니다. 심지어 java.util.zip 에 기본적으로 포함 되어 있기 때문에 외부 라이브러리를 사용하지 않고도 손쉽게 구현 할 수 있습니다. 아주 간단한 예제를 만들어서 실습 해 보겠습니다. 사전준비 사실 준비라고 할 것도 없고, 그냥 압축 할 파일을 몇개 준비시켜 둡니다. Terminal 을 켜서 파일들의 경로도 미리 확인을 해 둡니다. 코드작성 세개의 파일을 토대로 File 객체를 생성 한 후, ArrayList에 담아서 순회하고, 압축파일을 생성하는 코드를 작성 해 보았습니다. 딱히 어려운 내용이 없으니 코드를 보면 내용들이 이해 되실거에요. package com.tistory.shanepark.file.zip; import ja..

Programming/Java 2021.11.11

JAVA에서 비동기 HTTP 요청시 멀티파트 파일 전송 (ContentTooLongException: Content length is unknown)

문제 Multipart 요청을 비동기로 다른 API 서버에 보내려고 하는데 에러가 발생했습니다. 사용자가 업로드 한 파일에 문제가 있는지 (금지 단어 포함 등) 를 확인 하기 위해 어플리케이션 내부에서 해당 파일을 또 다른 어플리케이션(파일 검사API)으로 보내는 로직을 수행하도록 구현을 하고 있었습니다. 사용자에게서 받은 Multipart file을 그대로 다시 API 서버로 전송을 하는데, Single Thread로 수행 했을 때는 문제가 없었습니다. 하지만 Single Thread로 수행 시, 요청한 사용자 입장에서는 파일 업로드에 걸리는 시간이 사용자 -> 어플리케이션서버 -> 검증API서버 이렇게 이렇게 두배로 늘어나게 됩니다. 그래서 어플리케이션 내부에서 검증 서버로의 전송은 비동기 요청으로 ..

Programming/Java 2021.11.05