[Java] JDK / JRE / JVM
·
Java
JDK, JRE, JVM과 차이점을 알아보자.먼저, 구조는 다음과 같다.JVM(Java Virtual Machine)JVM, 즉 자바 가상 머신은 자바 소스코드를 실행시키기 위한 가상 기계를 의미한다.실행시키기 위한 구체적인 방식은 다음과 같다. 자바 소스코드를 컴파일하여 .class의 바이트코드 파일을 생성한다.컴파일된 바이트코드(중간) 파일을 인터프리터와 JIT 컴파일러를 통해 기계어로 변환하여 실행한다.※ 인터프리터: 바이트코드 명령어를 한 줄씩 읽어 기계어로 변환하는 방식JIT 컴파일러: 반복되는 코드들을 기계어로 변환한 후 캐싱하여, 나중에 해당 코드가 나오면 바로 실행하는 방식 JVM에 대해 더 자세히 알고 싶다면2025.08.30 - [Java] - [Java] JVM(Java Virtual..
[Java] Reflection
·
Java
Reflection이란?자바의 Reflection은 런타임에 동적으로 특정 클래스 정보를 추출·조작할 수 있는 프로그래밍 기법이다.다시 말해, 구체적인 클래스 타입을 알지 못하더라도 해당 클래스의 메소드·타입·변수에 런타임에 접근할 수 있도록 해주는 API이다. Reflection은 Class 라는 클래스로부터 다른 클래스 정보를 얻을 수 있다. Class 클래스Class 클래스(java.lang.Class)는 클래스의 메타데이터(메소드·필드·생성자 등 정보)를 JVM의 메소드 영역에서 가지고 있다.이러한 Class 객체를 얻는 3가지 방법은 다음과 같다. .class 리터럴 사용.class 리터럴은 특정 클래스의 인스턴스가 존재하지 않을 때도 Class 객체를 얻을 수 있다.코드를 컴파일하는 시점에서..
[Java] 익명 클래스, 람다식
·
Java
익명 클래스(Anonymous Class)자바의 익명 클래스는 이름이 없는 클래스이다.익명 클래스는 클래스 정의와 동시에 객체를 생성하며, 해당 객체는 일회성으로만 사용된다.(※ 일회성이기 때문에 메모리 관리에서 효과적이다.) 다음은 Subject 클래스를 상속받아 즉석에서 익명 클래스로 구현한 예제이다.이 익명 클래스(코드 블록)는 Subject의 exam() 메소드를 오버라이딩한 뒤, english로 할당되었다.class Subject { public void exam() { System.out.println("시험을 봅니다."); }}public class Anonymous { public static void main(String[] args) { Subj..
[Java] 제네릭(Generic)
·
Java
제네릭(Generic)제네릭은 클래스 내부가 아닌 외부에서 사용자에 의해 지정되는 타입을 의미한다. 제네릭을 사용하는 이유는클래스의 재사용성이 높아지며,컴파일 과정에서 잘못된 타입이 사용되는 것을 방지할 수 있다.제네릭을 쓰지 않는다면, Object 타입으로 클래스나 메소드를 선언하고객체를 생성할 때 원하는 타입으로 캐스팅을 해야 한다.. (귀찮..😮‍💨) 제네릭 타입 파라미터제네릭은 추후 지정하게 될 타입을 위해 모양 안에 아래 타입을 선언해주어야 한다. : Type, 일반적으로 쓰이는 타입 파라미터: Element, List 내 요소에 주로 사용한다.: Key, Map 형식의 키에 주로 사용한다.: Value, Map 형식의 값에 주로 사용한다.: Number, Integer / Double /..
[Java] 인터페이스 vs 추상 클래스
·
Java
인터페이스와 추상 클래스의 차이를 알아보자. 인터페이스(Interface)1. 인터페이스는 동일한 동작을 보장하는 데 초점을 둔다.💡따라서 인터페이스에 선언한 메소드는 implements하는 하위 클래스에 모두 구현해야 한다.만약 하위 클래스가 수행해야 하는 동작이 여러 개라면 다중 상속도 가능하다. 2. 인터페이스에서 가질 수 있는 메소드는 구현부가 없는 추상 메소드와 구현부를 가지는 default, static 메소드가 있다.인터페이스에서 흔히 볼 수 있는 추상 메소드는 구현부가 없다!implements하는 하위 클래스가 인터페이스에서의 모든 추상 메소드를 오버라이딩 해야 한다.interface Bus { void depart(); void arrive();}class RedBus implem..
[Java] final vs static vs static final
·
Java
finalfinal은 한 번 값을 저장하면, 더 이상 수정이 불가능하다.final을 적용할 수 있는 곳은 총 3곳이다. final을 적용할 경우변수한 번 값을 저장하면, 더 이상 수정이 불가능하다.메소드해당 메소드를 오버라이딩할 수 없다.클래스해당 클래스를 상속할 수 없다. staticstatic은 객체를 생성하지 않고 호출할 수 있다.static을 적용할 수 있는 곳은 총 3곳이다. static을 적용할 경우변수클래스 단위로 변수를 공유한다.메소드객체 생성 없이 클래스명.메소드이름()로 호출할 수 있다.정적 중첩 클래스외부 클래스의 static 멤버에만 접근할 수 있으며, 외부 클래스의 인스턴스 없이 바로 생성하여 사용할 수 있다. static은 JVM이 실행되는 동안 메소드 영역에 유지된다.따라..
[Java] JVM(Java Virtual Machine)
·
Java
JVM(Java Virtual Machine)JVM, 자바 가상 머신은 자바를 실행하기 위한 가상 기계를 의미한다. 가상 기계는 소프트웨어로 구현한 물리적인 컴퓨팅 환경을 의미한다.가상 기계에 대해 더 자세히 알고 싶다면, 2025.08.27 - [Development/개발 공부] - 가상 머신(VM, Virtual Machine) 를 참고하면 된다. 다음은 자바 애플리케이션이 실행되는 과정을 도식화한 것이다. 1) MyProgram.java라는 자바 소스 코드가 존재할 때,2) 컴파일러는 이 소스 코드를 컴파일하여 바이트코드로 이루어진 MyProgram.class 파일을 생성한다.3) 컴파일된 중간 파일은 JVM 위에서 CPU가 이해할 수 있는 기계어로 변환되고, 실제 연산을 수행한다. JVM의 동..
[Design Pattern] 디자인 패턴
·
Java/디자인패턴
디자인 패턴(Design Pattern)디자인 패턴은 개발하면서 반복적으로 발생하는 문제들을 어떻게 해결할 것인지에 대한 해결 방안이다.패턴은 새로운 것이 아닌 "비슷한 문제를 다루면서 얻은 노하우가 매우 잘 정리된 것"이다.이러한 패턴은 UML 도구인 클래스 다이어그램, 순차 다이어그램 등으로 구조와 동작을 가시적으로 표현할 수 있다. 패턴은 총 23가지이며, 3가지 종류(생성 패턴 / 구조 패턴 / 행위 패턴)로 나뉜다. 생성 패턴(Creational Pattern)생성 패턴은 객체 인스턴스를 생성하는 패턴이다.객체 생성과 그 참조 과정을 캡슐화하여 코드의 유연성과 재사용성을 높여준다.5가지의 생성 패턴이 존재한다. 싱글톤(Singleton)한 클래스의 인스턴스를 한 번만 생성하여 전역에서 접근 가..
[Design Pattern] SOLID 원칙
·
Java/디자인패턴
SOLID 원칙이란 객체지향 설계에서 지켜야 할 5가지 원칙으로, 다음과 같다.단일 책임 원칙(Single Responsibility Principle)개방-폐쇄 원칙(Open-Closed Principle)리스코프 치환 원칙(Liskov Substitution Principle)인터페이스 분리 원칙(Interface Segregation Principle)의존성 역전 원칙(Dependency Inversion Principle) SOLID 원칙은 왜 필요할까?프로그램을 설계할 때는 결합도는 낮게, 응집도는 높게 유지하는 것이 중요하다.즉, 변화하는 요구 사항에 유연하게 대응하기 위해 내부적으로는 응집된 모듈을 최대한 수정하지 않고, 파생되는 기능들은 느슨하게 결합하여 변경에 쉽게 적응할 수 있어야 한..
[Java] LocalDate / LocalTime / LocalDateTime 클래스
·
Java
Date 클래스 이후, Java 8 버전에서 새롭게 출시된 3개의 클래스에 관해 소개하려고 한다. > Date 클래스 포스팅2025.06.04 - [Java] - [Java] Date 클래스 LocalDate- 날짜 정보(년, 월, 일)를 나타내는 클래스- 오늘 날짜를 또는 특정 날짜로 LocalDate 객체를 생성할 수 있다. LocalDate ldNow = LocalDate.now();LocalDate ldYesterday = LocalDate.of(2025, 6, 5);System.out.println(ldNow); // 2025-06-06System.out.println(ldYesterday); // 2025-06-05 minus(), plus(): 생성된 LocalDate의 객체로부터 날짜를 ..