본문 바로가기

[2016 - 2019] 학부 정리/Java

18.01.11 자바 - 필기02 미완성

(오후) 

1. 디버깅연습

-----------------------------------------------------------------------------------------------------------------------------------------------------

디버그 모양 누르고, 더블 클릭한 후에 F8번 누르기

F5,6,7이거 누르면서 잘 안함

브레이크포인트 지점 다 지우고 자바모드로 돌아가기 ...졸려................=.=

-----------------------------------------------------------------------------------------------------------------------------------------------------

2. 스레드 <개념과 만드는 방법, 트랜잭션 처리방법>

: 멀티스레드 2권 12장

다중의 흐름, 여러개의 프로세스(같은 프로그램), 멀티태스킹과 다름(아예 프로그램이 다른것)

cpu의 시간을 나눠쓰는것 - timesharing(시분할) 빨라서 동시에 사용하는것 처럼 느낌

-----------------------------------------------------------------------------------------------------------------------------------------------------

싱글스레드>>

package thread;


public class ThreadTest1 {

public static void main(String[] args) {

run();

// 일반적인 싱글스레드

for (int i = 1; i < 5; i++) {

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

e.printStackTrace();

}

System.out.println("main : " + i);

}

System.out.println("main 종료");

}


private static void run() {

for (int i = 1; i < 5; i++) {

try {

Thread.sleep(1000); //예외처리 필요

} catch (InterruptedException e) {

e.printStackTrace();

}

System.out.println("run : " + i);

}

System.out.println("run 종료");

}

}


멀티스레드>>

package thread;


public class ThreadTest1 extends Thread {

public static void main(String[] args) {

ThreadTest1 t = new ThreadTest1();

t.start();

//멀티스레드

for (int i = 1; i < 5; i++) {

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

e.printStackTrace();

}

System.out.println("main : " + i);

}

System.out.println("main 종료");

}


  //run메소드오버라이딩

public void run() {

for (int i = 1; i < 5; i++) {

try {

Thread.sleep(1000); // 예외처리 필요

} catch (InterruptedException e) {

e.printStackTrace();

}

System.out.println("run : " + i);

}

System.out.println("run 종료");

}

}

-> 이방법이 많이 안쓰임..
왜? 자바에 상속은 2개를 superclass로 가질수없음 무조건 부모가 1개여야 함, 다중상속 X
다중상속이 안좋다고 생각, 모호성이 생길 수 있음(ex. 양쪽으로 상속 받았을 때 어디꺼에서 상속받았는지 어려워서)c++은 :: 영역지정자를 만들어서 가능, java는 어느 os에서 사용이 가능해야 하기때문에 최대한 단순한 구조를 만들어버림, 꼬일수 있기때문에
문법상으로 지원 X, 그러나 좋은 기능이니까 interface로 지원함..

https://docs.oracle.com/javase/8/docs/api/ -> thread확인

ThreadTest1 -> main() 쭉수행~ -> .start()를 만나는 순간, main()은 그대로 수행시키면서 또 다른 수행을 하나 더 만든다.
stack영역이 하나 더 만들어짐, 메소드,힙은 공유

main()은 계속 하고 있고 start()는 run() 호출하기로 약속! -> Thread에 있는 run( )을 오버라이딩하기위함

**순서가 일정하지 않음


implements Runnable >> 무조건 run()구현, 추상메소드라서 //인터페이스

package thread;


public class ThreadTest2 implements Runnable {

public static void main(String[] args) {

ThreadTest2 t = new ThreadTest2();

Thread nt = new Thread(t); //업캐스팅, 상속을 안받고 구현됨

nt.start();

//멀티스레드

for (int i = 1; i < 5; i++) {

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

e.printStackTrace();

}

System.out.println("main : " + i);

}

System.out.println("main 종료");

}


//run메소드오버라이딩

public void run() {

for (int i = 1; i < 5; i++) {

try {

Thread.sleep(1000); // 예외처리 필요

} catch (InterruptedException e) {

e.printStackTrace();

}

System.out.println("run : " + i);

}

System.out.println("run 종료");

}

}


트랜잭션 처리 : 동기화함

-----------------------------------------------------------------------------------------------------------------------------------------------------

3. 기본 API클래스 필요한것만

String

문자열은 원본 조작을 하지 않음 replace할 경우 다시 저장을 해야만 한다.

== 과 .equals 차이

이유 : 문자열은 길이가 쉽게 변함..


메모리누수

package api;


public class ApiTest3 {

public static void main(String[] args) {

String str = "0123456789";

String words = "";

for (int i = 1; i < 100; i++) {

words += str;

}

System.out.println(words);

}

}


원본데이터를 바꾸면 안됨.. 복사해서 사용해야 함.. 원본데이터를 계속해서 바꿔야 하는것은 따로 클래스가 있음
편집가능 : StringBuffer , StringBuilder 2개

System.out.println(str.length() + " : " + str.capacity()); -> capacity : 용량
특정한 문자열 길이를 미리 만들어준다.
미리미리 확보함
package api;

public class ApiTest4 {
public static void main(String[] args) {

StringBuffer str = new StringBuffer();
print(str);
str.append("실수란 "); print(str);
str.append("신을 용서하는 "); print(str);
str.append("인간의 "); print(str);
str.append("행위이다"); print(str);
}

private static void print(StringBuffer str) {
System.out.print(str.length() + " : " + str.capacity());
System.out.println(str);
}
}
stringbuffer : 내부적으로 동기화를 해줌
stringbuilder : 혼자쓸때는 속도가 빠르지만 동기화를 안시켜주는 builder를 쓰자

-----------------------------------------------------------------------------------------------------------------------------------------------------


내일 ->api, jdbc

'[2016 - 2019] 학부 정리 > Java' 카테고리의 다른 글

18.01.12 자바 - 필기02 미완성  (0) 2018.01.12
18.01.12 자바 - 필기01 미완성  (0) 2018.01.12
18.01.11 자바 - 필기01 미완성  (0) 2018.01.11
18.01.10 자바 - 필기02  (0) 2018.01.10
18.01.10 자바 - 필기01  (0) 2018.01.10