본문 바로가기

Java

Java 문법 - String, Arrays, Thread

@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>