반응형

JAVA 10

Blocking vs Non-Blocking, Synchronous vs Asynchronous

구분BlockingNon-BlockingSynchronousAsynchronous의미요청이 끝날 때까지 기다림요청하고 바로 제어권 반환호출자가 결과를 직접 기다림호출 후 결과는 콜백/이벤트로 전달됨예시파일 읽기 완료까지 멈춤읽을 게 없으면 즉시 리턴A → B → 결과 기다림 → 다음A → B 호출만 하고 → 다음 코드 실행대표 상황전통 IONIO일반 함수 호출Future, Callback, Reactor 위의 비교가 어렵다면 다음과 같이 비교해보도록 하자Blocking vs Non-Blocking은“작업이 끝날 때까지 기다릴 것이냐, 말 것이냐”의 차이→ "작업 진입 시점의 차이"Synchronous vs Asynchronous는“결과를 직접 받느냐, 나중에 받느냐”의 차이→ "작업 종료 시점의 처리 방..

JAVA 2025.04.21

JVM 메모리 구조

Method Area클래스 정보(메서드, 필드, static 변수 등)를 저장ClassLoader에 의해 로딩된 클래스들의 메타데이터가 올라간다.Java 8 이전에는 PermGen, 이후에는 Metaspace로 대체됨모든 thread가 함께 사용해당 영역 안에 Runtime Constant Pool이 존재Heap Area모든 객체 인스턴스(new)가 생성되는 영역GC의 주요 대상모든 thread가 함께 사용Stack Area메서드 호출 시 로컬 변수, 매개 변수, 리턴 주소 저장PC register현재 실행 중인 JVM 명령의 주소를 저장Native Method StackJVM이 아닌 Native code(C, C++ 등)를 실행할 때 사용하는 Stack public class Example { // M..

JAVA 2025.04.19

JVM GC(Garbage Collection)

C언어의 경우 malloc/free 를 통해서 프로그래머가 직접 메모리를 할당하고 해제해주지만 JVM의 경우에는 메모리를 알아서 관리해주고 있기 때문에 개발자가 직접 관리할 필요가 없어진다. JVM에 다양한 메모리 영역이 존재하는데 그 중에서도 Heap영역에서 다음과 같이 GC가 동작한다.Eden, Survivor, Old 영역들이 존재하는데 간단하게 객체가 생성(new Object()) 되면 Eden Space에 생겨난다.그러고 나서 아직 참조가 되고있는 객체 더이상 참조 되지 않는 객체를 분류한다. 위의 그림에서 Object2가 Mark되어지고 MinorGC에 의해서 메모리 할당이 해제된것으로 보면 된다.그렇게 생존한 객체들이 존재하는 Survivor영역을 왔다갔다 하면서 오래 살아남은 객체는 Old..

JAVA 2025.04.19

JVM(Java Virtual Machine: 자바 가상 머신)

JVM은 하드웨어 및 운영 체제에 독립적인 실행 환경을 제공하며, 컴파일된 코드의 크기를 줄이고, 악성 프로그램으로부터 사용자를 보호하는 역할을 한다. - Oracle Javadoc JVM이 어떻게 저런걸 가능하게 할까?C언어의 경우에는 윈도우용 컴파일러, 리눅스용 컴파일러가 각자 컴파일을 진행하여 실행파일을 만들지만 Java의 경우에는 각 환경에 맞는 JVM이 따로 존재하기 때문에 자바 컴파일러(javac)가 번역한 class file을 어느환경에서나 실행이 가능해진다. 여기서 만들어진 byte code는 JVM이 실행할 수 있는 추상적인 명령어 집합이므로 기계어보다 간결하다. CPU 명령어, 레지스터 정보 등 다양한 정보를 포함해야하는 기계어보다 컴파일된 코드의 사이즈는 작아진다. 이 때, clas..

JAVA 2025.03.13

JVM 초기화 과정(Loading, Linking, Initialization)

Java Virtual Machine(JVM)의 실행 과정은 크게 클래스 및 인터페이스의 로딩(Loading), 연결(Linking), 초기화(Initialization) 세 단계로 이루어집니다.로딩(Loading): JVM은 실행 시 필요한 클래스나 인터페이스를 동적으로 로드합니다. 이는 해당 클래스나 인터페이스의 바이너리 표현을 찾아 이를 JVM의 메서드 영역(Method Area)에 로드하는 과정입니다.연결(Linking): 로드된 클래스나 인터페이스를 JVM의 런타임 상태에 결합하여 실행 가능하게 만드는 과정입니다. 연결은 다음 세 단계로 구성됩니다:검증(Verification): 클래스 파일의 형식과 구조가 JVM의 명세에 부합하는지 확인합니다.준비(Preparation): 클래스나 인터페이스의..

JAVA 2025.03.13

String vs StringBuilder vs StringBuffer

결론부터 말하자면 불변성과 동기화 유무이다.String은 불변(immutable)의 속성을 가지고 있고StringBuilder/StringBuffer는 가변(mutable)성을 가지고 있습니다.StringBuffer는 동기화를 지원하기 때문에 멀티쓰레드 환경에서 안정성(Thread-safe)을 가지고 있습니다. 그렇다면 불변과 가변은 무엇일까?말 그대로 변할 수 없는 읽기만 가능한걸 '불변'이라고 한다.public void strMethod() { String str = "hello"; str = str + "world";}public void strBuilderMethod() { StringBuilder sb = new StringBuilder("hello"); sb.append("world")..

JAVA 2025.03.12

자바 POJO (Plain Old Java Object)

Plain Old Java Object일반적으로 getter, setter 와 같이 기본적인 기능만을 가진 자바 객체 를 말한다 우리는 사람들이 자기네 시스템에 보통의 객체를 사용하는 것을 왜 그렇게 반대하는지 궁금하였는데, 간단한 객체는 폼 나는 명칭이 없기 때문에 그랬던 것이라고 결론지었다. 그래서 적당한 이름을 하나 만들어 붙였더니, 아 글쎄, 다들 좋아하더라고. - 마틴 파울러 그 좋아하는 사람 중 한명이 나인거 같다간단하게 요약하면 이런 말인거 같다. - 기존에 있던 소스를 가져다 쓰고 상속하고 계속해서 확장하다보니까 불필요하게 무거운 객체들이 계속 생겨났다. Spring Framework의 경우에도 저런 불필요한 의존성의 최소화해서 객체지향적인 코딩을 하는걸 목적으로 탄생한 Framework이..

JAVA 2025.03.11

자바 와일드카드(Wildcards)

In generic code, the question mark (?), called the wildcard, represents an unknown type. - Oracle Javadoc type을 모를 때 쓰는 표현을 wildcard라고 한다는데! 그러면 generic하고는 뭐가 다를까?(제네릭 개념 공부하러가기) 일단 결론부터 이야기하면 제네릭(Generic)은 Java에서 타입을 파라미터화하는 기능이고, Wildcard는 제네릭에서 특정 타입을 유연하게 처리하기 위한 기법이다. 좀 더 이해해보자 public void method1(List list)public void method2(List list)public void method3(List list) 위 3개의 method가 있다고 생각해보자..

JAVA 2025.03.11

자바 제네릭(Generics)

Generics add stability to your code by making more of your bugs detectable at compile time. – Oracle Javadoc compile time에서 버그를 감지해서 코드 안정성을 높여준다. 무슨 말인지 조금 더 이해를 해보기 위해 generics가 없다고 생각하고 소스를 구현해보자. (jdk 1.5 이전에는 없었다.)public Object method(Object obj) { return obj;}public void execute() { String str1 = (String) method("this is test"); String str2 = (String) method(1234);} 당연히 java.lang.ClassN..

JAVA 2025.03.11

자바 직렬화(Serialization)

직렬화: 객체를 스트림으로 변환하는 것역직렬화: 스트림을 객체로 변환하는 것 serialVersionUIDJVM은 직렬화와 역직렬화를 하는 시점의 클래스에 대한 버전 번호를 부여합니다.만약 그 시점에 클래스의 정의가 바뀌어 있다면 새로운 버전 번호를 할당합니다.그래서 직렬화 할 때의 버전 번호와 역직렬화를 할 때의 버전 번호가 다르면 역직렬화가 불가능하게 될 수도 있습니다. 이런 문제를 해결하려면 개발자가 직접 버전 번호를 정해주면 됩니다. class 정보가 변경되어도 같은 class로 인식하기를 원한다면 serialVersionUID를 선언해주면 된다.만약에 아래 상황을 살펴보자public class TestClass implements Serializable { String test1;}//생성자나..

JAVA 2025.03.09
반응형