패키지(Package)
- 정의: 관련있는 타입(클래스, 인터페이스)들의 묶음
- 목적: 이름 충돌 방지, 접근 제어, 필요한 타입을 찾기 쉽게 분류하기 위함
- Java 기본 API 또한 계층적 패키지로 구성된다.
- 예를 들어, Java 기본 클래스들은 java.lang에, 입출력용 클래스들은 java.io에 모여 있다.
- java.lang은 묵시적으로 import 되나, 다른 패키지의 클래스를 쓰려면 import java.io.* 처럼 해야 한다.
- java.lang.String 클래스는 %JAVA_HOME%/jre/lib/rt.jar/java/lang/String.class에 존재한다.
- 커스텀 패키지를 사용하려면 OS의 환경변수 CLASSPATH에 자신이 만든 패키지 위치를 지정해야 한다.
커스텀 패키지 만들기(package 구문)
- CLASSPATH에 추가한 디렉터리로 이동한다.
- 소스코드 맨 위에 package com.example.test 라고 쓴다.
- 그리고 만들고 싶은 클래스나 인터페이스들을 작성한다.
- 컴파일하면 %CLASSPATH%/com/example/test/ 경로에 class 파일들이 생긴다.
커스텀 패키지 사용하기(import 구문)
- 소스코드 위에 import com.example.test.* 라고 쓴다.
- 그러면 아까 만든 패키지 안에 들어있는 클래스들을 원래 이름 그대로 사용할 수 있다.
접근제어자(access modifiers) 관련 복습
- 접근제어자를 생략하는 것을 '패키지 접근수준(package-private)'이라 한다.
- 이는 같은 패키지 내 다른 클래스에서 접근할 수 있는 클래스임을 의미한다.
오류(java.lang.Error)
- 프로그램 진행이 더 이상 불가한 것
예외(java.lang.Exception.*)
- 예외처리를 통해 정상 상태로 복구 가능한 것
- RuntimeException은 흔한 예외로, 프로그래머가 예외처리를 안 해도 컴파일 가능함.
- 하위 예외들인 ArithmeticException, NullPointerException, IndexOutOfBoundsException 등은 예외처리 안 해도 컴파일 된다.
- 나머지 예외들은 처리해 주어야 컴파일 가능하다.
예외처리
- 예외가 발생하면 Exception 객체가 반환되는데, 이를 try-catch로 받아서 처리해야 한다.
- try { 예외발생 가능한 코드; } catch (Exception e) { 적절한 처리; }
- try-catch-finally도 있는데, finally 블록은 항상 실행된다.
예외전파
- 예외가 발생할 가능성이 있는 메소드는 예외를 throw 할 수 있다.
- public int getNumber() throws IOException { 코드; }
커스텀 예외
- java.lang.Exception의 서브클래스를 구현한다.
- if (조건) { throw new CustomException(); }