처음부터 다 알려고 하지 말자!
문제 풀면서 새로 알게 된 개념. 기억하고 싶은 개념을 기록하자.
형변환
✔️ 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
문자열 다루기
1) 문자열 붙이기
String result = a + b : 작은 문자열 연결에서는 성능 차이가 거의 없음
String result = a.concat(b) : + 연산자보다 약간 성능이 좋음
String.join("", a, b) : + 연산자보다 명확하고 다수의 문자열을 합칠 때 효율적
'프로젝트 개발 기록 > [개발] java | spring' 카테고리의 다른 글
멀티 모듈, 그게 뭔데? 그거 어떻게 하는건데? 🧐 (0) | 2023.04.17 |
---|---|
[Java] 람다와 스트림 (Lambda & Stream) (1) | 2022.11.13 |
[Java] 코딩테스트 대비 정리 (1) (0) | 2022.10.29 |
[IntelliJ] project마다 JDK 버전 관리하기 (0) | 2022.10.25 |
댓글