Java 24

Heap Pollution

Java에서 제네릭은 컴파일 시점에 타입 안정성을 보장하여 런타임 오류를 줄이는 도구이다.그렇지만, 잘못된 제네릭 사용은 Heap Pollution 문제를 일으킬 수 있다.Heap Pollution이란?컴파일 타임에는 문제가 없어 보이지만, 런타임 시점에서 타입 안정성이 무너져 예상치 못한 타입이 힙에 저장되는 현상을 의미한다.특히 컴파일러가 타입 오류를 검출하지 못하기 때문에, 디버깅이 어려운 버그로 이어질 수 있다. 주로 다음의 경우에 문제가 발생한다.raw type 사용 - 제네릭 타입을 명시하지 않고 원시 타입을 사용하는 경우가변인자와 제네릭의 조합 - 제네릭 타입의 가변인자를 사용하는 경우Raw Type으로 인한 Heap Pollution현재 list 변수의 타입을 지정할 때, List의 타입을..

Java 2025.07.15

JVM의 내부 구조와 메모리 구조에 대해

Java 코드가 실행 되는 과정Java 코드는 일반적으로 IDE를 통해 .java 확장자의 파일로 작성된다.그러나 JVM은 이 파일을 직접 실행하지 않고, 먼저 컴파일 과정을 거쳐 .class 확장자의 바이트코드(Bytecode) 파일로 변환한다.이 바이트코드는 JVM이 이해할 수 있는 중간 코드로, 플랫폼에 독립적으로 실행될 수 있는 장점이 있다.예를 들어 Person.java 파일이 있다면, 컴파일을 거쳐 Person.class라는 바이트코드 파일이 생성되고, 이는 JVM 위에서 실행된다.JVM의 내부 구조JVM은 크게 세가지 영역으로 구분할 수 있다.클래스 로더실행 엔진런타임 데이터 영역이 외에도 바이트 코드 검증기, Java 네이티브 인터페이스(JNI), 가비지 컬렉터 등이 내부 구성 요소로 포합..

Java 2025.07.06

언체크 예외는 왜 존재할까?

Java로 개발을 하다보면 다음과 같은 말을 자주 듣게 된다.체크 예외는 호출하는 쪽에서 반드시 처리하거나 throws로 다시던져야 하지만, 언체크 예외는 굳이 처리하지 않아도 된다.그런데 근본적으로 언체크 예외는 왜 존재할까? 체크 예외와 언체크 예외 Java에서의 예외는 크게 두가지로 나뉘며 각 특징은 다음과 같다.예외 종류상속 구조컴파일 타입 검사예시체크 예외Exception필수IOException ..언체크 예외RuntimeException없음NullPointerException .. 왜 RuntimeException은 체크 예외가 아닐까?James Gosling은 예외 설계에 있어 다음과 같은 기준을 제시했다.복구 가능한 예외만 체크 예외로 강제하고, 프로그래머의 실수로 발생하는 예외는 컴파일..

Java 2025.07.01

Primitive Type vs Reference Type

타입의 정의와 분류언어 차원 Primitive Type : byte, short, int, long, float, double, char, booleanReference Type : 모든 클래스, 인터페이스, 배열, enum ... JVM 차원 JVM은 Primitive Type을 명확하게 별도의 명령어 세트로 분리함int의 경우 iadd , istore, iload 등으로 처리되며, 객체 참조는 aload, putfield, invokevirtual 등으로 처리됨Reference Type은 Heap영역의 객체 주소를 조작하는 방식이며, primitive type은 명령어 수준에서 값을 다룸 메모리 모델과 저장 위치 항목Primitive TypeReference Type변수 저장 위치 (지역 변수)Sta..

Java 2025.06.18

[Java] Optional

들어가기 앞서 자바를 사용해 프로그래밍을 할 경우 종종 마주치는 예외는 NullPointerException일 것입니다. public class Person{ private Car car; public Car getCar(){ return car; } } public class Car { private Insurance insurance; public Insurance getInsurance{ return insurance; } } public class Insurance{ private String name; public String getName(){ return name; } } public String getCarInsuranceName(Person person){ return person.get..

Java 2024.01.26

[Java] Stream

Stream이란 무엇인가? Java 8에 새로 추가된 기능으로 스트림을 사용하면 선언형으로 Collection 데이터들을 처리 할 수 있다. 예를 들어 칼로리가 400 미만인 요리들을 정렬해 Collection에 저장한다고 가정을 했을 때 스트림을 사용하지 않으면 다음과 같이 구현할 수 있다. List lowCaloricDishes = new ArrayList(); for(Dish dish : menu) { if (dish.getCalories() < 400){ lowCaloricDishes.add(dish); } } Collections.sort(lowCaloricDishes, new Comparator(){ public int compare(Dish dish1, Dish dish2){ return I..

Java 2024.01.24

[Java] 인터페이스 default method, static method

들어가며 자바에서는 인터페이스를 사용해 인터페이스를 구현하는 클래스에서 추상 메서드를 구현해야 합니다. public interface A { void doSomething(); } A 인터페이스에는 doSomething 이라는 추상 메서드가 존재합니다. public class AImpl implements A{ @Override public void doSomething() { System.out.println("this is A"); } } A인터페이스를 구현한 AImpl의 경우 doSomething 메서드를 override 하여 재정의 해 주어야 합니다. 만약 인터페이스에 추상 메소드가 추가되는 경우에는 이를 구현하는 클래스에서 다시 재정의 해 주어야 합니다. public interface A { v..

Java 2024.01.18

[Java] 함수형 인터페이스, 람다, 메소드 레퍼런스에 대하여

함수형 인터페이스, 람다, 메소드 레퍼런스 모두 긴밀한 연관을 가지고 있는 개념입니다. 이번 글을 통해 해당 개념들을 살펴 보고자 합니다. 함수형 인터페이스 @FunctionalInterface public interface Foo { int add (int a, int b); default void printDate(){ System.out.println(LocalDate.now()); } } 함수형 인터페이스란 추상 메소드를 단 하나 가지고 있는 인터페이스를 의미합니다. default method, static method가 몇개 존재하던 추상 메소드를 단 하나만 가지고 있다면 함수형 인터페이스라고 합니다. Q) 추상 메소드란 ? A) 선언만 되어 있고, 구체적인 구현은 되어있지 않은 메소드입니다. ..

Java 2024.01.15

[Java] Enum 전용 Map, Set이 있다?

백기선님의 Effective Java 강의를 듣는 도중 다음과 같은 질문이 있었습니다. enum을 key로 사용하는 Map을 정의하세요. enum을 담고 있는 Set을 만들어 보세요. 이 질문에 자신 당당히 HashMap, HashSet을 생각했습니다. 그런데 난생 처음 듣는 EnumMap, EnumSet이 정답이었습니다. EnumMap과 EnumSet은 HashMap, HashSet과는 어떠한 점이 차이가 있을까요? EnumMap EnumMap의 구조 public EnumMap(Class keyType) { this.keyType = keyType; keyUniverse = getKeyUniverse(keyType); vals = new Object[keyUniverse.length]; } EnumMa..

Java 2023.06.20

[Java] final 키워드 그리고 effectively final

final이란? final은 클래스, 메서드, 변수에 사용될 수 있습니다. final 키워드가 붙으면 특정한 무엇인가를 제한한다는 의미를 공통적으로 가지는데, 이 부분에 대해서 알아보도록 하겠습니다. 변수 변수에 final이 붙는다면 이 변수는 수정할 수 없다 라는 의미를 갖습니다. primitive type의 경우 수정 자체가 불가능 하며, reference type 경우 가르키는 객체의 주소를 변경할 수 없습니다. (객체의 내부 값은 영향을 받지 않습니다.) public class Temporary { public static void main(String[] args) { final int int1 = 2; System.out.println("int1 = " + int1); // int1++; //..

Java 2023.06.13