처음부터 다 알려고 하지 말자!
문제 풀면서 새로 알게 된 개념. 기억하고 싶은 개념을 기록하자.
형변환
✔️ String -> int
1) Integer.parseInt(String s)
- int 타입을 리턴한다.
2) Integer.valueOf(String s)
- parseInt와 다르게 Integer Object를 리턴한다. 그리고 .intValue()를 사용하여 int 타입으로 형변환할 수 있지만 붙이지 않아도 자동으로 형변환이 된다.
✔️ String -> char[]
1) str.toCharArray()
- 이때 str은 String 타입이다.
✔️ int -> String
1) Integer.toString(int i)
2) String.valueOf(int i)
3) i (int타입의 값) + ""
✔️ char -> int
1) Character.getNumericValue(char c)
char c = '1';
int n = Character.getNumericValue(c);
System.out.println(n); // 1
- char을 그냥 int로 바꾸면 아스키 코드로 변해서 다음 메서드를 사용해야지 진짜 숫자로 바뀐다.
문자열
✔️ String 클래스에 추가된 메소드 (Java 11)
- strip(): 문자열 앞, 뒤의 공백 제거.
- stripLeading(): 문자열 앞의 공백 제거.
- stripTrailing(): 문자열 뒤의 공백 제거.
- isBlank(): 문자열이 비어있거나, 공백만 포함되어 있을 경우 true를 반환한다.
- String.trim().isEmpty()와 결과가 동일.
- repeat(n): n개만큼 문자열을 반복하여 붙여서 반환함.
출처: https://steady-coding.tistory.com/598
✔️ String 문자열을 배열로 자르기
1) String.split() 구분자
String input = "1,2,3,4,5";
String[] splitedInput = input.split(",");
// ["1","2","3","4","5"]
2) String.split() 공백제거 후 구분자로 나누기
아래와 같이 하면 구분자 주변 공백도 제거해서 배열을 만들 수 있다.
// 정규 표현식 사용
String input = "1, 2, 3, 4, 5";
String[] splitedInput = input.trim().split("\\s*,\\s*");
// Stream() API 사용
String input = "1, 2, 3, 4, 5";
String[] splitedInput = Arrays.stream(input.split(","))
.map(String::trim)
.toArray(String[]::new);
✔️ 구분자 넣어서 문자열 붙이기 (Java String Joiner, Stream)
우리 착한 자바는^^... 일반 프로그래밍 언어처럼
s = ""
s += "안녕"
s += "하세요"
이렇게 문자열을 붙이면 안된다.
왜냐하면 자바의 String 클래스는 변경 불가능한 ReadOnly이기 때문에 새로운 문자열을 만든다.
그래서 반복적인 문자열 추가는 메모리 낭비가 된다.
그래서 StringBuilder, StringBuffer 등을 사용하게 되는데
이번엔 " "(공백)을 기준으로 String을 합치기 위해 StringJoiner에 대해서 알아보자.
// public StringJoiner(CharSequence delimiter, CharSequence prefix, CharSequence suffix)
StringJoiner sj = new StringJoiner(" ");
이때 구분자를 넣어줄 수 있다.
또한 2번째, 3번째 파라미터로 prefix 와 suffix 도 붙여줄 수 있다.
StringJoiner sj = new StringJoiner(" ");
sj.add("안녕");
sj.add("친구들");
System.out.println(sj.toString()); // 안녕 친구들
- Stream으로 처리하면
List<String> fruits = Arrays.asList("사과", "바나나", "키위");
String fruits_string = fruits.stream().collect(Collectors.joining("-", "[", "]"));
System.out.println(fruits_string);
✔️ 리스트 join
1) 문자 리스트 join
List<String> members = Arrays.asList("judy", "nick");
String result = String.join(",", members); // "judy,nick"
2) 숫자 리스트 join
String numbers = intList.stream().map(String::valueOf).collect(Collectors.joining(","));
System.out.println(numbers); // 1,2,3
✔️ 문자열 뒤집기
1) StringBuilder, StringBuffer
String str = "abcde";
StringBuilder sb = new StringBuilder(str);
String reversedStr = sb.reverse().toString();
System.out.println(reversedStr); // edcba
2) Collections.reverse(char[] ch)
String 클래스에도 reverse 메서드가 있으면 좋겠는데.. ㅠ 그립다 파이썬
대신 Collections 클래스에서는 reverse 메서드를 제공하고 있다. 형변환 후 메서드를 사용해보자.
String str = "abcde";
char[] ch = str.toCharArray();
List<Character> list = new ArrayList<>();
for(char each : ch){
list.add(each);
}
// reverse
Collections.reverse(list);
ListIterator li = list.listIterator();
while(li.hasNext()){
System.out.print(li.next()); // edcba
}
✔️ 정렬 (Sorting)
1) int 배열 오름차순
Arrays.sort(arr);
2) int 배열 내림차순
Arrays.sort(arr, Collections.reverseOrder());
// 람다식
Arrays.sort(arr, (i1, i2) -> i2 - i1);
3) String 배열, 문자열 길이 순서로 정렬
Arrays.sort(arr, new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
return s1.length() - s2.length();
}
});
4) String 배열, 정렬 기준이 2가지 일 때
Arrays.sort(arr, new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
if (s1.length() == s2.length()) {
return s1.compareTo(s2);
} else {
return s1.length() - s2.length();
}
}
});
✔️ 중복 체크
1) String에서 중복 체크
public static void validateDuplicateNumber(String input) {
String[] numbers = input.split("");
if (numbers.length != Arrays.stream(numbers).distinct().count()) {
throw new IllegalArgumentException(DUPLICATE_ERROR_MESSAGE);
}
2) List에서 중복 체크
public static void validateDuplicateNumber(List<Integer> numbers) {
Set<Integer> numSet = new HashSet<>(numbers);
if (numSet.size() != numbers.size()) {
throw new IllegalArgumentException(DUPLICATE_ERROR_MESSAGE);
}
}
✔️ 배열을 리스트로 변환
1) ListToArray
// 1. toArray() - 배열 선언과 동시에 할당
String[] arr = list.toArray(new String[0]); // ["a", "b", "c"]
//String[] arr = list.toArray(String[]::new); // java11~ 이상
// 2. toArray() - 배열 선언 후 채워 넣음
String[] arr2 = new String[list.size()];
list.toArray(arr2); // ["a", "b", "c"]
2) Stream API
// 3. Stream API (Java8 이상)
String[] arr3 = list.stream().toArray(String[]::new);
Enum
✔️ enum 활용
public enum Rank {
FIRST(6, false, 2_000_000_000),
SECOND(5, true, 30_000_000),
THIRD(5, false, 1_500_000),
FOURTH(4, false, 50_000),
FIFTH(3, false, 5_000),
MISS(0, false, 0);
private final int matchCount;
private final boolean matchBonus;
private final int prize;
Rank(int matchCount, boolean matchBonus, int prize) {
this.matchCount = matchCount;
this.matchBonus = matchBonus;
this.prize = prize;
}
// 조건에 일치하는 type 찾기
public static Rank getRankByMatchCount(int matchCount, boolean matchBonus) {
for (Rank type : Rank.values()) {
if (type.getMatchCount() == matchCount && type.getMatchBonus() == matchBonus) {
return type;
}
}
return MISS;
}
// name="FIRST" 일 때 matchCount 찾기
// Rank.FIRST.getMatchCount로 외부에서 가져올 수도 있음.
public static int getMatchCountByName(String name) {
for (Rank type : Rank.values()) {
if (type.name().equals(name)) {
return type.getMatchCount();
}
}
return 0;
}
public int getMatchCount() {
return matchCount;
}
public boolean getMatchBonus() {
return matchBonus;
}
public int getPrize() {
return prize;
}
}
Iterator
✔️ List<> 가지고 있는 객체 순회하기
- Lottos 객체
public Iterator<Lotto> iterator() {
return purchaseNumbers.iterator();
}
- Lottos에서 순회하면서 Lotto 가져오기
public void getResult(WinningLotto winningLotto, Lottos purchaseLotto) {
for (Iterator<Lotto> it = purchaseLotto.iterator(); it.hasNext(); ) {
Lotto lotto = it.next();
Rank rank = winningLotto.oneCompare(lotto);
if (result.containsKey(rank)) {
result.put(rank, result.get(rank) + 1);
continue;
}
result.put(rank, 1);
}
}
Map
✔️ HashMap에서 key로 value 업데이트
1) key에 대한 value 업데이트
Map<String, Integer> map = new HashMap<>();
map.put("ONE", 1);
map.put("TWO", 2);
// update
map.put("ONE", 5); // map.get("ONE") => 5
key가 HashMap에 존재하지 않는 경우에는 key와 value를 추가하고 이미 존재할 경우 값이 업데이트된다. (덮어씀)
2) key에 대한 value 값 증가
Map<String, Integer> map = new HashMap<>();
map.put("ONE", 1);
map.put("TWO", 2);
// update
map.put("ONE", map.get("ONE") + 5); // map.get("ONE") => 6
'프로젝트 개발 기록 > [개발] java | spring' 카테고리의 다른 글
멀티 모듈, 그게 뭔데? 그거 어떻게 하는건데? 🧐 (0) | 2023.04.17 |
---|---|
[Java] 람다와 스트림 (Lambda & Stream) (0) | 2022.11.13 |
[Java] 코딩테스트 대비 정리 (1) (0) | 2022.10.29 |
[IntelliJ] project마다 JDK 버전 관리하기 (0) | 2022.10.25 |
댓글