데이터 엔지니어링 과정/java
[24일차] 예외 처리 & 기본 API 클래스
오리는짹짹
2023. 1. 26. 17:31
목차
1. 예외 처리
2. java.lang 패키지
1. 예외 처리
1. 예외 처리 코드
- try-catch-finally;
① try 블록에는 예외 발생 코드 위치
② try 블록의 코드가 예외 발생 없이 정상 실행되면 catch 블록의 코드는 실행되지 않고 finally 블록의 코드 실행
만약 try 블록의 코드에서 예외가 발생하면 즉시 실행을 멈추고 catch 블록으로 이동하여 예외 처리 코드 실행한 후 finally 블록의 코드 실행
③ finally 블록은 생략 가능
예외 발생 여부와 상관없이 항상 실행할 내용이 있을 경우에만 finally 블록 작성
심지어 try 블록, catch 블록에서 return문을 사용하더라도 finally 블록 항상 실행
- 💻 일반 예외 처리
package sec02.exam01;
public class TryCatchFinallyExample {
public static void main(String[] args) {
try {
Class clazz=Class.forName("String2");
} catch (ClassNotFoundException e) {
System.out.println("클래스가 존재하지 않습니다.");
}
}
}
>>> 클래스가 존재하지 않습니다.
- 💻 실행 예외 처리
package sec02.exam02;
public class TryCatchFinallyRuntimeExceptionExample {
public static void main(String[] args) {
String data1 = null;
String data2 = null;
try {
data1 = args[0];
data2 = args[1];
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("실행 매개값의 수가 부족합니다.");
return;
}
try {
int value1 = Integer.parseInt(data1);
int value2 = Integer.parseInt(data2);
int result = value1 + value2;
System.out.println(data1 + "+" +data2 + "=" + result);
} catch (NumberFormatException e) {
System.out.println("숫자로 변환할 수 없습니다.");
} finally {
System.out.println("다시 실행하세요.");
}
}
}
>>> 실행 매개값의 수가 부족합니다.
2. 예외 종류에 따른 처리 코드
- 다중 catch
- try 블록 내부에서 다양한 예외가 발생할 때,
발생하는 예외별로 예외 처리 코드를 다르게 할 때 사용 - catch 블록이 여러 개라 할지라도 단 하나의 catch문만 실행
➡ try 블록에서 동시 다발적으로 예외가 발생하지 않고, 하나의 예외가 발생하면 즉시 실행을 멈추고 해당 catch 블록으로 이동하기 때문
- try 블록 내부에서 다양한 예외가 발생할 때,
package sec02.exam03;
public class CatchByExceptionKindExample {
public static void main(String[] args) {
try {
String data1 = args[0];
String data2 = args[1];
int value1 = Integer.parseInt(data1);
int value2 = Integer.parseInt(data2);
int result = value1 + value2;
System.out.println(data1 + "+" +data2 + "=" + result);
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("실행 매개값의 수가 부족합니다.");
} catch (NumberFormatException e) {
System.out.println("숫자로 변환할 수 없습니다.");
} finally {
System.out.println("다시 실행하세요.");
}
}
}
>>> 실행 매개값의 수가 부족합니다.
>>> 다시 실행하세요.
- catch 순서
- ❗주의할점❗
다중 catch 블록을 작성할 때 주의할 점은 상위 예외 클래스가 하위 예외 클래스보다 아래쪽에 위치해야 함
👀 만약 상위 예외 클래스의 catch 블록이 위에 있다면, 하위 예외가 상위 예외를 상속했기 때문에 상위 예외 타입도 되어서 하위 예외 클래스의 catch 블록이 실행되지 않음
- ❗주의할점❗
package sec02.exam04;
public class CatchOrderExample {
public static void main(String[] args) {
try {
String data1 = args[0];
String data2 = args[1];
int value1 = Integer.parseInt(data1);
int value2 = Integer.parseInt(data2);
int result = value1 + value2;
System.out.println(data1 + "+" +data2 + "=" + result);
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("실행 매개값의 수가 부족합니다.");
} catch (Exception e) {
System.out.println("실행에 문제가 있습니다.");
} finally {
System.out.println("다시 실행하세요.");
}
}
}
>>> 실행 매개값의 수가 부족합니다.
>>> 다시 실행하세요.
3. 예외 떠넘기기
- throws
- 메소드 선언부 끝에 작성되어 메소드에서 처리하지 않은 예외를 호출한 곳으로 떠넘기는 역할
- throws 키워드 뒤에는 떠넘길 예외 클래스를 쉼표로 구분해서 나열
package sec02.exam05;
public class ThrowsExample {
public static void main(String[] args) {
try {
findClass();
} catch (ClassNotFoundException e) {
System.out.println("클래스가 존재하지 않습니다.");
}
}
public static void findClass() throws ClassNotFoundException {
Class clazz = Class.forName("java.lang.String2");
}
}
>>> 클래스가 존재하지 않습니다.
2. java.lang 패키지
1. Object 클래스
- 자바의 모든 클래스는 Object 클래스의 자식이거나 자손 클래스
➡ Object는 자바의 최상위 부모 클래스! - 객체비교 equals()
package sec01.exam01;
public class Member {
public String id;
public Member(String id) {
this.id = id;
}
@Override
public boolean equals (Object obj) {
if (obj instanceof Member) {
Member member = (Member) obj;
if (id.equals(member.id)) {
return true;
}
}
return false;
}
}
package sec01.exam01;
public class MemberExample {
public static void main(String[] args) {
Member obj1 = new Member("blue");
Member obj2 = new Member("blue");
Member obj3 = new Member("red");
if (obj1.equals(obj2)) {
System.out.println("obj1과 obj2는 동등합니다.");
} else {
System.out.println("obj1과 obj2는 동등하지 않습니다.");
}
if(obj1.equals(obj3)) {
System.out.println("obj1과 obj3은 동등합니다.");
} else {
System.out.println("obj1과 obj3은 동등하지 않습니다.");
}
}
}
>>> obj1과 obj2는 동등합니다.
>>> obj1과 obj3은 동등하지 않습니다.
- 객체 해시코드 hashCode()
- 객체를 식별하는 하나의 정수값
package sec01.exam02;
public class Key {
public int number;
public Key(int number) {
this.number = number;
}
@Override
public boolean equals(Object obj) {
if (obj instanceof Key) {
Key compareKey = (Key) obj;
if (this.number == compareKey.number) {
return true;
}
}
return false;
}
@Override
public int hashCode() {
return number;
}
}
package sec01.exam02;
import java.util.*;
public class KeyExample {
public static void main(String[] args) {
//Key 객체를 식별키로 사용해서 String 값을 저장하는 HashMap 객체 생성
HashMap<Key,String> hashMap = new HashMap<Key, String> ();
//식별키 new Key(1)로 "홍길동"을 저장함
hashMap.put(new Key(1), "홍길동");
//식별키 new Key(1)로 "홍길동"을 읽어옴
String value = hashMap.get(new Key(1));
System.out.println(value);
}
}
>>> 홍길동
- 객체 문자 정보 toString()
- 객체의 문자 정보 리턴
package sec01.exam04;
import java.util.Date;
public class ToStringExample {
public static void main(String[] args) {
Object obj1 = new Object();
Date obj2 = new Date();
System.out.println(obj1.toString());
System.out.println(obj2.toString());
}
}
>>> java.lang.Object@3941a79c
>>> Thu Jan 26 12:23:00 KST 2023
- 💻 SmartPhone 클래스에서 toString() 메소드를 오버라이딩하여 제작회사와 운영체제 리턴
package sec01.exam05;
public class SmartPhone {
private String company;
private String os;
public SmartPhone(String company, String os) {
this.company = company;
this.os = os;
}
@Override
public String toString() {
return company + "," + os;
}
}
package sec01.exam05;
public class SmartPhoneExample {
public static void main(String[] args) {
SmartPhone myPhone = new SmartPhone("구글", "안드로이드");
String strObj = myPhone.toString();
System.out.println(strObj);
System.out.println(myPhone);
}
}
>>> 구글,안드로이드
>>> 구글,안드로이드
2. System 클래스
- 프로그램 종료 exit()
- 현재 실행하고 있는 프로세스 강제 종료시키는 역할
- int 매개값을 지정하도록 되어 있음 ➡ 종료 상태값
일반적으로 정상 종료일 경우 0 값을 줌
package sec01.exam06;
public class ExitExample {
public static void main(String[] args) {
for (int i=0; i<10; i++) {
if (i == 5) {
System.exit(0);
//break;
}
}
System.out.println("마무리코드");
}
}
- 현재 시각 읽기 currentTimeMilis(),nanoTime()
- 컴퓨터의 시계로부터 현재 시간을 읽어서 밀리세컨드 단위와 나노세컨드 단위의 long 값을 리턴
package sec01.exam07;
public class SystemTimeExample {
public static void main(String[] args) {
long time1 = System.nanoTime();
int sum = 0;
for (int i=1; i<=1000000; i++) {
sum+=i;
}
long time2 = System.nanoTime();
System.out.println("1~1000000까지의 합: " + sum);
System.out.println("계산에 " + (time2-time1) + " 나노초가 소요되었습니다.");
}
}
>>> 1~1000000까지의 합: 1784293664
>>> 계산에 2510600 나노초가 소요되었습니다.
3. Class 클래스
- Class 객체 얻기 getClass(), forName()
- Class 객체를 얻기 위한 방법
① Class clazz = 클래스이름.class
② Class clazz = Class.forName("패키지...클래스이름")
③ Class clazz = 참조변수.getClass( );
- Class 객체를 얻기 위한 방법
package sec01.exam08;
public class Car {
}
package sec01.exam08;
public class ClassExample {
public static void main(String[] args) {
//how1
Class clazz = Car.class;
//how2
//Class clazz = Class.forname("sec01.exam08.Car");
//how3
//Car car = new Car();
//Class clazz = car.getClass();
System.out.println(clazz.getName());
System.out.println(clazz.getSimpleName());
System.out.println(clazz.getPackage().getName());
}
}
>>> sec01.exam08.Car
>>> Car
>>> sec01.exam08
- 클래스 경로를 활용해서 리소스 절대 경로 얻기
- Class 객체는 해당 클래스의 파일 경로 정보를 가지고 있어서,
이 겨올를 활용해서 다른 리소스 파일 (이미지, XML, Property 파일)의 경로를 얻을 수 있음
- Class 객체는 해당 클래스의 파일 경로 정보를 가지고 있어서,
4. String 클래스
- String 생성자
- 💻 바이트 배열을 문자열로 변환
package sec01.exam10;
public class ByteToStringExample {
public static void main(String[] args) {
byte[] bytes = {72, 101, 108, 108, 111, 32, 74, 97, 118, 97 };
String str1 = new String(bytes);
System.out.println(str1);
String str2 = new String(bytes, 6, 4);
System.out.println(str2);
}
}
>>> Hello Java
>>> Java
package sec01.exam11;
import java.io.IOException;
public class KeyboardToStringExample {
public static void main(String[] args) throws IOException {
byte[] bytes = new byte[100];
System.out.println("입력: ");
int readByteNo = System.in.read(bytes);
String str = new String(bytes, 0, readByteNo-2);
System.out.println(str);
}
}
- String 메소드
- 문자 추출 charAt()
: 매개값으로 주어진 인덱스의 문자 리턴
- 문자 추출 charAt()
package sec01.exam12;
public class StringCharAtExample {
public static void main(String[] args) {
String ssn = "010624-1230123";
char sex = ssn.charAt(7);
switch (sex) {
case '1':
case '3':
System.out.println("남자 입니다.");
break;
case '2':
case '4':
System.out.println("여자 입니다.");
break;
}
}
}
>>> 남자 입니다.
- 문자열 비교 equals()
: 두 String 객체의 문자열만 비교
package sec01.exam13;
public class StringEqualsExample {
public static void main(String[] args) {
String strVar1 = new String("신민철");
String strVar2 = "신민철";
if (strVar1 == strVar2) {
System.out.println("같은 String 객체를 참조");
} else {
System.out.println("다른 String 객체를 참조");
}
if (strVar1.equals(strVar2)) {
System.out.println("같은 문자열을 가짐");
} else {
System.out.println("다른 문자열을 가짐");
}
}
}
>>> 다른 String 객체를 참조
>>> 같은 문자열을 가짐
- 바이트 배열로 변환 getBytes()
package sec01.exam14;
import java.io.UnsupportedEncodingException;
public class StringGetBytesExample {
public static void main(String[] args) {
String str = "안녕하세요";
byte[] bytes1 = str.getBytes();
System.out.println("bytes1.length: " + bytes1.length);
String str1 = new String(bytes1);
System.out.println("bytes->String: " + str1);
try {
byte[] bytes2 = str.getBytes("EUC-KR");
System.out.println("bytes2.length: " + bytes2.length);
String str2 = new String(bytes2, "EUC-KR");
System.out.println("bytes->String: " + str2);
byte[] bytes3 = str.getBytes("UTF-8");
System.out.println("bytes3.length: " + bytes3.length);
String str3 = new String(bytes3, "UTF-8");
System.out.println("bytes->String: " + str3);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
}
>>> bytes1.length: 15
>>> bytes->String: 안녕하세요
>>> bytes2.length: 10
>>> bytes->String: 안녕하세요
>>> bytes3.length: 15
>>> bytes->String: 안녕하세요
- 문자열 찾기 indexOf()
: 매개값으로 주어진 문자열이 시작되는 인덱스 리턴, 만약 주어진 문장려이 포함되어 있지 않으면 -1 리턴
package sec01.exam15;
public class StringIndexOfExample {
public static void main(String[] args) {
String subject = "자바 프로그래밍";
int location = subject.indexOf("프로그래밍");
System.out.println(location);
if (subject.indexOf("자바") != -1) {
System.out.println("자바와 관련된 책이군요");
} else {
System.out.println("자바와 관련없는 책이군요.");
}
}
}
>>> 3
>>> 자바와 관련된 책이군요
- 문자열 길이 length()
: 문자열의 길이(문자의 수) 리턴
package sec01.exam16;
public class StringLengthExample {
public static void main(String[] args) {
String ssn = "7306241230123";
int length = ssn.length();
if (length == 13) {
System.out.println("주민번호 자리수가 맞습니다.");
} else {
System.out.println("주민번호 자리수가 틀립니다.");
}
}
}
>>> 주민번호 자리수가 틀립니다.
- 문자열 대치 replace()
: 첫 번째 매개값인 문자열을 찾아 두 번째 매개값인 문자열로 대치한 새로운 문자열을 생성하고 리턴
package sec01.exam17;
public class StringReplaceExample {
public static void main(String[] args) {
String oldStr = "자바는 객체 지향 언어입니다. 자바는 풍부한 API를 지원합니다.";
String newStr = oldStr.replace("자바", "JAVA");
System.out.println(oldStr);
System.out.println(newStr);
}
}
>>> 자바는 객체 지향 언어입니다. 자바는 풍부한 API를 지원합니다.
>>> JAVA는 객체 지향 언어입니다. JAVA는 풍부한 API를 지원합니다.
- 문자열 잘라내기 substring()
: 주어진 인덱스에서 문자열을 추출
package sec01.exam18;
public class StringSubstringExample {
public static void main(String[] args) {
String ssn = "880815-1234567";
String firstNum = ssn.substring(0,6);
System.out.println(firstNum);
String secondNum = ssn.substring(7);
System.out.println(secondNum);
}
}
>>> 8808515
>>> 1234567
- 알파벳 소·대문자 변경 toLowerCase(), toUpperCase()
: 문자열을 모두 소문자로 바꾼 새로운 문자열을 생성한 후 리턴 |
문자열을 모두 대문자로 바꾼 새로운 문자열을 생성한 후 리턴
package sec01.exam19;
public class StirngToLowerUpperCaseExample {
public static void main(String[] args) {
String str1 = "Java Programming";
String str2 = "JAVA Programming";
System.out.println(str1.equals(str2));
String lowerStr1 = str1.toLowerCase();
String lowerStr2 = str2.toLowerCase();
System.out.println(lowerStr1.equals(lowerStr2));
System.out.println(str1.equalsIgnoreCase(str2)); //대소문자 구분 없이 판단
}
}
>>> false
>>> true
>>> true
- 문자열 앞뒤 공백 잘라내기 trim()
: 문자열의 앞뒤 공백을 제거한 새로운 문자열을 생성하고 리턴
package sec01.exam20;
public class StringTrimExample {
public static void main(String[] args) {
String tel1 = " 02";
String tel2 = "123 ";
String tel3 = " 1234 ";
String tel = tel1.trim() + tel2.trim() + tel3.trim();
System.out.println(tel);
}
}
>>> 021231234
- 문자열 변환 valueOf()
: 기본 타입의 값을 문자열로 변환하는 기능
package sec01.exam21;
public class StringValueOfExample {
public static void main(String[] args) {
String str1 = String.valueOf(10);
String str2 = String.valueOf(10.5);
String str3 = String.valueOf(true);
System.out.println(str1);
System.out.println(str2);
System.out.println(str3);
}
}
>>> 10
>>> 10.5
>>> true
5. Wrapper(포장) 클래스
- 박싱 Boxing과 언박싱 Unboxing
: 기본 타입의 값을 포장 객체로 만드는 과정 ➡ 박싱
포장 객체에서 기본 타입의 값을 얻어내는 과정 ➡ 언박싱
package sec01.exam22;
public class BoxingUnBoxingExample {
public static void main(String[] args) {
// 박싱
Integer obj1 = new Integer(100);
Integer obj2 = new Integer("200");
Integer obj3 = Integer.valueOf("300");
//언박싱
int value1 = obj1.intValue();
int value2 = obj2.intValue();
int value3 = obj3.intValue();
System.out.println(value1);
System.out.println(value2);
System.out.println(value3);
}
}
>>> 100
>>> 200
>>> 300
- 자동 박싱과 언박싱
- 자동 박싱: 포장 클래스 타입에 기본값이 대입될 경우 발생
- 자동 언박싱: 기본 타입에 포장 객체가 대입되는 경우와 연산에서 발생
package sec01.exam23;
public class AutoBoxingUnBoxingExample {
public static void main(String[] args) {
// 자동 박싱
Integer obj = 100;
System.out.println("value: " + obj.intValue());
//대입 시 자동 언박싱
int value = obj;
System.out.println("value: " + value);
//연산 시 자동 언박싱
int result = obj + 100;
System.out.println("result: " + result);
}
}
>>> value: 100
>>> value: 100
>>> result: 200
- 문자열을 기본 타입 값으로 변환
package sec01.exam24;
public class StringToPrimitiveValueExample {
public static void main(String[] args) {
int value1 = Integer.parseInt("10");
double value2 = Double.parseDouble("3.14");
boolean value3 = Boolean.parseBoolean("true");
System.out.println("value1: " + value1);
System.out.println("value2: " + value2);
System.out.println("value3: " + value3);
}
}
>>> value1: 10
>>> value2: 3.14
>>> value3: true
- 포장 값 비교
package sec01.exam25;
public class ValueCompareExample {
public static void main(String[] args) {
System.out.println("[-128~127 초과값일 경우]");
Integer obj1 = 300;
Integer obj2 = 300;
System.out.println("==결과: " + (obj1 == obj2));
System.out.println("언박싱후 ==결과: " + (obj1.intValue() == obj2.intValue()));
System.out.println("equuals() 결과: " + obj1.equals(obj2));
System.out.println();
System.out.println("[-128~127 범위값일 경우]");
Integer obj3 = 10;
Integer obj4 = 10;
System.out.println("==결과: " + (obj3 == obj4));
System.out.println("언박싱후 ==결과: " + (obj3.intValue() == obj4.intValue()));
System.out.println("equuals() 결과: " + obj3.equals(obj4));
}
}
>>> [-128~127 초과값일 경우]
>>> ==결과: false
>>> 언박싱후 ==결과: true
>>> equuals() 결과: true
>>>
>>> [-128~127 범위값일 경우]
>>> ==결과: true
>>> 언박싱후 ==결과: true
>>> equuals() 결과: true
6. Math 클래스
package sec01.exam26;
public class MathExample {
public static void main(String[] args) {
int v1 = Math.abs(-5);
double v2 = Math.abs(-3.14);
System.out.println("v1=" + v1);
System.out.println("v2=" + v2);
double v3 = Math.ceil(5.3);
double v4 = Math.ceil(-5.3);
System.out.println("v3=" + v3);
System.out.println("v4=" + v4);
double v5 = Math.floor(5.3);
double v6 = Math.floor(-5.3);
System.out.println("v5=" + v5);
System.out.println("v6=" + v6);
int v7 = Math.max(5, 9);
double v8 = Math.max(5.3, 2.5);
System.out.println("v7=" + v7);
System.out.println("v8=" + v8);
int v9 = Math.min(5, 9);
double v10 = Math.min(5.3, 2.5);
System.out.println("v9=" + v9);
System.out.println("v10=" + v10);
double v11 = Math.random();
System.out.println("v11=" + v11);
double v12 = Math.rint(5.3);
double v13 = Math.rint(5.7);
System.out.println("v12=" + v12);
System.out.println("v13=" + v13);
long v14 = Math.round(5.3);
long v15 = Math.round(5.7);
System.out.println("v14=" + v14);
System.out.println("v15=" + v15);
double value = 12.3456;
double temp1 = value * 100;
long temp2 = Math.round(temp1);
double v16 = temp2/100.0;
System.out.println("v16=" + v16);
}
}
>>> v1=5
>>> v2=3.14
>>> v3=6.0
>>> v4=-5.0
>>> v5=5.0
>>> v6=-6.0
>>> v7=9
>>> v8=5.3
>>> v9=5
>>> v10=2.5
>>> v11=0.7460928683694523
>>> v12=5.0
>>> v13=6.0
>>> v14=5
>>> v15=6
>>> v16=12.35
package sec01.exam27;
public class MathRandomExample {
public static void main(String[] args) {
int num = (int) (Math.random()*6) + 1;
System.out.println("주사위 눈: "+ num);
}
}
>>> 주사위 눈: 5