[Java] 자바 API 패키지, 예외 처리, 모듈
1. 패키지란?
패키지의 개념
- 패키지: 관련 있는 클래스들을 하나로 묶은 것. lang(<- String), util(<-ArrayList), awt, javax, swing, net, io, sql
Package of JAVA | Description |
---|---|
내장 패키지 | 자바에서 기본적으로 제공하는 패키지 |
사용자 정의 패키지 | 사용자가 정의하는 패키지 |
왜 패키지가 필요할까?
- 서로 관련된 클래스들을 하나의 단위로 모아 쉽게 유지 관리할 수 있다.
- 패키지 안에 있는 클래스들은 패키지 안에서만 사용할 수 있도록 선언하여 캡슐화를 구현할 수 있다.
- 패키지가 다르면 동일한 클래스의 이름을 사용할 수 있다.(이름 공간)
2. 패키지 선언하기
- 패키지 선언문은 반드시 소스 파일의 첫 번째 문장이어야 한다.
- 여러 개의 소스 파일에 동일한 패키지 선언문을 넣을 수 있다.
- 패키지는 계층 구조를 가질 수 있다. 패키지 안에 패키지를 넣을 수 있다.
package graphics; // Circle Class를 graphics package에 속하게 하는 코드
public class Circle {
double radius;
}
package pkg1.pkg2; // pkg1 안에 pkg2를 넣을 수 있다.
이클립스에서 패키지 만들기
소스 파일의 위치
클래스 파일의 위치
3. 패키지 사용하기
graphics.Rectangle myRect = new graphics.Rectangle(); // 1. 완전한 이름으로 참조 - 패키지 이름을 클래스 앞에 적는다.
import graphics.Rectangle; // 2. 패키지 안에서 우리가 원하는 클래스만을 포함한다.
Rectangle myRect = new Rectangle();
import graphics.*; // 3. 패키지 안의 모든 클래스를 포함한다.
Rectangle myRect = new Rectangle();
계층 구조의 패키지 포함하기
import java.awt.*; // java.awt 패키지의 모든 클래스와 인터페이스를 가져온다. 하지만 하위 패키지의 클래스는 가져오지 않는다.
import java.awt.font.*;
정적 import 문장
- 일반적으로 클래스 안에 정의된 정적 상수나 정적 메소드를 사용하는 경우에 클래스 이름을 앞에 적어야 한다.
- 하지만 정적 import 문장을 사용하면 클래스의 이름을 생략할 수 있다.
double r = Math.cos(Math.PI * theta);
import static java.lang.Math.*;
double r = cos(PI * theta);
예제 8-1
4. 클래스 파일은 언제 로드될까?
언제 클래스 파일이 로드되는가?
- Lazy Class Loading(지연 클래스 로드): 요청 시 클래스 파일은 JVM에 로드된다. -> JVM의 메모리를 절약할 수 있다.
- 시작 시 애플리케이션 코드를 구성하는 파일은 로드된다.
자바 가상 머신이 클래스를 찾는 순서
- 부트스트랩 클래스: 자바 플랫폼을 구성하는 핵심적인 클래스
- 확장 클래스: 자바 확장 메커니즘을 사용하는 클래스
- 사용자 클래스: 확장 메커니즘을 활용하지 않는 개발자 및 타사에 의해 정의된 클래스
CLASSPATH
- 사용자가 직접 작성하였거나 외부에서 다운로드 받은 클래스를 찾기 위하여 가상 머신이 살펴보는 디렉토리들을 모아둔 경로
클래스 경로를 지정하는 3가지 방법
- 현재 디렉토리
- CLASSPATH에 설정된 환경 변수 설정
- -classpath 옵션
JAR 압축 파일
이클립스를 사용하는 경우
JAR 형태의 라이브러리 사용하기
5. 자바 API 패키지
6. Object 클래스
- java.lang 패키지에 들어 있으며, 자바 클래스 계층 구조에서 맨 위에 위치하는 클래스
Object 클래스 안에 정의된 메소드
이름 | 기능 |
---|---|
public boolean equals(Object obj) | obj가 이 객체와 같은지 검사한다. |
public String toString() | 객체의 문자열 표현을 반환한다. |
protected Object clone() | 객체 자신의 복사본을 생성하여 반환한다. |
public int hashCode() | 객체에 대한 해쉬 코드를 반환한다. |
protected void finalize() | 가비지 컬렉터에 의하여 호출된다. |
public final Class getClass() | 객체의 클래스 정보를 반환한다. |
getClass() 메소드
- 객체가 어떤 클래스로 생성되었는지에 대한 정보를 반환한다.
- reflection(리플랙션): 객체가 자신을 만든 클래스에 대하여 물어보는 것
toString() 클래스
- 객체의 상태를 몇 줄의 문자열로 요약하여 반환하는 함수
- 일반적으로 재정의하여야 하는 메소드
equals() 메소드
- 동등 비교
- ’==’ : 참조값 비교
- equals() : 내용 비교
7. 랩퍼 클래스
- Wrapper Class : 기초 자료형을 객체로 포장하는 클래스
- 자바의 각 기초 자료형에 해당하는 랩퍼 클래스가 존재한다.
오토박싱
- 랩퍼 객체와 기초 자료형 사이의 변환을 자동으로 해주는 기능
8. String 클래스
String 클래스
객체 생성
문자열 객체를 생성하는 두 가지 방법
String s1 = new String("java");
String s2 = "java";
문자열의 기초 연산들
- length()
- charAt()
- concat()
문자열 비교하기
문자열 안에서 단어 찾기
문자열을 단어로 분리할 때
StringBuffer 클래스
9. 기타 유용한 클래스
10. 예외 처리
- 예외 : 배열의 인덱스가 배열의 한계를 넘거나 디스크에서 하드웨어 에러가 발생하는 등의 오류
- 일반적으로 오류가 발생하면 프로그램이 종료된다.
- 하지만 오류 처리를 통해 프로그램에서 오류를 감지하여 오류를 처리한 후에 계속 처리할 수 있다.
예외 발생 예제
public class DivideByAero {
public static void main(String [] args) {
int a = 10 / 0;
int b = 10;
System.out.println(a);
System.out.println(b);
}
}
/*
Exception in thread "main" java.lang.ArithmeticException: / by zero
at DivideByAero.main(DivideByAero.java:3)
*/
- 예외가 발생하는 즉시 프로그램이 종료되며 예외가 발생하는 지점 이후의 문장들이 실행되지 않는다.
try-catch 구조
- JAVA에서는 try-catch 구조를 사용하여 예외를 처리한다.
- 예외마다 하나의 catch 블록을 사용해야 한다.
try {
// 예외가 발생할 수 있는 코드
} catch (예외 클래스 변수) {
// 예외를 처리하는 코드
}
finally {
// try 블록이 끝나면 무조건 실행된다.(생략 가능))
}
0으로 나누는 예외 처리
import java.util.Scanner;
public class DiviedbyZeroOK {
public static void main(String [] args) {
try {
int a = 10 / 0;
int b = 10 / 2;
} catch (ArithmeticException e) {
System.out.println("예외 발생");
}
finally {
System.out.println("계속 진행");
}
}
}
예외의 종류
- try-catch 구조를 사용하여 예외를 처리하려면 클래스 이름을 catch 블록에 적어야 하기 때문에 각종 예외를 나타내는 클래스의 이름을 알아야 한다.
Object | |||
---|---|---|---|
Throwable | Error | ||
Exception | Runtime Exception | Arithmetic Exception | |
NullPointer Exception | |||
ArrayIndex OutOfBounds Exception |
- Error : 하드웨어의 오류로 자바 가상 기계 안에서 치명적인 오류가 발생하면 생성된다.
- 애플리케이션은 이러한 오류를 보고할 수 있지만 예측하거나 복구할 수 없다. 컴파일러가 체크하지 않는다.
- RuntimeException : 주로 프로그래밍 버그나 논리 오류에서 기인하는 오류
- 애플리케이션은 이러한 예외를 잡아서 처리할 수 있지만 보다 합리적인 방법은 예외를 일으킨 버그를 잡는 것이다. RuntimeException도 예외 처리의 주된 대상이 아니다. 따라서 컴파일러가 체크하지 않는다.
- unchecked exception(비체크 예외) : Error와 RuntimeException
- checked exception(체크 예외) : 충분히 예견될 수 있고 회복할 수 있는 예외로 프로그램에서 반드시 처리해야 하는 예외
분류 | Exception | Description |
---|---|---|
Checked-Exception | ClassNotFoundException | 클래스가 발견되지 않았을 때 |
IOException | 입출력 오류 | |
illegalAccessException | 클래스의 전근이 금지되었을 때 | |
NoSuchMethodException | 메소드가 발견되지 않았을 때 | |
NoSuchFieldException | 필드가 발견되지 않았을 때 | |
InterruptedException | 스레드가 다른 스레드에 의하여 중단되었을 때 | |
FileNotFoundException | 파일을 찾지 못했을 때 |
예제 8-2
public class ArrayError {
public static void main(String [] args) {
int array [] = {10, 20, 30, 40, 50};
int i = 0;
try {
for (i = 0; i <= array.length; i++)
System.out.println(array[i] + " ");
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("인덱스 " + i + "는 사용할 수 없네요!");
}
}
}
예외 8-3
public class ExceptionTest3 {
public static void main(String [] args) {
try {
int num = Integer.parseInt("ABC");
System.out.println(num);
} catch (NumberFormatException e) {
System.out.println("NumberFormatException is arising");
}
}
}
Try-With-Resource(Java 7)
import java.io.*;
public class TryTest {
public static void main(String [] args) {
try (FileReader fr = new FileReader("hello.rtf")) {
char [] a = new char[50];
fr.read(a);
for (char c : a)
System.out.println(c);
} catch (IOException e) {
e.printStackTrace();
}
}
}
예외 떠넘기기
- 발생하는 모든 예외를 그 자리에서 처리하는 것은 상당한 양의 코드가 필요하고 반드시 사위 메소드가 그 예외를 처리하도록 해야 하는 경우가 있다.
- 자신을 호출한 상위 메소드로 예외를 전달하는 경우도 있다.
import java.io.*;
public class ExceptionTest {
public static void main(String [] args) throws IOException {
FileReader fr = new FileReader("hello.rtf");
char [] a = new char[50];
fr.read(a);
for (char c : a)
System.out.println(c);
}
}
11. 모듈(Java 9)
- Module : 여러 가지 자바 패키지들을 하나의 단위(모듈)에 포장할 수 있는 메커니즘
직쏘 프로젝트
- 직쏘 프로젝트의 목표 : 개발자가 라이브러리와 대규모 애플리케이션을 쉽게 구성하고 유지 관리이 할 수 있도록 하는 것
모듈화의 장점
- 자신이 필요한 모듈만 골라서 실행 파일로 묶을 수 있다.
- 외부로 노출되는 패키지와 노출되지 않는 패키지를 지정할 수 있다.
모듈의 정의
- 모듈 : 패키지의 모임