@markdown
# String Class
## String vs StringBuffer vs StringBuilder 문자 연결 비교
____
<pre><code class="java" style="font-size:14px">public class StringClassTest {
public static void main(String[] args) {
System.out.println("String 주소");
String str = "a";
System.out.println(System.identityHashCode(str));
str += "b";
System.out.println(System.identityHashCode(str));
System.out.println("StringBuffer 주소");
StringBuffer sb = new StringBuffer();
sb.append("a");
System.out.println(System.identityHashCode(sb));
sb.append("b");
System.out.println(System.identityHashCode(sb));
System.out.println("StringBuilder 주소");
StringBuilder sb1 = new StringBuilder();
sb1.append("a");
System.out.println(System.identityHashCode(sb1));
sb1.append("b");
System.out.println(System.identityHashCode(sb1));
}
}
</code></pre>
<pre><code class="java" style="font-size:14px">실행결과
String 주소
2018699554
1311053135
StringBuffer 주소
118352462
118352462
StringBuilder 주소
1550089733
1550089733
</code></pre>
- String은 다시 만들기 때문에 주소가 바뀌고, StringBuilder, StringBuffer는 같은 주소를 계속 참조하며 String을 연결해간다.
# Java.util.Arrays Class
____
## Arrays.toString()
- Arrays.toString()을 사용하여 배열을 간단하게 콘솔창에 출력할 수 있다.
<pre><code class="java" style="font-size:14px">String[] arr = { "바나나", "사과", "귤", "복숭아", "수박" };
System.out.println(Arrays.toString(arr));
</code></pre>
<pre><code class="java" style="font-size:14px">실행결과
[바나나, 사과, 귤, 복숭아, 수박]
</code></pre>
## Arrays.sort()
____
- 기본 타입 배열에 대해서는 `Arrays.sort()`를 사용해 정렬할 수 있다.
<pre><code class="java" style="font-size:14px">String[] arr = { "바나나", "사과", "귤", "복숭아", "수박"
String[] arr1 = { "바나나", "사과", "귤", "복숭아", "수박" };
System.out.println(Arrays.equals(arr, arr1));
System.out.println("sort 전 "+Arrays.toString(arr));
Arrays.sort(arr);
System.out.println("sort 후 "+Arrays.toString(arr));
</code></pre>
<pre><code class="java" style="font-size:14px">실행결과
sort 전 [바나나, 사과, 귤, 복숭아, 수박]
sort 후 [귤, 바나나, 복숭아, 사과, 수박]
</code></pre>
## compareTo()
____
- 기본 타입의 경우 `compareTo()`을 사용하여 비교 가능
- 사용자 정의 class에 대해서는 `Comparable<UserClass>`를 `implements`하여 정렬할 수 있다.
<pre><code class="java" style="font-size:14px">Integer i = 100;
Integer j = 200;
System.out.println(i.compareTo(j));
</code></pre>
- `compareTo` 실행결과 앞이 작고 뒤가 크면 음수(-1) - 오름차순
- 같으면 0
- 뒤가 크면 양수(+1)
<pre><code class="java" style="font-size:14px">class Car implements Comparable<Car>{
String model;
int price;
Car(String model, int price){
this.model = model;
this.price = price;
}
@Override
public String toString() {
return "Car [model=" + model + ", price=" + price + "]";
}
@Override
public int compareTo(Car o) {
//return model.compareTo(o.model);
return price - o.price; //오름차순
//return o.price - price; //내림차순
}
}
</code></pre>
<pre><code class="java" style="font-size:14px">Car[] car = { new Car("제네시스", 7000), new Car("BMW", 5000), new Car("소나타", 2000) };
System.out.println("sort 전 \n"+Arrays.toString(car));
Arrays.sort(car);
System.out.println("sort 후 \n"+Arrays.toString(car));
</code></pre>
<pre><code class="java" style="font-size:14px">sort 전
[Car [model=제네시스, price=7000], Car [model=BMW, price=5000], Car [model=소나타, price=2000]]
sort 후
[Car [model=소나타, price=2000], Car [model=BMW, price=5000], Car [model=제네시스, price=7000]]
</code></pre>
- 위 실행결과 처럼 `String` 또는 `int`로 내림차순, 오름차순으로 정의하여 `object`를 정렬할 수 있다.
# Java Thread
____
## Process vs Thread
- process : 실행중인 프로그램
- thread : 프로그램의 실행흐름
## Thread 생성 방법
____
- Thread 클래스를 상속 받아 run()를 구현해 사용한다.
- thraed.start() : thread가 시작되는 함수
- Thread.start()에 의해 run()가 자동으로 호출되어 실행된다.
- run()을 직접 호출하는것은 thread가 아니다.
- main() 보다 먼저 thread.start()를 해야 main thread와 동시에 동작한다.
이후에 실행하면 main thread 수행 끝나고 나서 사용자 정의 thread가 실행됨
<pre><code class="java" style="font-size:14px">1. Thread 상속
class MyThread extends Thread{
@Override
public void run() {
super.run();
}
}
</code></pre>
- Runnable interface를 구현하여 사용한다.
<pre><code class="java" style="font-size:14px">2. Runnable interface 구현
class RunnableThread implements Runnable{
@Override
public void run() {
}
}
</code></pre>
## Thread 공유 데이터
____
- Thread로 공유데이터 접근 시 문제가 발생한다.
- 이때 `synchronized`를 사용하여 `Lock`을 걸어 Thread간 동기화를 시킨다.
<pre><code class="java" style="font-size:14px">public synchronized void method(String name){
...
}
</code></pre>
## Critical Section의 동기화
____
- 접근할 구역을 지정해 한 쓰레드만이 접근할 수 있도록 한다.
- `synchronized { ... }`으로 사용
<pre><code class="java" style="font-size:14px">한쪽은 다른 한쪽이 끝날때까지 lock 걸고 기다리고 있다.
synchronized(mutex) {
...
mutex.wait();
...
}
</code></pre>
<pre><code class="java" style="font-size:14px">
다른 한쪽은 동작이 끝나면 다른 Thread를 깨운다.
synchronized(mutex) {
...
mutex.notify();
...
}
</code></pre>
'Java' 카테고리의 다른 글
Java - JDBC 사용 및 DB 연결 (0) | 2017.05.20 |
---|---|
Java 문법 - Generic, Collection, IO (0) | 2017.05.10 |
Java 문법 - hashCode(), 객체 복제 (0) | 2017.05.02 |
Java 문법 - Inner 클래스, 예외처리 (0) | 2017.05.01 |
Java 문법 - 추상클래스, 인터페이스 (1) | 2017.04.28 |