복습

 

  • 자바는 타입 체크에 굉장히 민감한 언어이다.
  • instanceof : 다운캐스팅 할때 인스턴스 확인용으로 많이 사용
  • object클래스의 equals와 String 타입의 equals는 다르게 동작한다.
  • 추상 클래스라고 무조건 추상 메서드를 가진건 아니지만 추상 메서드는 무조건 추상 클래스 안에 있어야 한다.

 

 

이너클래스

 

 

 

인스턴스 멤버 클래스 : 클래스 안의 클래스(이너 클래스)를 의미한다.

정적 멤버 클래스 : 클래스 안의 스태틱 클래스를 의미한다.

지역이너클래스 : 클래스 안의 메서드 안의 클래스를 의미한다.

 

아우터 클래스와 이너클래스는 컴파일 파일이 따로 만들어 진다.

 

 

메서드 안의 클래스(=지역 클래스)는 숫자를 붙여서 구별하면서 컴파일 파일이 생긴다.

 

 

 

 

인스턴스의 이너클래스에서는 아우터 클래스의 모든멤버를 접근 지정자와 상관없이 사용 가능하다.

(p428) (430페이지 23번째줄)

 

이너클래스를 사용하려면 아웃터 클래스 객체를 생성한 다음 사용해야 한다.

단, 이너클래스에 static이 선언되어져 있다면 아웃터 클래스 객체 생성 필요없이 바로 사용가능하다.

A.B  b = new A.B();

 

정적 (static)이너클래스는 아우터 클래스의 정적(static) 멤버만 사용이 가능하다. (p432 참고)

 

 

만약 정적필드가 아닌 필드를 사용하게 되면 아래와 같은 오류가 난다.

Cannot make a static reference to the non-static field a

 

 

메서드 안에서 선언된 지역변수가 만약 지역 이너클래스(메서드 안의 클래스)에서 사용된다면 final로 선언된다.

(p434페이지 final로 선언되는 이유 생각해 보기)

 

 

 

인터페이스는 new 연산자를 사용할 수 없지만

1회용으로 몸통을 만들고 구체화(익명클래스)를 시키면 사용할 수 있다. (p438)

 

 

 

예외 처리

 

 

자바에서 예외를 처리하는 가장 최상위 클래스 => Throwable

 

  • 예외와 에러의 차이는?

예외 : 해결할수 있는 오류!

에러 : 가상머신에서 발생한 오류(JVM 자체에서 발생한 문제들) 로써 개발자가 해결할 수 없는 오류

 

 

일반 예외 클래스


  • InterruptedException : 일정 시간 동안 해당 쓰레드를 일시정지 상태로 만드는 Thread  클래스의 static메서드다.
  • ClassNotFoundException : 클래스를 메모리에 동적으로 로딩하는 과정에서 해당 클래스가 존재하지 않을때 발생
  • IOException : 자바 입출력 부분에서 자주 보게 될 일반 예외
  • FileNotFound : 파일을 읽을 때 해당 경로에 파일이 없으면 발생
  • CloneNotSupportedException : Cloneable 인터페이스를 상속하지 않은 클래스의 객체를 복사하기 위해 clone() 메서드를 호출할때 발생

 

 

Runtime Exception


  • ArithmeticException : 연산 자체가 불가능 할 때 발생하는 실행 예외
  • ClassCastException : 다운캐스팅이 불가능한 상황에서 다운캐스팅 시도할때 발생
  • ArrayIndexOutOfBoundsException : 배열의 인덱스를 잘못 사용했을 때 발생한다.
  • NumberFormatException : 문자열을 숫자 또는 실수로 변환할 때 문자열이 변환하고자 하는 숫자 형식이 아니면 발생

(Runtime Exception은 Exception의 자식 클래스다.)

 

 

 

예외처리 문법

 

 

예외처리를 기본적으로 해줘야 하는 곳이있다.

 

 

 

예외 처리 문법 구조

try ~ catch ~ finally

(try문을 길게 쓰는걸 비추한다. 상당히 느리다.)

 

try{ 
	//일반 예외, 실행 예외 발생 가능 코드
}catch(예외 클래스명 참조 변수명){
	//예외가 발생했을 때 처리
}finally{
	//예외 발생 여부에 상관없이 무조건 실행
}

 

예외처리 과정

1) 예외 발생

2) JVM에서  발생한 예외 클래스 객체 생성

3)  catch 블록으로 전달

 

try문 안에서 예외가 발생하면 예외 처리 객체를 생성해서 catch문 ()안에 매개변수로 집어 넣어준다.

(예를들어 JVM이 예외 처리해야할 부분을 발견하면 new ArithmeticException() 같은 예외처리 객체를 생성해서

catch 괄호안에 catch(ArithmeticException e)이런식으로 대입해 준다.)

 

 

복수 catch문

 

주의점!

catch문을 여러개 쓸때 

상속관계의 super클래스가 나중에 와야한다.

sub()  예외처리

super() 예외처리

 

=>이유는?  

 

만약에 super()예외처리 객체가 예외를 위에서 잡게 된다면 

모든 예외가 UpCasting 되어서 밑에까지 코드가 넘어가지를 않는다. 그래서 밑에 아래와 같은 오류 코드가 발생한다.

 

Unreachable catch block for ClassNotFoundException. It is already handled by the catch block for Exception

그래서 항상 catch를 여러개 쓸때 상속관계에 있다면 super()의 예외처리 부분을 제일 밑으로 내려야한다.

 

또한

 

여러개 catch 블록을 |  ( =>'or' ) 을 사용해서 처리 할 수 있다.

 

 

try with resources

 

 

try with resources 구문은 리소스 자동 해제를 할 때 사용된다.

 

try with resources 구문 사용으로 close를 해줘야 하는 자원을 안해줘도 되는 장점이 발생했다.

try ()안에 자원을 닫아야 하는 객체들을 넣어주면 된다.

 

try(리소스 자동 해제가 필요한 객체 생성){ 
	//예외 발생 가능 코드
}catch(예외 클래스명 참조 변수명){
	//예외가 발생했을 때 처리
}finally{
	//예외 발생 여부에 상관없이 무조건 실행
}

 

try with resources 구문에서 try()안에 코드는 try의{  마지막 중괄호 ' } ' 를 만나는 순간 close 메서드가 실행된다.

 

 

 

 

 

예외 전가

 

 

throws는 나를 호출한 곳에서 예외처리를 하라고 미루는 것이다.

(주의! throw 는 예외처리를 발생해 주라고 명시해주는 것이다. )

(throws 와 throw는 다른 것이다.)

 

 

  • 예외처리를 미루는(예외 전가를 하는) 이유는 무엇일까?

      =>(자유도가 높다,이식성이 좋다.)

 

 

아래의 사진을 비교해 보자

 

 

2개의 사진에서 위의 사진은 syso 때문에 자바 콘솔에서 밖에 쓰지 못한다.

하지만 아래 사진 같은 경우는 안드로이드나 여러 곳에서 쓸 수 있게 한다.

(즉 이말은 자유도가 높고 이식성이 좋다는 뜻이다.)

(사용하는 사람이 예외처리를 자유롭게 할께 할 수 있게 해주는게 좋다.)

 

결론 => 메서드 내에서 예외처리를 하는게 아니라  메서드를 호출 하는 곳에서 예외 처리를 해주는게 좋다.

 

  • 그렇다면 main에서 까지 미루는게 가능할까?

불가능 하다.

=>이건 그냥 예외처리를 안하는게 되는거다. (그래서 똑같이 에외로 빨간 글씨 나온다.)

=>main에서 까지는 예외 처리를 미루면 안된다!

 

 

오늘의 고민

 

멀티 태스킹이란?

쓰래드란?

 

=> 멀티 태스킹 : 완전 업무가 다른 것들이 동시에 가행한거

 

=> 쓰래드 : 프로그램은 보조장치에 있는걸 반드시 CPU에 올라온다음에 메모리에 올라와야 수행이된다.

스레드는 프로세스 내에서 실행되는 흐름의 단위

복사했습니다!