ref : 남궁성님의 유튜브 강의를 참조했습니다
https://www.youtube.com/watch?v=fcRapZYB29c&list=PLW2UjW795-f6xWA2_MUhEVgPauhGl3xIp&index=97
메소드
에매개변수
로객체
를 넘기면Call By Reference
로 동작모든 객체
는Object
를상속
객체
에생성자가 하나도 없으면
자동으로기본 생성자(Default Constructor)
생성
(사용자가 하나라도 만들면
기본 생성자를 만들어주지 X
)instanceof
키워드를 통해인스턴스의 타입을 확인
할 수 있다인터페이스
는다중 상속이 가능
- 접근 지정자
- private :
해당 클래스에서만
접근 가능- default :
해당 패키지 내에서만
접근 가능- protected :
동일 패키지 내의 클래스
혹은상속받은 외부 패키지의 클래스
에서 사용 가능- public :
모든 클래스와 패키지
에서 사용 가능
프로그램 오류
에러와 예외
- 런타임 에러(
runtime error
)는 크게 에러(error
) / 예외(exception
) 로 구분
- 에러(
error
) :심각한 오류
/프로그램 코드에 의해 수습 불가능
- 예외(
exception
) :미약한 오류
/프로그램 코드에 의해 수습 가능
예외 클래스의 계층 구조
프로그램 코드로 수습이 가능
한런타임 에러
인Exception
이 우리가처리할 대상
Exception 계층
은 아래처럼세분화
해서2가지로 구분
할 수 있다
예외(Exception)
- 예외(
Exception
) ?
error의 일종
으로, 발생시 시스템 및 프로그램을불능상태
를 야기함- 종류
- 일반 예외(
Exception
) :컴파일 시점에 발생
하는 예외- 실행 예외(
RuntimeException
) :프로그램 실행시 발생
하는 예외
예외 처리
- 예외 처리 ?
프로그램
에서예외
를발생
시키고,처리
하는 과정
- 예외 처리 구문 :
try ~ catch ~ finally
- try :
수행할 문장
- catch :
처리할 예외
- finally : 처리할 예외에 상관 없이
반드시 수행
되는 부분
- 예외 발생 키워드
- throw :
메소드 내
에서상위 블럭
으로예외를 던지는 것
- throws :
메소드
에서상위 메소드
로예외를 던지는 것
- 예외 처리 방법
- try-catch문 -->
직접 처리
throw
로예외를 발생
시킨 후적절한 처리
수행- 예외 선언 -->
예외 떠넘기기
throws
를 통해발생시 호출한 메서드로 예외를 넘기기
위한선언
throw
로예외를 발생
시키면throws에 따라 호출한 메서드
로예외를 떠넘기게 됨
- 은폐 -->
try-catch
는 쓰되,처리를 하지 않는 것
- 사용자 정의 예외 만들기
조상
은Exception
/RuntimeException
중에서선택
해서상속
(extends
)
:가능
하면RuntimeException
으로 만들어서선택적으로 예외 처리
할 것String 매개변수를 갖는 생성자
를 만들어부모 생성자 호출
:예외 메시지
를 통해부모
(Exception
/RuntimeException
)생성자 호출
-super
사용
예외 발생시
예외가 발생
하면 해당 예외에 맞는예외 객체
를생성
예외 객체
에는예외에 대한 정보
들이 존재다양한 API
를 통해서접근
하고사용
할 수 있음catch 블럭
을순회
하며해당 예외 처리
를수행
e.printStackTrace()
:예외발생 당시의 호출스택
에 있던메서드의 정보
와예외 메시지
출력e.getMessage()
:발생한 예외클래스
의인스턴스에 저장된 메시지
얻기
실행 예외(RuntimeException) 처리
(FoolException.java)
public class FoolException extends RuntimeException { }
(main.java)
public class Test { public void sayNick(String nick) { if("fool".equals(nick)) { /* 특정 조건을 만족할 경우 throw를 통해 예외를 발생 시킴 */ throw new FoolException(); } System.out.println("당신의 별명은 "+nick+" 입니다."); } public static void main(String[] args) { Test test = new Test(); test.sayNick("fool"); test.sayNick("genious"); } }
(결과)
Exception in thread "main" FoolException at Test.sayNick(Test.java:7) at Test.main(Test.java:15)
일반 예외(Exception) 처리
(FoolException.java)
public class FoolException extends Exception { }
(main.java)
public class Test { public void sayNick(String nick) { try { if("fool".equals(nick)) { /* throw로 예외 발생 시킴 */ throw new FoolException(); } System.out.println("당신의 별명은 "+nick+" 입니다."); }catch(FoolException e) { /* Exception은 컴파일 시 발생하므로 바로 처리해주는 코드가 있어야 정상 실행! */ System.err.println("FoolException이 발생했습니다."); } } public static void main(String[] args) { Test test = new Test(); test.sayNick("fool"); test.sayNick("genious"); } }
throws로 예외 던지기
특정 메소드 내부
에서예외를 발생
시켜 처리하기 위해서는throw
만 사용하면 됨하나의 트랜잭션 수행
에서발생한 예외
를상위 메소드
로 던져서전체 작업을 처리
하려면throws
가 필요메소드의 끝 부분
에throws 키워드
와예외
를 작성/* 상품발송이라는 하나의 트랜잭션 */ 상품발송() { try { 포장(); 영수증발행(); 발송(); }catch(예외) { 모두취소(); } } 포장() throws 예외 { ... } 영수증발행() throws 예외 { ... } 발송() throws 예외 { ... }
checked 예외 / unchecked 예외
- checked 예외
컴파일러
가예외 처리 여부를 체크
(예외 처리 필수
)try ~ catch
필수
Exception과 자손들
- unchecked 예외
컴파일러
가예외 처리 여부를 체크 안함
(예외 처리 선택
)try ~ catch
선택
RuntimeException과 자손들
Thread.start()
를 통해서쓰레드를 실행
(Thread
는순서에 상관 없이 동시에 실행
되기 때문에순서가 정해지지 X
)Thread.join()
을 통해서실행 순서 제어 가능
(Test.java)
/* Thread를 상속받고 실행하는 run 메소드를 구현해줘야 한다 */ public class Test extends Thread { int seq; public Test(int seq) { this.seq = seq; } public void run() { System.out.println(this.seq+" thread start."); try { Thread.sleep(1000); }catch(Exception e) { } System.out.println(this.seq+" thread end."); } }
(Main.java)
public static void main(String[] args) { ArrayList<Thread> threads = new ArrayList<Thread>(); for(int i=0; i<10; i++) { Thread t = new Test(i); /* thread 실행 */ t.start(); threads.add(t); } for(int i=0; i<threads.size(); i++) { Thread t = threads.get(i); try { /* thread.join()을 통해 실행이 끝날 때 까지 기다린 후 다음 수행! */ t.join(); }catch(Exception e) { } } System.out.println("main end."); }
Runnable
- 쓰레드 객체를 생성 하는 방법
Thread
직접 상속Runnable
인터페이스 상속Runnable 인터페이스
를 통해쓰레드 객체를 생성
하면상속 및 기타 등등
에서좀더 유연
해짐!import java.util.ArrayList; public class Test implements Runnable { int seq; public Test(int seq) { this.seq = seq; } public void run() { System.out.println(this.seq+" thread start."); try { Thread.sleep(1000); }catch(Exception e) { } System.out.println(this.seq+" thread end."); } public static void main(String[] args) { ArrayList<Thread> threads = new ArrayList<Thread>(); for(int i=0; i<10; i++) { Thread t = new Thread(new Test(i)); t.start(); threads.add(t); } for(int i=0; i<threads.size(); i++) { Thread t = threads.get(i); try { t.join(); }catch(Exception e) { } } System.out.println("main end."); } }