08 자바 API 패키지, 예외 처리, 모듈

목차

    08 자바 API 패키지, 예외 처리, 모듈

    8.1 패키지란?

    패키지의 개념

    : 관련있는 클래스들을 하나로 묶은 것

    • 내장 패키지 : 자바에서 기본적으로 제공하는 패키지들
    • 사용자 정의 패키지 : 사용자가 정의하는 패키지들

    왜 패키지가 필요할까?

    1. 패키지를 이용하면 서로 관련된 클래스들을 하나의 단위로 모을 수 있다.
      • 유사한 클래스들이 패키지로 묶여 있으면 유지 관리가 쉬워진다.
    2. 패키지를 이용하여 세밀한 접근 제어를 구현할 수 있다.
      • 패키지 안에서만 사용 가능하도록 선언할 수 있음 → 캡슐화
    3. 패키지를 사용하는 중요한 이유 중 하나는 "이름공간" 때문이다.
      • 원칙적으로 모든 클래스는 서로 다른 이름을 가져야 한다.
      • 따라서 이름 충돌을 방지할 방법으로 패키지를 사용한다.

    8.2 패키지 선언하기

    • 패키지 선언문은 반드시 소스 파일의 첫 번째 문장이어야 한다.
    • 패키지는 계층 구조가 될 수 있다. pkg1.pkg2는 pkg1안에 pkg2 패키지

    이클립스에서 패키지 만들기

    • src 우클릭 new → Package 선택

    소스 파일의 위치

    • 패키지명과 클래스명은 디렉터리의 이름과 대응된다.

    클래스 파일의 위치

    • 프로젝트 디렉터리의 bin 폴더
    • javac 명령어로 클래스 파일을 만들때, javac -d 를 활용하면 디렉터리를 자동으로 생성해준다.
    • (-d 다음 원하는 디렉토리를 적어줘야함 이클립스 사용으로 자동생성된 bin폴더로 진입하기 위해서는 상위 폴더로 이동하는 ..\을 여러번 입력하여 src바로 위인 프로젝트 디렉토리까지 이동해서 bin 폴더로 들어감 예를 들어 패키지를 하나만 만들어서 패키지 상위가 바로 src인 경우 javac -d ..\..\bin 클래스명.java)
    패키지 이름을 결정하는 규칙
    ● 패키지의 이름은 일반적으로 소문자만을 사용한다. (클래스나 인터페이스 이름 중복 피하기위해)
    ● 도메인 이름의 역순을 사용
    ● 자바 언어 자체의 패키지는 java나 javax로 시작한다.

    8.3 패키지 사용하기

    1. 완전한 이름으로 참조한다.

    • 패키지명.클래스명;

    2. 원하는 패키지 멤버만을 포함한다.

    • import 패키지명.클래스명
    • 이후 클래스명으로만 접근 가능

    3. 전체 패키지를 포함한다.

    • import 패키지명.*;
    • 이후 클래스명으로만 접근 가능

    계층 구조의 패키지 포함하기

    • java.awt.*를 포함시키면 awt폴더 안의 클래스만 포함
    • awt의 하위 패키지인 font 패키지가 자동으로 포함되는것이 아님
    • 만약 똑같은 이름의 클래스를 가지는 패키지가 동시에 포함될 때는 패키지명.클래스명으로 명시해야한다.

    정적 import 문장

    • static 상수나 메소드를 사용할 때, import static 패키지명.클래스명; 으로 import 했다면 클래스명 생략 가능

    8.4 클래스 파일은 언제 로드될까?

    언제 클래스 파일이 로드되는가?

    • 클래스 파일은 요청 시 JVM에 로드된다. 이것이 기본적인 방법으로 지연 클래스 로드(Lazy Class Loaidng)이라함
    • 애플리케이션 코드를 구성하는 기본적인 클래스 파일은 시작 시 로드된다.
    • 지연 클래스 로드는 JVM의 메모리를 절약할 수 있다.
    • 클래스를 로드하는 책임은 가상 머신의 클래스 로더가 담당한다.

    자바 가상 머신이 클래스를 찾는 순서

    1. 부트스트랩 클래스 - 자바 플랫폼을 구성하는 핵심적인 클래스. jre/lib 에 있는 여러 jar 파일 (Java 9부터는 모듈화되어 있는 jmods 파일들이 로드됨)
    2. 확장 클래스 - 자바 확장 메커니즘을 사용하는 클래스. 확장 디렉터리에 있는 jar 파일들 (jre/lib/ext의 모든 jar파일)
    3. 사용자 클래스 - 확장 메커니즘을 활용하지 않는 개발자 및 타사에서 정의한 클래스
      가상 머신 명령줄에서 -classpath 옵션을 사용하거나 CLASSPATH 환경 변수를 사용하여 클래스 위치를 식별

    CLASSPATH

    : 사용자가 직접 작성하였거나 외부에서 다운로드 받은 클래스를 찾기 위하여 가상 머신이 살펴보는 디렉터리들을 모아둔 경로

    • 클래스 경로는 많은 디렉터리들로 이루어질 수 있고, 윈도우에서는 ; 유닉스에서는 : 으로 분리된다.
    • 클래스 경로를 지정하는 3가지 방법
      1. 첫 번째로 가상 머신은 항상 현재 디렉터리부터 찾는다.
      2. 일반적으로는 환경 변수인 CLASSPATH에 설정된 디렉터리에서 찾는다.
        • CLASSPATH 변수 설정은 명령어를 사용해도 되고
          C:\> set CLASSPAHT= 디렉터리;디렉터리2;. (.은 현재 디렉터리)
        • 제어판 환경 변수 설정을 이용해서 설정해도 된다.
          [제어판] → [시스템] → [고급 시스템 설정] → [고급] → [환경 변수]
      3. 가상 머신을 실행할 때 옵션 -classpath를 사용할 수 있다.
        • 가상 머신을 실행할 때, 클래스 경로를 알려줌
        • 이클립스는 내부적으로 이 방법을 사용

    JAR 압축 파일

    : Java Archive의 줄임말로서 자바 파일들을 압축하여 하나의 파일로 만드는 데 사용된다.

    • JAR 파일은 클래스 파일과 이미지와 사운드 파일들을 함께 압축할 수 있으며 ZIP 압축 규격을 이용한다.
    • JDK 안에 포함된 jar 도구를 이용하여서 JAR 파일을 생성할 수 있다.
      C:\> jar cvf Game.jar *.class icon.png
    • 만약 실행 가능한 JAR 파일을 생성하려면
      C:\> jar cvfe Game.jar Main *.class icon.png (Main.class 가 제일 먼저 실행되는 클래스)
    • JAR 파일을 실행하는 방법
      C:\> java -jar Game.jar

    이클립스를 사용하는 경우

    • export 에서 [Java] → [Runnable JAR file]

    JAR 형태의 라이브러리 사용하기

    • 명령어를 사용해서 클래스 경로에 포함 시킨다
    • 이클립스에서 [Build Path] → [Add External Archives...] 메뉴를 사용하여 프로젝트에 JAR파일 추가

    8.5 자바 API 패키지

    주요 클래스

    • java.applet : 애플릿을 생성하는 데 필요한 클래스
    • java.awt : 그래픽과 이미지를 위한 클래스
    • java.io : 입력과 출력 스트림을 위한 클래스
    • java.lang : 자바 프로그래밍 언어에 필수적인 클래스
    • java.math : 수학에 관련된 클래스
    • java.net : 네트워킹 클래스
    • java.nio : 새로운 네트워킹 클래스
    • java.security : 보안 프레임워크를 위한 클래스와 인터페이스
    • java.sql : 데이터베이스에 저장된 데이터를 접근하기 위한 클래스
    • java.util : 날짜, 난수 생성기 등의 유틸리티 클래스
    • javax.imageio : 자바 이미지 I/O API
    • javax.net : 네트워킹 애플리케이션을 위한 클래스
    • javax.swing : 스윙 컴포넌트를 위한 클래스
    • javax.xml : XML을 지원하는 패키지

    https://docs.oracle.com/javase 

     

    JDK 22 Documentation - Home

    The documentation for JDK 22 includes developer guides, API documentation, and release notes.

    docs.oracle.com

    8.6 Object 클래스

    • 자바에서는 클래스를 정의할 때 명시적으로 부모 클래스를 선언하지 않으면 Object 클래스가 부모 클래스가 된다.
    • Object 안에 정의된 메소드를 자신의 용도에 맞게 재정의하여 사용한다
      • public boolean equals(Object obj) : obj가 이 객체와 같은지를 검사(주소가 같은지)
      • public String toString() : 객체의 문자열 표현을 반환 (sysout에 객체를 넣으면 이 메소드를 수행함)
      • protected Object clone() : 객체 자신의 복사본을 생성하여 반환 (얕은 복사)
      • public int hashCode() : 객체에 대한 해시 코드를 반환
      • protected void finalize() : 가비지 컬렉터에 의하여 호출됨
      • public final Class getClass() : 객체의 클래스 정보를 반환

    getClass() 메소드

    : 객체가 어떤 클래스로 생성되었는지에 대한 정보를 반환

    • 리플랙션 기법으로 구현한 것

    toString() 메소드

    • 일반적으로 오버라이딩해서 사용
    • println() 사용하여 객체를 출력하면 toString() 메소드가 자동으로 호출됨

    equals() 메소드

    • == 연산자는 주소가 동일한지 비교
    • 두 객체를 원하는대로 비교하기 위해서는 오버라이딩해야함

    finalize() 메소드

    • 콜백 메소드. 객체가 소멸되기 직전에 호출됨
    • Object 클래스에서는 아무것도 하지 않지만, 오버라이딩해서 자원을 반납하는 등의 정리 과정을 실행할 수 있다.

    8.7 랩퍼 클래스

    • 기초 자료형을 객체로 포장할 때 사용되는 클래스
    • 여러가지 유용한 메소드 제공
    • Integer 메소드 일부
    반환값 메소드 이름 설명
    int intValue() int형으로 반환
    double doubleValue() double형으로 반환
    float floatValue() float형으로 반환
    static int parseInt(String s) 문자열을 int형으로 변환
    static String toBinaryString(int i) int형의 정수를 2진수 형태의 문자열로 변환
    static String toString(int i) int형의 정수를 10진수 형태의 문자열로 변환
    static Integer valueOf(String s) 문자열 s를 Integer 객체로 변환
    static Integer valueOf(String s, int radix) 문자열 s를 radix진법의 Integer 객체로 변환

    오토박싱

    • 랩퍼 객체와 기초 자료형 사이의 변환을 자동으로 해주는 기능
    Integer obj;
    
    obj = 10; 			// 정수 -> Integer 객체
    System.out.println(obj + 1);	// Integer 객체 -> 정수

    8.8 String 클래스

    • 문자열을 구성하는 문자들을 내부에 저장
    • 저장된 문자에 인덱스가 매겨져 있다.

    String 클래스

    자주 사용하는 메소드

    char charAt(int index) : 지정된 인덱스에 있는 문자를 반환
    
    int compareTo(String anotherString) : 사전적 순서로 문자열을 비교한다.
    차이만큼 정수 반환 (this가 앞에있으면 음수값)
    
    String concat(String str) : 주어진 문자열을 현재의 문자열 뒤에 붙인다.
    
    boolean equals(Object anObject) : 주어진 객체와 현재의 문자열을 비교한다.
    
    boolean isEmpty() : length()가 0이면 true를 반환한다.
    
    int length() : 현재 문자열의 길이를 반환한다.
    
    String toLowerCase() : 문자열의 문자들을 모두 소문자로 변경한다.
    String toUpperCase() : 문자열의 문자들을 모두 대문자로 변경한다.

    객체 생성

    • 자바에서 객체를 생성하는 유일한 방법은 new를 사용하는 것
    • 하지만 문자열은 바로 초기화 할 수 있음
    • 이때, 문자열 상수 풀에 저장되고, 같은 문자열을 가진 객체가 생성되면 이 주소를 공유함

    문자열의 기초 연산들

    • concat() 보다는 + 연산자가 더 편리하다

    문자열 비교하기

    • equals() 호출해야함
    • == 은 주소 비교

    문자열 안에서 단어 찾기

    int indexof(String str) : 해당 하는 문자열의 시작 인덱스를 반환. (없으면 -1)

    문자열을 단어로 분리할 때

    • split() 메소드를 사용 (원하는 분리자를 지정할 수 있음 아래는 " ")
    String[] tokens = "I am a boy.".split(" ");
    for (String token : tokens)
    	System.out.println(token);
        
    I
    am
    a
    boy.

    StringBuffer 클래스

    • String클래스의 메소드는 새로운 String 객체를 생성하고 기존의 내용을 복사해서 내용을 변경한다 (불변성)
    • 따라서, Heap 메모리에 많은 가비지 객체가 생성되어 메모리가 부족해지기도 한다
    • StringBuffer 객체는 내부적으로 문자열을 저장하는 메모리를 가지고 있다. 이 메모리를 버퍼라고함
    • 버퍼의 총 크기는 capacity가 나타내고 문자열의 길이는 length. 버퍼의 크기는 자동적으로 조절됨
    • 가장 중요한 메소드 append(), insert()
      • 어떤 타입의 데이터도 받을 수 있도록 오버로딩 되어있다
      • 새로운 객체를 생성하지 않는다
      • append()는 문자열 끝에 추가 / insert()는 특정 위치에 추가

    8.9 기타 유용한 클래스

    Math 클래스

    • 기본적인 수치 연산을 위한 메소드들을 제공

    Random 클래스

    • Random 클래스의 객체는 난수를 발생하는 데 사용

    Arrays 클래스

    • 배열을 다루는 다양한 메소드들을 가지고 있다.
    • Arrays.sort() 정렬  / Arrays.binarySearch(array, 값) 값을 찾아 인덱스 반환
    • Arrays.fill(array, 값) 배열을 특정한 값으로 채운다

    Calendar 클래스

    • 추상 클래스로서 날짜와 시간에 대한 정보를 가지고 있고 특정 시각을 연도, 월, 일 등으로 변환하는 메소드도 가지고 있다.
    • 1970년 1월 1일 00:00:00.000GMT부터 흘러온 시간을 저장하고 있다.(UNIX 시간)

    8.10 예외 처리란?

    • exception이란 "exception event"의 약자이다.
    • 일반적으로 오류가 발생하면 프로그램이 종료된다.
    • 그러나 무조건 종료하는 것보다 프로그램에서 오류를 감지하여 매끄럽게 종료하거나
      오류를 처리한 후에 계속 실행할 수 있다면 더 나은 프로그램이 될 수 있을 것이다.

    예외 발생 예제

    • 어떤 수를 0으로 나누면 예외 발생 (ArithmeticException)
    • 예외가 발생한 지점 이후의 문장들이 실행되지 않는다.

    try-catch 구조

    try {
    	// 예외가 발생할 수 있는 코드
    } catch (예외클래스 변수) {
    	// 예외를 처리하는 코드
    } finally {
    	// 여기 있는 코드는 try 블록이 끝나면 무조건 실행된다.
    }

    예외의 종류

    • try-catch 구조를 사용하여 예외를 처리하려면 각종 예외를 나타내는 클래스 이름을 알아야 한다.
    • 모든 예외는 Throwable 클래스로 부터 상속되어 Error와 Exception으로 나뉜다.
    • Exception은 다시 RuntimeException과 그 외로 나누어진다.

     

    1. Error : 자바 가상 기계 안에서 치명적인 오류가 발생하면 생성된다.
      • 보통 애플리케이션은 이러한 오류를 예측하거나 복구할 수 없다.
      • Error를 잡아서 사용자에게 보고할 수는 있지만, 더는 처리할 수 없다.
    2. RuntimeException : 주로 프로그래밍 버그나 논리 오류에서 기인한다.
      • 컴파일러가 체크하지 않는다. 하지만, 개발자가 처리하기로 결정할 수 있다.
      • ArithmeticException : 어떤 수를 0으로 나누는 경우
      • NullPointerException : 널 객체를 참조하는 경우
      • ClassCastException : 적절치 못하게 클래스를 형변환하는 경우
      • NegativeArraySizeException : 배열의 크기가 음수값인 경우
      • OutOfMemoryException : 사용 가능한 메모리가 없는 경우
      • NoClassDefFoundException : 원하는 클래스를 찾지 못하였을 경우
      • ArrayIndexOutOfBoundsException : 배열을 참조하는 인덱스가 잘못된 경우
    3. 체크 예외 (Error와 RuntimeException 제외) : 충분히 예견될 수 있고 회복할 수 있는 예외이다.
      • 반드시 처리해야함. 예외 처리 하지 않으면 컴파일 오류 발생
      • ClassNotFoundException : 클래스가 발견되지 않을 때
      • IOException : 입출력 오류
      • illegalAccessException : 클래스의 접근이 금지되었을 때
      • NoSuchMethodException : 메소드가 발견되지 않을 때
      • NoSuchFieldException : 필드가 발견되지 않을 때
      • InterruptedException : 스레드가 다른 스레드에 의하여 중단되었을 때
      • FileNotFoundException : 파일을 찾지 못했을 때

    Try-With-Resource

    : 자동 리소스 관리. try catch 블록 내에서 사용되는 리소스를 자동으로 닫는다.

    try (필요한 리소스 선언) {
    } catch ...

    예외 떠넘기기

    • 메소드가 발생되는 예외를 그 자리에서 처리하지 않고, 자신을 호출한 상위 메소드로 예외를 전달하는 것
    • 발생하는 모든 예외를 그 자리에서 처리하는 것은 상당한 양의 코드를 필요로 한다
    • 한편으로 반드시 상위 메소드가 그 예외를 처리하도록 해야 하는 경우도 있다.
    메소드() throws 예외명{
    }

    8.11 모듈

    • 자바 모듈은 여러 가지 자바 패키지들을 하나의 단위에 포장할 수 있는 메커니즘이다.
    • 자바 플랫폼 모듈 시스템(JPMS: Java Platform Module System)은 직쏘 프로젝트의 결과물
    • JPMS을 사용하면, 애플리케이션이 실제로 사용하는 자바 플랫폼 API의 모듈만으로 패키징할 수 있다.
    • 개발자는 자바 API 외에도 자신의 애플리케이션도 모듈로 나누어서 개발할 수 있다.

    직쏘 프로젝트

    • 2008년에 시작되어 2017년에 완성된 OpenJDK의 프로젝트
    • 개발자가 라이브러리와 대규모 애플리케이션을 쉽게 구성하고 유지 관리할 수 있도록 하는것이 목표
    • 자바 API를 모듈로 분리하여서 소형 컴퓨팅 장치에서도 사용하도록 축소하는 것
    • 기존에는 사용하지 않더라도 무조건 rt.jar 파일이 항상 같이 배포되었다.

    모듈화의 장점

    • 자신이 필요한 모듈만 골라서 실행 파일로 묶을 수 있다.
    • 외부로 노출되는 패키지와 노출되지 않는 패키지를 지정할 수 있다.
      노출되지 않는 패키지는 다른 자바 모듈에서 사용할 수 없다.
    • JVM은 시작할 때 애플리케이션 모듈에서 전체 모듈 종속성 그래프를 확인할 수 있다.
      시작 시 필요한 모듈이 없으면 JVM은 누락된 모듈을 보고하고 종료한다.

    모듈의 정의

    • 모듈은 하나 이상의 자바 패키지로 이루어진다.
    • 모듈은 패키지의 상위 개념이다
      클래스들이 모여서 패키지가 되고, 패키지가 모여서 모듈이 된다.
    • 모듈 이름은 패키지와 동일한 명명 규칙을 따르나 밑줄(_)을 사용하면 안된다.
      가능한 모듈에 포함된 루트 패키지의 이름과 동일한 이름으로 지정하는 것이 좋다.
    • 모듈에서는 지정된 패키지를 요구할 수도 있고, 자신이 가진 패키지를 남들이 사용할 수 있도록 허가할 수도 있다.
      이것은 모듈마다 하나씩 있어야 하는 module-info.java에서 지정한다.
    • exports 뒤에는 남들에게 제공하는 패키지
    • requires 뒤에는 자신이 필요한 패키지를 지정

    디렉터리 구조 생성

    • 모듈을 생성하기 위헤서는 주어진 디렉터리 구조를 따라야 한다.
    d:\src
        ---> com.example
            ---> com
                ---> example
                    ---> Hello.java
            ---> module-info.java

    모듈 선언자 만들기

    • module-info.java는 루트 디렉터리에 있어야 한다.
    • 모듈 종속성이 없는 경우 모듈 본문을 비워 둔다.
    module com.example{
    	exports com.example;	// 내보내는 패키지
    	requires java.base;	// 필요한 패키지
    }

    자바 소스 파일 작성

    • 패키지 안에 자바 소스 파일을 만든다.
    • Hello클래스에 메인 함수 만들기

    자바 모듈 컴파일

    • 명령어 버전을 사용할 때
    d:\> javac -d mods --module-source-path src/ --module com.example
    d:\mods
        ---> com.example
            ---> com
                ---> example
                    ---> Hello.class
            ---> module-info.class

    모듈 실행

    d:\> java --module-path mods/ --module com.example/com.example.Hello
    • --module-path 인수는 컴파일된 모듈이 있는 루트 디렉터리를 가리킨다.
    • --module 인수는 모듈 + Main 클래스를 의미한다.

    독립 실행형 애플리케이션으로 자바 모듈 패키징

    • 자신이 만든 자바 모듈을 필요한 자바 API와 함께 독립 실행형 애플리케이션으로 패키징할 수 있다.
    • jlink 명령어 사용
    d:\> jlink --module-path "mods;jdk설치 디렉터리\jmods"
    --add-modules com.example --output out-standalone
    • --module-path 인수는 모듈을 찾기 위한 모듈 경로를 지정.
      예제에서는 모듈이 컴파일 되는 디렉터리와 JDK설치 디렉터리를 지정
    • --add-modules 인수는 독립 실행형 애플리케이션으로 패키지에 자바 모듈을 지정한다.
    • --output 인수는 독립형 자바 애플리케이션이 생성되는 디렉터리를 지정한다.
    • 앞의 명령어가 성공적으로 실행되면 out-standalone이라는 디렉터리가 생성되고 독립 실행형 애플리케이션이 저장된다.

    독립 실행형 애플리케이션 실행

    • 앞서 만든 디렉터리에서 실행하면된다.
    d:\out-standalone> bin\java --module com.example/com.example.Hello
    • --module 인수는 어떤 모듈의 클래스를 실행할 것인지를 지정한다.

    Mini Project 글자 추측 게임

    빈칸으로 구성된 문자열이 주어지고 사용자는 문자열에 들어갈 글자들을 하나씩 추측해서 맞히는 게임
    <예시 화면>
    행맨 게임에 오신 것을 환영합니다.
    현재의 상태 : _____
    글자를 추측하시오 : a
    현재의 상태 : _____
    글자를 추측하시오 : e
    현재의 상태 : _____
    글자를 추측하시오 : o
    현재의 상태 : _o___
    글자를 추측하시오 : u
    ···

     

    참조 코드

    String[] words = { "java", "count", "school", "book", "student", "programmer" };
    int index = (new Random()).nextInt(words.length);
    String solution = words[index];
    StringBuffer answer = new StringBuffer(solution.length());

     

    풀이

    public class HangmanGame {
    
    	public static void main(String[] args) {
    		String[] words = { "java", "count", "school", "book", "student", "programmer" };
    		int index = (new Random()).nextInt(words.length);
    		String solution = words[index];
    		StringBuffer answer = new StringBuffer(solution.length());
    		for (int i = 0; i < solution.length(); i++) {
    			answer.replace(i, i + 1, "_");
    		}
    		System.out.println("행맨 게임에 오신 것을 환영합니다.");
    		int count = 0;
    		try (Scanner scanner = new Scanner(System.in)) {
    			while (answer.indexOf("_") != -1) {
    				System.out.println("현재의 상태 : " + answer);
    				System.out.print("글자를 추측하시오 : ");
    				String input = scanner.nextLine();
    				int solutionIndex;
    				if ((solutionIndex = solution.indexOf(input)) != -1) {
    					answer.replace(solutionIndex, solutionIndex + 1, input);
    				}
    				count++;
    			}
    			System.out.println("성공!! 정답은 [" + answer + "] 입니다.");
    			System.out.println("총 시도 횟수 : " + count);
    		} catch (Exception e) {
    		}
    	}
    }

    Summary

    • 패키지는 관련있는 클래스들을 하나로 묶은 것이다.
      패키지를 사용하여 이름 충돌을 피하고 유지 관리가 쉬운 코드를 작성할 수 있다.
    • 패키지를 선언하는 문장 "package 패키지이름;"은 소스 파일의 첫 번째 줄로 추가한다.
    • 패키지를 사용하는 방법에는 3가지 방법이 있다
      1. 완전한 이름으로 참조한다.
      2. 패키지 안에서 원하는 클래스만을 포함한다.
      3. 패키지 안의 모든 클래스를 포함한다.
    • JAR 파일을 사용하면 자바 파일들을 압축하여 하나의 파일로 만들 수 있다.
    • 클래스를 찾기 위하여 가상 머신이 둘러보는 디렉터리들을 모아둔 경로가 class path이다.
    • 자바에서는 기본적으로 많은 패키지들을 제공하고 프로그래머는 이를 이용하여 편리하게 프로그램을 작성할 수 있다.
      (자바의 기본 패키지는 java로 시작하며 확장 패키지는 javax로 시작한다)

    Programming

    사용자가 입력하는 문자열을 정수로 변환 → 합 구하기

    정수로 변환할 수 없는 문자열일 경우 예외 처리

    public class SumIntException {
    
    	public static void main(String[] args) {
    		try (Scanner scanner = new Scanner(System.in)) {
    			String input;
    			int sum = 0;
    			while (!(input = scanner.nextLine()).equals("")) {
    				try {
    					int number = Integer.parseInt(input);
    					sum += number;
    				} catch (NumberFormatException e) {
    					System.out.println("NumberFormatException 발생");
    				} 
    			}
    			System.out.println("정수들의 합은 " + sum);
    		} catch (Exception e) {
    		}
    	}
    
    }
    3.14
    NumberFormatException 발생
    3
    4
    
    정수들의 합은 7

     

    사용자로부터 알파벳 받아 각 알파벳의 발생 횟수를 출력

    public class CountAlphabet {
    
    	public static void main(String[] args) {
    		int[] counts = new int[26];
    		try (Scanner scanner = new Scanner(System.in)){
    			String input;
    			while(!(input= scanner.nextLine()).equals("")) {
    				int index = input.charAt(0) - 65;
    				try {
    					counts[index]++;
    				} catch (ArrayIndexOutOfBoundsException e) {
    					System.out.println("ArrayIndexOutOfBoundsException 발생");
    				}
    			}
    			for (int i = 0; i < counts.length; i++) {
    				if(counts[i] != 0) {
    					char alphabet = (char)(i + 65);
    					System.out.println(alphabet + ": " + counts[i] + "번");
    				}
    			}
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    	}
    
    }
    A
    B
    #
    ArrayIndexOutOfBoundsException 발생
    A
    D
    
    A: 2번
    B: 1번
    D: 1번

    Java 목차로 돌아가기

     

    'Java > 교재 정리' 카테고리의 다른 글

    09 자바 GUI 기초  (0) 2024.05.03
    *16 멀티 스레딩  (1) 2024.05.02
    07 추상 클래스, 인터페이스, 중첩 클래스  (0) 2024.04.26
    06 상속  (1) 2024.04.23
    05 클래스와 객체 II  (0) 2024.04.18