하… 백엔드개발자로 커리어 전환을 목표로 한 이상 자바에 친숙해져야한다… 코틀린보다 참조할 코드도 많고 하니 일단 자바로 다시 바꾼다ㅠ_ㅠ

입력에는 Scanner 가 느려서 BufferedReader 사용

`public static void main(String[] args) throws IOEception
을 무조건 해야 BufferedReader 사용 가능하다고함.
readLine 및 StringTokenizer 를 사용. ```java
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
String str = br.readLine(); ``` ```java
	BufferedReader br = new BufferedReader(newInputStreamReader(System.in));
    int a = "";
    a = Integer.parseInt(br.readLine()); ``` 정수형 변환 필수 ```java

int [] targetArray = new int[100]; st = new StringTokenizer(sc.readLine(),” “); for(int i = 0 ; i < M ; i++){ targetArray[i] = Integer.parseInt(st.nextToken()); }


- 출력에도 System.out.println()은 느리다!
	대신 BufferedWriter를 쓰면 된다.
	이 함수 둘다 맨 끝에 close를 해야한다.
	*하지만 이 방법도 문제가 있다*
	따라서 kotlin처럼 *StringBuilder*를 쓰고
	마지막에 System.out.println(sb) 하는것이 좋다고한다.

### 자바 PS 다이아 분의 조언
- Comparable 인터페이스를 활용하는 방식을 익혀두는 것이 좋습니다.  
- switch 대신 hash 맵을 이용하여 최적화

자바 PS 하시는 분의 조언대로 Comparable과 Comparator를 공부했다. kotlin 때도 객체를 정렬하는데 어려움을 겪었는데 확실히 정리할 필요가 있다고 느낀다.
https://st-lab.tistory.com/243
이분의 글을 기반으로 공부했다.
### *정렬을 위해 객체들 간에 대소비교가 가능하도록 만드는 메소드*
	Comparable 
		- 자기자신과 매개변수 객체를 비교 (import 필요없음)
		- compareTo 메소드를 구현
		- -1, 0, 1(this. - o.) 로 표현 가능.
		- 대신 minus로 표현하면 오버플로우 가능성이 있으므로 그럴 경우 대소비교로 -1, 0, 1을 사용하면 됨.
	Comparator : 두 매개변수 객체를 비교 (import java.util )
		- Comparator interface를 구현하는 익명객체 생성 
		- 외부에서 익명 객체로 만들기 때문에 비교하고자 하는 클래스에서 구현할 필요가 없어진다.(Comparable과의 차이)
```java
// main 함수 안에서 구현할 때
		Comparator<Student> comp1 = new Comparator<Student>() {
			@Override
			public int compare(Student o1, Student o2) {
				return o1.classNumber - o2.classNumber;
			}
		};
	// main 함수 밖에서 구현할 때
	public static Comparator<Student> comp2 = new Comparator<Student>() {
		@Override
		public int compare(Student o1, Student o2) {
			return o1.classNumber - o2.classNumber;
		}
	};

오름차순 정렬 : 선행 원소가 후행 원소보다 ‘작다’ 즉 compare 혹은 compareTo 의 리턴값이 음수면 두 원소의 위치를 바꾸지 않는다. 양수일 경우 선행 원소가 더 크다는 의미므로 원소 위치를 교환 한다.

Arrays.sort(arr, comp) // comparator 방식 Arrays.sort(arr) // comparable 방식 (arr 클래스 안에 메소드가 내장되어 comparator을 따로 넘겨주지 않아도 동작함.)

내림차순으로 정렬하려면 `return o2.value - o1.value; 이렇게 선행 원소와 후행원소의 위치만 바꿔주면 된다.

성적 내림차순 정렬 -> 학급 오름차순 정렬

static Comparator<Student> comp2 = new Comparator<Student>() {
		
		@Override
		public int compare(Student o1, Student o2) {
			
			// 만약 성적이 같다면 학급을 "오름차순"으로 정렬한다.
			if(o1.score == o2.score) {
				return o1.classNum - o2.classNum;
			}
			return o2.score - o1.score;	// 성적을 내림차순으로 정렬한다.
		}
	};

다행히 String 문자열 비교할 땐 자체적으로 String 클래스 내에 Comparable을 implenments하여 compareTo() 메소드를 구현하고 있으므로 사전순 정렬이 가능하다.

인스턴스 변수 vs 클래스 변수 vs 지역 변수

  • 클래스 변수 : 클래스 내 선언, static 키워드 (클래스가 메모리에 올라갈 때, 모든 인스턴스가 공통된 값을 공유)
  • 인스턴스 변수 : 클래스 내 선언, (인스턴스가 생성될 때 생성, 즉 인스턴스 별로 다른 값을 가질 수 있음.)
  • 지역 변수 : 내가 아는 그것.

Character vs String

char는 2바이트 정수(ASCII 코드 규칙을 가졌을 뿐!) String은 불변 객체

  • char를 String으로 리턴하는 법 : 1) String.valueOf(char) 2) Character.toString(char) 3) “” + char
  • char를 Int형 숫자로 리턴하는 법: 1) char - ‘0’ 2) Character.getNumericValue()

Queue 구현

import java.util.Queue; import java.util.LinkedList;

**Queue<자료형> 변수명 = new LinkedList<>();**

  • 자료형에 넣은 자료형만 삽입, 삭제 가능 Queue 변수명 = new LinkedList();
  • 어떤 자료형이든 삽입, 삭제 가능(이전에 int형을 넣었어도 String형 삽입 가능

Stack 구현

import java.util.Stack; Stack stack = new Stack<>();

  • push, pop 사용
  • peek, 가장 상단의 값 출력

배열 출력

  • 1차원 출력 : `Arrays.toString(arr);
  • 2차원 출력 : 1) for문 사용
    for(int[] row : arr) {
      for(int col : row) {
          System.out.print(col);
      }
      System.out.println();
    }
    

    2) Arrays.deepToString(arr);

Deque 덱 구현

Deque<Type> q = new ArrayDeque<>(); -> Map 과 Queue와 비슷하게 그 자체로 객체를 선언하는게 아닌 인터페이스이므로 이를 구현한 ArrayDeque을 주로 쓴다.