Java 18

[Java] 리플렉션 (Reflection)에 대하여

리플렉션이란, 간단히 말해 컴파일 시점에 타입을 결정하는 정적 언어인 Java에서, 런타임시에 구체적인 Class의 Type을 알지 못하더라도 동적으로 클래스의 메서드, 타입, 변수들에 접근하여 정보를 추출할 수 있도록 해주는 api이다. 예를들어 다음의 상황들에서 리플렉션을 사용하고 있다 Reflection의 사용Dynamic Binding: 코드에서 동적으로 Class를 사용할 때 사용Spring Framework: DI, Annotation, Test Code 작성 등에서 사용MVC: View에서 넘어오는 데이터를 객체에 바인딩할 때 사용Hibernate: @Entity 클래스에 setter가 없으면, 해당 필드에 값을 바로 주입IDE: 자동 완성 기능 Example당신은 블로그를 개발하고 있고, ..

Java 2024.04.29

[Java] 상속(Inheritance) & 조합 (Composition)

Java와 같은 객체 지향 프로그래밍 언어에서는 상속(Inheritance)이라는 중요한 개념이 존재한다. 상속과 조합을 비교하기 전, 먼저 상속에 대해 알아보자 Inheritance 상속이란 부모 클래스(Super Class)의 특성을 자식 클래스(Sub Class)가 물려받아 사용할 수 있도록 해주는 메커니즘이다. Java에서는 extends 키워드를 사용하여 자식 클래스가 부모 클래스를 상속할 수 있다. 상속의 특징을 통해 장단점과 사용 목적을 알아보자 Java의 상속 (Inheritance) 코드 재사용성 : 상속을 통해 동일한 속성을 가진 객체들이, 매번 동일한 필드와 메서드를 작성할 필요 없이 '부모 클래스'에 선언된 필드와 메서드를 그대로 사용하게 함으로써 코드 재사용성을 높여준다 확장 가능..

Java 2024.04.10

[Java] String Constant Pool & String.intern()

String Constant Pool String Constant Pool은 이전 글에서 짧게 다룬 적이 있다 [Java] 문자열 클래스 String Class String 클래스의 구조 String은 문자열을 내부적으로 byte[]로 저장한다. JDK 9 이전에는 char[], JDK 9부터는 메모리 효율성을 위해 byte[]로 저장하게 되었다 // String.class (Java 8) public final class Stri kdh0518.tistory.com Java에서 문자열 리터럴(그 자체로 값을 나타내는 표현)을 저장하는 독립된 영역을 'String Constant Pool'이라고 한다. 스트링 상수 풀의 특징은 다음과 같다. String Constant Pool 문자열 리터럴 인스턴스를 ..

Java 2024.04.06

[Java] Record

Record는 Java 14에서 추가된 불변 데이터 클래스로, 그 자체로 '값'을 나타내는 클래스(즉, Value Object)를 좀 더 쉽게 생성 및 수정할 수 있게 해준다. Record 도입 이전의 VO를 보고 어떤 문제를 해결하기 위해 Record가 도입되었는지를 확인해보자 Record 이전의 VO VO는 다음의 특징들을 가지고 있는 클래스를 말한다 DTO처럼 단순한 데이터들의 집합이 아닌, 객체 그 자체가 '값'을 나타낸다 반드시 불변 객체(immutable Object)로 사용해야 하기에 한번 생성한 후 수정할 수 없고, 항상 새로운 객체를 만들어야 한다 비즈니스 로직을 포함할 수 있다 (Setter와 같이 값을 수정할 수 있는 로직은 제외) VO 예시를 보자 @Getter public clas..

Java 2024.04.05

[Java] Stream

스트림(Stream)은 Java 8에서 컬랙션과 배열을 반복적으로 처리할 때 코드의 가독성을 향상시키고 병렬 처리를 쉽게 하기 위해 새로 도입된 api이다. 우리는 데이터를 처리할 때, 알고리즘 로직을 작성하기 보다는 어떤 작업을 원하는지 '선언형(Declarative)'으로 작성함으로써 보다 직관적인 코드를 작성할 수 있다. 선언형과 명령형 선언형과 명령형을 비교하여 어떤 것이 다른지 직접 코드로 비교해보자 먼저 우리가 일반적으로 사용하는 명령형 코드이다 public class Example { public static void main(String[] args) { List numbers = Arrays.asList(1, 2, 3, 4, 5); List evenNumbers = new ArrayLis..

Java 2024.04.01

[Java] Error & Exception

Java 프로그램을 실행시킬 때, 프로그램 로직이 잘못 설계되었거나, 외부적인 요인, 혹은 하드웨어 문제에 의해 오류가 발생한 적이 있을 것이다. 자바에서는 이렇게 예상과 다른 결과를 만들어 내거나, 심각하면 프로그램을 종료시키는 오류들을 Error와 Exception으로 구분한다.           Error vs Exception 정확히 말하자면, 자바에서는 오류를 'Checked Exception', 'Unchecked Exception', 'Error' 총 3개로 구분한다. 이러한 오류들은 개발자가 예측할 수 있는지, 핸들러를 통해 처리/복구할 수 있는지, 시스템 레벨과 애플리케이션 레벨중 어디에서 발생하는지, 예외처리가 강요되는지, RuntimeException을 상속하는지 등에 따라..

Java 2024.03.30

[Java] Garbage Collection

가비지 컬렉션은 자바의 메모리 관리 방법 중의 하나로, 메모리 누수를 막기 위해 JVM의 Garbage Collector가 사용하지 않는 객체를 삭제하는 것을 의미한다. 가비지 컬렉션에 대해 알아보기 전에 메모리 누수를 먼저 알아보자 Memory Leak (메모리 누수) 메모리 누수란 "동적으로 할당한 메모리가 free(할당 해제)될 수 없는 상태"를 의미한다. 즉, 어딘가에 할당되어 있던 메모리가 더이상 사용자가 제어하거나 접근할 수 없어서 할당된 메모리를 회수할 수 없는 상태를 의미한다. 다음 코드를 보면 이해가 빠를것이다. char *a = malloc(20); // 포인터 변수 a에 동적 메모리 할당 char *b = malloc(10); // 포인터 변수 b에 동적 메모리 할당 b = a; //..

Java 2024.03.10

[Java] 자바 가상 머신 (JVM, Java Virtual Machine)

JVM과 그 역할 JVM(Java Virtual Machine)은 자바 프로그램이 어느 기기나 운영체제 상에서도 실행될 수 있도록 하기 위해 물리적 머신과 유사한 머신을 소프트웨어로 구현한 것으로, 다양한 역할을 한다. 개발자들은 보통 JVM을 '어떤 기기상에서 실행되고 있는 프로세스, 특히 자바 앱에 대한 리소스를 대표하고 통제하는 서버' 라고 말한다. JVM의 역할 Java와 OS사이에서 중개자 역할을 수행하여, Java가 OS에 구애받지 않고 독립적으로 작동 가능하도록 한다 자바 애플리케이션을 클래스 로더를 통해 읽어들여 자바 API와 함께 실행한다 메모리 관리와 Garbage Collection을 수행한다 JVM의 구조와 작동 원리 JVM의 구조 Java Compiler (JAVAC) 자바 소스코..

Java 2024.03.03

[Java] 고유락(Intrinsic Lock)과 동기화(synchronization)

동기화란? 멀티 스레드 환경에서는, 공유된 자원(변수나 객체 등)에 대해 여러 스레드가 동시에 접근하면서 예상치 못한 결과가 발생할 수 있다. 예시를 통해 알아보자 // Runnable을 구현해서 스레드 정의 public class RunnableThread implements Runnable{ private final Number number; public RunnableThread(Number number) { this.number = number; } @Override public void run() { number.updateNum(); System.out.println("update End"); } } // 공유된 자원 public class Number { private long num = 0..

Java 2024.03.03

[Java] Thread

스레드에 대해 공부하기 전에, 프로세스(Process)와 스레드(Thread)는 프로그램의 실행과 동작을 통해 설명할 수 있기에, 프로그램의 실행에 대해 먼저 알아보자 Program의 실행 프로그램(Program)과 프로세스(Process)는 둘 다 어떠한 목적을 위해 처리 방법과 순서를 기술한 코드의 집합체를 말하는데, 다만 프로그램은 저장 장치에 저장된 '정적'인 상태를 말하고, 프로세스는 실행을 위해 메모리 공간에 올라와있는 '동적'인 상태를 의미한다. 즉, 프로그램과 프로세스는 똑같은 프로그램을 말하지만, 상태만 다르다는 의미이다. 다시 프로그램의 실행으로 넘어가보자. 우리는 특정 프로그램을 실행시키기 위해 컴퓨터에 저장하고 설치한다. 이후에 프로그램(Program)을 실행시키면 OS에서 그 프로..

Java 2024.02.25