JAVA 50

유니코드와 UTF-8

유니코드는 문자표, 테이블이다. (이 글자를 bit 로 표현하면 어떤 bit 로 표현된다는 테이블 - 변환표)utf-8 은 그 표를 가지고 문자열을 어떻게 압축해서 표현할것인지유니코드는 글자와 코드가 1:1매핑 되어 있는 ‘코드표'이다. (코드표)UTF-8은 유니코드를 인코딩(encoding) 하는 방식이다. 전 세계에서 사용하는 약속이다.문자열을 비트로 표현하면 어떤 비트로 표현될 것이다라는 테이블 변환 표이고UTF- 8 은 유니 코드를 어떻게 변환할 것인가에 대한 스팩이다.UTF-8이란 말은 Unicode Transformation Format - 8bit에서 유래했다. 문자 인코딩 : 문자 집합을 통해 문자를 숫자로 변환하는 것문자 디코딩: 문자 집합을 통해 숫자를 문자로 변환하는 것인코딩 = 데..

JAVA 2024.11.17

[JAVA] String intern()

String의 intern() 메서드에 대해 공부하다 보면 "절대 쓰지 말라"는 권고를 접할 수 있습니다.intern()은 힙 영역에 생성된 String 객체를 String Constant Pool로 옮겨 메모리를 절약하고 중복을 줄이기 위한 메서드지만, 잘못 사용하면 성능 문제가 발생할 수 있습니다. String Constant Pool 은 자바 7 이후에  메서드 영역에서 힙 영역으로 옮겨졌습니다. 즉 GC 의 대상이 된다는 것입니다.  intern() 메서드를 사용할 때 발생할 수 있는 문제점 Full GC 발생 가능성 증가로 인한 성능 저하객체는 처음 생성 시 에덴 영역에 할당되고, 참조되지 않으면 Minor GC에서 쉽게 수거됩니다. 하지만 intern()으로 객체를 String Constant..

JAVA 2024.11.15

[JAVA] 스레드 제어와 생명 주기2 (Interrupted, yield)

인터럽트 - 시작 1특정 스레드의 작업을 중간에 중단하려면 어떻게 해야 할까?package thread.control.interrupt;import static util.MyLogger.log;import static util.ThreadUtils.sleep;public class ThreadStopMainV1 { public static void main(String[] args) { MyTask task = new MyTask(); Thread thread = new Thread(task, "work"); thread.start(); sleep(4000); log("작업 중단 지시 runFlag = true"); task..

JAVA 2024.11.13

[JAVA] 스레드 Join

스레드는 생성하고 시작하고, 종료되는 생명주기를 가진다. 스레드의 상태New (새로운 상태) : 스레드가 생성되었으나 아직 시작되지 않은 상태Runnable (실행 가능 상태) : 스레드가 실행 중이거나 실행될 준비가 된 상태Blocked (차단 상태) : 스레드가 동기화 락을 기다리는 상태Waiting (대기 상태) : 스레드가 무한으로 다른 스레드의 작업을 기다리는 상태Time Waiting (시간제한 대기 상태): 스레드가 일정 시간 동안 다른 스레드의 작업을 기다리는 상태Terminated (종료 상태) : 스레드의 실행이 완료된 상태.자바 스레드(Thread) 의 생명주기는 여러 상태(state)로 나뉘며, 각 상태는 스레드가 실행되고 종료되기까지의 과정을 나타낸다. 자바 스레드의 생명주기를 자..

JAVA 2024.11.12

[JAVA] Runnable 을 만드는 다양한 방법

Runnable을 만드는 다양한 방법 중첩 클래스를 사용하면 Runnable을 더 편리하게 만들 수 있다. 참고로 모두 결과는 같아. 정적 충첩 클래스 사용package thread.start;import static util.MyLogger.log;public class InnerRunnableMainV1 { // 특정 클래스만에서만 사용되는 경우 정적 중첩 클래스 사용 public static void main(String[] args) { log("main() start"); MyRunnable myRunnable = new MyRunnable(); Thread thread = new Thread(myRunnable); thread.sta..

JAVA 2024.11.11

[JAVA] 데몬 스레드

스레드는 사용자(user) 스레드와 데몬(daemon) 스레드 2가지 종류로 구분할 수있다.  사용자 스레드 (non-deamon 스레드)프로그램의 주요 작업을 수행한다.작업이 완료 될 때 까지 실행된다.모든 user 스레드가 종류되면 JVM 도 종료된다.  데몬 스레드 백그라운에서 보조적인 작업을 수행한다.모든 user 스레드가 종류되면  데몬 스레드는 자동으로 종료된다. jvm 은 데몬 스레드의 실행 완료를 기다리지 않고 종료된다. 데몬 스레드가 아닌 모든 스레드가 종류되면, 자바 프로그램도 종료된다. 용어 - 데몬 : 그리스 신화에서 데몬은 신과 인간 사이의 중간적 존재로 , 보이지 않게 활동하며 일상적인 일들을 도왔다. 이런 의미로 컴퓨터 과학에서는 사용자에게 직접적으로 보이지않으면서 시스템의 백..

JAVA 2024.11.11

[JAVA] 스레드란? run() start() 의 차이

스레드란 무엇이면 왜 스레드 실행 시 run() 메서드가 아닌 start()를 호출하라고 하는 걸까?해당 내용을 알아보자. 자바 메모리 구조자바 메모리 영역은 크게 메서드, 스택, 힙 영역으로 나눠져 있다. 메서드 영역(Method Area) :  메서드 영역은 프로그램을 실행하는데 필요한 공통 데이터를 관리한다. 이 영역은 프로그램의 프로그램의 모든 영역에서 공유한다.클래스 정보 : 클래스의 실행 코드 (바이트 코드). 필드, 메서드와 생성자 코드 등 모든 실행 코드가 존재한다.static 영역 : static 변수들을 보관한다.런타임 상수 풀 : 프로그램을 실행하는데 필요한 공통 리터럴 상수를 보관한다.스택 영역 (Stack Area) : 자바 실행 시, 하나의 실행 스택이 생성된다. 각 스택 프레임..

JAVA 2024.11.11

[JAVA] String + 연산과 비효율성 StringBuilder의 해결 원리

String에 + 연산은 상수풀에 메모리가 할당되어 중간연산 과정에서 많은 객체를 생성한다. StringBuilider를 사용하면 중간과정의 비효율을 해결할 수 있다는데 어떠한 원리로 해결하였을까?궁금증이 생겨 해당 내용을 포스팅하게 되었다.   String에서 + 연산과 그 비효율성 String 객체에서 + 연산을 사용할 때마다 새로운 객체가 생성된다. 이는 불변 (immutable) 특성 때문에 발생하는데 , String 객체는 한번 생성되면 그 값을 변경할 수 없다.따라서 + 연산을 통해 여러 문자열을 이어 붙일 때, 중간 과정에서 새로운 String 객체들이 계속 생성되고,  이 객체들은 상수 풀에 할당되어 메모리를 추가로 차지한게 된다.  이로 인해 불필요한 객체가 계속해서 생성되고 메모리 사용..

JAVA 2024.11.10

[JAVA] 제네릭 (Generic) 2

핵심 부분 미리보기!제네릭 메서드 VS 와일드카드printGenericV1 제네릭 메서드를 보자. 제네릭 메서드에는 타입 매개변수가 존재한다. 그리고 특정 시점에 타입 매개변수에 타입 인자를 전달하여 타입을 결정해야 한다. 이런 과정은 매우 복잡하다.반면에 printWildcardV1 메서드를 보자. 와일드카드는 일반적인 메서드에 사용할 수 있고, 단순히 매개변수로 제네릭 타입을 받을 수 있는 것뿐이다. 제네릭 메서드처럼 타입을 결정하거나 복잡하게 작동하지 않는다.단순히 일반 메서드에 제네릭 타입을 받을 수 있는 매개변수가 하나 있는 것 뿐이다.와일드 카드로 정의된 제네릭 타입에서는 컴파일러가 그 타입의 불변성을 보장하기 위해서 쓰기를 제한한다.즉 와일드 카드로 정의된 자료구조에서 그 자료구조 대한 불변..

JAVA 2024.11.09