[Lecture/Java] 07강 - 패키지와 예외처리

김찬미·2025년 5월 28일

7강 - 패키지와 예외처리

  • 패키지
  • 사용자 정의 패키지
  • 예외와 예외처리

✅ 패키지

패키지란, 관련이 있는 클래스와 인터페이스 묶음을 뜻한다.

  • 클래스와 인터페이스는 패키지의 멤버로 존재
  • 패키지는 클래스와 인터페이스의 .class 파일이 저장된 폴더
  • 계층 구조로 이루어짐

시스템 패키지

JDK가 제공하는 클래스 라이브러리

  • JDK와 함께 설치됨
  • 클래스 파일들은 기능에 따라 패키지로 묶여 분리됨
    • 과거에는 jar 파일로 압축되어 있었음
    • 현재는 모듈 단위로 분산되어 저장되어 있음
  • C:\Program Files\Java\jdk-21\lib\src.zip에서 소스 확인⭕

🔹시스템 패키지의 사용

  • 가장 기본이 되는 최상위 시스템 패키지 = java 패키지
  • Java 프로그램에서 상위 패키지와 하위 패키지 구분을 위해 . 사용
    • Java 언어에서 가장 기본적 클래스는 java.lang 패키지에 존재
    • 프로그램에서 클래스 사용
      java.io.IOExeption과 같이 완전한 이름으로 표현

✅ 사용자 정의 패키지

package com.vehicle;

public class Car {
	String szType = "승용차";
}
  • 컴파일 결과로 Car.class가 만들어짐
  • Car.class는 com.vehicle 패키지에 저장됨
  • 컴파일 할 때 -d 옵션 사용하여 저장함
javac Car.java -d // D:\javaClasses
// 이 경우, D:\javaClasses\com\vehicle\Car.class

🔸사용법

// 1) 직접 작성하는 방법 (패키지 경로 포함한 완전한 클래스 이름 사용)
java.util.Scanner s = new java.util.Scanner(System.in);

// 2) import 구문 사용 방법
import java.util.Scanner;

Scanner s = new Scanner(System.in);

import

import 패키지이름.*;
import 패키지이름.클래스이름;

Java 프로그램에서 import java.lang.*; 구문은 자동 포함됨


패키지 사용과 접근 제어

  • 다른 패키지에 존재하는 패키지 접근 수준Car 클래스를 사용할 수 없음
    → 같은 클래스에 정의하면 사용 가능
//package com.vehicle;

import com.vehicle.*;

class MyCar extends Car {} //오류
class MyBus extends Bus {}


package com.vehicle;

class Car {} // default, 같은 패키지에서만 사용 가능


package com.vehicle;

public class Bus extends Car {} // public, 모든 곳에서 사용 가능

클래스 찾기

  • 컴파일하거나 실행할 때, 필요한 클래스(A)를 찾아야 함
    → 컴파일러가 A.class가 위치한 경로 또는 A.class를 포함하고 있는 jar 파일의 존재를 알아야 함
  • JVM은 기본 패키지나 확장 패키지 외에 사용자 클래스도 찾을 수 있음
    • 컴파일러는 환경 변수 CLASSPATH에 지정된 경로에서 사용자 클래스를 찾을 수 있음

💡 환경변수 CLASSPATH

  • CLASSPATH의 경로는 jar 파일을 포함할 수 있음
  • 프로그램에서 graphics.Circle 클래스를 사용하는 경우
    • CLASSPATH=경로;a.jar라고 가정
    • 이때, 경로\graphics\Circle.class 혹은
    • a.jar에서 \graphics\Circle.class가 있어야 함

✅ 예외와 예외 처리

예외(Exception)란?

💡 에러Error와 예외Exception의 차이

  • 에러: 실행 중 발생하는 심각한 오류로 더 이상 실행 불가
  • 예외: 경미한 오류로 복구 가능 (예외적 사건이 발생한 것 뿐)
throw-catch

// 프로그램 실행 중 예외 상황 발생했을 때 과정
// 1. 예외처리 코드에 *예외 객체*를 생성하여 던짐 (throw)
// 2. 예외처리 코드(exception handler)가 있으면
// 예외 객체를 잡아(catch) 처리한 뒤, 프로그램을 계속 실행한다.

if 예외처리 코드가 없으면?

→ 오류 메시지 출력 후 프로그램이 즉시 비정상적으로 종료됨

💡 예외객체는 Exception 클래스(또는 하위 클래스)로 표현되며 예외 발생 정보를 가지고 있음


예외 클래스의 계층 구조

  • Exception 클래스는 Throwable 클래스의 자식 클래스
    • toString(), printStackTrace() 메소드 등을 상속 받음


예외 발생과 처리

  • checked Exception: 반드시 명시적인 예외처리가 필요함
  • RuntimeException: 예외처리를 안 해도 됨
    • 프로그램을 정확하게 작성하지 않은 경우에 발생
    • ArithmeticException, NullpointerException, IndexOutOfBoundsException

1) 직접 처리

예외가 발생한 곳에서 예외 객체를 잡아서 처리

try-catch | try-catch-finally

// try-catch-finally 구문
try {}
catch (ExceptionType1 ex1) {}
catch (ExceptionType2 ex2) {}
finally {}

// 실행 중 예외 발생 → catch 구문으로 이동
// try 구문에서 예외 발생하지 않음 → catch구문 실행X
// finally 구문은 예외 발생 여부와 무관하게 항상 실행됨

일반 코드와 예외 처리 분리 → 가독성↑

2) 간접 처리(예외의 전파)

예외 발생 가능성이 있는 문장을 가진 메소드의 선언에서 괄호 다음에 throws 예외클래스를 사용

class CharInput {
	int nInput;
    
    public char getInput() throws IOException {
        nInput = System.in.read(); //예외 발생 가능
        return (char) nInput;
    }
}

그 메소드를 호출한 메소드에게 예외 처리를 전달 또는 위임하는 것

// 메소드 선언에서 throws 절이 표시된 메소드의 호출은 예외 처리가 필요함
try {
	c = obj.getInput();
} catch (IOException ex) {
	...
}

예외(checked Exception)을 발생시킬 수 있는 메소드

  • public FileInputStream(String name) throws FileNotFoundException
    • FileInputStream 클래스의 생성자
  • public int read() throws IOException
    • InputStream(또는 Reader) 클래스의 메소드
  • 위와 같은 메소드를 호출할 때는 반드시 예외 처리가 필요함

3) try-with-resources 구문

try(리소스 생성 구문) {
} catch {
} finally {
}
  • 리소스 선언을 가진 try 블록
  • 원래는 리소스를 반환하는 close() 메소드 호출을 finally 블록에 넣어야 함
    try-with-resourcs에서는 자동 반환 보장

profile
백엔드 지망 학부생

0개의 댓글