JUnit 5 에 대해서 열심히 공부해서 정리했는데 날아갔다. 속상 ㅠㅠ
포스팅은 시험 끝나고..
C언어를 처음 배울 때 제어문을 이렇게 정의하더라.
프로그램의 진행 순서를 변경하는 구문
맞는 이야기 인 것 같다.
생략!
멀티스레딩 프로그래밍을 위한 키워드라고 한다. 멀티스레딩 환경에서 각 객체들이 침범당해 값이 변경되는 것을 주의해야한다.
(싱글톤 패턴을 사용할 때 본 것 같다.)
문법은 아래와 같다.
synchronized (expression) {
statements
}
expression
에는 배열 혹은 객체를 넣어야한다.
statements
에는 손상이 우려되는 코드를 넣어야한다.
statement block
을 실행하기 전에 자바 인터프리터는 expression
에 작성한 객체나 배열에 lock을 건다. 이 lock은 statement block
이 끝날 때 까지 지속된다. 물론 끝나면 다시 해제한다.(release)
expression
에 lock이 걸려있을 때는 다른 스레드에서 lock을 걸 수 없다.
syncronized
는 메소드에도 선언할 수 있다. 메소드에 선언되면 당연히 메소드의 모든 동작이 syncronized
에 의해 다뤄진다는 것을 나타낸다.
synchronized instance method
를 실행할 때 자바는 class instance
에 lock을 건다. 이는 아래와 같다고 볼 수 있다
synchronized (this) {
// synchronized가 선언된 메소드의 모든 동작
}
exception
은 너무 무섭다. 우테코 프리코스에 참여 했을 때 예외처리 하느라 과제를 시원하게 말아먹었던 기억이 난다. 워낙에 프로그래밍 숙련도도 부족했지만 클래스를 나누는 실력도 부족했다. 하여튼 throw를 살펴보자
exception
은 예외 조건이나 에러가 발생 했을 때 프로그램이 보내는 신호이다. exception
이 발생하면 throw
를 통해 exception
이 발생했다고 알리고 catch
로 핸들링하면 된다.
기본적인 문법은 이렇다. throw expression;
expression
은 exception
객체여야한다. 자바에서 제공하는 기본적인 exception
도 있지만 우리가 직접 정의할 수도 있다.
exception
을 정의하는 조건을 살펴보자
Exception
의 하위 클래스여야 한다.checked
, unchecked
두 가지 타입일 수 있다.자바 인터프리터가 throw
구문을 실행할 때 즉시 프로그램의 실행을 중지하고 catch
와 같은 exception handler
를 찾는다.
exception handler
는 try/catch/finally
구문과 함께 작성될 수 있다.
자바 인터프리터는 가장 가까운 블록 내에서 handler
를 탐색하기 시작한다. 만약 메소드를 벗어나기 전에 handler
를 찾으면 exception handler
를 실행한 후 handler
이후에 있는 코드부터 프로그램을 재개시킨다.
만약 메소드에서 handler
를 찾지 못하면 메소드를 호출한 메소드에 가서 탐색을 한다. 이런식으로 탐색은 main()
까지 전파(propagate)된다. main()
에서도 handler
가 없으면 Exception
에 의해 에러 메시지와 stack trace
를 출력하며 프로그램이 종료된다.
자바에서는 서로 다른 두가지 방싱의 exception handling
메커니즘을 가진다. 전통적인 방식은 try/catch/finally
구문이다.
try
는 exception handling
을 위한 코드를 항상 시작시킨다(establishe). try
는 catch
구문을 0개 이상 동반한다.
동반되는 각각의 catch
는 하나 이상의 서로 다른 exception
을 처리할 수 있다. 여러개의 Exception
을 처리할 때는 |
을 통해 구분하자. 항상 Throwable
의 하위 클래스를 캐치할 수 있다. Exception
이 발생했을 때 발생한 타입에 맞는 catch
문을 찾는다.
finallly
는 try
가 발생하면 무조건 실행되는 구문이다. catch
와 마찬가지로 생략되어도 상관없다. 대부분 try
에서 시도한 코드들을 수습할 때 사용한다고 한다.
문법을 살펴보자
try {
}
catch (SomeException e1) {
}
catch (AnotherException | YetAnother Exception e2) {
}
finally {
}
문법부터 보자
try (InputStream is = new FileInputStream("/Users/ben/details.txt")) {
}
try
의 괄호 안에는 cleanup
이 필요한 모든 객체가 파라미터로 들어올 수 있다. 파라미터로 들어온 객체는 try
블록에서만 스코프를 지닌다. 블록이 끝나면 자동으로 cleanup
된다. python의 with 같은 녀석인가봄
좋은 녀석이라고 하니까 자주 사용합시다.
assert는 boolean을 뱉는 표현식을 동반한다. boolean을 뱉는 표현식을 동반할 때는 우리가 항상 true
여야하는 값을 표현식이어야 한다. 그러니까 이게 항상 true
인가 확인하는 구문이다. 기본적으로 assertion
은 활성화되어 있지 않아서 assert
는 실제로 아무런 동작도 안한다.
활성화 하는 방법중에 한가지는 디버깅 툴이다. assert
가 실행되면서 표현식이 true
이면 프로그램이 그냥 지나가지만 표현식이 false
이면 java.lang.AssertionError
를 throw
한다.
assert
를 사용하는 일은 정말 적다고 한다.JUnit
을 사용한다고 한다.
assert
는 두번째 표현식을 동반할 수도 있다. :
으로 구분하여 작성한다. 문법을 살펴보자
assert assertion : errorcode;
만약 assertion
이 false
이면 errorcode
의 값을 AssertionError()
생성자에게 전달한다고 한다.
assertion
을 유용하게 사용하고 싶으면 두가지 포인트를 기억하자.
assertion
을 비활성화하고 필요할 때만 활성화시키자 그러니까 assertion
을 프로그램을 제어하는 목적으로는 절대 사용하지 말라는 뜻이다. 그리고 AssertionError
에 우리가 작성한 코드를 절대로 throw
하지 말아야한다.AssertionError
가 throw
됐을 때는 프로그램이 프로그래머가 의도한대로 흘러가고 있지 않다는 것이다. 그러니까 프로그램을 수정하자 AssertionError
를 수정하려고 들지 말자 댐비지말자;cli로 활성화 시켜보자
java -ea
를 입력하면 시스템 클래스를 제외한 모든 클래스에서 활성화된다.
java -esa
를 입력하면 시스템 클래스 포함한 모든 클ㄹ래스에서 활성화된다.
특정 클래스만 활성화 시키고 싶다면 java -ea:{특정클래스}
를 입력하자
특정 패키지와 서브 패키지들에 존재하는 모든 클래스에서 활성화 시키고 싶다면 java -ea:{패키지}...
를 입력하자 ...
을 빼면 서브 패키지는 포함하지 않는다.
다시 비활성화 시키고 싶다면 java -da:{패키지}
를 입력해서 비활성화 시키자.