전체 글 682

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

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

Dev/JAVA 2021.06.20

[ JAVA ] 제네릭 (Generic)

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

Dev/JAVA 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 클래스에 소속된 메소드라는 ..

Dev/JAVA 2021.06.20

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

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

Dev/JAVA 2021.06.20

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

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

Dev/JAVA 2021.06.20

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

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

Dev/JAVA 2021.06.20

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

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

Dev/JAVA 2021.06.20

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

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

Dev/JAVA 2021.06.20

[ JAVA ] 스레드(Thread)의 생성

작은 테트리스 게임 안에서도 다양한 스레드가 사용된다. 프로그램의 실행을 담당하는 '메인스레드' 게임 실행을 담당하는 '게임스레드' 블럭의 움직임을 담당하는 '블럭스레드' 게임 안의 여러 효과음을 담당하는 '음악스레드' 게임의 이미지를 그리는 'awt, swing 데몬스레드' 이렇게 다양한 스레드들이 한 프로그램 안에서 독립적으로 활동한다. 그러므로 스레드들이 자원을 두고 서로 충돌되지 않도록 적절한 코딩을 할 필요가 있다. 스레드란 무엇인가? CPU가 처리하는 일의 단위를 '프로세스'라고 한다. 그 프로세스는 여러 개의 스레드로 구성된다. JVM은 스레드를 STACK영역에 할당한다. 메모리를 할당받은 각각의 스레드들은 자신만의 STACK 구조를 갖는다. 이렇게 자신만의 메모리를 갖는 작업단위는 '독립성..

Dev/JAVA 2021.06.20

[JAVA ] GUI(Graphic User Interface)

JAVA코드를 짜고 이클립스를 실행하면 콘솔창이 뜬다. 하지만 우리는 프로그램을 '콘솔'로 사용하지 않는다. 아이콘을 '클릭'하면 '윈도우 창'이 열린다. 이와 같이 입출력 환경이 그래픽으로 구성된 환경을 두고 GUI 환경이라 부른다. 그럼 GUI란 어떤 일을 할까? GUI (Graphic user Interface) CPU는 연산이 목적이지 그림그리기가 목적이 아니다. 만약 CPU가 그림까지 그려버리면, 실제로 주목적인 연산을 처리하지 못하고 그림에만 매달리게 된다. 그래서 이 작업을 다른 장치에 맡겨두는데 그것이 그래픽카드(혹은 내장그래픽)다. OS는 사용자에게 그래픽을 제공한다. 사용자는 그래픽 안에서 각종 이벤트를 발생시킨다(키보드 입력, 마우스 클릭) . 그 이벤트를 OS는 2진코드로 바꾸어 C..

Dev/JAVA 2021.06.20