Java/혼공단

[혼공단10기] JAVA - 4주차

슈코 2023. 7. 25. 21:34

혼공단 4주차 - 시작은 멀어져가고, 끝은 가까워진다!

어느덧 혼공단 4주차에 접어들었다

이제 남은 주차보다 지나간 주차가 더 많아졌다

간만에 자바의 개념을 다시 공부하는것도 좋은 공부가 되고 있지만,

하나의 목표를 세우고, 그 목표를 조금씩 달성해나가는 기분이 좋다

 

다음주는 여름방학으로 한주 쉬어가는 타이밍이 되는데,

기가 막히게 해외여행 가는주라서 다행이란 생각이 든다ㅎ

여행을 다녀오면서 휴식도 취하고, 남은 시간에는 혹 부족했던 주차가 있었을거 같아서

그 부분을 보충하는 시간으로 가지면 좋을거 같다!

( 객체지향쪽 개념을 조금 더 상세하게 정리하고, 예시를 작성해보는 목표! )

 

4주차 기본미션 - P. 550 [직접 해보는 손코딩] 코딩 과정 및 실행 결과 캡처하기

AutoSaveThread

먼저, save() 메소드를 만들어 준다.

여기서는 단순히 텍스트를 출력해주는 println으로 표현해주고 있다

다음은 save()가 제대로 작동하는지 보여주기 위해 1초의 sleep을 주고 save()를 호출하는 반복문을 작성한다

 

AutoSaveThread를 데몬으로 사용하는 main

main에서는 AutoSaveThread를 생성하여, 데몬 스레드로 설정해주고 있다

데몬 스레드는 스레드의 작업을 돕는 보조적인 역할을 수행한다고 보면 된다

보조적인 역할을 수행하기 때문에, 주 스레드가 종료되게 되면 데몬 스레드는 강제적으로 자동 종료된다

데몬으로 만들어주기 위해서는 간단하게 setDeamon(true)로 설정할 수 있다

여기서 중요한점은 '강제적'으로 종료가 되기 때문에 이 특징을 제대로 알고 사용해야한다는 점이다

데몬 스레드를 만들어서 특정 기능을 부여하고, 그 기능이 완성되고 메인이 종료되어야 하는 상황에서는 주의가 필요하다!

 

책의 보기와 같은 결과를 만들기 위해서는 메인의 sleep을 4초로 늘려주어야 한다

이는 데몬이 1초당 한번씩 실행되고, 3초뒤에 메인이 종료되기 때문에 메인이 먼저 종료되면서 데몬도 강제 종료되 3번째 실행이 되지 않기 때문이다

메인을 3초로 유지하면서 실행결과를 유지하고 싶다면, 데몬 스레드의 sleep을 조정해주어도 된다(1000 -> 900)

( 같은 시간을 걸어주면, 메인이 먼저 실행됨이 예제를 통해서 확인되었다. 이 부분은 조금 더 확인이 필요할 거 같다 )

 

IF) 만약, AutoSaveThread를 데몬으로 설정하지 않는다면...?

 

데몬설정 x

다음과 같이 메인 스레드는 끝나도, AutoSaveThread는 계속해서 돌아가게 된다

이건 매우 조심해야하는 부분이다

사실 멀티쓰레드는 잘 사용하게 되면 매우매우 효율적인 프로그래밍이 가능하지만,

다음과 같이 잘못 설계하게 된다면, 큰 문제를 유발할 수 있다

 

데몬 스레드로 설정하지 않고 AutoSaveThread를 종료시키기 위해서는

AutoSaveThread가 스스로 종료될 수 있도록 조정할 필요가 있다

예제는 데몬 스레드를 사용하여 강제 종료되는것을 보여주기 위해서 무한로프가 도는 스레드를 준비한 거 같다

 

단순히 데몬 스레드만 확인하고 넘어가도 좋을 예제이지만,

이 예제를 통해서 스레드 사용시 설계의 중요성과 스레드의 위험성을 함께 알면 좋을거 같다!

 

메인이 종료되는 시점에, 스레드를 강제로 종료 시키려면 데몬 스레드 설정을!

데몬 스레드 설정없이 종료 시키려면 나름의 조건을 설정!

 

데몬 설정없이 종료를 위한 조건 추가

다음과 같이 count라는 변수를 추가하여, save() 작업 당 count를 하나씩 증가시키고

무한루프 안에 count가 5가 되면(특정 조건 설정) 해당 반복문을 빠져나오게끔 추가해보았다.

 

결과

다음과 같이 메인스레드는 4초후에 종료되고,

AutoSaveThread는 5번의 작업 후에 종료되는 것을 확인할 수 있다.

 

 

4주차 선택미션 - P. 539 문제 2번 풀고, 풀이 과정 설명하기

문제에서 요구하는 것은 두 가지 스레드를 실행하는 것이다.

ThreadExample을 먼저 확인해보면,

MovieThread

new MovieThread() 로 생성하여 start() 시켜주고 있다

그래서 에 들어갈 내용은 extends Thread 이다

이 방법은 Thread 하위 클래스로부터 생성해주는 방법인데 run()을 오버라이딩(재정의)해서 사용하고 있다

 

다음은 MusicRunnable인데,

MusicRunnable

이름에서 살짝의 힌트가 있긴하지만,

new Thread()를 사용하고 있고, 그 안에 빈칸으로 답을 요구하고 있기 때문에

이 방법은 Thread 클래스로부터 직접 생성하는 방법을 표현한 것 이다.

 

스레드 객체를 직접 생성해주기 위해서는 Runnable을 매개값으로 갖는 생성자를 호출해주어야 한다

익명객체로 만들어주어도 되지만, 예제에서는 MusinRunnable이 있기때문에

③의 정답은 implements Runnable이 된다

 

그래서 ①의 정답은 new MusicRunnable()이 들어가야 한다

 

결과1

 

결과2

 

결과3

결과를 보여주며 선택미션을 마무리 한다!

 

 

깊이를 채우는 시간

이번 4주차는 챕터도 하나이고 객체지향언어에 대해 공부했던 2주차에 비해서는 양이 현저히 적었다

미션도 2문제를 푸는 간단한 주차라고 할 수 있다

그렇지만, 지난 3주차와 마찬가지고 상당히 중요한 부분이라고 말할 수 있다

 

현재 현업에서 WebFlux를 통한 리액티브 프로그래밍을 접하고 있는데

결국 얼마나 효율적으로 프로그래밍을 하느냐의 문제를 다루는 것 이다

 

객체지향언어를 공부하는것은 매우 중요하다

그보다 앞서 자바의 기본 문법을 공부하는것도 너무너무 중요하다

 

2주차까지 자바의 기본적인 내용을 공부했다고 하면

3주차부터는 실무에서도 매우 중요하게 다루는 부분을 공부하고 있다고 생각하면 좋겠다

 

비교적 양은 적었지만, 단 2문제에서도 많은 부분을 생각해 볼 수 있었다

남은 5주, 6주에서도 1,2주차에 비해서 양은 적겠지만 앞으로 자바를 통해서 실무를 경험하게 될 분들이

깊이를 늘리는 시간으로 삼았으면 좋겠다

( 물론, 나에게도 깊이를 늘리는 시간이다!!! 멀티 스레드를 겁나 어렵거든!! )

 

'Java > 혼공단' 카테고리의 다른 글

[혼공단10기] JAVA - 6주차  (0) 2023.08.15
[혼공단10기] JAVA - 5주차  (0) 2023.08.08
[혼공단10기] JAVA - 3주차  (0) 2023.07.21
[혼공단10기] JAVA - 2주차  (1) 2023.07.16
[혼공단10기] JAVA - 1주차  (2) 2023.07.09