05.09 예외처리
throws : 예외 떠 넘기기
메소드 선언부 끝에 작성
package test2_throws;
public class ThrowsExample {
// throws : 예외 던지기. 메소드 호출하는곳에서 try-catch로 예외처리 해줘야 함.
public static void main(String[] args) // throws ClassNotFoundException
{
try {
findClass("java.lang.String");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public static void findClass(String path) throws ClassNotFoundException {
// class의 위치 이름을 전달받아 클래스 설계정보를 저장하는 객체
Class<?> clazz = Class.forName(path);
}
}
package test3_throw_extends;
public class Account {
private long balance; // 잔고
// 입금
public void deposit(int money) {
balance += money;
}
// 출금
public void withdraw(int money) throws BalanceInsufficientException {
if(balance < money) {
String message = "잔고 부족 : " + (money - balance) + "원 모자람";
//throw new 예외객체("예외 메시지"): 예외 강제 발생시키는것. > 이런 상황에서 이런 예외 발생할 수 있으니까
// 메소드 호출하는 곳에서 예외처리 해줘야한다고 알림.
// message : 예외처리시 e.getMessage()에 쓰임
throw new BalanceInsufficientException(message);
/*
System.out.println(message);
return;
*/
}
balance -= money;
}
}
package test3_throw_extends;
//extends Exception : 예외객체 만들기
public class BalanceInsufficientException extends Exception{
public BalanceInsufficientException (String message) {
super(message);
}
}
package test3_throw_extends;
import java.util.Scanner;
// 간단하게 예금을 입금 출금하는 프로그램
public class AccountExample {
public static void main(String[] args) {
Account account = new Account();
account.deposit(10000);
try (Scanner sc = new Scanner(System.in)) {
while(true) {
System.out.println("출금할 금액을 입력해 주세요.");
int money = sc.nextInt();
//alt + s + w : try-catch 블록지정
try {
account.withdraw(money);
break;
} catch (BalanceInsufficientException e) {
System.out.println(e.getMessage());
continue;
}
}// end while
//sc.close();// 자기랑 연결된 자원 해제
}
} // end main
}
Class 클래스(reflect pkg, 직접 사용하는 경우는 드물다... )
package b_class;
public class Person {
public static String addrress;
private String name;
private int age;
public Person() {}
public Person(String name) {
this.name = name;
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
//getter setter toString
public static String getAddrress() {
return addrress;
}
public static void setAddrress(String addrress) {
Person.addrress = addrress;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
// alt + s + s + s
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
}
package b_class;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
public class ClassExample {
public static void main(String[] args) throws ClassNotFoundException {
// Class - Class 또는 생성된 인스턴스의
// 설계정보를 알려주는 객체
// 1. class의 정적 멤버 class
// class의 설계정보가 메모리에 올라갈 때 class의 설계 정보를 저장
Class<Person> pClass1 = Person.class;
//class의 이름 정보(package를 포함하는 class의 전체 이름)
System.out.println(pClass1.getName());
// 2. 생성된 instance의 부모(Object)의 getClass() 함수 이용
Person person = new Person("a",12);
System.out.println(person);
Class<?> pClass2 = person.getClass();
System.out.println(pClass2.getName());
// 3. Class의 정적 멤버 forName(class이름)를 이용 (자주 사용)
Class<?> pClass3 = Class.forName("b_class.Person");
System.out.println(pClass3.getName());
System.out.println(pClass3.getSimpleName());
System.out.println(pClass3.getPackageName());
System.out.println(pClass3.getPackage().getName());
// class에 정의된 Field(전역변수) 정보
// 선언된 모든 필드에 대한 정보를 배열로 반환
// java.lang.reflect.Field
Field[] fields = pClass3.getDeclaredFields();
System.out.println("Fields==================================");
for(Field f : fields) {
// field 접근 제어자(static final 등도 포함)
System.out.print(Modifier.toString(f.getModifiers())+"\t");
// field 데이터 타입
System.out.print(f.getType().getSimpleName()+"\t");
// field 이름
System.out.println(f.getName());
}
// 생성자
System.out.println("Constructor ====================");
Constructor<?>[] cons = pClass3.getDeclaredConstructors();
for(Constructor<?> c : cons) {
System.out.print(c.getName()+"(");
Class<?>[] types = c.getParameterTypes();
for(int i = 0; i<types.length;i++) {
System.out.print(types[i].getName()+" ");
}
System.out.println(")");
}
// method
System.out.println("Methods =====================");
// java.lang.reflect.Method
Method[] methods = pClass3.getDeclaredMethods();
System.out.println(methods[0]);
for(Method m : methods) {
System.out.println(m);
System.out.print(Modifier.toString(m.getModifiers())+"\t");
System.out.print(m.getReturnType()+"\t"+m.getName());
System.out.print("(");
Class<?>[] types = m.getParameterTypes();
for(int i = 0; i<types.length;i++) {
if(i != 0 ) System.out.print(", ");
System.out.print(types[i].getName());
}
System.out.println(")");
}
// Class는 class의 설계 정보를 가지고 있으므로 인스턴스 생성이 가능함.
// ClassNotFoundException은 throws
Class<?> clazz = Class.forName("b_class.Person");
try {
//객체생성 1번째 방법 (기본생성자로 생성)
Person p = (Person)clazz.newInstance();
p.setAge(35);
p.setName("최기근");
System.out.println(p);
//객체생성 2번째 방법. 매개변수 있는 객체 생성시에도 사용가능.
Person p1 = (Person)clazz.getConstructor().newInstance();
System.out.println(p1);
Person p2 = (Person)clazz.getConstructor(String.class).newInstance("최기근");
System.out.println(p2);
Person p3 = (Person)clazz.getConstructor(String.class, int.class)
.newInstance("최기근",28);
System.out.println(p3);
} catch (InstantiationException e) {
// 객체 설계 정보는 있으나 객체 생성이 불가능 할때 발생하는 오류
// 추상클래스, 인터페이스 이러한 설계 정보를 가진 Class는
// 자체만으로 객체생성이 불가능 하므로 발생하는 오류
} catch (IllegalAccessException e) {
// class정보도 존재하고 객체생성이 가능한 일반 클래스 이지만
// 객체를 생성하기 위해 생성자를 호출할 수 없다. ex> default 생성자만 존재하는 경우
// 접근 제한자(접근제어자)
} catch (IllegalArgumentException e) {
// 동일한 타입의 인자값이 전달되지 않았을때 발생하는 오류
// String int인데 int int 타입의 매개변수를 전달했을 경우
} catch (InvocationTargetException e) {
// 설계 정보가 잘못 되었을 경우 발생하는 오류
} catch (NoSuchMethodException e) {
// 동일한 매개변수를 가진 생성자를 찾지 못했을 때 발생
} catch (SecurityException e) {
// ?
e.printStackTrace();
}
}// end main
}
Objects 클래스
Object의 유틸리티 클래스
package a_objects;
import java.util.Objects;
class A{}
public class ObjectsExample {
public static void main(String[] args) {
A a = null;
A a1 = null;
// a는 null 인가? true : false;
boolean isChecked = Objects.isNull(a);
System.out.println(isChecked);
System.out.println("1========================");
// a1은 널이 아닌가? true : false
isChecked = Objects.nonNull(a1);
System.out.println("2========================");
//System.out.println(a.equals(a1));
isChecked = Objects.equals(a, a1); //null 도 비교가능
System.out.println("3========================");
A c = new A();
A d = c;
isChecked = Objects.equals(a1, c);
System.out.println(isChecked);
System.out.println("4========================");
isChecked = Objects.equals(d, c);
System.out.println(isChecked);
System.out.println("5========================");
int[] arr1 = {1,2,3,4,5};
int[] arr2 = {1,2,3,4,5};
isChecked = Objects.equals(arr1, arr2);
System.out.println(isChecked);
System.out.println("6========================");
//해당 배열의 항목의 값 비교
isChecked = Objects.deepEquals(arr1, arr2);
System.out.println(isChecked);
System.out.println("7========================");
// null.toString()
// System.out.println(a1.toString()); //NullPointerException발생
System.out.println(a1);
System.out.println(Objects.toString(arr2));
System.out.println(Objects.toString(a)); //오류없이 출력 가능
System.out.println(Objects.toString(a,"a 는 참조하는 값이 없습니다.")); // null인 경우 default값 지정
System.out.println(Objects.toString(c,"c 는 참조하는 값이 없습니다."));
}
}
String 메소드
package c_string.method;
public class String01CharAtLengthExample {
public static void main(String[] args) {
// CharAt(인덱스) - 문자열을 문자타입의 배열로 지정 후
// 각 인덱스에 저장된 하나의 문자를 반환
String rrn = "010624-1230123";
char gender = rrn.charAt(7);
switch(gender) {
case '1' : case '3':
System.out.println("남성입니다.");
case '2' : case '4' :
System.out.println("여성입니다.");
case '5' : case '7' :
System.out.println("외국인 남성입니다.");
case '6' : case '8' :
System.out.println("외국인 여성입니다.");
default :
System.out.println("1900년 이전 출생자 입니다.");
}// end switch
// "문자열".length() - 문자가 몇개인지 개수를 반환
rrn="8206071123456";
int length = rrn.length();
System.out.println("rrn 길이 : "+length);
if(length == 13) {
System.out.println("올바른 주민등록번호 길이입니다.");
}
}//end main
}
package c_string.method;
public class String02indexOfExample {
public static void main(String[] args) {
// method를 호출한 문자열에서
// 매개변수로 전달한 문자열이 몇번째 인덱스에 위치하고 있는지
// 인덱스 번호를 반환
// 해당되는 값이 없으면 -1을 반환
String str = "자바 프로그래밍을 자바!";
int location = str.indexOf("프로그래밍");
System.out.println("location : "+location);
if(str.indexOf("자바") != -1) {
System.out.println("자바가 존재합니다.");
}else {
System.out.println("자바가 존재하지 않습니다.");
}
System.out.println(str.indexOf("자바"));
//lastIndexOf 후미에서 부터 검색
System.out.println(str.lastIndexOf("자바"));
}
}
package c_string.method;
public class String03SubStringExample {
public static void main(String[] args) {
String rrn = "880815-1******";
int index = rrn.indexOf("-");
// substring(시작인덱스번호,끝인덱스번호 - 1)
String birthDay = rrn.substring(0,index);
System.out.println(birthDay);
// substring(시작인덱스번호)
// 해당 인덱스 위치부터 끝까지 문자열을 잘라냄
String last = rrn.substring(index+1);
System.out.println(last);
String fileName = "cat.png";
index = fileName.lastIndexOf(".");
String ext = fileName.substring(index);
System.out.println(ext);
}
}
package c_string.method;
import java.util.Scanner;
public class String04CaseTrimExample {
public static void main(String[] args) {
// case 함수 - 저장된 알파벳 문자를 대문자 또는 소문자로 변경하여 저장
String str1 = "Java Programmming!";
String str2 = "JAVA Programmming!";
System.out.println(str1);
System.out.println(str2);
String lowerStr = str1.toLowerCase();
String upperStr = str2.toUpperCase();
System.out.println(lowerStr);
System.out.println(upperStr);
System.out.println(lowerStr.equals(str2.toLowerCase()));
// 대소문자 상관없이 문자만 고려
if (str1.equalsIgnoreCase(str2)) {
System.out.println("문자열이 같습니다.");
} else {
System.out.println("문자열이 같지 않습니다.");
}
// trim 함수 - 지정된 문자열 좌우에 있는 의미 없는 공백을 제거
String tel1 = " 02";
String tel2 = "1234 ";
String tel3 = " 5678 ";
String tel4 = " 010 9486 7166 ";
System.out.println(tel1.trim() + tel2.trim() + tel3.trim());
Scanner sc = new Scanner(System.in);
System.out.println("아이디를 입력해주세요 > ");
String id = sc.nextLine();
String ownerid = "id001";
if (id.trim().equals(ownerid)) {
System.out.println("일치합니다.");
} else {
System.out.println("일치하지 않습니다.");
}
sc.close();
}
}