개발/Java

    StringBuilder, StringBuffer

    String과 StringBuffer/StringBuilder의 차이점은 String은 immutable 하다는 점이다. 즉 새로운 문자열을 할당하면, 그 전의 객체를 삭제한다. String은 불변성을 가져 변하지 않는 문자열을 자주 읽어들이는 경우 String을 사용하면 좋은 성능 기대할 수 있음. 하지만 문자열 추가, 수정,삭제가 빈번하게 일어나면 mutable하게 할당하는게 유리할 수 있다. StringBuffer/StringBuilder는 가변성 가지기 때문에, .append(), .delete() 등의 API를 이용하여 동일 객체내에서 문자열 변경이 가능함. StringBuilder public final class StringBuilder extends AbstractStringBuilder ..

    StringJoiner

    문자열을 예쁘게 처리하기 위한 java.util 에 포함되어 있고, 순차적으로 나열되는 문자열을 처리할 때 사용됨. * {@code StringJoiner} is used to construct a sequence of characters separated * by a delimiter and optionally starting with a supplied prefix * and ending with a supplied suffix. * * Prior to adding something to the {@code StringJoiner}, its * {@code sj.toString()} method will, by default, return {@code prefix + suffix}. * However..

    자바 Optional 이란

    java.util에 속하고, 1.8부터 제공됨. Null 처리를 간편하게 하기 위해서 등장. T 객체를 포장해주는 래퍼 클래스이고, NullPointerException 예외를 예방할 수 있다. public final class Optional final 로 정의되어 있어 더 이상 확장이 불가능하다. Optional의 특이한 점은 아래와 같이 객체를 생성하지 않는다. new Optional(); 아래의 3개의 메소드를 통해 Optional 클래스의 객체를 생성할 수 있다. 데이터가 없는 Optional 객체를 생성하려면 이와 같이 empty() 메소드를 이용한다. javadoc에는 아래와 같이 기술되어 있다. * Returns an empty {@code Optional} instance. No valu..

    NIO2

    NIO와 이름은 비슷하지만 크게 관련은 없는 NIO2가 7버전 부터 제공된다. 지금까지 파일을 다루기 위해서 제공한 io 패키지와 File 클래으세 미흡한 부분이 많았다. 그래서 이를 보완하는 내용이 많이 포함되어 있다. 파일의 속성을 다룰 수 있고, 심볼릭 링크까지 다룰 수 있는 기능 제공하고, 어떤 파일이 변경되었는지 쉽게 확인할 수 있는 WatchService 라는 클래스도 제공된다. 그리고 며가지 채널들도 추가됨. File의 변경점 기존의 단점 심볼릭 링크, 속성, 파일의 원한 등에 대한 기능이 없음 파일을 삭제하는 delete() 메소드는 실패시 아무런 예외를 발생시키지 않고, boolean 타입의 결과만 제공해줌 파일이 변경되었는지 확인하는 방법은 lastModified()라는 메소드를 제공해..

    ThreadLocal이란?

    오직 한 스레드에서만 읽을 수 있고 쓸 수 있는 변수를 생성할 수 있도록 함. javadoc에는 아래와 같이 기술되어 있다. * This class provides thread-local variables. These variables differ from * their normal counterparts in that each thread that accesses one (via its * {@code get} or {@code set} method) has its own, independently initialized * copy of the variable. {@code ThreadLocal} instances are typically private * static fields in classes ..

    자바 volatile 이란?

    volatile = 휘발성 그 변수를 휘발성 메모리에 만들어라 라는 뜻이다. 변수를 메인 메모리에 저장하겠다고 명시하는 것이다. 매번 변수의 값을 Read,Wrtie할 때마다 CPU cache에 저장된 값이 아닌 Main Memory에서 읽는 것이다 . CPU Cache보다 Main Memory 비용이 더 크기 때문에 변수 값 일치를 보장해야만 하는 경우에만 volatile을 사용하는게 좋다. Main Memory에 read, write 하는 작업의 원자성을 보장하는 경우. 원자성이 보장되는 경우에 volatile 키워드 만으로 안전하게 데이터를 교환할 수 있음. 멀티 스레드 환경에서 하나의 스레드만 read & write 하고 나머지 Thread가 read하는 상황에서 가장 최신의 값을 보장함 vola..

    BigInteger, BigDecimal 클래스

    BigDecimal 아래의 두개로 표현 가능함 Unscaled value – an arbitrary precision integer : Scale – a 32-bit integer representing the number of digits to the right of the decimal point 예) 3.14인 경우 unscaled value = 314, scale = 2 javadocs에 아래와 같이 기술되어 있다. Immutable, arbitrary-precision signed decimal numbers. A * {@code BigDecimal} consists of an arbitrary precision integer * unscaled value and a 32-bit integer ..

    JVM String Constant Pool

    JVM의 Heap메모리의 Permenent 영역에 존재한다. 자바 7에서의 힙에서는 PerGen에 있는 클래스의 인스턴스 저장 -Xms(min), -Xmx(max로 사이즈 조정 PermGen 클래스와 메소드의 메타데이터 저장 상수풀 정보 JVM, JIT 관련 데이터 -XX:PermSize(min), -XX:MaxPermSize(max)로 사이즈 조정 Perm 영역은 보통 Class의 Meta 정보나, 메소드의 메타 정보, 스태틱 변수와 상수 정보들이 저장되는 공간으로 흔히 메타데이터 저장 영역이라고도 한다. 하지만 자바 8에서는 Native 영역으로 이동하여 Metaspace 영역으로 변경되었다. 자바8 : 메타스페이스 영역 자바 8에부터는 자바 7의 Perm 영역이 삭제되고 Native 영역으로 이동해..

    Spliterator란

    public interface Spliterator ForkJoinFramwork에서 사용되는 인터페이스라, 이번 기회에 공부해보려고 한다. Spliterator는 8버전에서 새롭게 소개된 인터페이스다. 소스의 원소를 traverse 하고 partition 하기 위한 인터페이스다. 이름에서 알수 있다 싶이, Stream안에서만 사용된다. * An object for traversing and partitioning elements of a source. The source * of elements covered by a Spliterator could be, for example, an array, a * {@link Collection}, an IO channel, or a generator funct..

    non-reifiable 타입이란

    비 구체화 타입(non-reifiable type) : 타입 소거자에 의해 컴파일 타임에 타입 정보가 사라지는 것(런타임에 구체화하지 않는 것) 구체화 타입(reifiable type) : 자신의 타입 정보를 런타임 시에 알고 지키게 하는 것 (런타임에 구체화하는 것). 런타임 시에 완전하게 오브젝트 정보를 표현할 수 있는 타입 제너릭 타입 소거 : 원소 타입을 컴파일 타임에만 검사하고 런타임에는 해당 타입 정보를 알 수 없는 것. 다른 말로는 컴파일 타임에만 제약 조건을 적용하고, 런타임에 타입에 대한 정보를 소거하는 프로세스. Primitives, non-generic types, raw types 등이 있다. non-reifiable 문제는 자바에서 제네릭을 사용하지 않는 버전과의 호환성을 위해서 ..