Language/Java 56

Effective Java - try-finally 대신 try-with-resources 사용하기!

기존의 코드 - try, finally Java 7 버전 이전에는 다 사용하고 난 자원을 반납하기 위해 try-catch-finally 구문을 사용했다. 예시로 살펴보자. public class MainApplication { public static void main(String[] args) { Scanner scanner = null; try { scanner = new Scanner(new File("input.txt")); // scanner 사용 } catch (FileNotFoundException e) { // 예외 처리 } finally { if (scanner != null) { scanner.close(); } } } } 예시에서는 Scanner를 생성하고 finally 구문 안에서 ..

Language/Java 2022.08.31

Effective Java - 빌더 패턴 안전하게 사용하기 (+Use Lombok)

점층적 생성자 패턴 점층적 생성자 패턴은 필수 매개변수만 받는 생성자를 만들고, 선택 매개변수가 더 필요할 때마다 추가로 생성자를 구현하는 방식이다. 점층적 생성자 패턴은 안전하게 객체를 생성할 수 있다는 장점이 있다. public class NutritionFacts { private final int servingSize; private final int servings; private final int calories; private final int fat; private final int sodium; public NutritionFacts(int servingSize, int servings, int calories, int fat) { this.servingSize = servingSize..

Language/Java 2022.06.18

Java - 애노테이션(Annotation)이란 무엇인가 ?

애노테이션(Annotation) 자바 개발을 하다 보면 클래스 또는 메서드 또는 변수 앞에 @Override 같은 표시를 많이 본다. Spring처럼 각종 프레임워크나 라이브러리도 애노테이션을 많이 활용한다. 애노테이션은 메타 데이터(데이터에 대한 설명을 하기 위한 데이터)의 역할을 주로 한다. 애노테이션은 내부적으로 어떻게 동작할까? 구현하면 어떤 문제를 해결할 수 있을까? 에 대해 알아보자. Java에서 제공하는 애노테이션 종류 예를 위해 자바에서 제공하는 애노테이션을 살펴보자. 주로 해당 데이터를 설명하기 위해서 사용한다. 1. @Override 선언한 메서드가 오버라이드 되었다는 것을 나타낸다. 상위(부모) 클래스(또는 인터페이스)에서 해당 메서드를 찾을 수 없다면 컴파일 에러를 발생한다. 2. ..

Language/Java 2022.05.21

Java - 제네릭(Generic)타입을 제한하는 방법! (2)

제네릭(Generic) 타입 제한 지난 1장(Java - 제네릭은 무엇인가)에 이어서 제너릭을 사용해서 타입을 제한하거나 와일드카드로 사용하는 방법을 알아본다. 지난 장에서 봤듯 제너릭을 사용하면 타입 체크를 효율적으로 수행할 수 있다. 일반적인 제너릭 형식을 사용한 클래스를 만들었다고 가정하자. 하지만 이 방식으로 클래스를 선언했을 떄 제너릭 타입은 모든 타입을 허용 한다. public class MyClass implements MyInterface{ private E element; void set(E element) { this.element = element; } } 해당 클래스의 인스턴스 객체를 생성할 때 제너릭 타입을 명시한다. MyClass instance = new MyClass(); 여..

Language/Java 2022.05.08

Java - 제네릭(Generic)은 무엇인가? 에 대한 정리! (1)

제너릭(Generic) 제너릭(Generic)은 JDK ArrayList나 LinkedList, HashMap 등의 자료구조를 사용할 때 주로 사용한다. ArrayList students = new ArrayList(); 그렇다면 제너릭의 정확한 역할은 무엇인가 ? 우리는 제너릭을 잘 활용하고 있을까? 제너릭을 사용하는 이유 제너릭은 JDK 1.5에 처음 도입되었다. Oracle Javadoc - Generics add stability to your code by making more of your bugs detectable at compile time. 다음은 제너릭의 기능을 정리한 것이다. 잘못된 타입이 들어오는 것을 컴파일 단계에서 방지한다. 자바 컴파일러는 잘못 사용된 타입 때문에 발생하는 에..

Language/Java 2022.05.08

Java - ArrayList가 가변적일 수 있는 이유 (+ Size 지정하는 이유)

ArrayList 자바에서 배열은 크기가 고정된 데이터 구조이다. 반면에, ArrayList는 가변적인 크기를 가지고 있다. 일반적인 배열은 우리가 알고 있는 형태로 Heap에 저장된다. ArrayList는 물리적으로 원소들이 연속되어야 한다. 만약 여기서 Heap에 새로운 Object가 들어왔다고 가정하자. 그러면 List에 새로운 원소를 생성할 수 없게 된다. "ArrayList는 어떻게 가변적인 길이를 가질 수 있을까?"에 대해 알아보자. add() ArrayList 클래스의 add() 메서드를 살펴보자. add()를 사용하면 내부적으로 오버로딩된 add 메서드를 호출한다. 메서드 내부를 살펴보면 흥미로운 사실을 알 수 있다. ArrayList는 내부적으로 elementData라는 배열을 가지고 있..

Language/Java 2022.05.07

Java - PreparedStatement란 무엇인가?

Statement 자바에서 쿼리문을 사용할 때 java.sql 패키지에 있는 Statement를 사용한다. Statement는 SQL문을 실행할 때 사용하는 인터페이스이다. Statement는 다음과 같은 동작 방식을 가진다. PreparedStatement PreparedStatement는 Statement를 상속하고 있는 Interface이다. PreparedStatement는 내부적으로 Statement의 4단계 과정 중 첫 번째 parse 과정의 결과를 캐싱하고, 나머지 3가지 단계만 거쳐서 SQL문이 실행될 수 있게 한다. PreparedState를 사용하면 구문 분석(parse)의 결과를 캐싱해서 과정을 생략할 수 있으므로 성능이 향상된다. 많은 분들이 아시고 계시길 PreparedStatem..

Language/Java 2022.05.03

Java - Perm 영역이 Metaspace로 바뀐 이유! [+ Heap Area, Native Memory 차이]

JDK 8부터는 Java Heap에서 PermGen이라는 영역이 제거되었고, Metaspace라는 영역이 Native Memory에 추가되었다. 기존에 Perm 영역 크기로 인한 java.lang.OutOfMemory가 뜨는 경우가 많았다. PermGen이라는 영역이 제거되고 Metaspace 영역이 생기면서 이제는 해당 문제를 보기 어려워졌다. 그 이유를 알아보자. Perm PermGen(이하 Perm) 영역은 상수와 static 변수, 런타임 중에 읽은 클래스와 메소드의 메타데이터를 저장한다. PermGen 영역의 크기는 JVM이 사이즈를 지정한다. 앱이 실행되면 최대 사이즈는 변경되지 않는다. 동적으로 클래스들이 로드되고 Static 변수나 상수가 Perm영역에 쌓이게 되면서 OOM이 자주 발생했다..

Language/Java 2022.04.29

Java - JVM 구성 요소와 역할 정리! (+ JIT 컴파일러, 인터프리터, 클래스 로더, 가비지 컬렉터란 무엇인가?)

JVM이란 JVM(Java Virtual Machine)은 자바 프로그램의 실행하기 위해 물리적 머신과 유사하게 소프트웨어로 구현한 것이다. JVM 역할은 자바 애플리케이션을 클래스 로더를 통해 읽어 들여 자바 API와 함께 실행하는 것이다. JVM은 JAVA와 OS사이에서 중개자 역할을 수행하여 JAVA가 OS에 구애받지 않고 재사용을 가능하게 해준다. 그리고 메모리관리, Garbage collection을 수행한다. 추가적으로 JVM은 스택 기반의 VM(가상머신)이다. Lua VM, Dalvik VM 등은 레지스터 기반으로 동작하는데 비해 JVM은 스택 기반으로 동작한다. 스택 기반 VM 스택 기반 VM은 다음과 같은 장점을 가진다. 코드 작성과 컴파일이 쉽다. 속도는 레지스터 기반 VM보다 느리지만..

Language/Java 2022.04.27

Java - JDK와 JRE 차이 정리!

JDK와 JRE의 차이 아래는 Oracle에서 JDK와 JRE의 범위에 대해 표현한 그림이다. JRE JRE(Java Runtime Environment)는 자바 가상 머신( Java Virtual Machine ), 자바 클래스 라이브러리(Java class library), 자바 명령(Java command) 및 기타 인프라를 포함한 컴파일된 Java 프로그램을 실행하는데 필요한 패키지이다. JRE는 환경(Environment)이다. 기본적으로 Java 관련 파일이 있는 디렉터리이다. 포함되어 있는 폴더와 파일에 대해 설명을 간단하게 하면 아래와 같다. bin: Java 실행 프로그램이 포함되어 있다. JVM을 시작하는 java(Window의 경우 javaw)가 포함되어 있다. 또한, keytool ..

Language/Java 2022.04.26