[whiteship] 자바 온라인 스터디 - 제어문

노력을 즐겼던 사람·2020년 12월 7일
0
post-thumbnail

JUnit 5 에 대해서 열심히 공부해서 정리했는데 날아갔다. 속상 ㅠㅠ
포스팅은 시험 끝나고..

제어문

C언어를 처음 배울 때 제어문을 이렇게 정의하더라.
프로그램의 진행 순서를 변경하는 구문
맞는 이야기 인 것 같다.

if/while/for

생략!

syncronized

멀티스레딩 프로그래밍을 위한 키워드라고 한다. 멀티스레딩 환경에서 각 객체들이 침범당해 값이 변경되는 것을 주의해야한다.
(싱글톤 패턴을 사용할 때 본 것 같다.)

문법은 아래와 같다.

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가 선언된 메소드의 모든 동작
}

throw

exception은 너무 무섭다. 우테코 프리코스에 참여 했을 때 예외처리 하느라 과제를 시원하게 말아먹었던 기억이 난다. 워낙에 프로그래밍 숙련도도 부족했지만 클래스를 나누는 실력도 부족했다. 하여튼 throw를 살펴보자

exception은 예외 조건이나 에러가 발생 했을 때 프로그램이 보내는 신호이다. exception이 발생하면 throw를 통해 exception이 발생했다고 알리고 catch로 핸들링하면 된다.

기본적인 문법은 이렇다. throw expression;
expressionexception 객체여야한다. 자바에서 제공하는 기본적인 exception도 있지만 우리가 직접 정의할 수도 있다.

exception을 정의하는 조건을 살펴보자

  • 객체로 표현되어야 한다.
  • Exception의 하위 클래스여야 한다.
  • checked, unchecked 두 가지 타입일 수 있다.

자바 인터프리터가 throw 구문을 실행할 때 즉시 프로그램의 실행을 중지하고 catch와 같은 exception handler를 찾는다.
exception handlertry/catch/finally 구문과 함께 작성될 수 있다.
자바 인터프리터는 가장 가까운 블록 내에서 handler를 탐색하기 시작한다. 만약 메소드를 벗어나기 전에 handler를 찾으면 exception handler를 실행한 후 handler 이후에 있는 코드부터 프로그램을 재개시킨다.
만약 메소드에서 handler를 찾지 못하면 메소드를 호출한 메소드에 가서 탐색을 한다. 이런식으로 탐색은 main()까지 전파(propagate)된다. main()에서도 handler가 없으면 Exception에 의해 에러 메시지와 stack trace를 출력하며 프로그램이 종료된다.

try/catch/finally

자바에서는 서로 다른 두가지 방싱의 exception handling 메커니즘을 가진다. 전통적인 방식은 try/catch/finally 구문이다.
tryexception handling을 위한 코드를 항상 시작시킨다(establishe). trycatch구문을 0개 이상 동반한다.
동반되는 각각의 catch는 하나 이상의 서로 다른 exception을 처리할 수 있다. 여러개의 Exception을 처리할 때는 |을 통해 구분하자. 항상 Throwable의 하위 클래스를 캐치할 수 있다. Exception이 발생했을 때 발생한 타입에 맞는 catch문을 찾는다.
finalllytry가 발생하면 무조건 실행되는 구문이다. catch와 마찬가지로 생략되어도 상관없다. 대부분 try에서 시도한 코드들을 수습할 때 사용한다고 한다.

문법을 살펴보자

try {

}
catch (SomeException e1) {

}
catch (AnotherException | YetAnother Exception e2) {

}
finally {

}

try with resources

문법부터 보자

try (InputStream is = new FileInputStream("/Users/ben/details.txt")) {

}

try의 괄호 안에는 cleanup이 필요한 모든 객체가 파라미터로 들어올 수 있다. 파라미터로 들어온 객체는 try 블록에서만 스코프를 지닌다. 블록이 끝나면 자동으로 cleanup된다. python의 with 같은 녀석인가봄

좋은 녀석이라고 하니까 자주 사용합시다.

assert

assert는 boolean을 뱉는 표현식을 동반한다. boolean을 뱉는 표현식을 동반할 때는 우리가 항상 true여야하는 값을 표현식이어야 한다. 그러니까 이게 항상 true인가 확인하는 구문이다. 기본적으로 assertion은 활성화되어 있지 않아서 assert는 실제로 아무런 동작도 안한다.
활성화 하는 방법중에 한가지는 디버깅 툴이다. assert가 실행되면서 표현식이 true이면 프로그램이 그냥 지나가지만 표현식이 false이면 java.lang.AssertionErrorthrow한다.

assert를 사용하는 일은 정말 적다고 한다. JUnit을 사용한다고 한다.

assert는 두번째 표현식을 동반할 수도 있다. :으로 구분하여 작성한다. 문법을 살펴보자
assert assertion : errorcode;
만약 assertionfalse이면 errorcode의 값을 AssertionError() 생성자에게 전달한다고 한다.

assertion을 유용하게 사용하고 싶으면 두가지 포인트를 기억하자.

  • 평소에는 assertion을 비활성화하고 필요할 때만 활성화시키자 그러니까 assertion을 프로그램을 제어하는 목적으로는 절대 사용하지 말라는 뜻이다. 그리고 AssertionError 에 우리가 작성한 코드를 절대로 throw하지 말아야한다.
  • AssertionErrorthrow 됐을 때는 프로그램이 프로그래머가 의도한대로 흘러가고 있지 않다는 것이다. 그러니까 프로그램을 수정하자 AssertionError를 수정하려고 들지 말자 댐비지말자;

enabling assertion

cli로 활성화 시켜보자
java -ea를 입력하면 시스템 클래스를 제외한 모든 클래스에서 활성화된다.
java -esa를 입력하면 시스템 클래스 포함한 모든 클ㄹ래스에서 활성화된다.
특정 클래스만 활성화 시키고 싶다면 java -ea:{특정클래스} 를 입력하자
특정 패키지와 서브 패키지들에 존재하는 모든 클래스에서 활성화 시키고 싶다면 java -ea:{패키지}... 를 입력하자 ...을 빼면 서브 패키지는 포함하지 않는다.
다시 비활성화 시키고 싶다면 java -da:{패키지} 를 입력해서 비활성화 시키자.

과제 - LinkedList

포스팅이 길어져서 따로 분리했습니다

profile
노력하는 자는 즐기는 자를 이길 수 없다 를 알면서도 게으름에 지는 중

0개의 댓글