+) <T>는 아무 영어 대문자(A,B,C..) 써도 됨. but 일반적으로 T를 많이 씀.
ex> string, integer 등
사용하는 애가 타입을 결정해.
ex) 항아리 팔 때, 사는 너가 안에 넣을 거 결정해
static을 object로 할 수 밖에 없다.(new할 때 만들어져서?)
package ex13.example1;
classBox<T> {
T data;
}
public classGenericEx01 {
public staticvoidmain(String[] args) {
Box<String> box1 = newBox();
Box<Integer> box2 = newBox();
box1.data = "1";
box2.data = 1;
}
}
<> 안에는 기초형은 올 수 없다. 참조형만 올 수 있다._wrapping 처럼
그래서 int형을 넣고 싶으면 integer로 적음.[object 참조 변수로 받아 다양한 데이터 담음_책]
~이 부분-v
package ex13.example2;
classBox {
staticObject data;
}
public classGenericEx02 {
public staticvoidmain(String[] args) {
Box.data = 1;
Box.data = "문자";
}
}
여기서 static object data?를 꼭 해야하는 이유?
package ex13.example3;
//이렇게 내가 혼자 코드 짤 때는 아래처럼 추상화를 사용해서 하면 훨씬 편함
abstract classAnimal {
public abstract voidspeak();
}
classDogextendsAnimal {
public String name;
public int age;
public voidspeak() {
System.out.println("멍멍");
}
}
classCatextendsAnimal {
public String name;
public int age;
public voidspeak() {
System.out.println("야옹");
}
}
public classGenericEx03 {
public staticvoidmain(String[] args) {
Animal[] arr = newAnimal[2];
arr[0] = newDog();
arr[1] = newCat();
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 중요
new → 제네릭하면 되지만,
어쩔 수 없을 때만 object
풀링기술
object 타입만 쓸 수 있음
미리 튜브를 띄어 놓으면 됨. 그렇지만 이 경우 object로 꺼내는 거니까 꺼내고 다운캐스팅해야 함.
ex) 수영장 튜브 알바
메모리가 10mb라고 치고,
튜브1개당 1mb라고 치면 10개까지 가능(더하면 용량 모지람)
여기서 튜브를 만드는 게 new하는 것이라고 생각하면
꼬마 1명 오면 1개 튜브 불어서 줌. 다른 한 명 오면 또 불어서 줌. 그 2명이 가면 튜브 바람 뺀다.
그리고 다른 꼬마 2명 오면 다시 튜브 2개 불어줘야 함. 이것은 너무 비효율적..
이런 경우 수영장 개장 전 튜브를 10개 미리 띄어놓으면 됨.(static으로)
(+ 그리고 튜브를 (개장 전)미리 띄어놓아야 해서 <T>제네릭 안 됨.)
package ex13.example4;
//static, instance(객체)로 만든 거?classModel {
private staticModel instance = newModel();
public staticModelgetInstance() {
return instance;
}
private Model() {
}
private Object data;
public voidsetData(Object data) {
this.data = data;
}
public ObjectgetData() {
return data;
}
}
classUser {
public int id = 1;
public String name = "홍길동";
public String email = "ssar@nate.com";
public voidhello() {
System.out.println("안녕하세요");
}
}
public classGenericEx04 {
public staticvoidmain(String[] args) {
Model m = Model.getInstance();
User u = newUser();
m.setData(u);
// Q)큰 걸(오브젝트)를 작은 거에 넣으려고 하니까 다운형변환?해줘야 함.?-vUser ob = (User) m.getData();
ob.hello();
}
}
package ex13.example5;
//T로 쓰고classModel<T> {
private T data;
public voidsetData(T data) {
this.data = data;
}
public T getData() {
return data;
}
}
// 위의 뜻이 MODEL이 DATA는 못 바꾸고 접근을 못하는데.. 바꾸고/ 출력하는 건 돼..-V
(data 틀(id, name, email...)만 있고 내용 수정 가능해)-V
(아니야.. 아마
Model이란 클래스 박스에 모든 종류의 data를 받을 수 있어라는 뜻.~책에는 )
classUser {
public int id = 1;
public String name = "홍길동";
public String email = "ssar@nate.com";
public voidhello() {
System.out.println("안녕하세요");
}
}
public classGenericEx05 {
public staticvoidmain(String[] args) {
Model<User> m = newModel();
m.setData(newUser());
User u = m.getData();
u.hello();
}
}
Q) 모델에 유저타입(객체)을 넣었어..? 그리고 __ 이건 무슨 말이야....
실행할 때 하드 디스크 정보를 ram에 (load, output, 할당하다.(alocate?))
창 띄울 때 바로 안되는 거 로딩-v
로딩-하드디스크 정보를 ram에 올리는 거
메모리 모자랄 때?..-v
끌어 썼는데 딱 맞아(ram용량에 예를 들어 16gb) 그러면 더 필요하면, swap(지금 안 쓰는 거랑 쓰는 거. 다 쓰면 뻗음.⇒ 이걸 방지 , 가상메모리_하드디스크에~느림) 운영체제가 알아서 해?-v
Ram에 데이터 넣는 게 cpu에 나음.-v
운영체제, window가 맵 테이블 가지고 잇음?
[변수, 번지]
[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개)
타임슬라이싱(tim slicing / rr : 시간 분할-v~ 전후 문맥을 알아야 함. ex~ 책 2권 1분씩 읽기 다음에 1에 왔을 때 50pg부터 다시 시작, 그리고 읽고 나서 80pg까지 읽었다 기록이 되있어야 함.)
so 멀티 스레드 한 명이 왔다 갔다 하니까 느림.(ex> 세수)
~그래서 문맥 이해 해야 함.
왔다 갔다 보다 쭉 다 읽고 넘어가는 게 문맥 기록 할 필요 없어서 더 빠름
⇒ 컨텍스트 스위칭이 되서 느림? for 동시에 시행하는 것처럼 속임-v
24frame = 영상처럼 보임.
멀티 스래드(cpu 분신)
cpu는 스래드를 무한대로 만들 수 있음.
운영체제(네이티브 콜 = 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)
메인스레드 > 서브스레드
3때는 파일 기록하고 와/ 그 멍 때리는 시간에 왔다갔다 함.
나이테(SECTOR)~ 중요X
(cpu의 시간을 분할한 것. 예를 들어 1초씩 왔다갔다 함. _메인과 서브스레드를)
main 실행 - cpu가 일을 할 때(스래드) 함.
1나 밖에 실행 못하는데 화면 2개 띄어넣음 ⇒_ 스레드가 돌고 있기에
동시에 시행되는 것처럼 보임.(스레드 덕)
[cpu가 1개니까 일을 하나밖에 못함. 지금 화면에 창이 3개가 띄어져 있는데 동시에 3가지 일을 하는 것은 아니다. 왜? cpu가 하나니까. 왜 3개처럼 보이느냐? 사람이 눈이 인식할 수 있는 게 1초라면.. 1초보다 훨씬 빠르게(예를 들어 0.1초) 3가지를 왔다갔다 해서 우리 눈에는 동시에 하는 것처럼 보인다. 하지만 실제는 일을 하나씩 하고 있는 것이다.]
동기식?
-데이터(db) 관점) 데이터 2개가 동기화(동일성-v), 양쪽의 컴퓨터에 데이터가 같다. 데이터의 일관성,