JAVA 54

[ JAVA ] 문자 인코딩(Character Encoding)이란?

인간과 컴퓨터가 대화하려면 어떻게 할까? 인간의 언어는 문자, 이미지, 동영상, 소리 등이 있다. 그러나 컴퓨터는 1과 0밖에 모른다. 그러므로 우리는 문자, 이미지, 동영상, 소리를 1과 0에 대응하여 표현해야 한다. 문자표(Character Set) 특히 문자를 1과 0으로 표현하려면 문자표가 있어야 한다. 대표적인 문자표는 '아스키 코드표'가 있다. 아스키 코드표는 7bit가 만들어 낼 수 있는 이진수 조합을 문자와 대응한 표이다. 총 128가지 표현 가능하다. 하지만 128가지는 영어 알파벳 표현에는 문제 없지만 세계 각국의 문자 표현은 불가능하다. 그래서 탄생한 것이 16bit를 활용한 유니코드이다. 유니코드는 16bit이기에 216가지, 즉 65536가지 문자 표현이 가능하다. 16비트 고정폭..

JAVA/JAVA Basic 2021.07.05

[ JAVA ] 바이트 스트림 vs 문자 스트림

[ JAVA ] InputStream, OutputStream 프로그램 실행은 보조기억장치(Disk)에 저장된 프로그램이 RAM에 할당됨을 의미한다. 이때 할당된 RAM 영역을 System(시스템)이라 부른다. 시스템은 안팎으로 상호작용한다. 밖에서 들어오는 데이터 lordofkangs.tistory.com 지난 포스팅에서 스트림(Stream)에 대해서 알아보았다. 스트림(Stream)은 프로그램 안팎으로 들어오거나 나가는 바이트 흐름을 의미한다. 바이트 스트림 vs 문자 스트림 기본적으로 스트림에는 두 가지 종류가 있다. 1. 바이트 스트림 2. 문자 스트림 '바이트 스트림'은 데이터를 1byte 단위로 읽는다. 반면에 '문자 스트림'은 2byte 단위로 읽는다. 파일은 OS에 영향을 받는다. 그러므로..

JAVA/JAVA Basic 2021.06.30

[ JAVA ] 제네릭 (Generic) 심화 ( 와일드 카드 + 상속 )

[ JAVA ] 제네릭 (Generic) 제네릭(Generic)을 사용하는 이유는 무엇일까? 프로그래밍에서 자료형(Data Type)이란 굉장한 의미를 갖는다. 자료형이 '명시'되어 있으면 데이터를 저장하는데 필요한 메모리의 크기를 알 수 있다. lordofkangs.tistory.com 이전 포스팅을 통해 기본적인 제네릭의 개념을 알아보았다. 이번에는 제네릭 심화 개념을 파헤쳐 볼까한다. 제네릭을 사용하면 타입 파라미터로 모든 클래스를 넣어줄 수 있다. 이렇게 모든 타입이 가능하다는 말은 프로그램에 있어 좋은 말이 아니다. 다양한 타입이 들어오면서 데이터의 정체성을 훼손시킬 수 있다. 예를들면 어떤 제네릭 클래스는 숫자 타입만 사용할 목적으로 만든 클래스지만 문자열 클래스가 들어가도 컴파일 과정에서 어..

JAVA/JAVA Basic 2021.06.20

[ JAVA ] 제네릭 (Generic)

제네릭(Generic)을 사용하는 이유는 무엇일까? 프로그래밍에서 자료형(Data Type)이란 굉장한 의미를 갖는다. 자료형이 '명시'되어 있으면 데이터를 저장하는데 필요한 메모리의 크기를 알 수 있다. 이처럼 자료형은 변수에 저장할 수 있는 데이터의 '범위'를 알려준다. 그러므로 코딩을 할 때, 데이터를 데이터에 알맞는 크기의 변수에 저장하면 모든 일이 쉽게 풀릴 것만 같다. 하지만 코딩은 그리 단순한 흐름으로 흘러가지 않는다. double realNum = 1.5; int intergers = (int) realNum; double(8byte)형 변수에 저장한 데이터를 int(4byte)형 변수에 저장해야하는 상황이 발생한다. (강제형변환, casting) 강제형변환은 프로그램 성능에 악영향을 준다..

JAVA/JAVA Basic 2021.06.20

[ JAVA ] 스레드(Thread) 동기화5 (Implicit Lock vs Explicit Lock )

동기화는 스레드 간 작업 순서를 결정하는 것이다. 작업순서를 결정하기 위해서는 두 가지가 고려되어야 한다. 1. 상호배제(Mutex) 2. 협동(Cooperation) 상호배제(Mutex)에 관해서는 '스레드 동기화 이해하기 1,2,3 포스팅에서 알아보았고 협동(Cooperation)에 관해서는 '동기화 이해하기 4'에서 알아보았다. 이번 포스팅은 '스레드 동기화 이해하기 5'로 스레드 동기화와 관련된 마지막 포스팅이다. 이번 포스팅에서는 협동(Cooperation)을 더 다루어 볼것이다. 협동이란, 스레드 간의 소통을 원할히 하여 동기화를 구현하는 것이다. '스레드 동기화 이해하기 4'에서는 join()과 yield()를 알아보았다. 두 메소드의 공통점은 둘 다 Thread 클래스에 소속된 메소드라는 ..

JAVA/JAVA Basic 2021.06.20

[ JAVA ] 스레드(Thread) 동기화4 ( yield(), join() )

[ JAVA ] 스레드(Thread) 동기화1 ( Intrinsic Lock + 피터슨 알고리즘 ) 동기화 지훈이네 가족은 아빠, 엄마 그리고 형까지 네 식구로 이루어져 있다. 그러나 집 안에 컴퓨터가 단 한 대 뿐이라 가족간의 충돌이 불가피했다. 그래서 지훈이네 가족은 컴퓨터를 쓰는 순 lordofkangs.tistory.com 위 포스팅에서 동기화는 '상호배제(Mutex)'와 '협동(Cooperation)'으로 이루어진다고 말했다. 이전 포스팅 '스레드 동기화 이해하기 1,2,3'에서는 상호배제(Mutex) 방법으로 피터슨 알고리즘, 세마포어, 모니터를 알아보았다. 이번 포스팅에서는 동기화 작업을 위한 협동(Cooperation)에 대해서 알아볼 것이다. 동기화는 작업 순서를 정하는 것이다. 그 안에..

JAVA/JAVA Basic 2021.06.20

[ JAVA ] 스레드(Thread) 동기화3 ( 모니터(Monitor) )

[ JAVA ] 스레드(Thread) 동기화2 (세마 포어 Semaphore) 이전 포스팅에서는 공유 객체를 향한 스레드의 경쟁이 적은 경우의 상황을 알아 보았다. 이번에는 공유객체를 향해 스레드의 경쟁이 심해지는 경우, 어떤 방식으로 JVM이 스레드 동기화를 시도 lordofkangs.tistory.com 이전 포스팅에서 동기화를 위한 상호배제 방법으로 '세마포어(Semaphore)에 대해서 알아 보았다. 하지만 세마포어는 JVM이 채택하고 있는 방식이 아니다. JVM은 상호배제를 위해 Monitor 방식을 사용한다. [ JAVA ] 스레드(Thread) 동기화1 ( Intrinsic Lock + 피터슨 알고리즘 ) 동기화 지훈이네 가족은 아빠, 엄마 그리고 형까지 네 식구로 이루어져 있다. 그러나 집..

JAVA/JAVA Basic 2021.06.20

[ JAVA ] 스레드(Thread) 동기화2 (세마 포어 Semaphore)

이전 포스팅에서는 공유 객체를 향한 스레드의 경쟁이 적은 경우의 상황을 알아 보았다. 이번에는 공유객체를 향해 스레드의 경쟁이 심해지는 경우, 어떤 방식으로 JVM이 스레드 동기화를 시도하는지 파헤쳐 볼 것이다. 결론부터 말하면, 경쟁이 심해지면 공유 객체는 Heavy Weight Lock 상태가 된다. Heavy Weight Lock 상태는 모니터(Monitor) 방식으로 상호배제를 구현한다 Monitor 방식은 다음 포스팅에서 진행할 예정이다. 이번 포스팅은 Monitor 방식이 나올 수 있도록 영감을 준 세마포어(Semaphore) 방식에 대해서 알아볼 것이다. JVM은 세마포어 방식을 사용하지 않는다. JVM는 synchronized 키워드를 통한 Monitor방식으로 상호배제를 구현한다. JVM..

JAVA/JAVA Basic 2021.06.20

[ JAVA ] 스레드(Thread) 동기화1 ( Intrinsic Lock + 피터슨 알고리즘 )

동기화 지훈이네 가족은 아빠, 엄마 그리고 형까지 네 식구로 이루어져 있다. 그러나 집 안에 컴퓨터가 단 한 대 뿐이라 가족간의 충돌이 불가피했다. 그래서 지훈이네 가족은 컴퓨터를 쓰는 순서를 정하기로 결정했다. 이것이 '동기화'다. 동기화는 한정된 자원을 두고 작업들 간의 작업순서를 정하는 것이다. 작업순서를 정할 때는 두 가지 개념을 생각해야 한다. 1. 상호배제(Mutex) 2. 협동(Cooperation) 지훈이가 컴퓨터를 쓰고 있는 중에, 형이 나타나 컴퓨터를 낚아채면 안 된다. 이것이 상호배제(Mutex)다. 그리고 지훈이가 컴퓨터를 다 썼으면 다음 차례에게 컴퓨터를 다 사용했음을 알려줘야한다. 이것이 협동(Cooperation)이다. 상호배제와 협동이 잘 구현되면 안정적인 자원공유가 가능해진..

JAVA/JAVA Basic 2021.06.20

[ JAVA ] 스레드(Thread) 우선순위 설정

스레드(Thread) 우선순위 설정 하나의 프로세스는 여러 스레드를 생성하여 처리될 수 있다. 그러나 스레드가 점유할 수 있는 자원은 한정적이다. 여기서 자원이란, CPU와 HEAP 영역의 객체를 의미한다. 우리는 CPU를 고를 때, 코어와 쓰레드를 고려한다. 코어는 연산처리를 위한 ALU + 레지스터 + 컨트롤러가 합쳐진 모듈을 의미한다. 한 개의 코어는 한 개의 스레드를 처리한다. 여기서 문제가 생긴다. 일반적으로 1개의 코어에 1개의 ALU가 할당되므로 자원이 한정적이다. 위 그림을 기준으로 봤을 때, 쓰레드가 4개가 넘어간다면 CPU가 가진 코어로는 모든 쓰레드를 감당할 수 없다. 그러므로 어떤 스레드를 우선 처리할 것인지 정해야 하는데 이것을 '스레드 스케줄링'이라 부른다. 스레드 스케줄링에는 ..

JAVA/JAVA Basic 2021.06.20