일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 26 | 27 | 28 |
- 큐
- union_find
- math
- spring boot
- alter
- NIO
- Union-find
- 리소스모니터링
- sql
- BFS
- JPA
- List
- deque
- html
- priority_queue
- Java
- string
- javascript
- set
- Properties
- 힙덤프
- date
- GC로그수집
- dfs
- 스택
- CSS
- scanner
- Calendar
- 스프링부트
- map
- Today
- Total
매일 조금씩
11/19 - Java (9) : 예외처리, 열거타입 본문
복습 & 개념정리
OOP 이론 - 문법(문법이 아니고 oop이론이라고 생각해야한다.)
캡슐
*상속
추상
다형
+형변환
+오버라이드
추상클래스
인터페이스 구현클래스의 메서드를 사용
상속과 추상을 생각하면서 다형을 생각해야한다.
추상클래스의 다형, 인터페이스의 다형 둘다 똑같다.
둘다 미완성된 추상메서드를 갖고 있기 때문에 똑같다.
*중첩 클래스
멤버 필드
인스턴스 멤버 클래스
스태틱(정적) 멤버 클래스
로컬 클래스
익명 클래스 (UI할 때 사용한다.)
*에러처리
에러
컴파일 에러
실행 에러( = runtime)
값(논리)오류
if
예외(Exception)를 통해서 처리
try {
구문
} catch(익셉션 객체 변수){
익셉션 발생시 처리 부분
} finally {
무조건 수행
}
예외 처리
▷p430
exception은 오류가 날 수 있는 부분만 최대한 작게 처리해 주는 게 좋다.
1. 다중 catch
▷p433
여러가지 예외가 동시에 나올수 있다.
위에서 예외 발생하면 바로 넘어가기 때문에 아래의 예외들은 못잡는다. 순차적이다.
public class ExceptionEx05 {
public static void main(String[] args){
try{
// Exception 발생 가능 1
String data1 = args[0];
String data2 = args[1];
// Exception 발생 가능 2
int value1 = Integer.parseInt(data1);
int value2 = Integer.parseInt(data2);
int result = value1 + value2;
System.out.println(data1 + "+" + data2 + "=" + result);
// Exception 1
}catch(ArrayIndexOutOfBoundsException e){
System.out.println("실행 매개값의 수가 부족합니다.");
System.out.println("[실행 방법]");
System.out.println("java CatchByExceptionKindExample num1 num2");
// Exception 2
}catch(NumberFormatException e){
System.out.println("숫자로 변환할 수 없습니다.");
}finally{
System.out.println("다시 실행하세요.");
}
}
}
▷p434
| 는 or 처럼
▷p437 예제
catch(Exception e)를
catch(ArrayIndexOutOfBoundsException e)와 같이 세부적인 에러처리 위에 오게되면 실행이 안된다.
catch(Exception e)는 항상 제일 밑에 finally바로 위에 와야한다.
2. 위임
▷p440
메소드를 호출한 곳으로 예외를 떠넘길 수도 있다.
throws 키워드는 메소드 선언부 끝에 작성되어 메소드에서 처리하지 않은 예외를 호출한 곳으로 떠넘기는 역할을 한다.
main()에서도 throws 키워드를 사용하여 예외를 떠넘길 수 있는데 결국 JVM이 최종적으로 예외처리를 하게 된다.
JVM은 예외의 내용을 콘솔에 출력하는 것으로 예외 처리를 한다. 그러나 이것은 좋지 못한 방법니다.
main()에선 try-catch블록으로 예외를 최종 처리 하는 것이 바람직하다.
메서드에서 throws 하고 main이 try~catch 마무리함
다음 코드에서 method2 를 보자.
public class ExceptionEx07 {
public void method1(int num ){
System.out.println("시작");
try{
if(num < 100){
// 강제 익셉션 발생
throw new Exception("익셉션 발생");
}
}catch(Exception e){
System.out.println("[익셉션]" + e.getMessage());
}
System.out.println("끝");
}
public void method2(int num) throws Exception {
System.out.println("시작");
if(num < 100){
// 강제 익셉션 발생
throw new Exception("익셉션 발생");
}
System.out.println("끝");
}
public static void main(String[] args){
ExceptionEx07 e = new ExceptionEx07();
e.method1(101);
e.method1(10);
try{
e.method2(101);
}catch(Exception e1){
System.out.println("[익셉션]" + e1.getMessage());
}
}
}
api 메서드 안에서는 전부 위임으로 처리해놨다. 그래서 try, catch 를 꼭 우리가 구현해야 한다.
다음의 브라우저 열기 코드를 보자.
예외의 메세지가 출력된다.
3. 사용자 정의 예외
▷p443
4. 이클립스에서 예외처리하기
예외처리할 구간 드래그 > 우클릭 > surround With > try/catch 하면 자동완성
열거 타입 (enumeration type)
▷p171
몇개의 열거 상수 중에서 하나의 상수를 저장하는 데이터 타입이다.
모두 대문자로 써야하고 숫자형태(상수)로 저장된다.
1. 열거타입 선언
Week.java
Member.java
ProductKind.java
public enum Week{ MONDAY, TUESDAY, WEDNESDAY ,TURSDAY, FRIDAY , ... }
2. 열거타입 변수
- 이클립스에서 new에 따로 enum만드는게 있다.
- 문자열이 아니고 enum타입으로 특수한 타입이다.
- 상수 값이 아니라 이름에 의한 접근이며 목록 중심이다.
3. 열거타입 메서드
java api에서 볼때 STATIC , INSTANCE 메서드 볼때 Exception위임 까지 같이봐라
// 상수값이 아니라 이름에 의한 접근
// 목록 중심
public enum Week {
MONDAY, // 0
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY,
SUNDAY
}
import java.util.Calendar;
public class EnumWeekExample {
public static void main(String[] args) {
// TODO Auto-generated method stub
Week week1 = Week.SATURDAY;
Week week2 = Week.SATURDAY;
Week today = null;
Calendar cal = Calendar.getInstance();
int week = cal.get(Calendar.DAY_OF_WEEK);
switch(week) {
case 1:
today = Week.SUNDAY; break;
case 2:
today = Week.MONDAY; break;
case 3:
today = Week.TUESDAY; break;
case 4:
today = Week.WEDNESDAY; break;
case 5:
today = Week.THURSDAY; break;
case 6:
today = Week.FRIDAY; break;
case 7:
today = Week.SATURDAY; break;
}
System.out.println("오늘 요일: " + today);
if(today == Week.SUNDAY) {
System.out.println("일요일에는 축구를 합니다");
}else {
System.out.println("열심히 자바 공부합니다.");
}
System.out.println(week1 == week2);
// String
System.out.println(week1.name());
// Week
System.out.println(week1.SATURDAY);
// 순서 번호
System.out.println(week1.ordinal());
Week[] days = Week.values();
for(Week day: days) {
System.out.println(day);
}
}
}