본문 바로가기

Java

(10)
[Java] Arrays.asList() 의 비밀 자바의 java.util.Arrays 클래스는 배열을 다루는 유용한 메서드들을 제공하는 클래스입니다. sort(), copyOf(), equals(), deepEquals(), fill() 등 여러 static 메서드가 포함되어 있습니다. 오늘은 이 중에서 배열을 List 로 변환해주는 asList() 메서드의 비밀에 대해 알아봅시다. asList() 메서드의 구현은 아래와 같습니다. @SafeVarargs @SuppressWarnings("varargs") public static List asList(T... a) { return new ArrayList(a); } 보기엔 별 특이한 점이 없는 것 같은데요, 여기에는 아주 무시무시한 비밀이 숨겨져 있습니다.. 바로… 리턴하는 ArrayList 클래스가..
[Java] Optional 때려 뿌수기 Optional 클래스는 Integer나 Double 클래스처럼 'T'타입의 객체를 포장해 주는 래퍼 클래스(Wrapper class)입니다. 이러한 Optional 객체를 사용하면 예상치 못한 NullPointerException 예외를 제공되는 메소드로 간단히 피할 수 있습니다. 즉, 복잡한 조건문 없이도 널(null) 값으로 인해 발생하는 예외를 처리할 수 있게 됩니다. 오늘은 이러한 Optional 을 여러 주제로 정리해보겠습니다. 1. Optional.of() vs Optional.ofNullable() 먼저 of() 메서드와 ofNullable() 의 코드를 봅시다. /** * Returns an {@code Optional} describing the given non-{@code null}..
[Java] Integer.valueOf("128")의 비밀 안녕하세용. 이번 글에서는 Integer.valueOf() 캐싱에 대해 간단히 알아보겠습니다. 며칠전 사내 기술교육에서 아이스 브레이킹으로 강사님이 언급해주신 내용인데 흥미로워서 글로 정리해봅니다.. ㅎ 아래 코드를 봅시다. System.out.println(Integer.valueOf("127") == Integer.valueOf("127")); System.out.println(Integer.valueOf("128") == Integer.valueOf("128")); System.out.println(Integer.parseInt("128") == Integer.valueOf("128")); 위 코드를 실행하면 다음과 같은 결과가 출력됩니다. true false true 127을 비교한 결과는 우리 ..
[Java] Enum의 비교 현업에서는 enum 타입 클래스(열거형)를 참 많이 씁니다. 저희 팀에선 에러 코드부터 유입 경로, 결제 수단 등등 정말 많은 enum 클래스를 정의하여 사용하고 있는데요, 많은 비즈니스 로직에서 enum의 값을 비교하고 있습니다. 그럼 enum 타입을 비교할 때는 ==을 사용해야 할까요, equals()를 사용해야 할까요? 이번 글에서는 이 enum 열거형에 대한 간단한 소개 및 enum 타입의 비교에 대해서 간단히 정리해봅니다. Enum 개요 enum 타입은 동서남북, 요일 등과 같이 서로 관련있는 상수들을 미리 정의된 상수들의 집합 형태로 정의해놓은 특수한 데이터 타입입니다. 간단히 말해서 클래스로 모아놓은 상수의 집합이라고 생각하면 되겠습니다. 상수의 집합이기 때문에 필드명은 대문자를 사용합니다...
[Java] String Constant Pool 자바에서 == 연산은 객체의 주소값을 비교할 때 사용하고 문자열의 값을 비교할 때는 equals() 메소드를 사용합니다. 그럼 다음 코드의 실행 결과는 어떻게 될까요? String a = new String("aaa"); String b = new String("aaa"); System.out.println(a == b ? "true" : "false"); // false System.out.println(a.equals(b) ? "true" : "false"); // true 출력 결과는 false 와 true 입니다. 위에서 말했던 것처럼 a와 b의 값은 같지만, 모두 새로운 객체 (new String()) 를 만들어서 그 곳의 주소를 가리키기 때문입니다. 그럼 다음 코드의 결과는 어떻게 될까요? S..
[Java] Java Garbage Collection C/C++ 프로그래밍을 할 때는 메모리 누수(Memoeyr leak)를 막기 위해 객체를 생성한 후 사용하지 않는 객체의 메모리를 프로그래머가 직접 해제해주어갸 했다. 하지만, 자바에서는 JVM의 구성 요소 중 하나인 Garbage Collection(GC)이 자동으로 사용되지 않는 객체를 해제한다. JVM의 메모리는 총 5가지 영역(method, heap, stack, PC, Native method stack)으로 나뉘는데, GC는 Heap 영역만 다룬다. 일반적으로 다음과 같은 경우가 GC의 대상이 된다. 객체가 NULL인 경우 (e.g String str = null;) 블럭 실행 종료 후, 블럭 안에서 생성된 객체 부모 객체가 NULL인 경우 포함하는 자식 객체 GC에 대해서 알아보기 전에 's..
[Java] Garbage Collection Algorithms 여러 Garbage Collector들이 어떠한 알고리즘들을 채택해왔고 발전해왔는지를 공부해보자!! 그 전에 어떤 객체를 Garbage로 볼 것이냐에 대해 먼저 알아보자. Garbage Collector는 객체를 Reachable과 Unreachable의 상태로 구분한다. 구분하는 방법은 Root set 과의 관계로 판단한다. Root set으로부터 어떤 식으로든 Reference 관계가 있다면 Reachable Object라고 판단하고, 그렇지 않다면 Unreachable Object라고 판단한다. Root set을 간단하게 설명하면 객체들 간의 참조 사슬의 시작점이라고 생각하면 된다. Root set은 아래의 세 가지 형태로 나뉜다. JVM Stack 내의 Local Variable Section과 ..
[Java] Immutable & Mutable [불변 객체 (Immutable)] 불변 객체란 한 번 객체가 생성되면 변하지 않는 객체를 의미한다. 자바의 대표적인 불변 객체는 String 클래스, Integer, Long과 같은 boxed primitive object 들이 있다. String 클래스 public final class String implements java.io.Serializable, Comparable, CharSequence { /** The value is used for character storage. */ private final char value[]; /* ... */ public String() { this.value = "".value; } } 필드의 접근 제한자는 private이며, final 키워드를 통해 ..