Java 공부/자바 공부 (baek)

2021-09-14

Hesitater 2021. 9. 14. 16:02
728x90

2021-09-14

11.12 Wrraper(포장)클래스
기본타입(byte, char, short, int, long, float, double boolean) 제외 다 참조타입임

기본타입을 -> reference type(참조타입) 처럼 사용하는경우 반대로
참조타입(reference type) -> 기본타입으로 쓰는경우

포장클래스는 대문자로 시작하고 기본타입의 풀네임이다.

기본타입 포장 클래스
byte Byte
char Character
short Short
int Integer
long Long
float Float
double Double
boolean Boolean

Wrapper 클래스는 예시를 통해 알아보자

wrap -> boxing

Ex01

wrapping, boxing 많이 쓰인다.

Ex02 자주일어나서 auto boxing이 됨

자바에서 자동으로 wrapping, boxing 하게 해줌( 많이쓰여서)

콜렉션 할때 많이 사용된다고 함

포장클래스 -> 기본타입

Ex03

intValue, shortValue 등등..으로

*Ex04 *
포장클래스 -> 기본타입 자동으로 되는것 예시

unboxing 과 auto unboxing 비교

*Ex05 *

내가 쓰고 있는게 기본타입인지 참조타입인지..?

EX06
참조타입과 기본타입이 있을때 어떻게 값을 비교를 하니?

equals 매소드를 사용 or 참조타입을 기본타입으로 형 변환해서 값을 비교

System.out.println(i3.equals(i4)); Integer 에서 equals 가 오버라이당(메서드 재정의) 가 된 거죠?

Ex07

아직 배우지 않은 내용이라 나중에 볼것

결과값

=====================================자바 167쪽~ 배열복사===================

복사되지 않은String[] 배열의 기본 초기값은 null

복사 되지 않은 int[] 배열의 기본 초기값은 0

oldIntArray 에서 1,2,3, 복사 에서 newArray에 넣는다 index3,4 는 복사되지 않은 값이라 배열의 기본 초기값 인 0 이 나온다.

System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length);
System.arraycopy(Object의 원본배열, int 원본배열에서 복사할 항목의 시작 인덱스, Object 의 매개값(새배열), int 새배열에서 붙여넣을 시작 인덱스, 복사할 개수)
ex) 원본배열이 arr1이고 새배열이 arr2일경우 arr1의 모든 항목을 arr2에 복사하려면
       System.arraycopy(arr1, 0 , arr2, 0 , arr1.length)

 

12.1 멀티 스레드 개념


프로세스= 프로그램

하나의 스레드는 하나의 코드 실행 흐름
멀티스레드는 여러 코드 실행 흐름
ex) 노래들으면서 가사보기 , 동영상 보면서 웹서핑 

extends Thread 를 사용하기

이번에는 extends Thread를 사용해서 해봅시다.

extends 는 상속이죠? 상속을 하는 것이기 때문에, 따로 오버라이딩을 꼭 해줘야 한다거나 하는건 아니지만, run() 을 오버라이딩 해줘야 저희가 원하는 대로 만들 수 있습니다.

 

/run 메소드를 가지고 있는 MyThread1,2 만들고

거기에 Thread 상속 받게하고

Main에 Thread t1 = new MyThread1 생성하고 

t1.start() 메소드를 실행 (start() 메소드는 Thread안에 있다)/

 p12thread.p03lecture;
Ex01

start()메소드는 Thread안에 있음 OtherThread가 Thread를 상속 받으니 사용가능

 

결과값

0~10000까지 실행 도중에 JVM이 알아서 run 메소드를 실행시켜서  알아서 실행시켜줌

컴퓨터 성능에 따라 결과값이 조금 다르지만 적절한순간에 같이 실행시켜줌

 

Ex02

질문 :그러면 쓰레드에 메소드를 여러개 만들고 하나만 실행시키고 싶을 떄에는
어떻게하나요?
(쓰레드가 하는일이 각각 다르다는 전제)

메인함수에서 Thread 생성할때 상속받는클래스로보단 그냥 'Thread' 이름으로 생성시키나요?
  :상관없음  MyThread1,2 는 Thread니깐

 

Ex03

InterruptedException을 가지고 있어서 throws 해주거나 try/catch문 이용 처리

출력값 나올때 잠깐잠깐식 멈추어서 출력됨 (바로출력안되구)

 

Ex03

 

Ex04 

Ex03을 동시에 실행하고 싶어욘

결과값

숫자 나오면서 소리도 동시에 나옴

class NumberThread, BeepThread 를 만들고 Thread를 상속받게합니다 (실행시키려고 하는 것의 관련)

NumberThread, BeepThread 클래스안에 run메소드를 만듭니다  (  각각 실행 시켜야 하므로)

run 메소드 안에 내가 실행시키고 싶은 것들을 작성합니다.

ex) 1~100까지 출력   ,  여기서는 시간 간격당 소리가 나게

그다음 main 메소드 에서 

Thread t1 = new Thread(NumberThread);

Thread t2 = new Thread(BeepThread);

를 생성하고 

start() 메소드로 실행키셔줍니다

(start() 만들지 않았는데 어떻게 사용 할 수 가 있죠? 그것은 Thread 안에 start()메소드가 존재하는데 NumberThread와 BeepThread가 Thread를 상속 받기 때문에 start()메소드를 사용 할수 있습니다.)

Thread.currentThread() -> 현재 쓰레드를 가져옵니다.

Thread.sleep(value) -> 밀리초 단위로 정지합니다

 

implements Runnable 을 사용하기

interface 인 Runnable 을 사용하는 것이기 때문에, 오버라이딩을 꼭 해주어야 합니다.

implements Runnable 을 사용한 경우에는 클래스를 객체화 하고, Thread 클래스도 만들어서, Runnable해준 클래스를 넣어주면 됩니다.

Runnable apI검색한후 보면 interface 받으면 메서드 재정의를 해야만 하죠

p02runnable

 

Ex01

출력할때 멈추면서 실행됨

 

Ex02

interface Runnable을 사용하기 떄문에 오버라이딩을 해줘야함

여기서는 run() 메소드를 오버라이딩(메소드재정의) 해야겠죠?

implements Runnable 을 사용한 경우에는 클래스를 객체화 하고, Thread 클래스도 만들어서, Runnable해준 클래스를 넣어주면 됩니다 쓰레드를 실행시킬 경우에는 start()를 써주면 됩니다.

무명 클래스 메소드 재정의

 

Ex03

이름없는 객체 사용해서 

 

Ex04
쓰레드 클래스 안에 또다른 쓰레드가 들어갈수도 잇나요??
메인 자체가 쓰레드라고 했으니까..?

무명클래스로 해봤음 너무 복잡하긴한데 배운거 활용
보통 class를 만들어서 함

걍 해석만..

 

 

Sinsynchronized

synchronized는 스레드가 사용중인 객체를 다른 스레드가 변경할 수 없도록 객체에 lock을 걸어 줍니다

1000번 더하는거랑 "프로그램 종료" 같이 실행되서 먼저 끝나는게 먼저 나옴

내가 value값 계산이 끝나고 "프로그램 종료" 가 나올 수 있게..하고싶으면?

t.join // t thread가 끝나길 기다림

t.join() 메소드 사용하고싶은데 InterruptedException 이 나서 try/catch로 잡아준다

try/ catch로 잡Exception 잡은상태

이상황이 나오는데 출력 값을 확인하기위해

System.out.println(value); 값을 옮겨줌

 

 

Ex02

 

Ex02

내가 원하는건 2000000만인데  약간 병목현상? 때문에 값이 이상하게 쓰임

// 1. value 읽기
// 2. value 증가
// 3. value 쓰기

 에서 읽기로 쓰는건 괜찮은데 쓰기에서 문제가 생김


읽기,증가가 되는데 다른 쓰레드에서 읽기,증가,쓰기가 실행 되면서
읽는데 문제가 생겨버림?

 

 

어떤 쓰레드가 동시에 접근하게 된다면
여러 쓰레드 들중 (o)를 획득한 쓰레드만 실행할 수 있다.

이블럭이 실행한 다음에 JVM에 반납한다
반납 됬으면 다른 쓰레드가 잡을 수 있는 기회가 생김
다른 쓰레드가 기회를 잡으면 그 쓰레드에서 실행하고 반납
이걸 반복하는 것

우리가 스레드 오기전에  방식

메인 스레드 하나 놓고 사용했으나

이 위의 문제들은

start 하나씩 마다 스레드가 생가서 작업을 하나씩 생겨서

나옴

공통된 객체를 읽는데는 문제가없는데 쓰기를 할때 문제가 생긴다.

'Java 공부 > 자바 공부 (baek)' 카테고리의 다른 글

2021-09-15 15장 컬렉션 프레임워크01  (0) 2021.09.15
2021-09-15 p.654제네릭 맛만보기  (0) 2021.09.15
2021-09-13_01  (0) 2021.09.13
2021-09-13  (0) 2021.09.13
2021-09-10  (0) 2021.09.10