Post

[Java] 예외처리 응용, API, Object클래스

📌 들어가며

이번 글에서는 예외 처리 응용 문제를 풀고, API(내부·외부)를 다루는 법, 그리고 모든 클래스의 부모인 Object 클래스(toString, equals)를 정리한다.


1. 예외 처리 응용

문제: 무한 반복 안에서 정수 5개만 입력받아 5칸 배열에 넣기. try~catch 사용.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class ExceptionTask {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int[] arData = new int[5];
        int tmp = 0;
        String temp = null;
        while (true) {
            System.out.println(++tmp + "번째 정수 입력[나가기 : q]: ");
            try {
                temp = sc.next();
                if (temp.equals("q")) break;
                arData[tmp - 1] = Integer.parseInt(temp);
                System.out.println("추가 성공");
            } catch (NumberFormatException e) {        // 정수가 아닌 입력
                System.out.println("정수만 입력해주세요.");
                tmp--;
            } catch (ArrayIndexOutOfBoundsException e) { // 6번째 입력 시도
                System.out.println("더 이상 정수를 입력할 수 없습니다.");
                tmp--;
            } catch (Exception e) {                     // 그 외
                System.out.println(e);
            }
        }
    }
}

두 가지 예외를 각각 처리한 것이 포인트다.

예외발생 상황처리
NumberFormatException정수가 아닌 문자 입력안내 + tmp--(칸 건너뜀 방지)
ArrayIndexOutOfBoundsException6번째 정수 입력 시도안내 + tmp--

💡 sc.nextInt() 대신 Integer.parseInt(sc.next())를 쓴 이유: 정수가 아닌 입력을 일단 받아들인 뒤 NumberFormatException으로 잡기 위해서다. nextInt()는 예외 후 무한 루프에 빠질 수 있다.


2. API (Application Programming Interface)

API란? 선배 개발자들이 미리 만들어둔 소스코드의 집합.

종류설명
내부 APIJDK 설치 시 제공되는 기본 API (docs.oracle.com/javase)
외부 API업체·기업이 만든 패키지. 보통 JAR 파일로 배포

외부 JAR을 Build Path에 추가

1
2
3
프로젝트 우클릭 → Build Path → Configure Build Path
→ Libraries 탭 → Add External JARs → .jar 선택
→ Order and Exports 탭 → Select All → Apply and Close

Desktop View Desktop View Desktop View

추가한 JAR은 Referenced Libraries에 나타나며, import 후 사용할 수 있다.

1
2
3
4
5
6
7
8
import api.Calc;

public class ApiTest {
    public static void main(String[] args) {
        Calc c = new Calc();
        c.add(10, 9);   // 자동완성으로 메소드 시그니처·설명 확인 가능
    }
}

Desktop View Desktop View

내가 만든 클래스를 JAR로 배포 (JavaDoc 주석)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/**
 * @author 신동희
 * <br>계산기<br>
 * @since JDK8
 */
public class Calc {
    /**
     * @param num1 : First integer to divide
     * @param num2 : Last integer to divide
     * @return integer value
     * @throws ArithmeticException
     */
    public int div(int num1, int num2) {
        return num1 / num2;
    }
}

💡 /** ... */JavaDoc(어노테이션) 주석이다. 외부 배포 시 받는 사람이 API 정보를 알 수 있게 해준다. @author(만든 사람), @param(매개변수 설명), @return(반환), @throws(예외), @since(버전)를 적는다.

클래스 우클릭 → Export → JAR file로 JAR을 생성한다.

Desktop View Desktop View


3. Object 클래스 — 최상위 부모

모든 클래스의 부모인 Object에는 toString(), equals()가 있다.

toString()

객체를 출력할 때 항상 toString()생략되어 호출된다. 결과가 마음에 안 들면 재정의한다.

1
2
3
4
5
6
7
8
9
public class Student {
    int number; String name; int age;
    // 생성자 생략

    @Override
    public String toString() {
        return "번호: " + number + "\n이름 : " + name + "\n나이 : " + age + "살";
    }
}
1
2
Student 신동희 = new Student(1, "신동희", 20);
System.out.println(신동희);   // 주소값 대신 재정의한 문자열 출력

Desktop View

equals() — ==는 주소값 비교

==는 사실 주소값 비교다. Stringequals값 비교로 재정의했다.

1
2
3
4
5
6
7
8
9
String data1 = "ABC";           // 값 중심 (constant pool)
String data2 = "ABC";
String data3 = new String("ABC");   // 주소값 중심 (new)
String data4 = new String("ABC");

System.out.println(data1 == data2);        // true  (같은 pool 주소)
System.out.println(data1.equals(data2));   // true
System.out.println(data3 == data4);        // false (다른 주소)
System.out.println(data3.equals(data4));   // true  (값 비교!)

Desktop View

data3 == data4가 false인데 equals는 왜 true일까? String의 equals는 값을 한 글자씩 비교하도록 재정의됐기 때문이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
// String.equals() (요약)
public boolean equals(Object anObject) {
    if (this == anObject) return true;             // 주소 같으면 true
    if (anObject instanceof String) {              // 타입 비교
        String anotherString = (String) anObject;
        if (value.length == anotherString.value.length) {  // 길이 비교
            // 문자 하나씩 비교하다 다르면 false
            ...
            return true;                           // 전부 같으면 true
        }
    }
    return false;
}
비교data1/data2 (pool)data3/data4 (new)
== (주소)truefalse
equals (값)truetrue

📝 정리

1
2
3
4
5
예외 응용 · API · Object
├─ 예외 응용  여러 catch로 예외별 처리 (구체적 → 포괄)
├─ API        내부(JDK) / 외부(JAR, Build Path 추가)
├─ JavaDoc    /** @author @param @return @throws */
└─ Object     toString(출력 재정의) · equals(String은 값 비교)
개념한 줄 정의
API미리 만들어진 코드의 집합 (내부/외부)
JavaDoc 주석배포 시 API 정보를 담는 주석
toString객체 출력 형식을 정의
== vs equals주소 비교 vs (String은) 값 비교

이번 글은 예외 응용부터 API 배포, Object 클래스까지 내용이 정말 많았다. 특히 ==equals의 차이, 그리고 String이 equals를 값 비교로 재정의했다는 사실은 여러 번 곱씹어 확실히 내 것으로 만들 필요가 있다.

This post is licensed under CC BY 4.0 by the author.

Comments powered by Disqus.