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 |