Java

[Java]debug, Thread,예외처리(2),간단로그인_10/05

하체는 스쿼트 2022. 10. 5. 17:06
복습

 

 

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가지

  1. 메서드 단위로 하기
  2. 블록 단위로 하기

 

오늘의 Tip

 

MemberDTO 구현할때는 implements Serializable(객체 직렬화)를 해주는게 좋다.

 

DTO에 저장할 데이터 들이 많은데 이걸 따로따로 저장 하기 객체단위로 한번에 저장해 주는게 좋다 . 

=> 이런 것을 객체 직렬화라고 한다.

객체 직렬화 객체 단위로 한번에 저장 해주는 방법

 

공식 문서 들어가는 방법 : shift + f2