포스트

2020-11-17-TIL

문자열 분리

String.split() vs StringTokenizer

문자열을 구분자로 나누는 방법은 두 가지가 있다. String.split()은 정규 표현식을 받아 배열을 돌려주고, StringTokenizer는 토큰을 하나씩 꺼내 쓰는 방식이다. 차이는 빈 값을 다루는 방식에서 드러난다. "호호호,23,,여자"처럼 구분자 사이가 비어 있으면 split()은 빈 문자열을 하나의 요소로 만들어 주지만, StringTokenizer는 그 자리를 건너뛴다.

StringTokenizer Javadoc은 이 클래스를 호환성 때문에 남겨 둔 legacy 클래스로 분류하고, 새 코드에서는 String.split()이나 java.util.regex 패키지를 쓰라고 권한다.


날짜와 시간

Java Date, Time

java.util.Date(JDK 1.0)와 Calendar(JDK 1.1)는 오래된 API이고, JDK 8부터는 java.time 패키지의 LocalDateTime, ZonedDateTime 같은 클래스가 제공된다. 옛 API는 Date를 돌려주는 메서드 이름이 getTime()인 것처럼 이름만으로 반환 타입을 짐작하기 어렵고, cal.add(Calendar.DATE, 1) 같은 정수 상수 연산은 잘못된 값을 넣어도 컴파일 시점에 잡히지 않는다. java.sql.Date는 JDBC에서 SQL DATE 값을 다루기 위해 java.util.Date를 감싼 클래스다.

How to get hour, minute in Java

현재 시각에서 시와 분만 꺼내는 방법을 찾았다. Date의 getHours()는 deprecated이고 Javadoc은 Calendar.get(Calendar.HOUR_OF_DAY)로 대체하라고 안내하므로, 이 방식이나 java.time의 LocalDateTime을 쓰는 쪽으로 정리된다.

Calendar

콘솔에 달력을 출력하는 방법도 함께 찾아봤다.

How to get current time using Calendar in Java

Calendar Javadoc은 Calendar rightNow = Calendar.getInstance();처럼 getInstance()로 현재 시각이 들어간 객체를 얻으라고 안내한다. 이름이 getInstance()라서 싱글톤처럼 보이지만 직접 비교해 보면 다르다.

1
2
3
Calendar cal = Calendar.getInstance();
Calendar cal2 = Calendar.getInstance();
System.out.println(cal == cal2);

it’s not singleton

호출할 때마다 새 객체를 돌려주므로 false가 출력된다. getInstance()라는 이름은 정적 팩토리 메서드일 뿐 싱글톤을 보장하지 않는다.

Date refresh without create new instance

이미 만든 Date 객체를 새로 만들지 않고 현재 시각으로 갱신하는 방법을 찾았다. Date는 가변 객체라 setTime(System.currentTimeMillis())로 값을 바꿀 수 있다.


콘솔 출력

How to clear screen in Java

C의 system("CLS")에 해당하는 기능이 Java에는 없다. Windows에서 Runtime.getRuntime().exec("cls")가 동작하지 않는 이유는 cls가 실행 파일이 아니라 명령 줄 인터프리터의 내장 명령이기 때문이다. 그래서 new ProcessBuilder("cmd", "/c", "cls").inheritIO().start().waitFor()처럼 cmd를 거쳐 실행하고 출력 채널을 현재 콘솔에 연결해야 한다. ANSI 이스케이프 시퀀스를 지원하는 터미널에서는 System.out.print("\033[H\033[2J")로 화면을 지울 수도 있다.

How to initialize/fill 2d array with 0 in Java

JLS에 따르면 배열 요소는 생성될 때 기본값으로 초기화되고, int의 기본값은 0이다. 따라서 new int[n][m]은 이미 0으로 채워져 있다. 다른 값으로 채우려면 Arrays.fill()이 1차원 배열만 받으므로 행마다 호출해야 한다.

Java set color in console

콘솔 글자 색도 ANSI 이스케이프 코드(\u001B[31m 등)를 출력해 바꾸는 방식이다. 터미널이 ANSI 코드를 지원해야 적용된다.


컬렉션과 래퍼 클래스

Map

K,V 구조의 자료구조

1
Map<String, Long> map = new HashMap<>();

제네릭 타입에는 객체로 전달을 해야하므로 프리미티브 타입을 객체로 사용하려면 Wrapper클래스를 사용하면 된다.

HashMap vs HashTable

HashMap Javadoc은 HashMap이 동기화되지 않고 null을 허용한다는 점을 빼면 Hashtable과 거의 같다고 설명한다. 순서는 보장하지 않는다.

Wrapper Class

1
Long x = 100L;

변수 = 리터럴 상수

자바 최신버전에서는 자동으로 오토박싱/언박싱으로 자동 캐스팅을 해준다.

Java Tutorials는 오토박싱을 기본 타입과 대응하는 래퍼 클래스 사이에서 컴파일러가 자동으로 하는 변환으로 정의하고, 반대 방향을 언박싱이라고 부른다. 정확히는 캐스팅이 아니라 컴파일러가 Long.valueOf(100L) 같은 변환 코드를 넣어 주는 것이다.

Java Optional

null 체크는 if문으로 체크하는 것보다 Optional을 이용하는것이 더 최신 feature

Kotlin은 Optional이 기본형이다 -> NullPointerException이 예방된다.

Optional은 null이 아닌 값을 담고 있을 수도, 비어 있을 수도 있는 컨테이너 객체다. 참고한 글은 Optional의 의도를 메서드가 돌려줄 결과가 없음을 명확히 표현하는 데 두고, 필드로 쓰거나 컬렉션을 Optional로 감싸 반환하지 말라고 정리한다. Kotlin은 Optional을 쓰는 대신 타입 시스템에서 null을 담을 수 있는 nullable 타입과 그렇지 않은 non-nullable 타입을 구분해 NPE를 막는다.

객체를 멤버값이아닌 주소값으로 정렬을 한다던가 가끔 사용하는 경우가 있다

자바에서는 var보다 명확하게 타입을 적어주는 것이 좋다?


운영체제와 데이터베이스 개념

Process and Thread

프로그램은 항상 파일이 있고, 사용자가 어떤 작업으로 하고 다시 파일로 저장

CPU - Memory - SSD/HDD

프로세스는 디스크에 설치된 프로그램이 메모리에 올라와 실행 중인 작업이다. 프로세스마다 Code, Data, Stack, Heap으로 이루어진 독립된 메모리 영역을 받는다. 스레드는 한 프로세스 안에서 실행 흐름을 나눈 단위로, 같은 프로세스의 메모리를 공유한다.

하이퍼 스레딩

인텔 하이퍼 스레딩 기술은 각 코어에서 둘 이상의 스레드를 실행할 수 있게 하는 하드웨어 기술이다. 물리 코어 하나가 운영체제에는 논리 코어 두 개처럼 보인다.

가상화

가상화는 물리적인 하드웨어 장치를 논리적인 객체로 추상화하는 것이다. 하나의 장치를 여러 개처럼 쓰거나 여러 장치를 하나처럼 묶을 수 있고, 대상은 CPU, 메모리, 스토리지, 네트워크를 포함한다.

Session, Connection, Transaction

Apache Derby 문서는 트랜잭션을 커밋하거나 롤백할 수 있는 논리적 작업 단위로 정의하고, 하나의 트랜잭션은 하나의 Connection 객체에 묶여 여러 커넥션에 걸칠 수 없다고 설명한다. JDBC 표준에 따라 새 커넥션은 auto-commit 모드로 시작한다. JPA 쪽에서는 Hibernate Session이 JDBC 커넥션을 얻어 이 트랜잭션 위에서 동작하는 관계를 함께 찾아봤다.

참고한 자료외부 출처 33

외부 출처

이 글은 저작권자의 CC BY 4.0 라이선스를 따릅니다.

댓글

아직 댓글이 없습니다