본문 바로가기

Java/The Java9

Type Erasure Deep Dive 제네릭에 사용되는 타입 소거(type erasure)에 대해 알아보고 이로 인해 생기는 제약과 문제들에 대해 탐구합니다. Type Erasure(타입 소거)란 제네릭 타입에 사용된 타입 정보를 컴파일 타임에만 사용하고 런타임에는 소거하는 것을 말한다. 타입 소거 규칙 자바 컴파일러는 아래의 규칙에 따라 타입 소거 과정을 실행한다. 모든 타입 파라미터를 그들의 바운드나 Object 타입으로 교체한다. 제네릭 타입을 제거한 후 타입이 일치하지 않으면 타입 캐스팅을 추가한다 확장된(extended) 제네릭 타입의 다형성을 보존하기 위해 브릿지 메서드를 생성한다. 예를들어 아래처럼 언바운드 타입 T로 제네릭 클래스를 선언하고 컴파일을 한 뒤 바이트코드를 까보면 타입 변수가 사라지고 Object 타입으로 바뀐 것.. 2022. 3. 6.
[이펙티브자바] Item 8. finalizer와 cleaner를 사용하지 마라 Finalizer와 Cleaner는 사용하지 마라 Class는 생성자(Constructor)와 소멸자(Destructor)라는 특별한 함수가 있다. 생성자는 익숙한 개념이지만 자바에서 소멸자를 직접 정의하는 일은 흔치 않기 때문에 익숙하지 않을 수 있는데, 그냥 생성자의 반대 개념이다. 객체가 소멸될 때 호출되는 함수이다. 자바는 두 가지 객체 소멸자 finalizer와 cleaner를 제공한다. 우선 결론부터 말하자면 finalizer는 쓰면 안된다. 언제 실행될지 예측할 수 없고 상황에 따라 사용하면 위험할 수 있다. 그래서 Java9에서는 deprecated되고 그 대안으로 cleaner가 새로 추가됐다. 그렇지만 cleaner도 finalizer보다는 덜 위험하지만 여전히 예측할 수 없고 일반적으.. 2021. 8. 12.
[이펙티브자바] Item 7. 다 쓴 객체의 참조를 해제하라 다 쓴 객체 참조를 해제하라 새삼스럽지만 자바는 가비지 컬렉터가 메모리 관리를 자동으로 해준다. 근데 이때문에 프로그래머가 메모리 관리에 더 이상 신경쓰지 않아도 된다고 오해할 수 있는데 그렇지 않다. 메모리 누수를 주의해야하는 케이스는 다음과 같은 것들이 있다. 클래스가 메모리를 직접 관리 아래의 코드에서는 메모리 누수가 일어난다. public class Stack { private Object[] elements; private int size = 0; private static final int DEFAULT_INITIAL_CAPACITY = 16; public Stack() { elements = new Object[DEFAULT_INITIAL_CAPACITY]; } public void push.. 2021. 8. 12.
[Java] equals()와 hashcode()는 언제 재정의해야 하나 [이펙티브 자바]의 아이템 10, 아이템 11에서 equals()와 hashcode() 재정의에 대한 내용을 자세하게 다루고 있다. 추후에 해당 내용에 대한 포스팅을 할 예정이고 여기서는 간단하게 요약해 알아보고자 한다. equals() equals()는 두 객체가 논리적으로 같은가를 확인해야하는데 상위 클래스의 equals가 논리적 동치성을 비교하도록 재정의되지 않았을 때 재정의한다. 예를들어, 레스토랑의 주문 관리 애플리케이션을 만들고 있고, 식당의 메뉴를 나타내는 Menu 클래스를 정의하고 있다고 해보자. public class Menu { private String name; private int price; ... } Menu 객체의 두 인스턴스가 이름과 가격이 같다면 이 둘은 “논리적으로 같은.. 2021. 8. 8.
[Java] StringBuffer vs StringBuilder 차이 (무엇을 써야할까?) String in Java 자바에서 String을 다룰 때 알아두어야 할 것이 있습니다. String은 참조 자료형이다. 근데 자바에서 좀 특별하게 취급된다. 불변(Immutable)이다. String pool 자바에서 String은 일반 객체와 달리 heap 영역의 String pool에서 관리됩니다. 문자열은 다음과 같이 두 가지 방법으로 생성할 수 있습니다. public static void main(String[] args) { String a = "Hello"; String b = new String("Hello"); } a, b 두 개의 문자열은 JVM 내에서 생성되는 영역이 다릅니다. 출처: https://www.journaldev.com/797/what-is-java-string-pool .. 2021. 8. 2.
[Java] 메서드 시그니처 vs 메서드 타입 더블 디스패치에 대해 공부하려고 토비님의 유튜브 영상을 보다가 메서드 시그니처(method signature)와 메서드 타입(method type)에 대해 정리해주시는 것을 보고 정리해둘 필요가 있을 것 같아 포스팅해봅니다. 메서드 시그니처(Method Signature) 시그니처, 말 그대로 서로다른 메서드를 구분하는 근거가 되는 요소입니다. 메서드 오버라이딩을 할 때 중요합니다. 메서드 시그니처의 구성 요소 메서드 이름 파라미터 리스트 이 두 가지가 같으면 메서드를 오버라이딩할 수 있으며, 이 두 가지가 같은 메서드가 한 클래스 내에 두 개 이상 정의되어 있으면 메서드 중복으로 컴파일 에러가 발생합니다. 여기서 파라미터 리스트라는 것은 파라미터의 타입, 개수, 순서를 말합니다. 예를 들어 파라미터의 .. 2021. 7. 29.