하… 백엔드개발자로 커리어 전환을 목표로 한 이상 자바에 친숙해져야한다… 코틀린보다 참조할 코드도 많고 하니 일단 자바로 다시 바꾼다ㅠ_ㅠ
입력에는 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
- 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을 주로 쓴다.