진법 변환
- 다른 진법 => 10진수
- Integer.parseInt(문자열, 문자열의 진수)
- ex) System.out.println(Integer.parseInt("A", 16))
- 출력 : 10
- 10진수 => 16진수
- Integer.toHexString(10진수 정수)
- 16진수로 변환된 문자열을 반환
- ex) String s = Integer.toHexString(15)
- s에 "f"가 저장됨
- 대문자로 변환하고 싶다면 Integer.toHexString(15).toUpperCase()를 이용
- Integer.toBinaryString / Integer.toOctalString 등 여러 진수에 대한 변환 제공
- Integer.toHexString(10진수 정수)
import에 관해서
- ArrayList는 java.util.ArrayList 필요
- Arrays는 java.util.Arrays 필요
- StringTokenizer는 java.util.StringTokenizer 필요
- Scanner는 java.uitl.Scanner
- 처음에 import java.util.*;로 임포트하면 대부분 사용 가능
- Buffered 세트는 java.io.*;로 임포트하면 쉽게 사용 가능
- 따라서 코딩 테스트에서는 import java.util.* + java.io* 조합으로 대다수의 메소드와 클래스를 이용가능
Arrays.asList 사용
- List list = new ArrayList(Arrays.asList(arr));
- 주의 : List list = Arrays.asList(arr);와 같이 사용하면 정적 클래스를 리턴함(사이즈를 바꾸지 못함)
- 원본 배열의 주소값을 가져옴
- 내가 사용하는 java.util.ArrayList와 달리 이렇게 생성된 것은 java.util.Arrays.ArrayList 클래스임
- 따라서 set(), get(), contains() 등의 메서드만 있음
- 이 경우 새로운 원소 추가 및 삭제가 불가능
- add나 remove를 실행해보니 오류가 뜸
- 주의 : List list = Arrays.asList(arr);와 같이 사용하면 정적 클래스를 리턴함(사이즈를 바꾸지 못함)
String.join
- List 또는 Array에 대해서 각 인덱스를 구분하는 구분자를 추가하여 반환(return 자료형은 String)
- List / Array의 자료형은 String형이어야 함
- ex) System.out.println(String.join("+", arr))
- arr(또는 list) : {1, 2, 3, 4, 5, 6, 7, 8}
- 실행 결과 : 1+2+3+4+5+6+7+8
- 마지막 인덱스에는 구분자가 붙지 않음
- String s = String.join(" ", list)와 같이도 사용 가능
- ex) System.out.println(String.join("+", arr))
ArrayList
- import java.util.ArrayList가 필요
- ArrayList<타입> numbers = new ArrayList<>()로 생성
- 주요 메소드
- add(타입 e) : 원소 추가
- add(int index, 타입 e) : 원하는 인덱스에 원소 추가
- clear() : 모든 원소 제거
- clone() : 리스트 복제
- contains(Object o) : 객체가 있는지 확인. 있으면 true, 없으면 false 반환
- get(int index) : index에 해당하는 원소를 반환
- indexOf(Object o) : o에 해당하는 원소가 있는 인덱스를 반환
- isEmpty() : 원소가 없으면 true, 하나라도 있으면 false
- remove(int index) : index에 해당하는 인덱스의 원소를 삭제
- remove(Integer.valueOf(숫자)) : 숫자에 해당하는 원소를 삭제
- set(int index, E element) : index에 해당하는 원소를 element로 교체
- size() : 원소의 개수를 반환
- Collections.sort(ArrayList) : ArrayList를 오름차 순으로 정렬
- Collections.sort(ArrayList, Collections.reverseOrder()) : list를 역순(내림차순)으로 정렬
- Collections.sort(ArrayList, Comparator) : ArrayList를 원하는 규칙으로 정렬
- @Override를 통해 public int compare(E a, E b)를 재정의 해야 함
- return 값이 음수 : a < b
- return 값이 양수 : a > b
- return 값이 0 : a = b
- a - b와 같이 return 할 수도 있지만, 이 경우에 a - b 값이 오버플로우를 일으키면 잘못된 정렬이 이루어질 수 있음
- 따라서 a.compareTo(b);와 같이 사용하는 것이 좋음
- Integer 등 wrapper 클래스는 compareTo 메소드를 제공
- 역순 정렬 시에는 b.compareTo(a);
- 규칙을 정해서 정렬 가능(같은 나이는 이름 기준으로 오름차순 등)
// 람다 표현식을 사용하여 ArrayList을 역순으로 정렬 Collections.sort(list, (Integer a, Integer b) -> -(a - b));
- // ArrayList을 역순(내림차 순)으로 정렬 Collections.sort(list, new Comparator<Integer>() { @Override public int compare(Integer a, Integer b) { return b.compareTo(a); } });
- add(타입 e) : 원소 추가
Arrays 클래스
- import java.util.Arrays 필요
- Arrays.asList(배열) : 배열을 리스트로 바꿈
- List list = new ArrayList(Arrays.asList(arr));
- 이와 같이 사용해야함.
- Arrays.binarySearch(배열, 찾는 값) : 정렬되어 있는 상태에서 찾는 값의 인덱스를 반환
- 찾는 값이 없으면 음수를 반환
- 찾는 값이 배열에서 어디 위치하느냐에 따라 다른 음수값 반환
- 예를 들어 배열이 {1, 5, 9}라고 하고, 찾는 값이 4면 -2를 반환
- X 1 X X X 5 X X X 9
- 4, 10, 16를 기준으로 찾는 값이 K일 때
- K < 4 : -1 반환
- 4 < K < 10 : -2 반환
- 10 < K < 16 : -3 반환
- K > 16 : -4 반환
- Arrays.sort(배열) : 배열을 오름차순 정렬
- Arrays.sort(배열, Collections.reverseOrder())
- 배열을 역순으로 정렬
- 이 때, 배열은 "Wrapper Class"여야 함
- ex : int [] arr (X. 기본 타입) , Integer [] arr (O. 래퍼 클래스)
- Arrays.sort(배열, Comparator) : 배열을 규칙을 정해서 정렬
- Collections.sort랑 동일
- *Collections.sort는 "ArrayList"에 사용하고 Arrays.sort는 일반 배열에 사용
- @Override를 통해 public int compare(E a, E b)를 재정의 해야 함
- return 값이 음수 : a < b
- return 값이 양수 : a > b
- return 값이 0 : a = b
- a - b와 같이 return 할 수도 있지만, 이 경우에 a - b 값이 오버플로우를 일으키면 잘못된 정렬이 이루어질 수 있음
- 따라서 a.compareTo(b);와 같이 사용하는 것이 좋음
- Integer 등 wrapper 클래스는 compareTo 메소드를 제공
- 역순 정렬 시에는 b.compareTo(a);
- 규칙을 정해서 정렬 가능(같은 나이는 이름 기준으로 오름차순 등)
// 람다 표현식을 사용하여 배열을 역순으로 정렬 Arrays.sort(arr, (Integer a, Integer b) -> -(a - b));
// 람다 Comparator 사용 : 이름 순으로 오름차순 정렬하되, 같은 이름은 나이 내림차순 정렬 Arrays.sort(pl, (Person a, Person b) -> { if (a.getName() == b.getName()) { return -(a.getAge() - b.getAge()); } return a.getName().compareTo(b.getName(; });
- // 배열을 역순(내림차 순)으로 정렬 Arrays.sort(arr, new Comparator<Integer>() { @Override public int compare(Integer a, Integer b) { return b.compareTo(a); } });
- Arrays.fill(배열, 값) : 해당 배열을 값으로 채움
- Arrays.copyOf(배열, 복사할 길이) : 복사할 길이 만큼 배열을 복사하여 반환
- 사용법
- int [] arr2 = Arrays.copyOf(arr, 5);
- arr[0] ~ arr[5-1] 까지 복사
- Arrays.copyOfRange(배열, 시작 인덱스, 마지막 인덱스) : 시작 인덱스 ~ (마지막 인덱스 - 1)까지 복사
String 클래스
- 기본적으로 변경이 불가능한 immutable 객체
- 주요 메소드
- str1.equals(String str2) : str1과 str2를 비교해서 같으면 true 다르면 false
- str.split(String regex) : 패러미터로 전달된 특정 문자열 또는 정규 표현식을 기준으로 String을 나누어 배열로 리턴함
- str.length() : 문자열 str의 길이 반환
- cf. 배열 타입의 길이는 arr.length
- str.replace(”대상 문자열”, “바꿀 문자열”)
- ex) str = str.replace(”123”, “456”)
- String은 immutable함. String.replace() 메소드는 해당 스트링을 변환하는 것이 아닌 변환된 문자열을 리턴함
- replaceAll() 과의 차이는 정규표현식
- replaceAll()은 정규표현식을 사용할 수 있음
- 따라서 replaceAll()은 일반적인 특수문자를 사용하기 어려움
- 이러한 이유로 replace()를 사용하는 것이 편할 것으로 보임
- ex) str = str.replace(”123”, “456”)
- str.charAt(int index) :index에 해당하는 char 형 원소를 반환
- 자바에서는 문자열의 인덱스 접근이 안되기 때문에, charAt으로 인덱스 접근을 수행
- str.substring(int 시작 인덱스, int 끝 인덱스) : 시작 인덱스 ~ (끝 인덱스 - 1)까지의 문자열을 리턴
- 끝 인덱스를 생략하면 첫번째 인자부터 문자열 끝까지 리턴
- substring으로 특정 인덱스 제거한 문자열 반환받기
- str = str.substring(0, 제거할 인덱스) + str.substring(제거할 인덱스 + 1);
- substring으로 특정 인덱스 문자열 치환
- str = str.substring(0, 치환할 인덱스) + (치환할 인덱스 문자열) + str.substring(치환할 인덱스 + 1);
- (static) String.valueOf(객체) : 객체를 문자열로 반환
- String.valueOf(객체)에서 객체 자리에 정수, BigInteger 등 여러 가지가 들어갈 수 있음
- (static) Integer.parseInt(String str) : Integer 클래스의 정적 메소드로 str을 정수로 변환함
- str1.contains(String str2) : str2이 포함되어있는지 확인하여 있으면 true 아니면 false
- str1.indexOf(String str2) : str2이 시작되는 인덱스를 리턴하고, 해당 str2이 존재하지 않으면 -1을 리턴
- str.toUpperCase() : 문자열을 전체 대문자로 새로운 객체 반환
- str.toLowerCase() : 문자열을 전체 소문자로 새로운 객체 반환
- str1.compareTo(str2) : str1과 str2를 비교하여 정수 리턴
- return 값이 음수 : str1 < str2(str2이 사전순으로 뒤에 등장)
- return 값이 양수 : str1 > str2(str2이 사전순으로 앞에 등장)
- return 값이 0 : str1 = str2
- (static) String.format("%d + %d", 1, 2) : 포맷에 맞춘 문자열 반환
- 위의 예시는 "1 + 2" 반환
- str.repeat(int count) : str을 count번 만큼 반복하여 리턴
- JDK 11 이상부터 지원
Character 클래스
- Character.isDigit(char ch)
- ch가 숫자라면 true, 아니라면 false를 리턴
- Character.isLetter(char ch)
- ch가 문자라면 true, 아니라면 false를 리턴
- Character.isAlphabetic(char ch)와 거의 동일하며, 코딩테스트 수준에서는 같다고 봐도 될듯
- isLetter()가 좀 더 기억하기 쉽고 짧으니 이를 사용하도록 하자
- Character.toUpperCase(char ch)
- ch를 대문자로 변경
- Character.toLowerCase(char ch)
- ch를 소문자로 변경
StringBuilder 클래스
- import java.lang.StringBuilder가 필요(기본적으로 가능)
- 주요 메소드
- [ String 클래스와 동일 메소드 ]
- charAt(int index) : index 위치의 char형 원소 반환
- indexOf(String str) : 문자열에서 해당 문자열이 처음 시작되는 인덱스를 반환
- length() : 문자열 길이를 정수로 반환
- replace() : 검색된 문자열 교체
- substring(int 시작 인덱스, int 끝 인덱스) : 시작 인덱스 ~ (끝 인덱스 - 1)까지의 문자열을 리턴
- 끝 인덱스를 설정하지 않으면 첫번째 인자부터 문자열 끝까지 리턴
- toString() : 문자열 출력
- 고유 메소드
- append(String str) : 기존 문자열에 인자 문자열 추가
- delete(int 시작 인덱스, int 끝 인덱스) : 시작 인덱스 ~ (끝 인덱스 - 1)까지의 문자열을 삭제
- deleteCharAt(int index) : index의 원소 삭제
- insert(int index, String str) : 해당 index 위치에 str을 삽입
- reverse() : 문자열을 거꾸로 뒤집음
- setCharAt(int index, char c) : index의 문자를 c로 변경
Deque 자료구조 : 스택과 큐 구현 가능
- 참고 : https://hbase.tistory.com/128
- import java.util.*로 사용 가능
- 스택의 구현 : BOJ 10828 / 큐의 구현 : BOJ 10845 / 덱의 구현 : BOJ 10866
- 사용 : Deque deque = new ArrayDeque<>();
- 값 추가 함수
- 덱의 앞쪽에 데이터 삽입
- offerFirst() : 덱의 앞쪽에 데이터 삽입 후 true 반환, 용량 초과시 false 반환
- addFirst() / push() : 덱의 앞쪽에 데이터 삽입. 용량 초과시 예외 발생
- 덱의 뒷쪽에 데이터 삽입
- offerLast() / offer() : 덱의 뒷쪽에 데이터 삽입 후 true 반환. 용량 초과시 false 반환
- addLast() / add() : 덱의 뒷쪽에 데이터 삽입, 용량 초과시 예외 발생
- 참고 : addLast()가 offerLast()보다 빠름(아마 offerLast는 반환이 있어서 그렇지 않을까 추측)
- 덱의 앞쪽에 데이터 삽입
- 값 제거 함수
- 덱의 앞쪽의 데이터 제거
- pollFirst() / poll() : 덱의 앞쪽의 데이터를 제거 및 반환. 덱이 비어있으면 null 리턴
- removeFirst() / remove() / pop() : 덱의 앞쪽의 데이터 삭제. 덱이 비어있으면 예외 발생
- 덱의 뒷쪽의 데이터 제거
- pollLast() : 덱의 뒷쪽의 데이터 제거 및 반환. 덱이 비어있으면 null 리턴
- removeLast() : 덱의 뒷쪽의 데이터 제거 및 반환. 덱이 비어있으면 예외 발생
- 특정 객체 제거
- remove(Object o) : 덱의 앞쪽부터 시작하여, 일치하는 첫번째 객체를 제거 후 true 반환
- 존재하지 않을 시 false 반환
- remove(Object o) : 덱의 앞쪽부터 시작하여, 일치하는 첫번째 객체를 제거 후 true 반환
- 덱의 앞쪽의 데이터 제거
- 값 체크 함수
- 덱의 첫번째 원소 확인
- peekFirst() / peek() : 덱의 맨 앞(첫번째 원소)를 확인. 비어있으면 null 반환
- getFirst() : 덱의 맨 앞(첫번째 원소)를 확인. 비어있으면 예외 발생
- 덱의 마지막 원소 확인StringTokenizer는 레거시 클래스로, String.split을 사용하는 것이 더 좋음(공식 문서)
- peekLast() : 덱의 맨 뒤(마지막 원소)를 확인. 비어있으면 null 반환
- getLast() : 덱의 맨 뒤(마지막 원소)를 확인. 비어있으면 예외 발행
- 덱에 특정 객체가 있는지 확인
- contains(Object o) :
- 덱의 원소의 개수
- size() : 덱의 원소의 개수를 반환
- 덱의 첫번째 원소 확인
- 정리 : 스택과 큐 구현 시 First, Last 둘 중 어떤걸 사용할 것인가
- 기본적으로 스택은 후입 선출(LIFO), 큐는 선입 선출(FIFO)의 원칙만 지키면 됨
- Deque의 메소드를 종합하여 보면 데이터의 제거 연산은 First 쪽에서 된다고 생각하면 됨
- Stack 연산
- push() = addFirst()
- pop() = removeFirst()
- Queue 연산
- add() = addLast()
- remove() = removeFirst()
- Stack 연산
- 스택의 경우 removeFirst()와 addFirst()를 사용하여 구현하면 됨
- First에서 제거, First에서 삽입 -> 후입 선출(LIFO)
- 큐의 경우 removeFirst()와 addLast()를 사용하여 구현하면 됨
- First에서 제거, Last에서 삽입 -> 선입 선출(FIFO)
- Deque의 메소드를 종합하여 보면 데이터의 제거 연산은 First 쪽에서 된다고 생각하면 됨
- 기본적으로 스택은 후입 선출(LIFO), 큐는 선입 선출(FIFO)의 원칙만 지키면 됨
BigInteger
- import java.math.BigInteger가 필요
- BigInteger = new BigInteger(String)으로 생성
- 주요 메소드
- BigInteger.add(BigInteger) : 덧셈, 반환 타입 BigInteger
- BigInteger.subtract(BigInteger) : 뺄셈, 반환 타입 BigInteger
- BigInteger.multiply(BigInteger) : 곱셈, 반환 타입 BigInteger
- BigInteger.divide(BigInteger) : 나눗셈, 반환 타입 BigInteger
- BigInteger.remainder(BigInteger) : 나머지, 반환 타입 BigInteger
- String str = String.valueOf(BigInteger)로 문자열 변환 가능
Scanner 클래스
- import java.uitl.Scanner 필요
- Scanner sc = new Scanner(System.in)으로 객체 생성
- 주요 메소드
- sc.nextLine() : 문자열 한 줄 입력
- sc.next() : 문자열을 공백 또는 줄바꿈까지 읽음
- sc.nextInt() : 정수를 입력받음
- 1 2 3 이렇게 한 줄로 입력시 nextInt()를 3개 소모함
- 예를 들어 int a = sc.nextInt(); int b = sc.nextInt(); int c = sc.nextInt(); 일 때
- 1 2 3 입력하면 a = 1, b = 2, c = 3이 들어감
- 마지막에 sc.close()로 닫는 것을 잊지 말기
BufferedReader && BufferedWriter
- import java.io.* 하는 것이 마음 편함
- BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
- 다음과 같이 사용하며,BufferedReader 또는 BufferedWriter 사용시에는 main에 throws IOException을 추가해야 함
- public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int a = Integer.parseInt(br.readLine()); System.out.println(a); } }
- 주요 메소드(BufferedReader)
- readLine() : 한 줄의 문자열을 읽음
- 사용이 끝난 후 br.close()를 해주어야 함
- 공백 기준으로 구분하기 위해 StringTokenizer가 필요
- 주요 메소드(BufferedWriter)
- write(문자열) : 문자나 문자열을 버퍼에 씀
- 정수를 출력할 땐 String.valueOf(정수) 식으로 만들어서 출력해야 함
- 버퍼에 넣는 방식이므로, 출력 값이 버퍼 사이즈보다 작으면 flush()를 통해 출력해야 함
- 말 그대로 버퍼에 write하는 함수이므로, 출력 결과는 flush()를 통해 비워내지 않으면 마지막에 한 번에 출력됨
- newLine() : 빈 줄을 작성(개행)
- flush() : 버퍼를 모두 비워냄. 일부 문제에서 bw.write() 다음에 bw.flush()를 해주어야 하는 경우가 있음
- close() : 사용이 끝난 후 close()를 해줌
- write(문자열) : 문자나 문자열을 버퍼에 씀
- 출력이 아주 많은 경우가 아니라면, BufferedWriter는 사용하지 않는 것이 편함
※ 코딩테스트를 준비하며 개인적으로 공부하고 경험한 것을 기록하기 위한 목적으로 작성한 문서이며, 정확하지 않은 내용이 포함되어 있을 수 있습니다.
'Study > Java' 카테고리의 다른 글
[Logger] SLF4J 기초 (0) | 2022.12.22 |
---|---|
[Gradle] 두 개의 프로젝트를 하나로 프로젝트로 변경하며 gradle 설정 (0) | 2022.11.28 |
[JSP] JSP에서의 session 관련 메소드 학습 (0) | 2022.11.28 |
[디자인 패턴] 싱글톤(Singleton) 패턴 (0) | 2022.11.16 |
[InteliJ] InteliJ Settings (0) | 2022.11.12 |