제네릭, 풀링,스레드

이소연's avatar
Aug 05, 2024
제네릭, 풀링,스레드

FileReader

jre가 가지고 있는 라이브러리
notion image

제네릭 프로그래밍(Generic Programming)

: new할 때 타입 결정 못할 때 쓰는 것.(new 할 때 타입 결정)
-다양한 종류 데이터 두루두루 처리할 수 있는 클래스,메소드를 작성하는 기법.
 
💡
문법) class Box <T> { ... } - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - main(Box<String> box1 = new Box(); Box<Integer> box2 = new Box(); )~이런 식으로 (new할 때)타입을 결정할 수 있다.
여기서 왜
+) <T>는 아무 영어 대문자(A,B,C..) 써도 됨. but 일반적으로 T를 많이 씀.
 
ex> string, integer 등
사용하는 애가 타입을 결정해.
ex) 항아리 팔 때, 사는 너가 안에 넣을 거 결정해
static을 object로 할 수 밖에 없다.(new할 때 만들어져서?)
 
package ex13.example1; class Box<T> { T data; } public class GenericEx01 { public static void main(String[] args) { Box<String> box1 = new Box(); Box<Integer> box2 = new Box(); box1.data = "1"; box2.data = 1; } } <> 안에는 기초형은 올 수 없다. 참조형만 올 수 있다._wrapping 처럼 그래서 int형을 넣고 싶으면 integer로 적음.[object 참조 변수로 받아 다양한 데이터 담음_책] ~이 부분-v
 
package ex13.example2; class Box { static Object data; } public class GenericEx02 { public static void main(String[] args) { Box.data = 1; Box.data = "문자"; } } 여기서 static object data?를 꼭 해야하는 이유?
package ex13.example3; //이렇게 내가 혼자 코드 짤 때는 아래처럼 추상화를 사용해서 하면 훨씬 편함 abstract class Animal { public abstract void speak(); } class Dog extends Animal { public String name; public int age; public void speak() { System.out.println("멍멍"); } } class Cat extends Animal { public String name; public int age; public void speak() { System.out.println("야옹"); } } public class GenericEx03 { public static void main(String[] args) { Animal[] arr = new Animal[2]; arr[0] = new Dog(); arr[1] = new Cat(); Animal d1 = (Dog) arr[0]; // [-> Object, Dog] Animal c1 = (Cat) arr[1]; // [-> Object, Cat] d1.speak(); c1.speak(); } } Q) 제네릭으로 speak()를 씀, object(like 아담_태초의 인간, 모든 DNA를 가진 존재)에 speak가 없어서 x..? Q) int[]로 못 받고 object로 꼭 받아야하는 이유??_문법 (3인칭 S 같은..) 그래서 그냥 Integer로 받아야 함-v [메모리에] Q) arr[0] -> [object] [Dog ] 메모리에 object랑 dog랑 2개 떴는데 object를 가르킴-v? Q) 오브젝트는 메서드 호출이 안돼 => 오브젝트는 메서드 없어, 껍데기만 있어, // 야옹,멍멍 아직 없어. Q) static object는 한 번만 결정돼서 사용함. (프로그램 시작 전부터 main 끝날 때까지 떠있어. 그래서 여러번 띄울 필요가 없어) 이런 예가 있음...-v
 
object사용하면 사용할 때 다운캐스팅해야함.(ex> 부모나이 → 자식 나이에 맞추는 거)
내가 다 하면 추상화해서 타입 일치시키는 게 나음-v
 
혼자서 할 때는 상속으로 하면되는데
어쩔 수 없을 때 object로 묶음. (상속 대신)
 
new할 수 있으면 <T> object보다(코드 짜기 힘드니까_runtime때 터질 수 있으니까)-v
 
 
요청일 일어날 때 객체가 만들어진다-v 중요
notion image
new → 제네릭하면 되지만,
어쩔 수 없을 때만 object
 
 

풀링기술

object 타입만 쓸 수 있음
미리 튜브를 띄어 놓으면 됨. 그렇지만 이 경우 object로 꺼내는 거니까 꺼내고 다운캐스팅해야 함.
미리 튜브를 띄어 놓으면 됨. 그렇지만 이 경우 object로 꺼내는 거니까 꺼내고 다운캐스팅해야 함.
ex) 수영장 튜브 알바
메모리가 10mb라고 치고,
튜브1개당 1mb라고 치면 10개까지 가능(더하면 용량 모지람)
여기서 튜브를 만드는 게 new하는 것이라고 생각하면
꼬마 1명 오면 1개 튜브 불어서 줌. 다른 한 명 오면 또 불어서 줌. 그 2명이 가면 튜브 바람 뺀다.
그리고 다른 꼬마 2명 오면 다시 튜브 2개 불어줘야 함. 이것은 너무 비효율적..
이런 경우 수영장 개장 전 튜브를 10개 미리 띄어놓으면 됨.(static으로)
(+ 그리고 튜브를 (개장 전)미리 띄어놓아야 해서 <T>제네릭 안 됨.)
 
package ex13.example4; //static, instance(객체)로 만든 거? class Model { private static Model instance = new Model(); public static Model getInstance() { return instance; } private Model() { } private Object data; public void setData(Object data) { this.data = data; } public Object getData() { return data; } } class User { public int id = 1; public String name = "홍길동"; public String email = "ssar@nate.com"; public void hello() { System.out.println("안녕하세요"); } } public class GenericEx04 { public static void main(String[] args) { Model m = Model.getInstance(); User u = new User(); m.setData(u); // Q)큰 걸(오브젝트)를 작은 거에 넣으려고 하니까 다운형변환?해줘야 함.?-v User ob = (User) m.getData(); ob.hello(); } }
 
package ex13.example5; //T로 쓰고 class Model<T> { private T data; public void setData(T data) { this.data = data; } public T getData() { return data; } } // 위의 뜻이 MODEL이 DATA는 못 바꾸고 접근을 못하는데.. 바꾸고/ 출력하는 건 돼..-V (data 틀(id, name, email...)만 있고 내용 수정 가능해)-V (아니야.. 아마 Model이란 클래스 박스에 모든 종류의 data를 받을 수 있어라는 뜻.~책에는 ) class User { public int id = 1; public String name = "홍길동"; public String email = "ssar@nate.com"; public void hello() { System.out.println("안녕하세요"); } } public class GenericEx05 { public static void main(String[] args) { Model<User> m = new Model(); m.setData(new User()); User u = m.getData(); u.hello(); } } Q) 모델에 유저타입(객체)을 넣었어..? 그리고 __ 이건 무슨 말이야....
Q) 객체로 받는거랑 제네릭으로 받는 거 차이?
객체 -동적바인딩(ex> 태초인간 speak( ) 없음)이 안되고 다운 캐스팅을 해야함.-v
제네릭-형식이 new 할 때(=객체생성) 결정 .
 
Q) ( )→ { } : 람다식-V
인터페이스를 new 못하니까
그걸 대체해주기 위해 중간에 받아서 구현해주는 것
package ex07.example; //라이브러리 판매 interface EventListener{ void action(); }//이거는 인터페이스니까 new x, 틀만 갖고 올게()-> {} : 이게 람다식 //라이브러리 판매자가 생성 class MyApp{ public void click(EventListener l){ l.action(); } } //개발자인 내가 구현 public class InterEx02 { public static void main(String[] args) { MyApp app = new MyApp(); app.click(() { System.out.println("회원가입 로직이 실행됩니다"); }); //그럼 구현체를 만들지 않아도 됨.new 할 필요 없다. new 안됨. } }
—컴퓨터 기본 - - -
16장
notion image
notion image
큐를 꺼내는 역할(pop) : 스레드
main 스레드가 다섯 줄이면
다섯 개 브랜치 같은 (하나의 실에 5가닥으로 나뉜 느낌?)
 
cpu : 프로세서
notion image
 
Ram과 hdd는 기억하는 방식이 다름
  1. ram : 메모리(보통 16gb)(그림 빌딩에 전류 다 흐름)
notion image
1칸 - 1byte
1칸 - 1byte
 
전류로 데이터 저장.
랜덤 엑세스 가능—v
게임할 때 모든 데이터를 올리지 않고
게임할 때 부분적으로 할당
 
notion image
  1. 하드디스크(hdd) : 메모리 영구히 기록,(=커밋(commit)= write = input)
느림
notion image
원래는 풀 스캔함. 그런데 인덱스가 있으면 풀스캔 안 해도 됨.
 
현재 사용x 프로그램 같은 것들이 들어있음
게임 그래서 켜면 오래걸림(메모리가 크니까 들고오는데 오래걸림)
액츄레이터(핀)~ 물리적임. 판에 상처를 내어 기록.
원판이 돌면 핀이 수평적으로 자료들을 읽음
ex) 한 바퀴 돌면 수평(한 칸 빠지고)이동 → 이렇게 전체를 읽음
마지막 핀의 위치, 회전 시간에 따라 다름
notion image
하드디스크도 테이블이 있어 나이테 찾을 때 빨리 찾을 수 있다.
시크(seek_ 핀 다 도는 시간. 회전 시간, 위치, 그리고 다른 시간들 합쳐서 다 도는 시간)
notion image
회전율, 시크+액츄(핀 도는 시간)⇒ 총 시간 나옴
 
한 번에 수평 이동 여러 개 갈 수 있는데 그 경우 인덱스가 필요..-v
(나이테 정보만 있으면 수평 이동 한 번에 가능)
ex) 사과 찾을 때 10번 나이테에 있음. 바로 찾음
cpu가 ram 테이블로 감. 나이테 10~15번이야 > cpu가 읽고 ram에 명령(hdd 읽어와)
하드 디스크에 프로그램 저장
 
순서) 하드 > ram> cpu 감
실행할 때 하드 디스크 정보를 ram에 (load, output, 할당하다.(alocate?))
창 띄울 때 바로 안되는 거 로딩-v
로딩-하드디스크 정보를 ram에 올리는 거
메모리 모자랄 때?..-v
끌어 썼는데 딱 맞아(ram용량에 예를 들어 16gb) 그러면 더 필요하면, swap(지금 안 쓰는 거랑 쓰는 거. 다 쓰면 뻗음.⇒ 이걸 방지 , 가상메모리_하드디스크에~느림) 운영체제가 알아서 해?-v
 
Ram에 데이터 넣는 게 cpu에 나음.-v
 
운영체제, window가 맵 테이블 가지고 잇음?
notion image
[변수, 번지]
[a,0]
[num,4]
⇒ a를 찾을 때 0번지 바로 찾음. num은 4번지로 다이렉트 엑세스
인덱스 번호로 다이렉트 엑세스(랜덤엑세스)
 
0번지부터 끝까지 풀스캔
 
데이터를 트랜지스터로 기록(전기로 기록)-v
 
프로세스: 하드디스크에서 ram으로 올린 거?(메모리에 뜨는 것)
이걸 관리하는 애 : cpu ⇒ 프로세서
 
cpu 1개⇒ 일하는 거 1개
cpu가 main 스레드(한 개씩 꺼내서 cpu가 처리)
스레드는 분신(일하는 애로 cpu 분신.),
 
자바실행
cpu(main 스레드 )프로세스가 되는 순간 cpu가 스레드-v
 
메인스레드(그림 벤츠, 6개, 4개때 서브 만듬)서브스레드(2개)
notion image
타임슬라이싱(tim slicing / rr : 시간 분할-v~ 전후 문맥을 알아야 함. ex~ 책 2권 1분씩 읽기 다음에 1에 왔을 때 50pg부터 다시 시작, 그리고 읽고 나서 80pg까지 읽었다 기록이 되있어야 함.)
so 멀티 스레드 한 명이 왔다 갔다 하니까 느림.(ex> 세수)
~그래서 문맥 이해 해야 함.
왔다 갔다 보다 쭉 다 읽고 넘어가는 게 문맥 기록 할 필요 없어서 더 빠름
⇒ 컨텍스트 스위칭이 되서 느림? for 동시에 시행하는 것처럼 속임-v
24frame = 영상처럼 보임.
 
멀티 스래드(cpu 분신)
cpu는 스래드를 무한대로 만들 수 있음.
notion image
 
운영체제(네이티브 콜 = system call)가 스래드 크기 정해줌?그걸
자바가 스래드 임대(네이티브한 걸 콜해서 가져온다= system call)
 
네이티브 코드 : 운영체제를 통해 바로 하드웨어에 사용하는 것.
 
스레드 쓰면 컴터 속도 빨라지지 x
여러 가지 실행 = 동시에 실행되는 거 처럼 보임 ux (유저의 경험이 좋아짐.)
 
process : hdd에 기록된 프로그램이 램으로 로드된 것.
모든 프로세스 관리 = cpu
precesser : 하나의 스레드를 가지고 있다.(모든 언어가)-v
 
프로세스가 hdd에 저장 : 속도가 엄청 느림. 그래서 hdd에 저장 안 하는 게 나음.-v
IO(INPUT/OUTPUT)가 가장 오래 걸림.
~IO를 줄이는 게 속도와 연관 많다.-V
실제 일하는 거 : RAM이랑 HDD / CPU는 연산만
WAIT 시간~?
스타벅스 손님 3. 손님이 20잔 시킴
1~(처리)
2~
3 IO
4~
5~
 
SO I/O시간을 마지막에 하면 좋음(실 하나 더 만들어 스레드가 처리하게)
 
SO (12,4,5, / 3)
notion image
 
메인스레드 > 서브스레드
3때는 파일 기록하고 와/ 그 멍 때리는 시간에 왔다갔다 함.
나이테(SECTOR)~ 중요X
(cpu의 시간을 분할한 것. 예를 들어 1초씩 왔다갔다 함. _메인과 서브스레드를)
 
main 실행 - cpu가 일을 할 때(스래드) 함.
1나 밖에 실행 못하는데 화면 2개 띄어넣음 ⇒_ 스레드가 돌고 있기에
동시에 시행되는 것처럼 보임.(스레드 덕)
[cpu가 1개니까 일을 하나밖에 못함. 지금 화면에 창이 3개가 띄어져 있는데 동시에 3가지 일을 하는 것은 아니다. 왜? cpu가 하나니까. 왜 3개처럼 보이느냐? 사람이 눈이 인식할 수 있는 게 1초라면.. 1초보다 훨씬 빠르게(예를 들어 0.1초) 3가지를 왔다갔다 해서 우리 눈에는 동시에 하는 것처럼 보인다. 하지만 실제는 일을 하나씩 하고 있는 것이다.]
 
동기식?
-데이터(db) 관점) 데이터 2개가 동기화(동일성-v), 양쪽의 컴퓨터에 데이터가 같다. 데이터의 일관성,
ex) 카카오톡 주소가 다름~
-프로그래밍) 일의 순서가 있음,
ex) 타스크(task) : 임무 다 하고 주문 받음
동기적 : 임무 다 하고 주문 받음 / 임무 할 때 손님은 계속 기다려야 함. ?
 
비동기적 : 일의 순서x(하나의 일을 다 안하고 다른 일 함)~보통 알고리즘이 들어옴
 
라운드로빈?_ 하나씩 줌.. (전부 1나씩 줌.) 많이 주문하는 사람이 좀 늦지만.
notion image
notion image
먼저 들어온 거 먼저 끝 fifo(first in first out)
작은 거 먼저 하는 거_셀랙트?,,,
~~~~~
~ 한 사람을 보지 않고 waiting을 봄(운영체제가 하는 거?)
 
비동기적_CPU가 멍을 덜 때림 , ⇒ thread 일의 순서 없이. 동시에 뻗어나감.
ex) start1, 2 동시에 실행
 
cpu가 풀 파워면 아무도 인터럽트 할 수 없음. 이벤트가 생길 수 없음
(선풍기가 돌면 못 지나감. 1초(멍)라도 쉬면 지나갈 수 있음 그게 sleep-v)
contect switching 왔다갔다 할려면, 슬립을 걸어줘야 함.
조건 : 잠깐 멈추는 시간 필요(왔다갔다하는 시간-v)
 
여기서 타겟 ⇒ 메서드, 다하고 끝⇒스레드 끝?,,
 
대부분-able : interface
람다식. runnable
 
실행 줄 - 스래드
ctrl + space : 람다 ( )→{ }
 
new만 뜬 거는 실만 있는거 그럼 바로 꺼짐. 길이가 없음
실의 길이 runnable 타겟
start는 native 운영체제가. 콜백..(운영체제가 뭐를 했는데 run을 때림)
 
메인 스레드는 run만 함..(runable interface)
실을 메인 스레드가 만듦
메인 스레드는 밑에 때리고 끝남?
자바는 스레드가 하나라도 살아있으면 안 꺼짐.-v
 
notion image
notion image
컨택팅 스위치(출력 11/22/33/44/55)
동시작동?아니 빠르게 왔다 갔다 하는 거
notion image
멍 때리는 시간 줄이는 거 threadex02
package ex13.example2; class Box { static Object data; } public class GenericEx02 { public static void main(String[] args) { Box.data = 1; Box.data = "문자"; } }
io는 cpu가 직접 처리하는 게 아니라 시키는 거지.
io hdd에서 하니까 오래 걸려
I/O가 빨리 끝나는 거 하고 하는게 조아
 
비동기.동기
 
핵심) 멍 때리지 말고 일해라. 스레드를 통해. 일은 어차피 1명(CPU)이 함
 
cpu 여러 개 = 멀티 코어 // Context 스위칭 없이 동시에 시행 가능.
 
피파
예를 들어 4코어가 대중이라 그렇게 짜면. 2코어에서는 안돌아감.(그걸 해결하기 위해 스레드를 씀. 2개씩 뽑아서 씀 )
멀티.. 한 개.. 그거 차이…
타겟.. 실의 길이(=메인 메서드 내부의 길이)
실 100개면 무조건 좋아? 노 동작 안할 수 있음-v(즉, 스레드가 너무 많아도 좋지 않다…)
package ex13.example1; class Box<T> { T data; } public class GenericEx01 { public static void main(String[] args) { Box<String> box1 = new Box();// 스레드 Box<Integer> box2 = new Box(); box1.data = "1"; box2.data = 1; } }
이거는 뭐야?..
 
notion image
notion image
 
Share article

Coding's note