'프로그래밍/Java'에 해당하는 글 19건

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
김치치즈스마일
세계정복!

,

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
김치치즈스마일
세계정복!

,

컬렉션 프레임워크란?

· 많은 자료들을 처리할 때 여러가지 문제가 생길 수 있으며 처리하기 어려울 수 있다.

그래서 자바에서는 다수의 데이터를 쉽고 효율적으로 처리하기 위해서 표준화된 방법을 제공하는 인터페이스나 클래스들을 java.util 패키지에 모아놓았으며 이것을 컬렉션 프레임워크라고 한다.

· Java API 문서에서는 컬렉션 프레임워크를 한마디로 '데이터 군을 다루고 표현하기 위한 단일화된 구조'라고 정의하고 있다.

 

 

컬렉션 프레임워크에서 가장 많이 쓰이는 것이 List, Set, Map이다. 위에 계층도를 보면 List와 Set은 Collection을 상속하고 있지만 Map은 Collection을 상속하고 있지 않다.

 

 

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

쓰레드(Thread) 2  (0) 2017.11.04
쓰레드(Thread) 1  (0) 2017.11.03
throw와 throws 비교  (0) 2017.08.28
에러(error)와 예외(exception)  (0) 2017.08.27
인터페이스(interface)란?  (0) 2017.08.25

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

,

throw

강제로 사용자가 예외를 발생시킬 때 사용.

try{
  Exception e = new Exception();
  throw e;
} catch (Exception e) {
  e.printStackTrace();
}

 

 

throws

호출하는 메서드에게 예외를 던질 때 사용. (호출하는 메서드에서 예외를 처리해주어야 함)

void method() throws Exception1, Exception2, Exception3 {
}

 


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

,

에러(error)

프로그램 코드에 의해서 수습될 수 없는 심각한 오류.

 

예외(exception)

프로그램 코드에 의해서 수습될 수 있는 다수 미약한 오류. → 예외처리의 의해서 수습 가능.

 

예외처리(exception handling)

프로그램 실행 시 발생할 수 있는 예외의 발생에 대비한 코드를 작성하여 프로그램의 비정상 종료를 막고, 정상적인 실행상태를 유지하는 것.

 

예외처리 구문

· try - catch문을 사용.

· 하위 예외가 상위 예외보다 먼저 나와야한다.

try {
  // 예외가 발생할 가능성이 있는 문장을 넣음.
} catch (Exception1 e)
  // Exception이 발생했을 경우, 이를 처리하기 위한 문장을 넣음.
} catch (Exception2 e) {
  // Exception이 발생했을 경우, 이를 처리하기 위한 문장을 넣음.
}

 

finally 블럭

· try - catch문과 함께 사용되어, 예외의 발생여부에 상관없이 실행되어야 할 코드를 포함 시킬 목적으로 사용된다.

· try - catch -finally 순서로 사용하면 된다.

try {
  // 예외가 발생할 가능성이 있는 문장을 넣음.
} catch (Exception1 e)
  // Exception이 발생했을 경우, 이를 처리하기 위한 문장을 넣음.
} catch (Exception2 e) {
  // Exception이 발생했을 경우, 이를 처리하기 위한 문장을 넣음.
} finally {
  // 예외의 발생여부에 상관없이 항상 수행되어야 할 문장을 넣음.
}

 


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

,

인터페이스란?

· 구현된 것은 아무 것도 없는 밑그림만 있는 기본 설계도.

· 일반 메서드 또는 멤버 변수를 가질 수 없고, 오직 추상 메서드상수만을 멤버로 가질 수 있다. → 추상 클래스보다 추상화가 더 높다.

· 인터페이스는 표준, 약속, 규칙 이다.

 

인터페이스 작성 방법

· class 대신 interface라는 키워드를 사용한다.

· class와 같이 접근 제어자로 public이나 default를 사용할 수 있다.

interface 인터페이스 이름 {
   public static final 타입 상수이름 = 값;
   public abstract 메서드이름(매개변수목록);
}

 

인터페이스 제약사항

· 모든 멤버 변수public static final 이어야 하며, 이를 생략 가능.

· 모든 메서드public abstract 이어야 하며, 이를 생략 가능.

 

인터페이스의 상속

· 인터페이스는 인터페이스로부터만 상속 받을 수 있다. (Object와 같은 최고 조상이 없다)

· 여러개의 인터페이스로부터 상속 가능. (다중 상속 가능)

interface Movable{
  void move(int x, int y);
}

interface Attackable {
  void attack(Unit u)l
}

interface Fightable extends Movable, Attackable {
}

 

인터페이스의 구현

· 그 자체로는 인스턴스를 생성할 수 없다.

· 구현한다는 의미의 implements를 사용해서 구현한다. (클래스는 확장한다는 의미에 extends를 사용)

· 만약 인터페이스의 메서드 중 일부만 구현한다면, 추상 클래스로 선언되어야 한다.

· 상속과 구현을 동시에 할 수 있다.

class 클래스이름 implements 인터페이스이름 {
  // 인터페이스에 정의된 추상 메서드를 구현
}

abstract class 클래스이름 implements 인터페이스이름 {
  // 인터페이스에 정의된 추상 메서드의 일부만 구현
}

class 클래스이름 extends 조상클래스이름 implements 인터페이스이름 {
}

 

 

인터페이스의 장점

· 개발 시간을 단축시킬 수 있음.

· 표준화가 가능.

· 서로 관계없는 클래스들에게 관계를 맺어 줄 수 있다. → 하나의 인터페이스를 공통적으로 구현하도록 함으로써 관계를 맺어 줄 수 있다.

· 독립적인 프로그래밍이 가능.  → 클래스와 클래스간의 직접적인 관계를 인터페이스를 이용해서 간접적인 관계로 변경하면, 한 클래스의 변경이 관련된 다른 클래스에 영향을 미치지 않도록 독립적인 프로그래밍이 가능.

 

▶ 직접적인 관계의 두 클래스 (A-B)

class A {
  public void methodA(B b) {
    b.methodB();
  }
}
class B {
  public void methodB() {
    System.out,println("methodB()");
  }
}
class InterfaceTest {
  public static void main(String[] args) {
    A a = new A();
    a.methodA(new B());
  }
}

 

▶ 간접적인 관계의 두 클래스 (A-I-B)

class A {
  public void methodA(I i) {
    i.methodB();
  }
}
Interface I {
  void methodB();
}
class B implements I {
  public void methodB() {
    System.out.println("methodB()");
  }
}
class C implements I {
  public void methodB() {
    System.out.println("methodB() in C");
  }
}

 

 

추상 클래스와 인터페이스 비교

· 공통점

  - 스스로 객체를 생성할 수 없다.

  - 상속 관계에서만 존재한다. (구현을 목적으로 한다)

· 차이점

  - 다중 상속을 지원한다. (인터페이스)

  - 모든 자원이 미완성이다. (인터페이스)

 

 

 


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

,