반응형

Java 14

Java Collection - List

가장 자주 비교되는 ArrayList와 LinkedList 그리고 Array하고는 어떻게 다른지 확인해보자ArrayList의 경우 실제 내부에 Array구조를 가져가고 있다.class ArrayList { Object[] data; E get(int index) { return (E) data[index]; }} 결국 ArrayList도 내부적으로 Array형태를 가져가고 있지만, 핵심은 동적인 리사이징 기능이다.Array의 경우 최초에 선언한 사이즈에서 조절이 불가능하다. ArrayList의 경우 초기 설정한 size보다 더 많은 양의 데이터가 들어올 경우 자동으로 사이즈를 조절하여 새로운 배열에 데이터가 쌓인다.그렇다면 ArrayList에 무작정 데이터를 적재하면 어떻..

JAVA 2025.08.08

Java Collection - Map

아마 가장 많이 사용하는 Map은 HashMap일 것이다.HashMap의 구조에 대해서 살펴보자 HashMap key값에서 value를 찾을 수 있는 O(1) 형태의 데이터 구조이다.Java의 모든 객체는 hashCode()와 equals() 메소드를 가지고 있다.Node>[] table;public V get(Object key) { int index = object.hashCode() % 16; List list = table[index]; for(int i = 0; i 객체의 hashCode()를 통해 index의 위치를 탐색하기 때문에 O(1) 형태의 구조를 가지지만 hash충돌이 많을 경우 O(n)의 구조를 가져갈 수 있으니 hashCode(), equals()를 재구현해야할 경우 주의가..

JAVA 2025.08.08

Java IO vs NIO

java.io, java.nio (new input/output)io는 blocking, nio 는 non-blocking 방식(blocking도 지원)io는 stream 형식으로 입출력, nio는 channel 형식으로 입출력이라고 하지만 결국에는 커넥션을 맺는건데 이게 왜 중요할까???예를 들어 이렇게 생각할 수 있을거 같다."실제로 데이터를 끊어서 읽어온다음 처리하는게 아니라 다 읽어오고 나서 처리하는건데 non-blocking 되는게 필요한거야?"(물론 끊어 읽어와서 처리하는 것도 가능은하다.이런 의문은 소스코드를 보면 더 커진다.InputStream in = socket.getInputStream();byte[] buffer = new byte[1024];int len = in.read(buff..

JAVA 2025.07.20

Java Collection Framework

A collection is simply an object that groups multiple elements into a single unit. Collections are used to store, retrieve, manipulate, and communicate aggregate data.— Collections Framework Overview, Java SE 8Oracle JDK에서는 Collection에 대해서 데이터를 저장하고 조작하는 표준화된 방식을 제공하고 있다고 설명하고 있다. Collection Framework를 제공함으로써 다음과 같은 이점을 가질 수 있다고 한다.1. 프로그래밍 작업을 줄일 수 있다.2. 성능을 향상시킨다.3. 관련 없는 API간 상호운용성을 제공한다.4. ..

JAVA 2025.07.12

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
반응형