'자바'에 해당하는 글 19건

스프링, 스프링 부트와 관련된 책들은 시중에 굉장히 많이 있다.

그래서 스프링을 필요로 하는 사람들은 어렵지 않게 책을 찾아서 공부를 시작할 수 있을 텐데

'Spring Boot Up & Running 처음부터 제대로 배우는 스프링 부트' 이 책은 어떤 책일지 궁금증을 가지며 읽기 시작했다.

 

책의 표지에서도 바로 느낄 수 있듯이 책은 처음부터 스프링 부트의 기본부터 다루고 있다.

하지만 기본에 대한 이론에서 그치치 않고, REST API라던지 스프링 MVC 패턴, 그리고 리액티브 프로그래밍등 다양하고 전반적인 스프링에 대한 내용들을 다루고 있어서 단순히 기본을 넘어서 중급이상으로 넘어갈 수 있도록 신경 쓴 책이라고 느껴졌다.

 

스프링 부트를 통해 일을 하고있지만 다시 초심으로 돌아가서 읽게되는 좋은 기회였고 놓치고 있거나 알지 못했던 부분들도 챙길 수 있어서 읽으면서 좋았었다 :)

 

 

※ 한빛미디어 <나는 리뷰어다> 활동을 위해서 책을 제공받아 작성된 서평입니다.


WRITTEN BY
김치치즈스마일
세계정복!

,

"이것이 자바다"라는 책을 처음 마주했을 때 가장 먼저 든 생각은 '아, 굉장히 두껍다!' 였다.

그만큼 많은 내용들을 빼곡하게 다루고 있을 것이라는 것을 이미 두께에서 짐작이 가능할 정도로 두껍다는게 첫 인상이였다.

 

딱 봐도 두껍다ㅎㅎ

 

그러던중 저자가 눈에 들어왔다. 두분이 공동 저자셨는데 그 중에서 한분의 이름이 너무 낯이 익어서 찾아보니 과거에 판교에서 프로그래밍 강의를 들었을 때 우리 기수를 담당해주신 교수님이셨다!

지금 내가 개발자로 일하고 있을 수 있는 밑거름이 되는 지식을 가득 채워주시던 분이셔서 너무 반가웠고 이미 직접 강의를 들었었기에 강의나 내용에 대한 믿음과 확신이 샘솟았다. 

 

취준생 시절 강의를 듣던 때로 돌아가서 그때의 기억을 되살리며 책을 읽기 시작했다. 

책의 표지는 아쉽게도 관심을 끌 수 있을만한 디자인은 아니었다. 두꺼운 책의 두께와 표지만 봤을 때는 다소 학생 혹은 처음 프로그래밍을 공부하려는 학생들에 흥미를 끌기에는 아쉬워 보였지만 책을 하나씩 읽어보면 정말 놓치는 것 하나 없이 다양한 그림 예제들과 많은 소스예제들로 빼곡하게 채워져 있기 때문에 정말 기본부터 하나씩 알아가기 좋았다.

 

이해를 돕는 예제 그림과 코드들

또한 각 단원이 끝날 때마다 확인 문제를 통해서 배운 내용들을 복습할 수 있는 점이 좋았다.

하지만 가장 눈에 띄었던 점은 Java 버전을 8부터 17까지 대응하고 있다는 것과 자바의 기본 이론뿐만 아니라 Oracle연동과 그걸 통해서 간단한 게시판을 만들어보는 예제까지 정말 기본부터 응용까지 많은 내용들을 다루고 있는게 좋았다.

 

이런 내용들 또한 과거에 강의를 들어봤기 때문에 얼마나 탄탄하며 이해가 잘 되는지 직접 느껴봤기에 더욱 와닿았다.

 

다소 딱딱해보거이거나 한번에 흥미를 확 끌만한 디자인은 아니지만 그만큼 기본과 활용까지 많은 내용들을 빠짐없이 다루고 있었으며 많은 양의 예제 그림과 예제 코드를 통해서 공부하는 사람들에게 더욱 이해하기 쉽게 구성한 점이 매우 좋았다.

 

자바 개발자라면 옆에 놔두고 두고두고 읽어보기에 딱 좋은 책이었다 :)

 

※ 한빛미디어 <나는 리뷰어다> 활동을 위해서 책을 제공받아 작성된 서평입니다.

 

 


WRITTEN BY
김치치즈스마일
세계정복!

,

String.format

프로그래밍/Java 2020. 1. 25. 23:20

String 클래스의 format 메서드를 이용하면 지정된 위치에 값을 대입해서 문자열을 만들 수 있다.

 

1.String format문의 형식

%[argument_index$][flags][width]conversion

예) String.format("%2$10s%1$10s", "KOREA", "JAPAN");

※ %와 conversion은 필수이며 나머지 arguent_index나 flags, width는 생략이 가능하다.

 

2. [argument_index]

- 파라미터의 인덱스

- 숫자와 $문자로 구성

- 1부터 시작

- '<'을 사용하여 직전의 파라미터와 같은 것임을 지정

 

3. [flag]

- '-'를 사용하면 출력하는 문자열이 왼쪽으로 정렬

- '-'를 빼면 출력하는 문자열이 오른쪽으로 정렬

 

4. [width]

- 원하는 길이를 지정

 

5. conversion

- %d : 10 진수

항목 내용
%10d 숫자만큼 문자열 좌측에 공백을 채워 숫자열 길이를 만듬
%-10d 숫자만큼 문자열 우측에 공백을 채워 숫자열 길이를 만듬
%010d 숫자만큼 문자열 좌측에 0을 채워 숫자열 길이를 만듬
%,d 1000 단위로 콤마(,) 처리를 함

  예) System.out.println(String.format("%10d%10d", 12345, 67890));

- %x or %X : 16진수

  예) System.out.println(String.format("%10x%10x", 2047, 2047));

- %o : 8진수

  예) System.out.println(String.format("%10o%10o", 2047, 2047));

- %f : 실수

항목 내용
%10f 숫자만큼 문자열 좌측에 공백을 채워 숫자열과 소숫점 이하의 자리를 포함하여 길이를 만듬
%-10f 숫자만큼 문자열 우측에 공백을 채워 숫자열과 소숫점 이하의 자리를 포함하여 길이를 만듬
%.2f (.) 우측에 해당하는 숫자만큼 소숫점 이하 자리를 반올림하여 길이를 만듬
%010.2f 숫자(10) 만큼 문자열 좌측에 0을 채우고 점(.) 우측에 해당하는 숫자만큼 소숫점 이하 자리를 반올림하여 길이를 만듬
%,.2f 1000 단위로 콤마(,) 처리를 하고, 점(.) 우측에 해당하는 숫자만큼 소숫점 이하 자리를 반올림하여 길이를 만듬

  예) System.out.println(String.format("%10.2f%10.2f", 100000.999f, 200000.999f));

- %s or %S : 문자열

항목 내용
%10s
%-10s 숫자만큼 문자열 우측에 공백을 채워 문자열 길이를 만듬
%10.2s (.) 우측에 숫자만큼 스트링을 자른 후, 점 좌측 숫자만큼 문자열 좌측에 공백을 채워 문자열 길이를 만듬
%-10.2s 점(.) 우측에 숫자만큼 스트링을 자른 후, 점 좌측 숫자만큼 문자열 우측에 공백을 채워 문자열 길이를 만듬

  예) System.out.println(String.format("%2$10s%1$10s", "KOREA", "JAPAN"));

- %c or %C : 문자

  예) System.out.println(String.format("%c", 'A'));

- %t or %T : 시간

항목 내용
%td Date를 입력 받으며 오늘 일자를 제공
%tm

Date를 입력 받으며 이번 달을 제공 

예) 12

%th

long형 시간 데이터를 입력 받으며 이번 달을 제공

예) 12월

%ty

Date를 입력 받으며 이번 약년을 제공

예) 20

%tD

Date를 입력 받으며 오늘 날짜(월/일/약년)를 제공

예) 01/25/20

%tY

Date를 입력 받으며 오늘 년을 제공

예) 2020

%tF

Date를 입력 받으며 오늘 날짜(월/일/년)를 제공

예) 2020-01-25

%fT long형 시간 데이터를 입력 받으며 현재시간(시:분:초)를 제공
%tH

long형 시간 데이터를 입력 받으며 시간(24시간 단위)를 제공

예) 23

%tl

long형 시간 데이터를 입력 받으며 시간(12시간 단위)을 제공

예) 11

%tM long형 시간 데이터를 입력 받으며 분을 제공
%tS long형 시간 데이터를 입력 받으며 초를 제공
%tL

long형 시간 데이터를 입력 받으며 밀리세건을 제공

예) 871

  예) System.out.println(String.format("날짜,시간 서식: %tY년 %<tm월 %<td일 %<tH시 %<tM분 %<tS초", new Date()));

 

 

참고 및 출처]

- 까딱이의 춤과 IT

- Blog Goooood.net

- 라이언 서버

- 자바킹 - IT 정복

- Java Document

 

'프로그래밍 > Java' 카테고리의 다른 글

enum 2  (3) 2018.01.28
enum 1  (0) 2018.01.02
쓰레드(Thread) 3  (0) 2017.11.20
쓰레드(Thread) 2  (0) 2017.11.04
쓰레드(Thread) 1  (0) 2017.11.03

WRITTEN BY
김치치즈스마일
세계정복!

,

문제) 입력 받은 n개까지의 소수의 개수를 구하시오. (1은 소수 X)

응용) 소수의 합을 구하시오, 소수를 전부 출력하시오

 

소수의 개수를 구하는 방식은 간단하며 여러개의 방법이 있다. 

처음에는 안에 있는 for문을 for(int j = 2; j <= i; j++)로 사용하여 if(i % j == 0)일 경우, Count를 해주어서 구하였었다.

하지만 이와 같은 방법은 개수를 구할 수는 있었지만 모든 값들을 다 계산하여야 하기에 효율성이 떨어진다고 생각하여 더욱 효율적인 방법이 있을지 고민을 해보았다.

그 결과 아래와 같이 수정하였다. (Math.sqrt()는 루트 값을 구하는 함수)

(학생 때 수학 좀 열심히 공부할걸....)

public int solution(int n) {
      int answer = 0;
      
      for(int i = 2; i <= n; i++) {
          boolean isPrime = true;
          for(int j = 2; j <= Math.sqrt(i); j++) {
              if(i % j == 0) {
                  isPrime = false;
                  break;
              }
          }
          
          if(isPrime) {
              answer++;
          }
      }
      
      return answer;
 }

'프로그래밍 > 알고리즘' 카테고리의 다른 글

보간 탐색(Interpolation Search)이란?  (0) 2017.10.19
이진 탐색(Binary Search)이란?  (0) 2017.10.18
순차 탐색(Sequential Search)이란?  (0) 2017.10.18
탐색(Search)이란?  (0) 2017.10.18
선택 정렬(Selection Sort)  (0) 2017.10.08

WRITTEN BY
김치치즈스마일
세계정복!

,

자바스크립트란 무엇일까? 우리가 흔히 알고 있는 자바(Java)랑 이름이 비슷한데 자바의 다른 이름인 것일까?

아니면 형제 관계의 언어일까?

지금부터 자바스크립트란 무엇인지 알아보자! 

 

자바스크립트란?

웹 브라우저에서 동작하는 스크립트 언어.

넷스케이프에서 개발되었으며 초기에는 라이브스크립트라는 이름으로 개발.

이후 썬 마이크로시스템에서 개발한 자바와 이름을 같게 하는 마케팅 조약을 체결한 후, 자바스크립트라는 이름으로 발전하기 시작.


자바스크립트의 장점

- 유연하며 뛰어난 표현력을 가짐.

- 느슨한 타입 체크로 개발자에게 타입 체크에 대한 자유를 줌.

- 웹개발, 서버개발, 애플리케이션 개발 등 다양한 용도에 쓰일 수 있음.


자바스크립트의 단점

- 디버깅이 어려움

- 타입 체크가 자유로운만큼 컴파일 타임에서 에러를 발견하지 못하고 런 타임 시 발견.

- 최상위 레벨의 객체들은 모두 전역 객체 안에 위치하여, 이름 충돌의 위험성 존재.

 


[출처] 네이버 백과사전

[출처] 인사이드 자바스크립트

'프로그래밍 > Java script' 카테고리의 다른 글

함수도 객체다!  (0) 2019.05.29
함수 생성 방법  (0) 2019.05.29
자바스크립트 데이터 타입2  (0) 2018.08.04
자바스크립트 데이터 타입1  (0) 2018.08.04

WRITTEN BY
김치치즈스마일
세계정복!

,

enum 2

프로그래밍/Java 2018. 1. 28. 23:29

저번 enum 1에서는 int enum 패턴의 문제점을 확인하였다. 이번부터는 enum이란 과연 무엇인지 본격적으로 알아보자.

enum이란?

· 열거 자료형(enummerated type)은 고정 개수의 상수들로 값이 구성되는 자료형.

· 자바의 enum 자료형은 완전한 기능을 갖춘 클래스.

· 열거 상수(enumeration constant)별로 하나의 객체를 public static final 필드 형태로 제공하는 것. (클라이언트가 접근할 수 있는 생성자가 없기 때문)

· enum 자료형의 개체 수는 엄격히 통제됨. (싱글턴 패턴을 일반화 한 것)

· enum 자료형은 컴파일 시점 형 안정성(compile-time type safety)을 제공함.

· enum 자료형은 name space가 분리되어 있기 때문에 같은 이름의 상수가 평화롭게 공존할 수 있음.

· 상수를 제공하는 필드가 enum 자료형과 클라이언트 사이에서 격리 계층(layer of insulation) 구실을 하기 때문에 상수를 추가하거나 순서를 변경해도 다시 컴파일할 필요가 없음.

· toString 메서드를 호출하면 인쇄 가능 문자열로 쉽게 변환이 가능.

· 임의의 메서드나 필드도 추가 가능.

public enum Apple {
	FUJI, PIPPIN, GRANNY_SMITH
}

public enum Orange {
	NAVEL, TEMPLE, BLOOD
}

※ enum의 간단한 예

 

풍부한 enum 자료형을 만드는 법

· enum 상수에 데이터를 넣으려면 객체 필드(instance field)를 선언하고 생성자를 통해 받은 데이터를 그 필드에 저장하면 됨.

public enum Planet {
	MERCURY (3.302e+23, 2.439e6),
	VENUS (4.869e+24, 6.052e6),
	EARTH (5.975e+24, 6.378e6),
	MARS (6.419e+23, 3.393e6),
                JUPITER (1.899e+27, 7.149e7),
	SATURN (5.685e+26, 6.027e7),
	URANUS (8.683e+25, 2.556e7),
	NEPTUNE (1.024e+26, 2.477e7);
	
	private final double mass; // 킬로그램 단위
	private final double radius; // 미터 단위
	private final double surfaceGravity; // m / s^2
	
	private static final double G = 6.67300E-11;
	
	Planet(double mass, double radius) {
		this.mass = mass;
		this.radius = radius;
		surfaceGravity = G * mass / (radius * radius);
	}
	
	public double mass() {
		return mass;
	}
	
	public double radius() {
		return radius;
	}
	
	public double surfaceGravity() {
		return surfaceGravity;
	}
	
	public double surfaceWeight(double mass) {
		return mass * surfaceGravity; // F = ma
	}
}

public class WeightTable {
	public static void main(String[] args) {	
		Double earthWeight = 175d;
		Double mass = earthWeight / Planet.EARTH.surfaceGravity();
		
		for(Planet p : Planet.values()) {
			System.out.printf("Weight on %s is %f%n", p, p.surfaceWeight(mass));
		}
	}
}

※ 풍부한 enum 자료형의 예

 

 

[참고] Effective Java

'프로그래밍 > Java' 카테고리의 다른 글

String.format  (0) 2020.01.25
enum 1  (0) 2018.01.02
쓰레드(Thread) 3  (0) 2017.11.20
쓰레드(Thread) 2  (0) 2017.11.04
쓰레드(Thread) 1  (0) 2017.11.03

WRITTEN BY
김치치즈스마일
세계정복!

,

enum 1

프로그래밍/Java 2018. 1. 2. 23:54

사실 평소 개발하면서 enum 자료형을 거의 써보지 않았다. 단순히 int형의 상수들을 가지고 사용하던 것이 익숙했기 때문에 특별히 enum 자료형을 왜 써야하는지 몰랐었다.

하지만 Effective Java를 읽다보니 이러한 int enum 패턴이 굉장히 단점이 많다는 사실을 알게되었다.

 

public static final int APPLE_FUJI = 0;
public static final int APPLE_PITPPIN = 1;
public static final int APPLE_GRANNY_SMITH = 2;

※ int를 사용한 int enum 패턴의 모습

 

int enum 패턴의 단점

· 위의 코드를 보면 사과 관련 상수명이라서 APPLE_이라는 접두어를 붙여서 사용하였다. 이런 접두어는 자바가 int enum 그룹별로 별도의 name space를 제공하지 않기 때문에 사용.

· int enum 상수는 컴파일 시점 상수이기 때문에 상수를 사용하는 클라이언트 코드와 함께 컴파일 됨. 따라서 상수의 int 값이 변경되면 클라이언트도 다시 컴파일해야 함.

· int enum 상수는 인쇄 가능한 문자열로 변환하기도 쉽지 않음. 이런 상수를 출력하거나 디버거로 확인해보면 숫자만 보이기 때문에 크게 도움이 되지 않음. 또한 int enum 상수를 순차적으로 이용하거나, int enum 그룹의 크기를 알아낼 좋은 방법도 없음.

 

이와 같은 단점이 있기 때문에 int enum 패턴은 좋지 않은 방법이다. 그렇다면 이런 int enum 패턴 대신 사용할 enum 자료형은 어떤 것인지 다음 enum 2에서 부터 알아보자.

 

 

[출처] Effective Java

'프로그래밍 > Java' 카테고리의 다른 글

String.format  (0) 2020.01.25
enum 2  (3) 2018.01.28
쓰레드(Thread) 3  (0) 2017.11.20
쓰레드(Thread) 2  (0) 2017.11.04
쓰레드(Thread) 1  (0) 2017.11.03

WRITTEN BY
김치치즈스마일
세계정복!

,

앞선 쓰레드1쓰레드2를 통해서 쓰레드에 관한 내용들을 알아보았는데 이제 쓰레드에 관한 정리도 끝나간다. (앞에 내용을 보지 못하신 분들은 링크를 타고 보실 것을 권함)

이번에는 쓰레드를 사용하면서 동기화란 어떤 것이면 어떻게 사용하는지와 어떻게하면 동기화의 효율을 높일 수 있는지 알아보자.

 

쓰레드의 동기화란?

내가 컴퓨터로 몇시간동안 문서 작업을 하다가 잠시 자리를 비운 사이에 다른 사람이 문서를 만든다고 건드려서 내 작업이 날아가면 어떻게 될까??? (생각만 해도 끔찍...ㅠㅠ!!!)

이럴 때는 문서 작업이 다 끝날 때까지 다른 사람이 컴퓨터를 사용할 수 없게 비밀번호를 설정해서 잠금 상태(lock)로 해놓으면 될 것 같다.

이처럼, 데이터에 lock을 걸어서 먼저 작업 중이던 쓰레드가 작업을 완전히 마칠 때까지는 다른 쓰레드에게 제어권이 넘어가더라도 데이터가 변경되지 않도록 보호함으로써 동기화를 시킬 수 있다.

 

synchronized를 이용한 동기화

자바에서는 키워드 synchronized를 이용해 공유 데이터에 lock을 걸어서 동기화를 가능하게 함.

이때, synchronized는 두 가지 방법으로 사용 됨.

 

· 특정한 객체에 lock을 걸고자 할 때

synchronized(객체의 참조변수) {
	
}

synchronized 블록의 경우, 지정된 객체는 synchronized 블럭의 시작부터 lock이 걸렸다가 블록이 끝나면 lock이 풀림.

이 블록을 수행하는 동안은 지정된 객체에 lock이 걸려서 다른 쓰레드가 이 객체에 접근할 수 없게 됨.

 

· 메서드에 lock을 걸고자 할 때

public synchronized void cal() {
	
}

synchronized 메서드의 경우, 한 쓰레드가 synchronized 메서드를 호출해서 수행하고 있으면 메서드가 종료될 때까지 다른 쓰레드가 이 메서드를 호출할 수 없음.

 

교착상태(dead lock)에 빠질 수 있기때문에 가능하면 메서드에 synchronized를 사용하는 메서드 단위의 동기화를 권장.

 

 

 

쓰레드를 동기화 할때, 한 쓰레드가 객체에 lock을 걸고 어떤 조건이 만족될 때까지 기다려야 하는 경우가 생길 수 있다. 이럴 때, 이 쓰레드를 그대로 놔두면 이 객체를 사용하려는 다른 쓰레드들은 lock이 풀릴 때까지 같이 기다려야만 하는 상황이 발생한다.

이런 비효율을 개선하기 위해서 wait()와 notify() 또는 notifyAll()을 사용하여 동기화의 효율을 높여준다.

wait()

한 쓰레드가 객체에 lock을 걸고 오래 기다리는 대신 wait()을 호출해서 다른 쓰레드에게 제어권을 넘겨주고 대기 상태로 기다림.

Thread 클래스가 아닌 Object 클래스에서 정의된 메서드로 모든 객체에서 호출이 가능.

동기화 블록 내에서만 사용 가능.

 

notify()

대기 상태로 기다리는 쓰레드를 다른 쓰레드에 의해서 notify()가 호출되면 다시 실행상태로 만듬.

Thread 클래스가 아닌 Object 클래스에서 정의된 메서드로 모든 객체에서 호출이 가능.

동기화 블록 내에서만 사용 가능.

 

notify()와 notifyAll()의 차이점

notify()는 waiting pool에 있는 쓰레드 중에서 하나만 깨우고 notifyAll()은 모든 쓰레드를 깨움. 하지만 어차피 한 번에 하나의 쓰레드만 사용 가능하기 때문에 별 차이는 없음.

 

※ notify()를 사용할 경우 어떤 쓰레드가 깨워지게 될지는 알 수 없어서 특정 쓰레드가 오랫동안 waiting pool에 머물 수 있기 때문에 다시 객체의 waiting pool에 들어가게 되더라도 notifyAll()을 이용해서 모든 쓰레드를 깨워놓고 JVM의 쓰레드 스케줄링에 의해서 처리되도록 하는 것이 안전함.

 

 

2017/11/03 - [프로그래밍/Java] - 쓰레드(Thread) 1

2017/11/04 - [프로그래밍/Java] - 쓰레드(Thread) 2

 

 

 

 

'프로그래밍 > Java' 카테고리의 다른 글

enum 2  (3) 2018.01.28
enum 1  (0) 2018.01.02
쓰레드(Thread) 2  (0) 2017.11.04
쓰레드(Thread) 1  (0) 2017.11.03
컬렉션 프레임워크(Collection Framework)란?  (0) 2017.09.01

WRITTEN BY
김치치즈스마일
세계정복!

,

앞서서 쓰레드에 관한 기본적인 내용들을 알아보았다.

이번에는 쓰레드의 세부적인 것을 알아보도록 하자.

 

 

쓰레드의 우선순위

· 쓰레드는 우선순위(priority)라는 것을 가지고 있어서 우선순위의 값에 따라 쓰레드가 얻는 시간을 다르게 줄 수 있음.

· 쓰레드가 가질 수 있는 우선 순위의 범위는 1에서 10까지 이며 높을수록 우선순위가 높은 것. (우선 순위의 높고 낮음은 절대적인 것이 아닌 상대적인 것)

· 쓰레드의 우선순위는 쓰레드를 생성한 쓰레드로부터 상속 받는 것. (main메서드를 수행하는 쓰레드는 우선순위가 5이므로 main 메서드 내에서 생성하는 쓰레드는 자동적으로 우선순위가 5가 됨)

 

void setPriority(int newPriority); // 쓰레드의 우선순위를 지정한 값으로 변경
int getPriority(); // 쓰레드의 우선순위를 반환
		
public static final int MAX_PRIORITY = 10; // 최대 우선순위
public static final int MIN_PRIORITY = 1; // 최소 우선순위
public static final int NORM_PRIORITY = 5; // 보통 우선순위

 

쓰레드의 스케줄링과 관련된 메서드

생성자 / 메서드 

설명 

void interrupt()

sleep()이나 join()에 의해 일시정지인 쓰레드를 실행대기상태로 만듬

해당 쓰레드에서는 interruptedException일 발생하여 일시정지상태를 벗어나게 됨

void join()

void join(long millis)

void join(long millis, ont nanos)

지정된 시간동안 쓰레드가 실행되도록 함

지정된 시간이 지나거나 작업이 종료되면 join()을 호출한 쓰레드로 다시 돌아가 실행을 계속 함 

void resume() 

suspend()에 의해 일시정지해 있는 쓰레드를 실행대기상태로 만듬

교착상태에 빠지기 쉽기 때문에 deprecated됨

static void sleep(long millis)

static void sleep(long millis, int nanos)

지정된 시간동안 쓰레드를 일시정지시킴

지정한 시간이 지나면 자동적으로 다시 실행대기 상태가 됨 

void stop() 

쓰레ㅐ드를 즉시 종료 시킴

교착상태에 빠지기 쉽기 때문에 deprecated됨

void suspend() 

쓰레드를 일시정지시킴

resume()을 호출하면 다시 실행대기상태가 됨

교착상태에 빠지기 쉽기 때문에 deprecated됨

static void yield() 

실행 중에 다른 쓰레드에게 양보하고 실행대기상태가 됨 

 

쓰레드의 상태

상태 

설명 

NEW 

쓰레드가 생성되고 아직 start()가 호출되지 않은 상태

RUNNABLE 

실행 중 또는 실행 가능한 상태 

BLOCKED 

동기화 블럭에 의해서 일시정지된 상태 (lock이 풀릴 때까지 기다리는 상태)

WAITING, TIMED_WAITING 

쓰레드의 작업이 종료되지는 않았지만 실행가능하지 않은(unrunnable) 일시정지 상태

TIMED_WAITING은 일시정지시간이 지정된 경우를 의미

TERMINATED 

쓰레드의 작업이 종료된 상태

 

 

[참고] 자바의 정석

 

 

2017/11/03 - [프로그래밍/Java] - 쓰레드(Thread) 1

 

'프로그래밍 > Java' 카테고리의 다른 글

enum 1  (0) 2018.01.02
쓰레드(Thread) 3  (0) 2017.11.20
쓰레드(Thread) 1  (0) 2017.11.03
컬렉션 프레임워크(Collection Framework)란?  (0) 2017.09.01
throw와 throws 비교  (0) 2017.08.28

WRITTEN BY
김치치즈스마일
세계정복!

,

 

우리는 채팅창에서 대화를 주고 받으면서 동시에 채팅창에 사진을 올려 공유할 수도 있다. 이처럼 동시에 여러 작업을 할 수 있는 것은 무엇 때문일까? 바로 쓰레드 덕분이다.

그렇다면 쓰레드란 무엇일까? 이제 알아보도록 하자.

 

쓰레드란?

· 프로세스 내에서 자원을 이용하여 작업을 수행하는 것.

· 별도의 호출 스택(call stack)이 있다는 것을 의미.

 

멀티 쓰레딩

· 하나의 프로세스 내에서 여러 쓰레드가 동시에 작업을 수행하는 것.

· 실제로는 한 개의 CPU가 한 번에 한 가지의 작업만 할 수 있기 때문에 아주 짧은 시간 동안 여러 작업을 번갈아 가며 수행함으로써 여러 작업이 동시에 수행되는 것처럼 보이게 하는 것.

 

멀티 쓰레딩의 장점

· CPU의 사용률을 향상 시킴.

· 자원을 보다 효율적으로 사용할 수 있음.

· 사용자에 대한 응답성이 향상됨.

· 작업이 분리되어 코드가 간결해짐.

 

※ 프로세스의 성능이 쓰레드의 개수에 비례하지는 않음.

 

멀티 쓰레딩의 단점

잘못하면 교착상태(Deadlock)의 빠질 수 있음.

 

※ 교착상태란 두 쓰레드가 자원을 점유한 상태에서 서로 다른 쓰레드가 점유한 자원을 사용하려고 기다리느라 실행이 멈춰있는 상태.

 

쓰레드 구현하는 방법

· Thread 클래스를 상속 받는 방법

· Runnable 인터페이스를 구현하는 방법

 

Thread 클래스를 상속 받는 방법

public class MyThread extends Thread{
	@Override
	public void run() {
		// Thread 클래스의 run()을 오버라이딩
	}
}

public class MyThreadTest {
	public static void main(String[] args) {
		MyThread th = new MyThread();
		th.start();
	}
}

 

Runnable 인터페이스를 구현하는 방법

public class MyThread implements Runnable {
	@Override
	public void run() {
		// Runnable 인터페이스의 추상메서드인 run()을 구현
	}
}

public class MyThreadTest {
	public static void main(String[] args) {
		Runnable r = new MyThread();
		Thread th = new Thread(r);
		th.start();
	}
}

※ Runnable 객체와 Thread 객체의 관계는 작업과 일꾼 사이의 관계와 같음. Runnable 객체에 Thread에서 실행시킬 작업이 들어있음.

 

※ 쓰레드를 실행시킬 때 왜 run()이 아닌 start()일까? run()을 호출하는 것은 쓰레드를 실행시키는 것이 아니라 단순히 클래스에 속한 메서드를 호출하는 것이다. 따라서 쓰레드의 작업을 실행하는데는 start()를 사용한다.

 

 

[참고] 자바의 정석

[참고] Head First 자바

'프로그래밍 > Java' 카테고리의 다른 글

쓰레드(Thread) 3  (0) 2017.11.20
쓰레드(Thread) 2  (0) 2017.11.04
컬렉션 프레임워크(Collection Framework)란?  (0) 2017.09.01
throw와 throws 비교  (0) 2017.08.28
에러(error)와 예외(exception)  (0) 2017.08.27

WRITTEN BY
김치치즈스마일
세계정복!

,