[Java]debug, Thread,예외처리(2),간단로그인_10/05
복습
P434 페이지 복습해보기!
debug 모드
디버그 모드 사용해서 ExceptionTest5 흐름 파악하기

main 매서드의 catch문에서 Exception에서 UpCasting 되어서여기서 잡힌거다.
f5 : stepInto
f6 : stepOver
f7 : step Return
f8 : resume
산술연산 예외 발생 잡아주는 catch 블록을 추가해보자

예외처리
throw : 원하는 시점에 예외처리를 강제로 발생시킬 때
또다시 근본적인 물음을 가져보자...
- 왜 예외를 강제로 발생시킬까?
=>특정 상황을 예방차원에서 예외를 강제로 발생시킨다.
메서드를 호출하는 쪽에서 예외처리를 할 수 있게 미룬다.

Throw로 예외를 던지면 던진 시점에서 예외가 발생하고 catch문으로 넘어가게 된다.
사용자 정의 예외 클래스
예외를 발생시키고 예외 처리를 해줄 때
getMessage를 사용해서 내가 설정한 메시지를 출력할 수 도 있다.

p495쪽 실습 38번째줄/ 51번째줄 확인해보기
로그인 에외처리 간단하게 해보기
exception2 패키지 만들기
LoginFailException 클래스 만들기
로그인 과정 실습
로그인 실패했을 때 메모장에 실패 기록을 남기는 코드를 만들어 보자
과정
1단계) MemberDTO 클래스 만들기
암호 필드를 get 하는 부분에서 암호화를 해보자.
=> https://commons.apache.org/ 의 다운로드에 들어가서
commons-codec-1.15-bin.zip 파일을 다운로드

다운로드 받은 파일을 압축을 푼 후 C드라이브 dev64 mylib 폴더에 넣어두자.


이클립스에서
프로젝트(우) - properties - JavaBuildPath - Add External Jars를 클릭하여
위의 사진에 표시 된것처럼 commons-codec-1.15.jar 파일을 넣어준다.
jar 파일을 추가하면 필드로 받은 비밀번호를 암호화 시킬 수 있다.

2단계) LoginFail Exception 클래스 만들기
여기서 예외처리 내용을 만들면서 로그인 실패 기록을 만드는 메모장 파일 작성하는 코딩한다.

3단계) LoginTest 클래스 만들기

실습해보기 503page
Thread
쓰레드란?
- CPU가 독립적으로 처리하는 하나의 작업단위 (**중요 암기**)
프로세스 : 프로그램이 메모리에 로드된 상태를 의미한다.
Class 영역이랑 heap영역은 쓰레드들이 공유하지만
- 스택 영역은 쓰레드당 하나의 스택 영역이 만들어진다.
동시성/병렬성
동시성이란?
작업의 수가 CPU의 코어수보다 많은 경우를 의미한다.
이런 경우에는 CPU코어를 나눠서 써야 한다. 이때 CPU는 각 작업 쓰레드의 요청 작업을 번갈아 가면서 실행한다.
병렬성이란?
CPU 코어수가 작업 수 보다 많을 때를 의미한다.
이때는 각각의 작업을 각각의 코어에 할당해 동시에 실행할 수 있게 때문에 그야말로 동시에 작업이 수행된다.
Multi Thread
멀티쓰래드르 사용하기 위해 새로운 쓰래드를 선언하면
새로운 쓰래드를 실행시키기 위해서는 run() 메서드를 오버라이딩을 해줘야한다.
멀티쓰래드를 사용하는 방법(p521)
1) 외부 클래스를 선언해 주고 Thread 를 상속받게 해준다.
2) Thread 클래스의 추상 메서드인 run() 메서드를 오버라이딩 해준다.
3) 인스턴스를 생성한다.
4) 인스턴스.start로 수행해 준다.
만약 멀티 쓰레드를 구현하고 싶은데 상속받은 클래스가 있다면 어떻게 해야할까?
=> implements 로 Runnable을 구현 받으면 된다.

Thread smiFileThread = new Thread(new SMIFileThread());
- Thread 객체에 생성자에 매개변수로 받아온 것의 run()메서드를 실행시켜 주는 생성자가 있다.
package thread4;
class SMIFileThread extends Object implements Runnable{
@Override
public void run() {
String[] strArray= {"하나","둘", "셋", "넷", "다섯"};
for (int i = 0; i < strArray.length; i++) {
System.out.println("(자막번호)"+ strArray[i]);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
}//for
}//run
}//SMIFileThread
public class CreatAndStartThread_M1C1{
public static void main(String[] args) {
Thread smiFileThread = new Thread(new SMIFileThread());//업캐스팅
smiFileThread.start();
int[] intArray = {1,2,3,4,5};
for (int i = 0; i < intArray.length; i++) {
System.out.println("(비디오 프레임)"+ intArray[i]);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
}//for
System.out.println("종료");
}//main
}//TheNeedForThread
Thread
Thread 속성
Thread.activeCount() : 총 쓰래드 개수
Thread.currentThread().getName() : 현재 쓰래드 이름
Thread 이름 바꾸기
쓰래드 이름 바꾸는 방법 2가지
1) 생성자를 통해서 바꾸기
public SMIFileThread() {}
public SMIFileThread(String name) {
super(name);
}
2) set 을 이용해서 바꾸기
smiFileThread.setName("자막 쓰레드");
Thread 우선순위
Thread 클래스에서 쓰래드에 우선순위를 정해 줄 수 있다.
thread.setPriority(10);
getPriority()
윈도우에서는 쓰레드 우선 순위 7~10 이 똑같다.
(원래 기본값은 5이다.)
그래서 같게 나온다.
p531 실습해보기
Thread Daemon
Daemon Thread란?
일반 쓰레드가 마지막으로 종료되는 시점에 강제적으로 종료되는 쓰레드를 Daemon Thread라고 한다.
Daemon Thread 설정하는 법
setDemon(True)
일반 쓰레드가 모두 종료되면 데몬쓰레드는 무조건 종료된다.
Thread 동기화
Thread 동기화란?
하나의 작업이 환전히 완료된 후 다른 작업을 수행하는 것을 말한다.
멀티쓰레드에서 왜 동기화가 필요할까?
그림 15-9
업무단위가 높을 수록 데드락에 걸릴 확률이 높아진다.
그래서 트랜잭션은 최소 업무 단위로 행해야한다.
동기화가 되어있다면 도중에는 다른 업무가 들어오면 안된다.
(트랜잭션중에는 다른곳에서 업무가 들어오면 안된다.)
동기화 방법 2가지
- 메서드 단위로 하기
- 블록 단위로 하기
오늘의 Tip
MemberDTO 구현할때는 implements Serializable(객체 직렬화)를 해주는게 좋다.
DTO에 저장할 데이터 들이 많은데 이걸 따로따로 저장 하기 객체단위로 한번에 저장해 주는게 좋다 .
=> 이런 것을 객체 직렬화라고 한다.
객체 직렬화 객체 단위로 한번에 저장 해주는 방법
공식 문서 들어가는 방법 : shift + f2