본문 바로가기

언어/JAVA17

[JAVA] 코테용 함수들 코딩테스트를 하다보면 List, Set, Map 등의 자료구조를 가져와서 써야할 때가 많다. 대부분은 평소 개발을 하거나 코딩테스트 연습 문제를 풀때는 딱히 인식을 하지 않아도 그냥 손가락이 알아서 쳐주는 함수들인데, 이상할 정도로 코딩 테스트만 가면 기억이 안나는 경우가 허다하다. 그래서 "언젠가는 정리해놓아야지..." 하다가 이제서야 정리를 한 번 해볼까 한다. List 형변환 일단 가장 먼져 형변환 코드이다. array list // array if(true) { // array > list String[] arr = new String[] {"a", "b", "c"}; List list = Arrays.asList(arr); System.out.println(list); // list > arra.. 2023. 7. 8.
1970년 01월 01일 00시 00분 00초 개발을 하던 중 쿼리파라미터를 입력받아 해당 쿼리에 맞는 데이터를 HBase에서 추출하는 요구사항을 만났다. 쿼리파라미터에는 시작일~종료일 사이의 데이터만을 뽑아내는 옵션도 존재했는데, 이 변수가 참 애매하게 잡혀있었다. 설명하자면 너무 복잡해지고 보안상 좋지 않을 수 있으므로 일단 설명은 패스하겠다. 어찌됐든 DB에 쿼리를 날릴 때 startDate와 endDate는 무조건 있어야 겠다는 생각이 들었다. 그래서 코드를 짤 때 막연하게 이렇게 생각했다. "쿼리에 startDate와 endDate가 입력되지 않은 상태면... 그냥 대충 startDate는 1900년 01월 01일로 하고 endDate는 오늘날짜로 하면 되겠다!" 그래서 얼추 아래와 비슷하게 코드를 구현해놓았다. Calendar startC.. 2023. 3. 17.
JDBC 사용법 DB내 특정 테이블을 다른 DB내 테이블과 동기화시켜야 하는 요구사항이 발생했다. 해당 기능의 구현을 위해서는 Spring의 DataSource를 두 개로 설정해서 개발해도 되지만, "고작 테이블 하나를 퍼오는 작업에 굳이 그 정도의 노력을 감수해야 할까?" 하는 생각이 들었다. 결과적으로 그 정도의 노력을 감수하고 싶지 않았고, 해당 기능은 일반 JDBC로 사용하기로 결심했다. 그러나 JPA에 너무 익숙해진 탓에 일반 JDBC를 사용하는 방법을 잊어먹어버렸고, 똑같은 상황이 발생할 경우 언제든 다시 사용할 수 있도록 코드를 저장해놓고자 한다. import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStateme.. 2022. 7. 25.
리눅스 OS에 명령어 보내기 Java 프로그램이 OS내 자원을 주기적으로 관리해야 하는 요구사항이 생겼다. 이에 해당 요구사항 구현을 위해 구글링을 해본 결과 ProcessBuilder를 사용하는 것이 간편해보여 이를 통해 구현을 완료했고, 언제든 사용할 수 있도록 해당 내용을 저장하고자 한다. import java.io.BufferedReader; import java.io.InputStreamReader; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; = @Service public class SomeService { Logger logger = LoggerFactory.getLogger(S.. 2022. 7. 21.
[JAVA] 온점 단위 Split 기존 프로그램을 수정하는 과정에서 원래의 기능을 새로운 기능에 접목시키기 위해, 몇 개의 변수를 온점 (.) 단위로 스플릿을 할 일이 생겼다. 예를 들어 123.456.789 라는 String이 있으면, 당연히 {Variable}.split("."); 와 같이 split을 하면 돌아갈 줄 았았다. 하지만 위 함수의 결과값인 배열은 length가 0이 나온다. 즉 빈 배열이 반환된다. 이유라면 split은 원래 정규식을 파라미터로 받는 함수이고, 정규식에서 온점(.) 은 하나의 임의의 문자로 인식을 하기 때문이었다. 그래서 위의 경우에는 정규식을 사용하여 다음과 같이 사용하면 온점 단위 Split이 가능함을 확인하였다. {Variable}.split("[.]"); 2022. 3. 10.
[JAVA] Call by Value & Call by reference 두 방식은 메소드 (함수, Function)을 호출할 때 해당 메소드에 파라미터를 넘겨주는 방식이다. 이 중 값을 넘겨주는 방식을 Call by value, C++에서는 포인터라고 표현되는 참조값을 넘겨주는 방식을 Call by reference라고 한다. Call by value는 단순히 값만 넘겨주는 방식이므로 파라미터로 넘겨준 값이 변해도 원래 변수의 값은 변하지 않는다. 하지만 Call by reference는 참조값을 넘겨주는 방식이기에 변수의 값이 변하면 원래 변수의 값도 변하게 된다. 그렇다면 JAVA는 Call by value 일까, 아니면 Call by reference일까? 아래의 예시를 보자. public class HelloWorld{ public static class exampl.. 2021. 4. 29.
[JAVA] == vs equals vs hashCode == 객체, 참조 타입에서 가리키는 주소가 같은지 확인한다. 즉, 같은 객체인지를 확인한다. equals() 객체의 내용 (값)이 같은지 확인한다. hashCode() 메모리에서 가진 해시 주소값을 반환한다. 상세하게 설명하면 주소값를 비교함으로써 같은 객체임을 확인하는 함수이다. 하지만 hashCode를 사용한 비교는 그렇게 정확하지 못한데, hashCode는 객체마다 유일한 값을 리턴하지 않고, 다른 객체임에도 같은 hashCode를 갖는 경우가 생기기 때문이다. 같은 hashCode를 갖게 되는 것은 HashTable이 의 형태로 데이터를 저장할 때, 키 값을 기준으로 해시값을 만들기 때문이다. 이 때 HashTable은 크기가 한정적이기에 서로 다른 객체가 같은 해시값을 가질 수 있다. 이를 해시.. 2021. 3. 30.
[JAVA] Garbage Collection (GC) 자바의 코드와 C 계열 언어들의 코드를 비교해보면, C 계열 언어는 클래스 선언 시 생성자와 소멸자를 정의해주지만, 자바의 경우에는 생성자만 정의하곤 한다. 이러한 차이점은 C 계열 언어들과 달리 자바에서는 개발자가 굳이 메모리를 해제하지 않아도 되기 때문이다. 그 이유는 GC 때문이다. JVM의 GC는 더 이상 사용되지 않는 인스턴스를 찾아 메모리에서 삭제하는 역할을 수행한다. GC는 메모리의 힙 영역을 돌아다니며 더 이상 사용되지 않는 인스턴스에 할당된 메모리를 삭제하는데, 이를 위해 자바는 GC를 실행하기 위해 GC의 쓰레드를 제외한 다른 쓰레드들을 전부 잠시 멈추었다가, GC의 동작이 완료된 이후 재개해야 한다. 이러한 동작을 Stop the World 라고 한다. Stop The World는 당.. 2021. 3. 30.
[JAVA] String, StringBuffer, StringBuilder 자바에서 문자열을 다룰 때, 대표적으로 String, StringBuffer, StringBuilder를 사용한다. 사실 데이터의 변경이 많지 않을 때, 즉 연산이 거의 없을 때는 위의 클래스 중 어느 클래스를 사용하여도 큰 문제는 없다. 하지만 세 개의 클래스는 분명 다른 목적으로 개발되었고, 그 차이점은 개발자 면접 질문에서 자주 출제되는 질문이다. String은 원래 불변이다. 즉, 원래는 변할 수 없는 클래스이다. 하지만 Java에서 String은 변경이 가능하다. String str = "abc"; str += "de"; System.out.println(str); 위처럼 코드를 구동해보면 출력은 abcde가 된다. 즉, 변할 수 있다. 하지만 그 변화하는 과정이 조금 비효율적이다. str을 선.. 2021. 3. 30.
[JAVA] BufferedReader와 Scanner 자바는 콘솔에서 입력을 받을 때 가장 자주 사용하는 두 가지 클래스가 있다. 하나는 BufferedReader, 다른 하나는 Scanner이다. 두 클래스는 콘솔에서 입력을 받는다는 공통점이 존재하지만, 차이점도 존재하는데, 가장 큰 차이점은 바로 속도이다. BufferedReader는 버퍼를 사용해 입력을 받는다. 즉 키보드가 입력될 때마다 한 문자씩 버퍼로 이동하여 저장하고, 버퍼가 가득 차거나 줄바꿈이 일어나면 버퍼의 내용을 한 번에 전송하는 방식으로 사용된다. 이러한 점은 기존의 문자열을 한 글자 단위로 읽는 InputStreamReader에서 발전한 형태이며, 속도가 빠르다는 장점이 있다. 그렇기에 알고리즘 문제에서 Scanner 대신 자주 사용된다. BufferedReader의 단점은 모든 입.. 2021. 3. 30.
HashSet import java.util.HashSet; //선언 HashSet arr = new HashSet(); //추가 arr.add(0); arr.add(1); //삭제 arr.remove(0); //0 값 삭제 arr.clear(); //모두 삭제 //검색 arr.contains(0); //false //크기 arr.size(); //출력 System.out.println(arr); //전체 Iterator itr = arr.Iterator(); while(itr.hasNext()) { System.out.print(iter.next() + " " ); } //정렬 ArrayList arrList = new ArrayList(arr); Collections.sort(arrList); 2020. 10. 27.
[JAVA][ARRAYS] 배열 비교 배열은 equals나 ==이 아닌, Arrays.equals()로 비교한다. import java.util.Arrays; Arrays.equals(arr1, arr2); //true false 2020. 5. 26.