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."); } }