10장 라이브러리와 모듈

1. 라이브러리

: 프로그램 개발 시 활용할 수 있는 클래스와 인터페이스들을 모아놓은 것.

=> 개발 시간의 단축 효과가 있다.

: JAR 압축 파일 (~.jar) 형태로 존재한다. (바이트코드 파일(~.class)을 모아놓은 것)

 

● 콘솔(명령 프롬프트 or 터미널)에서 프로그램을 실행할 경우

→ java 명령어를 실행할 때 -classpath로 제공

→ CLASSPATH 환경 변수에 경로 추가

 

● 이클립스 프로젝트에서 실행할 경우

→ 프로젝트의 Build Path에 추가

 

※ 직접 만들어 사용해보기

▶ JAR 파일 만들기

1) 이클립스에서 my_lib 라이브러리 프로젝트 생성

2) my_lib의 src폴더에 pack1패키지와 그 안에 클래스 A 생성, pack2패키지와 그 안에 클래스 B 생성

3) my_lib 프로젝트 내에 folder생성 (폴더명: dist)

4) my_lib 프로젝트 Export → java → JAR File만들기  → export 경로 설정 (dist폴더로)

- 이렇게 JAR 파일을 만들어 저장할 수 있다.

 

▶ 이클립스 사용하기

1) 연결하고자하는 프로젝트 폴더(my_application_1)의 Build Path 설정

개발이 완료된 JAR파일을 사용할 땐 라이브러리의 Class Path에 Build Path해준다.

[해당 프로젝트 마우스 우클릭] → [Build Path] → [Configure Build Path] → [Libraries 탭] → [Classpath 항목 선택] → [add External JARs 버튼]

 

개발을 진행중인 JAR파일을 사용할 땐 프로젝트의  Class Path에 Build Path해준다.

[해당 프로젝트 마우스 우클릭] → [Build Path] → [Configure Build Path] → [Projects 탭] → [Classpath 항목 선택] → [add  버튼]

import하여 사용할 수 있게 된다.

 

 

▶ 콘솔에서 -classpath 옵션 사용하기 ( 윈도우 명령 프롬프트 )

실행할 바이트코드 파일의 주소에서 " java -cp JAR파일의 절대주소.; 패키지.클래스파일 " 형식으로 코드를 실행할 수 있다.

ex) java -cp D:\KosaCourse\projects\my_lib\dist\my_lib.jar;. app.Main

 

-cp 옵션은 java명령어를 실행할 때마다 별도로 추가해야 하는 불편함이 있다.

여러 프로그램에서 공통으로 사용하는 라이브러리 환경 변수 CLASSPATH에 경로를 추가하면 불편함을 없앨 수 있다.

이처럼 "java app.Main" 만 입력하여 간편하게 사용할 수 있다.

 


 

11장 예외 처리

11.1 예외와 예외 클래스

'예외' : 잘못된 사용 또는 코딩으로 인한 오류

예외가 발생되면 프로그램은 곧바로 종료한다는 점에서 에러와 동일하지만, 예외 처리를 통해 계속 실행 상태를 유지할 수 있다.

 

모든 에러와 예외 클래스는 Throwable을 상속받아 만들어지고,

예외 클래스는 java.lang.Exception 클래스를 상속받는다.

 

● 일반 예외 (Exception)

: 컴파일러가 예외 처리 코드 여부를 검사하는 예외

ex) ClassNotFoundException, InterruptedException

 

● 실행 예외 (Runtime Exception)

: 컴파일러가 예외 처리 코드 여부를 검사하지 않는 예외

ex) RuntimeException, NullPointerException, ArrayIndexOutOfBoundsException, NumberFormatException

 

예외가 발생하면 예외 클래스로부터 객체를 생성. 이 객체는 예외 처리 시 사용된다.

 

11.2 예외 처리 코드

프로그램의 갑작스러운 종료를 막고 정상 실행을 유지할 수 있도록 처리하는 것이 목적

try-catch-finally 블록으로 구성된다.

try {
	// 예외 발생 가능 코드 
    
} catch(예외클래스 e) {
	// 예외 처리 코드
    
} catch(예외클래스 e) {
	// catch는 여러번 실행이 가능하다!
    
} fianlly {
    // 항상 실행되는 코드
    // 파이널 구문은 생략 가능하다.
}

 

# 예외의 종류

예제)

public class ExceptionHandlingExample2 {
	
	public static void printLength(String data) {
		try {		// 예외가 발생하지 않으면 try 구간 실행
			int result = data.length();
			System.out.println("문자 수: " + result);	
		} catch(NullPointerException e) {	// NullPointerException 에러가 일어나면 이 부분을 실행
			System.out.println("문자열이 없습니다.");
			System.out.println(e.getMessage());
			System.out.println("-------------");
			System.out.println(e.toString());
			System.out.println("-------------");
			e.printStackTrace();
		} finally {		// 항상 무조건 실행
			System.out.println("예외 처리 구문이 마무리되었습니다.");
		}
	}
	
	public static void main(String[] args) {
		System.out.println("프로그램 시작");
		printLength("This is java");
		printLength(null);
		System.out.println("프로그램 종료");
	}

}

 

catch (예외 클래스   예외 클래스 타입 변수) 형태로 쓰인다.

 

# 예외 정보를 얻는 3가지 방법

ex) catch(NullPointerException e) 라면

1) System.out.println(e.getMessage()); → 예외가 발생한 이유 리턴

2) System.out.println(e.toString()); → 예외가 발생한 이유 + 예외의 종류 리턴

3) e.printStackTrace(); → 예외가 발생한 이유 + 예외의 종류 + 예외가 어디서 발생했는지 추적한 내용 리턴

 

 

11.3 예외 종류에 따른 처리

처리해야 할 예외 클래스들이 상속 관계에 있을 때,

하위 클래스 catch 블록부터 작성해야한다.

(상위 클래스 블록이 먼저 검사 대상이되면 다음 catch문을 건너 뛸 수 있다.)

 

두 개 이상의 예외를 하나의 catch블록으로 동일하게 예외 처리하고 싶을 때, 기호 | 로 연결하면 된다.

ex) catch(NullPointerExcemption | NumberFormatException  e)

 

 

11.4 리소스 자동 닫기

리소스(resource) : 데이터를 제공하는 객체

리소스는 사용하기 위해 open해야 하며, 사용 후 close해야 한다.

ex) 파일 내용을 읽기 위해 파일을 열었으면 이 파일을 닫아줘야 다른 프로그램에서 사용할 수 있다.

따라서 예외가 발생될 경우에도 안전하게 닫는 것이 중요

 

예제) finally 구문으로 close를 무조건 실행

FileInputStream fis = null;
try{
	ifs = new FileInputStrea("file.txt");	// 파일 열기
    ...
} catch(IOException e){
	...
} finally {		// 무조건 실행
	fis.close();							// 파일 닫기
}

 

예제) try - with - resources 블록을 사용하면 예외 발생 여부와 상관없이 리소스를 자동으로 닫아줌

public class MyResource implements AutoCloseable {
	private String name;
    
    public MyResource(String name){
    	this.name = name;
        System.out.println("MyResource(" + name + ") 열기]");
    }
	
	@Override
    public void close() throws Exception {
    	System.out.println("MyResource(" + name + ") 닫기]");
    }
}

리소스는 java.lang.AutoCloseable 인터페이스를 구현해서

AutoCloseable 인터페이스의 close() 메소드를 재정의해야 한다.

public class TryWithResourceExample {
	public static void main(String[] args) {
		
		try(MyResource res = new MyResource("A")){
			String data = res.read1();
			int value = Integer.parseInt(data);
		} catch(Exception e) {
			System.out.println("예외 처리: " + e.getMessage());
		}

위 코드의 try(MyResource res = new MyResource("A")) 이 부분의 조건식에서 예외 발생 여부와 상관없이 리소스를 자동으로 닫아준다.

 

11.5 예외 떠넘기기

예외가 발생할 때 try - catch 블록으로 예외처리하는 것 말고도 'throws 키워드'로 메소드를 호출한 곳으로 예외를 떠넘길 수 있다.

리턴타입 메소드명(매개변수, ... ) throws 예외클래스1, 예외클래스2 ... {
}

이 메소드를 호출하는 곳에서 예외를 받아 처리해야 한다.

 

예시)

 

public void method1(){
	try{
    	method2();		// 메소드 호출
    } catch(ClassNotFoundException e) {		// 여기서 호출되었기 때문에 예외처리를 해준 것
    	System.out,println("예외 처리: " + e.getMessage());
    }
}

public void method2() throws ClassNotFoundException {	// 호출한 곳으로 예외처리 떠넘기기
	Class.forName("java.lang.String2");
}

나열해야 할 예외 클래스가 너무 많을 경우 Exception 또는 Throwable로 모든 예외를 간단히 떠넘길 수 있다.

 

11.6 사용자 정의 예외

직접 예외 클래스를 정의해서 사용하는 예외 (표준 라이브러리에 존재하지 않는 예외 등)

* 일반 예외는 Exception의 자식 클래스로 선언하고, 실행 예외는 RuntimeException의 자식 클래스로 선언

 

기본 골격 (이 형식으로 만들어주면 된다)

public class XXXException extends [ Exception | RuntimeException ] {
	public XXXException() {		// 기본 생성자
    }
    
    public XXXException(String message) {	 // 예외 메시지를 입력받는 생성자
    	super(message);
    }
}

이렇게 생성자를 이용하여 예외를 발생시킨다고 이해.

throw new Exception();
throw new RuntimeException();
throw new InsufficientException();

throw new Exception("예외메시지");
throw new RuntimeException("예외메시지");
throw new InsufficientException("예외메시지");

이런식으로 throw 키워드 + 객체 생성 하면 상속받은 해당 생성자를 거치면서 예외발생를 발생시킨다.

 

throw된 예외는 try - catch 블록을 사용하여 처리하거나,

메소드를 호출한 곳에서 예외를 처리하도록 throws 키워드로 예외를 넘긴다.

// 방법 (1) 
// try-catch 를 이용
void method(){
	try{
    	...
        throw new Exception("예외메시지");
        ...
    } catch(Exception e) {
    	String message = e.getMessage();
    }
}
// 방법 (2)
// 메소드를 호출한 곳에서 예외를 처리하도록
void method() throws Exception {
	...
    throw new Exception("예외메시지");
    ...
}

 

'JAVA' 카테고리의 다른 글

14일차 2024 - 3 - 15  (0) 2024.03.14
13일차 2024 - 3 - 14  (0) 2024.03.14
3일차 2024 - 2 - 28  (0) 2024.02.28
2일차 2024 - 2 - 27  (0) 2024.02.28
1일차 2024 - 2 - 26  (0) 2024.02.27

+ Recent posts