πŸ“— [Java] Clean Code

λ¬Έμžμ—΄

λ¬Έμžμ—΄

1. [Java] μ•”ν˜Έ 해독 - cipher.charAt(i - 1)


https://school.programmers.co.kr/learn/courses/30/lessons/120892

μ˜€λ‹΅

class Solution {
    public String solution(String cipher, int code) {
        StringBuilder sb = new StringBuilder();
        for (int i = code; i <= cipher.length(); code++;) {
            sb.append(cipher[i-1]); // μΈλ±μŠ€λŠ” 0λΆ€ν„° μ‹œμž‘
        }
        return sb.toString();
    }
}


βœ… for문의 증가식 였λ₯˜
for (int i = code; i <= cipher.length(); code++;)


βœ… λ¬Έμžμ—΄ 인덱슀 μ ‘κ·Ό 였λ₯˜


μ •λ‹΅ μ½”λ“œ

class Solution {
    public String solution(String cipher, int code) {
        StringBuilder sb = new StringBuilder();
        for (int i = code; i <= cipher.length(); i += code) {
            sb.append(cipher.charAt(i - 1)); // μΈλ±μŠ€λŠ” 0λΆ€ν„° μ‹œμž‘
        }
        return sb.toString();
    }
}



λ¬Έμžμ—΄

2. [Java] λŒ€λ¬Έμžμ™€ μ†Œλ¬Έμž

https://school.programmers.co.kr/learn/courses/30/lessons/120893

μ˜€λ‹΅

class Solution {
    public String solution(String my_string) {
        StringBuilder sb = new StringBuilder();
        for(int i = 0; i < my_string.length(); i++) {
            if(Character.isUpperCase((my_string.charAt(i)))) {
                sb.append(Character.toLowerCase(my_string.charAt(i)));
            } else {
                sb.append(Character.toUpperCase(my_string.charAt(i)));
            }
        }
        return sb.toString();
    }
}

βœ… my_string.charAt(i)λŠ” μœ„λ‘œ λΉΌμ„œ char c = my_string.charAt(i); 둜 λ§Œλ“€μ–΄ μ£Όλ©΄ μ½”λ“œκ°€ 간단해진닀.


κ°œμ„ ν•œ μ½”λ“œ

class Solution {
    public String solution(String my_string) {
        StringBuilder sb = new StringBuilder();
        for(int i = 0; i < my_string.length(); i++) {
            char c = my_string.charAt(i);
            if(Character.isUpperCase(c)) {
                sb.append(Character.toLowerCase(c));
            } else {
                sb.append(Character.toUpperCase(c));
            }
        }
        return sb.toString();
    }
}



λ¬Έμžμ—΄

3. [Java] μ˜μ–΄κ°€ μ‹«μ–΄μš” - numbers.replaceAll(a,b);

https://school.programmers.co.kr/learn/courses/30/lessons/120894

ν‹€λ¦° μ½”λ“œ

class Solution {
    public long solution(String numbers) {
        String[] words = {
            "zero", "one", "two", "three", "four", "five",
            "six", "seven", "eight", "nine"
        };
        for (int i = 0; i < words.length; i++) {
            numbers = numbers.replace(words[i], String.valueOf(i));
        }
        return Integer.parseInt(numbers);
    }
}

ν…ŒμŠ€νŠΈλŠ” ν†΅κ³Όν–ˆμœΌλ‚˜ λ‹΅μ•ˆ μ œμΆœμ‹œ λŸ°νƒ€μž„ μ—λŸ¬

image.png

image.png

βœ… Integer.parseInt() μ‚¬μš© μ‹œ λŸ°νƒ€μž„ μ—λŸ¬

κ°œμ„ ν•œ μ½”λ“œ

class Solution {
    public long solution(String numbers) {
        String[] words = {
            "zero", "one", "two", "three", "four", "five",
            "six", "seven", "eight", "nine"
        };
        for (int i = 0; i < words.length; i++) {
            numbers = numbers.replaceAll(words[i], String.valueOf(i));
        }
        return Long.parseLong(numbers); // βœ… int β†’ long 으둜 λ³€κ²½
    }
}



κΈ°λ³Έν˜• VS 래퍼클래슀


βœ…Β κΈ°λ³Έν˜•Β (PrimitiveΒ type)
πŸ‘‰ λ©”λͺ¨λ¦¬μ— κ°’ 자체λ₯Ό μ €μž₯함
πŸ‘‰Β μ„±λŠ₯이 빠λ₯΄κ³ Β λ©”λͺ¨λ¦¬Β μ‚¬μš©μ΄Β νš¨μœ¨μ 


βœ…Β μ°Έμ‘°ν˜•Β (ReferenceΒ type,Β WrapperΒ class)
πŸ‘‰ 객체이기 λ•Œλ¬Έμ— null 값을 κ°€μ§ˆ 수 있음
πŸ‘‰Β ArrayList<Integer>μ²˜λŸΌΒ μ œλ„€λ¦­μ—Β μ‚¬μš©Β κ°€λŠ₯
πŸ‘‰ κΈ°λ³Έν˜•μ€ μ œλ„€λ¦­μ—μ„œ μ‚¬μš©ν•  수 μ—†μŒ β†’ μ°Έμ‘°ν˜• ν•„μš”



λ¬Έμžμ—΄

4. [Java] 인덱슀 λ°”κΎΈκΈ° - return new String(arr);

https://school.programmers.co.kr/learn/courses/30/lessons/120895

ν‹€λ¦° μ½”λ“œ

class Solution {
    public String solution(String my_string, int num1, int num2) {
        String[] arr = String.toCharArray(my_string);
        char tmp = arr[num1];
        arr[num1] = arr[num2];
        arr[num2] = tmp;
        return arr.toString();
    }
}
βœ… String[] arr = String.toCharArray(my_string);
βœ… String.toCharArray() μš©λ²•
βœ… return arr.toString();


κ°œμ„ ν•œ μ½”λ“œ

class Solution {
    public String solution(String my_string, int num1, int num2) {
        char[] arr = my_string.toCharArray();
        char tmp = arr[num1];
        arr[num1] = arr[num2];
        arr[num2] = tmp;
        return new String(arr);
    }
}



클래슀 λ©”μ„œλ“œ VS μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œ


μžλ°”μ—μ„œ λ©”μ„œλ“œλŠ” 크게 μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œμ™€ **클래슀 λ©”μ„œλ“œ(static λ©”μ„œλ“œ)**둜 λ‚˜λ‰˜λŠ”λ°, 이 λ‘˜μ€ λ©”μ„œλ“œλ₯Ό μ–΄λ–»κ²Œ ν˜ΈμΆœν•˜κ³  μ–Έμ œ μ‚¬μš©ν•˜λŠ”μ§€μ— 따라 μ€‘μš”ν•œ 차이λ₯Ό κ°€μ§„λ‹€.

클래슀 λ©”μ„œλ“œλŠ” static ν‚€μ›Œλ“œλ‘œ μ •μ˜λ˜μ–΄ μžˆμ–΄ 객체λ₯Ό λ§Œλ“€μ§€ μ•Šμ•„λ„ 클래슀 μ΄λ¦„μœΌλ‘œ λ°”λ‘œ ν˜ΈμΆœν•  수 μžˆλŠ” λ©”μ„œλ“œμ΄λ‹€. 클래슀 λ©”μ„œλ“œλŠ” 객체의 고유 μƒνƒœμ™€λŠ” λ¬΄κ΄€ν•˜λ©°, 보톡 λͺ¨λ“  μΈμŠ€ν„΄μŠ€μ—μ„œ κ³΅ν†΅μœΌλ‘œ μ‚¬μš©ν•˜λŠ” λ‘œμ§μ„ κ΅¬ν˜„ν•  λ•Œ μ‚¬μš©λ©λ‹ˆλ‹€. λŒ€ν‘œμ μΈ 예둜 Integer.parseInt("123")λŠ” λ¬Έμžμ—΄μ„ μ •μˆ˜λ‘œ λ³€ν™˜ν•˜λŠ” 클래슀 λ©”μ„œλ“œλ‘œ, IntegerλΌλŠ” 클래슀 μ΄λ¦„λ§ŒμœΌλ‘œ λ°”λ‘œ ν˜ΈμΆœν•  수 μžˆλ‹€.

반면 μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œλŠ” νŠΉμ • 객체가 μƒμ„±λ˜μ–΄μ•Όλ§Œ μ‚¬μš©ν•  수 μžˆλŠ” λ©”μ„œλ“œμ΄λ‹€. 즉, new ν‚€μ›Œλ“œλ‘œ 객체λ₯Ό λ§Œλ“  후에야 호좜이 κ°€λŠ₯ν•˜λ©°, 주둜 κ·Έ 객체의 μƒνƒœ(멀버 λ³€μˆ˜)λ₯Ό 기반으둜 λ™μž‘ν•œλ‹€. 예λ₯Ό λ“€μ–΄, str.length()λŠ” λ¬Έμžμ—΄ 객체 str의 길이λ₯Ό λ°˜ν™˜ν•˜λŠ” μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œμΈλ°, μ΄λŠ” strμ΄λΌλŠ” 객체가 μ‘΄μž¬ν•΄μ•Όλ§Œ ν˜ΈμΆœν•  수 μžˆλ‹€.

μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œλŠ” κ°μ²΄λ§ˆλ‹€ μƒνƒœκ°€ λ‹€λ₯Ό 수 있기 λ•Œλ¬Έμ—, 같은 λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜λ”λΌλ„ 객체에 따라 κ²°κ³Όκ°€ 달라진닀. 예λ₯Ό λ“€μ–΄, Personμ΄λΌλŠ” ν΄λž˜μŠ€μ— sayHello()λΌλŠ” μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œκ°€ μžˆλ‹€λ©΄, person1.sayHello()와 person2.sayHello()λŠ” 각각 λ‹€λ₯Έ 이름을 좜λ ₯ν•œλ‹€. μ΄λŠ” 각 μΈμŠ€ν„΄μŠ€κ°€ κ°€μ§€κ³  μžˆλŠ” name 값이 λ‹€λ₯΄κΈ° λ•Œλ¬Έμ΄λ‹€.

이처럼 μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œλŠ” 객체의 κ³ μœ ν•œ 데이터λ₯Ό 닀루고 μ‘°μž‘ν•  λ•Œ μœ μš©ν•˜λ©°, 클래슀 λ©”μ„œλ“œλŠ” 그와 λ¬΄κ΄€ν•œ 곡톡 κΈ°λŠ₯을 μ œκ³΅ν•  λ•Œ μ‚¬μš©λœλ‹€. κ°œλ°œμžλŠ” κΈ°λŠ₯의 λͺ©μ μ— 따라 두 λ©”μ„œλ“œ 쀑 μ μ ˆν•œ μͺ½μ„ 선택해야 ν•œλ‹€. κ°μ²΄λ§ˆλ‹€ λ‹¬λΌμ§€λŠ” λ™μž‘μ΄ ν•„μš”ν•˜λ‹€λ©΄ μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œ, 객체 없이 ν˜ΈμΆœν•΄λ„ λ˜λŠ” λ²”μš©μ μΈ κΈ°λŠ₯이라면 클래슀 λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜λŠ” 것이 μ’‹λ‹€.


βœ… 1. μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œ (Instance Method)

μ •μ˜

νŠΉμ§•

μ˜ˆμ‹œ

public class Person {
    String name;

    public void sayHello() {
        System.out.println("Hello, my name is " + name);
    }
}

// μ‚¬μš©
Person p = new Person();
p.name = "Dain";
p.sayHello();  // 좜λ ₯: Hello, my name is Dain


βœ… 2. 클래슀 λ©”μ„œλ“œ (Class Method)

μ •μ˜

νŠΉμ§•

μ˜ˆμ‹œ

public class MathUtil {
    public static int add(int a, int b) {
        return a + b;
    }
}

// μ‚¬μš©
int result = MathUtil.add(3, 5);  // 객체 없이 호좜 κ°€λŠ₯



λ¬Έμžμ—΄

5. [Java] ν•œ 번만 λ“±μž₯ν•œ 문자 (λ¬Έμžμ—΄) - sb.toString();

https://school.programmers.co.kr/learn/courses/30/lessons/120896

ν‹€λ¦° μ½”λ“œ

import java.util.*;

class Solution {
    public String solution(String s) {
        int[] cnt = new int[26];
        
        for(char c : s.toCharArray()) {
            cnt[c - 'a']++;
        }
        
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < 26; i++) {
            if (cnt[i] == 1) sb.append((char)i+'a');
        }
        return sb.toString(); 
    }
}

image.png


βœ… sb.append((char)i + 'a');
(char)i + 'a' // => μ •μˆ˜ + μ •μˆ˜ β†’ int둜 연산됨

β†’ i + 'a' 전체λ₯Ό char둜 μΊμŠ€νŒ…ν•΄μ•Ό 문자둜 μ œλŒ€λ‘œ λ³€ν™˜λœλ‹€.

sb.append((char)(i + 'a'));


κ°œμ„ ν•œ μ½”λ“œ

import java.util.*;

class Solution {
    public String solution(String s) {
        int[] cnt = new int[26];
        
        for(char c : s.toCharArray()) {
            cnt[c - 'a']++;
        }
        
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < 26; i++) {
            if (cnt[i] == 1) sb.append((char)(i + 'a'));
        }
        return sb.toString(); 
    }
}




λ¬Έμžμ—΄

10. [Java] 숫자 찾기 - String.indexOf(), String.valueOf()

https://school.programmers.co.kr/learn/courses/30/lessons/120904

ν‹€λ¦° μ½”λ“œ

class Solution {
    public int solution(int num, int k) {
        String numToString = Integer.toString(num);
        char[] arr = numToString.toCharArray();
        char kToChar = (char) k; 
        int idx = -1;
        for(int i = 0; i < arr.length; i++ ) {
            if (arr[i] == kToChar) {
                return i+1;
            }
        }
        return idx;
    }
}
βœ… char kToChar = (char) (k + '0');

κ°œμ„ ν•œ μ½”λ“œ

class Solution {
    public int solution(int num, int k) {
        String numToString = Integer.toString(num);
        char[] arr = numToString.toCharArray();
        char kToChar = (char) (k + '0');
        int idx = -1;
        for(int i = 0; i < arr.length; i++ ) {
            if (arr[i] == kToChar) {
                return i+1;
            }
        }
        return idx;
    }
}


더 κ°„λ‹¨ν•œ 방법 (String API ν™œμš©)

public int solution(int num, int k) {
    String s = String.valueOf(num);
    int idx = s.indexOf(String.valueOf(k));
    return idx == -1 ? -1 : idx + 1;
}


βœ… String.indexOf()

λ¬Έμžμ—΄ λ‚΄μ—μ„œ νŠΉμ • λ¬Έμžλ‚˜ λ¬Έμžμ—΄μ΄ 처음 λ“±μž₯ν•˜λŠ” μœ„μΉ˜μ˜ 인덱슀λ₯Ό μ•Œλ €μ£ΌλŠ” 맀우 μœ μš©ν•œ λ©”μ„œλ“œμ΄λ‹€.

πŸ“Œ κΈ°λ³Έ μ‚¬μš©λ²•

String s = "29183";
int idx = s.indexOf("1");   // κ²°κ³Ό: 2

πŸ“Œ μžλ°” 곡식 문법

int indexOf(int ch)           // 문자 λ˜λŠ” 문자 μ½”λ“œ (ex: 'a', 97)
int indexOf(String str)       // λ¬Έμžμ—΄


βœ… μ‚Όν•­μ—°μ‚°μž

μžλ°”μ˜ μ‚Όν•­ μ—°μ‚°μž(ternary operator)λŠ” if-elseλ₯Ό ν•œ μ€„λ‘œ κ°„λ‹¨ν•˜κ²Œ μ“Έ 수 있게 ν•΄μ£ΌλŠ” 쑰건 μ—°μ‚°μžμ΄λ‹€.

πŸ“Œ κΈ°λ³Έ μ‚¬μš©λ²•

쑰건식 ? 참일 λ•Œ κ°’ : 거짓일 λ•Œ κ°’;

πŸ“Œ 예제

int age = 20;
String result = (age >= 18) ? "성인" : "λ―Έμ„±λ…„μž";
System.out.println(result);  // 좜λ ₯: 성인



λ°°μ—΄


λ°°μ—΄

6. [Java] μ•½μˆ˜κ΅¬ν•˜κΈ° - list.toArray(new String[0]);

https://school.programmers.co.kr/learn/courses/30/lessons/120897

ν‹€λ¦° μ½”λ“œ

import java.util.*;

class Solution {
    public int[] solution(int n) {
        ArrayList<Integer> list = new ArrayList<>();
        for (int i = 0; i <= n; i++) {
            if(n%i==0) list.append(i);
        }
        int[] answer = list.toArray(new String[0]);
        return answer;
    }
}

image.png

βœ… for (int i = 0; i <= n; i++)
βœ… list.add(i)
βœ… int[] answer = list.toArray(new String[0]);


κ°œμ„ ν•œ μ½”λ“œ

import java.util.*;

class Solution {
    public int[] solution(int n) {
        ArrayList<Integer> list = new ArrayList<>();
        for (int i = 1; i <= n; i++) {
            if(n%i==0) list.add(i);
        }
        int[] answer = new int[list.size()];
        for(int i = 0; i < list.size(); i++) {
            answer[i] = list.get(i);
        }
        return answer;
    }
}


Stream μ‚¬μš© 버전

import java.util.*;
import java.util.stream.*;

class Solution {
    public int[] solution(int n) {
        return IntStream.rangeClosed(1, n) // 1λΆ€ν„° nκΉŒμ§€ 숫자 생성
                .filter(i -> n % i == 0)   // μ•½μˆ˜λ§Œ 필터링
                .toArray();                // int[]둜 λ°˜ν™˜
    }
}




List β†’ Array ν˜•λ³€ν™˜

List νƒ€μž…

λ³€ν™˜ 방법

List<String>

list.toArray(new String[0])

List<Integer>

list.toArray(new Integer[0])

List<Integer> β†’ int[]

반볡문으둜 μˆ˜λ™ λ³€ν™˜ ν•„μš”


βœ… 1. List β†’ Array (μ°Έμ‘°ν˜•, 예: Integer, String λ“±)
List<String> list = Arrays.asList("a", "b", "c");
String[] arr = list.toArray(new String[0]);
List<Integer> list = Arrays.asList(1, 2, 3);
Integer[] arr = list.toArray(new Integer[0]);


βœ… 2. List β†’ Array (κΈ°λ³Έν˜•, 예: int)
List<Integer> list = Arrays.asList(1, 2, 3);
int[] arr = new int[list.size()];

for (int i = 0; i < list.size(); i++) {
    arr[i] = list.get(i);  // μ–Έλ°•μ‹± μžλ™ μˆ˜ν–‰
}




Array β†’ List ν˜•λ³€ν™˜


λ³€ν™˜ 방법

String[]

Arrays.asList(arr)

Integer[]

Arrays.asList(arr)

int[]

Arrays.stream(arr).boxed().collect(Collectors.toList())


βœ… 1. μ°Έμ‘°ν˜• λ°°μ—΄ β†’ List (예: String[], Integer[] λ“±)
String[] arr = {"a", "b", "c"};
List<String> list = Arrays.asList(arr);
List<String> modifiableList = new ArrayList<>(Arrays.asList(arr));


βœ… 2. κΈ°λ³Έν˜• λ°°μ—΄ β†’ List (예: int[], double[] λ“±)
int[] arr = {1, 2, 3, 4};

List<Integer> list = Arrays.stream(arr)  // IntStream 생성
                           .boxed()      // int β†’ Integer (λ°•μ‹±)
                           .collect(Collectors.toList());



λ°°μ—΄

7. [Java] κ°€μž₯ 큰 수 μ°ΎκΈ°- return new int[]{max, idx};

https://school.programmers.co.kr/learn/courses/30/lessons/120899

ν‹€λ¦° μ½”λ“œ

import java.util.*;

class Solution {
    public int[] solution(int[] array) {
        Arrays.sort(array);
        int[] answer = new int[2];
        answer[0] = array[array.length-1];
        answer[1] = array.length-1;
        return answer;
    }
}

image.png

βœ… index 계산 잘λͺ»λ¨


κ°œμ„ ν•œ μ½”λ“œ

import java.util.*;

class Solution {
    public int[] solution(int[] array) {
        int max = array[0];
        int idx = 0;
        
        for(int i = 1; i < array.length; i++) {
            if (array[i] > max) {
                max = array[i];
                idx = i;
            }
        }
        return new int[]{max, idx};
    }
}


λ°°μ—΄ λ¦¬ν„°λŸ΄μ„ λ°˜ν™˜ν•  λ•Œ μ“°λŠ” μ½”λ“œ

intν˜• 두 개짜리 배열을 직접 μƒμ„±ν•˜κ³ , κ·Έ 배열을 λ©”μ„œλ“œμ˜ λ°˜ν™˜κ°’μœΌλ‘œ μ‚¬μš©ν•˜λŠ” μ½”λ“œμ΄λ‹€.

return new int[]{max, idx};

μ•„λž˜μ™€ 같이 배열을 λ§Œλ“€κ³  λ°˜ν™˜ν•˜λŠ” μ½”λ“œμΈλ° ν•œ μ€„λ‘œ 쀄인 것이닀.

int[] result = new int[]{max, idx};
return result;

Javaμ—μ„œ return은 값을 λ°˜ν™˜ν•˜κΈ°λ§Œ ν•˜λ©΄ 되기 λ•Œλ¬Έμ—, ꡳ이 int[] result = ...처럼 쀑간에 λ³€μˆ˜μ— 담을 ν•„μš”κ°€ μ—†λ‹€.


λ°°μ—΄ λ¦¬ν„°λŸ΄μ€ μ„ μ–Έ 없이 μ“°λ©΄ 컴파일 였λ₯˜κ°€ λ‚œλ‹€.

int[] a;
a = {1, 2}; // ❌ 컴파일 였λ₯˜

β†’ λŒ€μ‹  μ΄λ ‡κ²Œ 써야 ν•œλ‹€.

int[] a = new int[]{1, 2};



λ°°μ—΄

8. [Java] λ¬Έμžμ—΄ κ³„μ‚°ν•˜κΈ° - Character.isDigit(c)

https://school.programmers.co.kr/learn/courses/30/lessons/120902

ν‹€λ¦° μ½”λ“œ (1μ°¨ μ‹œλ„)

class Solution {
    public int solution(String my_string) {
        char[] arr = my_string.toCharArray();
        int sum = 0;
        for (char c : arr ) {
            if (c != '+' && c != '-' && c !=' ') {
                sum+= Integer.parseInt(c);
            }
        }
        return sum;
    }
}

image.png

βœ… Integer.parseInt()


String β†’ int VS char β†’ int

1. String을 int둜 λ³€ν™˜ν•  λ•ŒλŠ” Integer.parseInt()

String str = "123";

// λ¬Έμžμ—΄ β†’ int
int num = Integer.parseInt(str);       // 123

2. char을 숫자둜 λ³€ν™˜ν•  λ•ŒλŠ” char νƒ€μž… λ³€μˆ˜ - '0'

char c = '7';

// 문자 β†’ 숫자 (μ •μˆ˜κ°’)
int digit = c - '0';   // '7' - '0' = 7


ν‹€λ¦° μ½”λ“œ (2μ°¨ μ‹œλ„)

class Solution {
    public int solution(String my_string) {
        char[] arr = my_string.toCharArray();
        int sum = 0;
        for (char c : arr ) {
            if (c != '+' && c != '-' && c !=' ') {
                sum+= c - '0';
            }
        }
        return sum;
    }
}

image.png

λ‚΄κ°€ μ“΄ μ½”λ“œλŠ” λͺ¨λ“  숫자λ₯Ό "ν•œ 자리 숫자"둜 μ²˜λ¦¬ν•œλ‹€. 즉, "12"κ°€ 있으면 1 + 2 = 3으둜 κ³„μ‚°ν•œλ‹€.

String my_string = "a12b3";
β†’ arr = ['a', '1', '2', 'b', '3']
β†’ κ²°κ³Ό: 1 + 2 + 3 = 6 (❗ μ‹€μ œ 12 + 3이 μ•„λ‹˜)

λ¬Έμ œμ—μ„œ μ›ν•˜λŠ” 것은 λ§Œμ•½ "12 + 3" β†’ 15둜 κ³„μ‚°ν•˜λŠ” 것이닀.

String num λ³€μˆ˜λ₯Ό λ°–μœΌλ‘œ λΉΌκ³ , Character.isDigit() 으둜 cκ°€ 0~9사이 μˆ«μžν˜• λ¬Έμžμ—΄μ΄λ©΄ num에 μ €μž₯ν•˜λŠ” ν˜•μ‹μœΌλ‘œ μ½”λ“œλ₯Ό 짜 μ£Όμ—ˆλ‹€.


ν‹€λ¦° μ½”λ“œ (3μ°¨ μ‹œλ„)

class Solution {
    public int solution(String my_string) {
        char[] arr = my_string.toCharArray();
        int sum = 0;
        String num = "";
        for (char c : arr ) {
            if (Character.isDigit(c)) {
                num += c;
            } else {
                if (!num.isEmpty()) {
                    sum += Integer.parseInt(num);
                    num = ""; 
                }
            }
        }
        if (!num.isEmpty()) {
            sum += Integer.parseInt(num);
        }
        return sum;
    }
}

image.png

λ§μ…ˆλ§Œ ν•˜λŠ”κ²Œ μ•„λ‹ˆλΌ λΊ„μ…ˆλ„ μžˆμ—ˆλ‹€. μ—°μ‚°μž(+, -)에 따라 연산을 λͺ¨λ‘ μ²˜λ¦¬ν•˜λŠ” μ½”λ“œλ₯Ό μ§œμ•Ό ν•œλ‹€.

  1. λ¬Έμžμ—΄μ„ " "(곡백) κΈ°μ€€μœΌλ‘œ λ‚˜λˆ μ„œ
  2. 처음 값은 result에 μ €μž₯
  3. μ΄ν›„μ—λŠ” μ—°μ‚°μž(+ λ˜λŠ” -)와 μˆ«μžκ°€ λ²ˆκ°ˆμ•„ λ“±μž₯
  4. μ—°μ‚°μžμ— 따라 +λ©΄ λ”ν•˜κ³ , -λ©΄ λΉΌμ•Ό 함


ν‹€λ¦° μ½”λ“œ (4μ°¨ μ‹œλ„)

class Solution {
    public int solution(String my_string) {
        String[] splited = my_string.split(" ");
        int answer = Integer.parseInt(splited[0]);
        
        for(int i = 1; i < splited.length; i += 2) {
            String op = splited[i];
            int num = Integer.parseInt(splited[i + 1]);
            
            if (op == '+')) {
                answer += num;
            } else if (op == '-') {
                answer -= num;
            }
        }
        return answer;
    }
}
βœ… if(op == '+')


κ°œμ„ ν•œ μ½”λ“œ

class Solution {
    public int solution(String my_string) {
        String[] splited = my_string.split(" ");
        int answer = Integer.parseInt(splited[0]);
        
        for(int i = 1; i < splited.length; i += 2) {
            String op = splited[i];
            int num = Integer.parseInt(splited[i + 1]);
            
            if (op.equals("+")) {
                answer += num;
            } else if (op.equals("-")) {
                answer -= num;
            }
        }
        return answer;
    }
}



λ°°μ—΄

9. [Java] λ°°μ—΄μ˜ μœ μ‚¬λ„(λ°°μ—΄, Set) - set.contains(str)

https://school.programmers.co.kr/learn/courses/30/lessons/120903

Set 을 ν™œμš©ν•œ μ½”λ“œ

import java.util.*;

class Solution {
    public int solution(String[] s1, String[] s2) {
        Set<String> set = new HashSet<>(Arrays.asList(s1));
        int cnt = 0;
        for (String str : s2) {
            if (set.contains(str)) cnt++;
        }
        return cnt; 
    }
}


βœ… Set<String> set = new HashSet<>(Arrays.asList(s1));


이쀑 forλ¬Έ(반볡문)을 μ‚¬μš©ν•œ μ½”λ“œ

class Solution {
    public int solution(String[] s1, String[] s2) {
        int cnt = 0;
        for (int i = 0; i < s1.length; i++) {
            for (int j = 0; j < s2.length; j++) {
                if (s1[i].equals(s2[j])) {
                    cnt++;
                    break;
                }
            }
        }
        return cnt;
    }
}


Java Coding Test Cheatsheet


0. Frequently Used Libraries

import java.util.*;      // Data structures
import java.io.*;        // Fast I/O
import java.math.*;      // BigInteger, BigDecimal

1. Variable & Array Declaration

String[] arr1 = new String[5];
int[] arr2 = {1, 2, 3};
int N = 3;
int[] arr3 = new int[N];

2. Arrays Utility

Arrays.sort(arr);                                 // Ascending
Arrays.sort(arr, Collections.reverseOrder());     // Descending
Arrays.sort(arr, 0, 4);                           // Partial sort
Arrays.binarySearch(arr, 2);                      // Binary search
List<String> list = Arrays.asList(arr1);          // Convert to List
int[] tmp = Arrays.copyOfRange(arr, 0, 3);        // Slice

3. length / length() / size()

arr.length        // Arrays
str.length()      // String
list.size()       // Collections

4. String Handling

str.split(" ");
str.substring(0, 5);
str.charAt(i);
str.toUpperCase();
str.toLowerCase();
String[] letters = str.split("");
String newStr = str.substring(0,4) + "X" + str.substring(5);

5. HashMap

Map<String, Integer> map = new HashMap<>();
map.put("key", 1);
map.get("key");
map.containsKey("key");
map.getOrDefault("key", 0);
for (String k : map.keySet()) map.get(k);

6. ArrayList

List<String> list = new ArrayList<>();
list.add("a");
list.set(0, "b");
list.remove("b");
list.contains("a");
list.indexOf("a");

7. Queue (LinkedList)

Queue<Integer> q = new LinkedList<>();
q.offer(1);
q.poll();
q.peek();
q.clear();
q.isEmpty();

8. PriorityQueue

PriorityQueue<Integer> pq = new PriorityQueue<>();
PriorityQueue<Integer> maxPq = new PriorityQueue<>(Collections.reverseOrder());

9. Math

Math.max(a, b);
Math.min(a, b);
Math.abs(x);
Math.ceil(x);
Math.floor(x);
Math.round(x);
String.format("%.2f", d);  // Round to 2 decimal
Math.pow(a, b);
Math.sqrt(x);

10. HashSet

Set<String> set = new HashSet<>();
set.add("a");
set.remove("a");
set.contains("a");

11. Stack

Stack<Integer> stack = new Stack<>();
stack.push(1);
stack.pop();
stack.peek();

12. Deque (ArrayDeque)

Deque<Integer> dq = new ArrayDeque<>();
dq.addFirst(1);
dq.addLast(2);
dq.pollFirst();
dq.pollLast();

13. TreeSet

TreeSet<Integer> ts = new TreeSet<>();
ts.add(5);
ts.first();
ts.last();
ts.lower(5);
ts.higher(5);

14. TreeMap

TreeMap<String, Integer> tm = new TreeMap<>();
tm.put("apple", 3);
tm.firstKey();
tm.lastKey();

15. Fast I/O

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
String[] parts = br.readLine().split(" ");

BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
bw.write("Hello\n");
bw.flush();
bw.close();

16. DFS

void dfs(int node) {
    visited[node] = true;
    for (int next : graph.get(node)) {
        if (!visited[next]) dfs(next);
    }
}

17. BFS

Queue<Integer> q = new LinkedList<>();
q.offer(start);
visited[start] = true;
while (!q.isEmpty()) {
    int cur = q.poll();
    for (int next : graph.get(cur)) {
        if (!visited[next]) {
            q.offer(next);
            visited[next] = true;
        }
    }
}

18. Sorting

list.sort(Comparator.naturalOrder());
list.sort(Comparator.reverseOrder());
people.sort(Comparator.comparingInt(p -> p.age));

19. DP (Fibonacci)

int[] dp = new int[N+1];
dp[0] = 0; dp[1] = 1;
for (int i = 2; i <= N; i++) dp[i] = dp[i-1] + dp[i-2];

20. Union-Find

int find(int x) {
    if (x != parent[x]) parent[x] = find(parent[x]);
    return parent[x];
}
void union(int a, int b) {
    a = find(a); b = find(b);
    if (a != b) parent[b] = a;
}

21. Bitmask

int bit = 0;
bit |= (1 << 3);
bit &= ~(1 << 3);
boolean on = (bit & (1 << 3)) != 0;
Integer.bitCount(bit);

22. Greedy

int[] coins = {500, 100, 50, 10};
int count = 0;
for (int coin : coins) {
    count += target / coin;
    target %= coin;
}

23. Prefix Sum

int[] prefix = new int[N+1];
for (int i = 0; i < N; i++) prefix[i+1] = prefix[i] + arr[i];

24. Sliding Window

int sum = 0;
for (int i = 0; i < k; i++) sum += arr[i];
int max = sum;
for (int i = k; i < N; i++) {
    sum += arr[i] - arr[i-k];
    max = Math.max(max, sum);
}

25. Sieve of Eratosthenes

boolean[] isPrime = new boolean[N+1];
Arrays.fill(isPrime, true);
for (int i = 2; i*i <= N; i++) {
    if (isPrime[i]) {
        for (int j = i*i; j <= N; j += i) isPrime[j] = false;
    }
}

26. Dijkstra

PriorityQueue<int[]> pq = new PriorityQueue<>(Comparator.comparingInt(a -> a[1]));
int[] dist = new int[N+1];
Arrays.fill(dist, INF);
dist[start] = 0;
pq.offer(new int[]{start, 0});

27. Tree / LCA

void dfs(int node, int par, int d) {
    parent[node] = par;
    depth[node] = d;
    for (int next : tree.get(node)) {
        if (next != par) dfs(next, node, d+1);
    }
}

28. Coding Test Patterns

29. Backtracking (Permutation, Combination)

void permute(List<Integer> list, boolean[] used) {
    if (list.size() == N) {
        System.out.println(list);
        return;
    }
    for (int i = 0; i < N; i++) {
        if (!used[i]) {
            used[i] = true;
            list.add(arr[i]);
            permute(list, used);
            list.remove(list.size() - 1);
            used[i] = false;
        }
    }
}

30. Binary Search / Parametric Search

int left = 1, right = maxVal;
while (left <= right) {
    int mid = (left + right) / 2;
    if (condition(mid)) {
        answer = mid;
        right = mid - 1;
    } else {
        left = mid + 1;
    }
}

31. Recursion Optimization

32. String Algorithms (KMP)

int[] makeTable(String pattern) {
    int[] table = new int[pattern.length()];
    int j = 0;
    for (int i = 1; i < pattern.length(); i++) {
        while (j > 0 && pattern.charAt(i) != pattern.charAt(j)) j = table[j-1];
        if (pattern.charAt(i) == pattern.charAt(j)) table[i] = ++j;
    }
    return table;
}

33. Permutations / Combinations / Bitmask

// Bitmask Combination
for (int mask = 0; mask < (1 << N); mask++) {
    for (int i = 0; i < N; i++) {
        if ((mask & (1 << i)) != 0) {
            // element i is selected
        }
    }
}

34. BigInteger / BigDecimal

BigInteger a = new BigInteger("12345678901234567890");
BigInteger b = new BigInteger("98765432109876543210");
BigInteger sum = a.add(b);
BigDecimal dec = new BigDecimal("1234.5678");
BigDecimal result = dec.setScale(2, RoundingMode.HALF_UP);

좜처 : chatGPT


Java ν‘œν˜„μ‹(Expression)이 뭐야?


1. ν‘œν˜„μ‹μ΄λž€?

**ν‘œν˜„μ‹(Expression)**μ΄λž€, 값을 μƒμ„±ν•˜λŠ” μ½”λ“œ 쑰각이닀.
λ³€μˆ˜, μƒμˆ˜, μ—°μ‚° κ²°κ³Ό, 객체 생성 λ“± 결과값이 λ‚˜μ˜€λŠ” λͺ¨λ“  μ½”λ“œκ°€ ν‘œν˜„μ‹μ΄λ‹€


2. μ˜ˆμ‹œλ‘œ λ³΄λŠ” ν‘œν˜„μ‹

μ½”λ“œ

κ²°κ³Ό

μ„€λͺ…

3 + 4

7

μ •μˆ˜ λ§μ…ˆ

"Hi" + " there"

"Hi there"

λ¬Έμžμ—΄ μ—°κ²°

new String("abc")

"abc"

객체 생성

arr.length

λ°°μ—΄ 길이

λ°°μ—΄μ˜ 길이 μ°Έμ‘°

x > 5

true/false

비ꡐ μ—°μ‚°


3. ν‘œν˜„μ‹κ³Ό λ¬Έμž₯(statement)의 차이

// ν‘œν˜„μ‹
3 + 4               // κ°’: 7
"Hello" + "World"   // κ°’: "HelloWorld"
x > 5               // κ°’: true λ˜λŠ” false

// λ¬Έμž₯
int a = 3 + 4;               // λ³€μˆ˜ μ„ μ–Έ (ν• λ‹Ή)
System.out.println("Hi");   // λ©”μ„œλ“œ 호좜
if (x > 5) { ... }           // 쑰건문

4. ν‘œν˜„μ‹μ΄ μ“°μ΄λŠ” μœ„μΉ˜

μœ„μΉ˜

μ˜ˆμ‹œ

return λ¬Έ

return x + y;

λ³€μˆ˜ λŒ€μž…

int z = x * 2;

쑰건문 쑰건

if (a > b)

λ©”μ„œλ“œ 인자

System.out.println("Hi");


5. μš”μ•½



Java μ΄μŠ€μΌ€μ΄ν”„ μ‹œν€€μŠ€ (Escape Sequences)


1. μ΄μŠ€μΌ€μ΄ν”„ μ‹œν€€μŠ€λž€?

μ΄μŠ€μΌ€μ΄ν”„ μ‹œν€€μŠ€λŠ” 일반 문자처럼 좜λ ₯ν•  수 μ—†λŠ” νŠΉμˆ˜ν•œ λ™μž‘(예: μ€„λ°”κΏˆ, νƒ­ λ“±)을
λ¬Έμžμ—΄ μ•ˆμ—μ„œ ν‘œν˜„ν•  수 μžˆλ„λ‘ ν•΄μ£ΌλŠ” λ°±μŠ¬λž˜μ‹œ \둜 μ‹œμž‘ν•˜λŠ” 문자 쑰합이닀.


2. μ£Όμš” μ΄μŠ€μΌ€μ΄ν”„ μ‹œν€€μŠ€ ν‘œ

μ΄μŠ€μΌ€μ΄ν”„

의미

μ„€λͺ… μ˜ˆμ‹œ

\n

μ€„λ°”κΏˆ (newline)

쀄을 λ°”κΏ”μ€Œ

\t

νƒ­ (tab)

띄어쓰기 4~8μΉΈ (νƒ­ μœ„μΉ˜μ— 따라 닀름)

\"

ν°λ”°μ˜΄ν‘œ (")

λ¬Έμžμ—΄ μ•ˆμ—μ„œ ν°λ”°μ˜΄ν‘œ 좜λ ₯ κ°€λŠ₯

\'

μž‘μ€λ”°μ˜΄ν‘œ (')

μž‘μ€λ”°μ˜΄ν‘œλ₯Ό 문자 λ˜λŠ” λ¬Έμžμ—΄ μ•ˆμ—μ„œ μ‚¬μš©

\\

λ°±μŠ¬λž˜μ‹œ ()

μ—­μŠ¬λž˜μ‹œ 자체 좜λ ₯

\r

캐리지 리턴 (CR)

μ»€μ„œλ₯Ό 맨 μ•žμœΌλ‘œ 이동 (거의 μ‚¬μš© μ•ˆ 함)

\b

백슀페이슀

이전 문자 μ‚­μ œ (거의 μ‚¬μš© μ•ˆ 함)

\f

폼 ν”Όλ“œ (Form feed)

νŽ˜μ΄μ§€ λ„˜κΉ€ (ν”„λ¦°ν„° μ œμ–΄μš©, ν˜„μž¬λŠ” 거의 μ‚¬μš© μ•ˆ 함)


3. μ‚¬μš© μ˜ˆμ‹œ μ½”λ“œ

public class EscapeExample {
    public static void main(String[] args) {
        System.out.println("이름\tλ‚˜μ΄\t성별");
        System.out.println("철수\t20\t남");
        System.out.println("κ·ΈλŠ” λ§ν–ˆλ‹€: \"μ•ˆλ…•ν•˜μ„Έμš”\"");
        System.out.println("C:\\Program Files\\Java");
    }
}

좜λ ₯ κ²°κ³Ό:

이름	λ‚˜μ΄	성별
철수	20	남
κ·ΈλŠ” λ§ν–ˆλ‹€: "μ•ˆλ…•ν•˜μ„Έμš”"
C:\Program Files\Java

4. μ–Έμ œ μ‚¬μš©ν•˜λ‚˜μš”?

예:

System.out.println("Hello\nWorld");  // μ€„λ°”κΏˆ
char quote = '\'';                   // μž‘μ€λ”°μ˜΄ν‘œ 문자


Java κ³ κΈ‰ 좜λ ₯ 포맷 (μ΄μŠ€μΌ€μ΄ν”„ μ‹œν€€μŠ€, printf, format)


1. μ΄μŠ€μΌ€μ΄ν”„ μ‹œν€€μŠ€λž€?

**μ΄μŠ€μΌ€μ΄ν”„ μ‹œν€€μŠ€(Escape Sequence)**λŠ” λ¬Έμžμ—΄ λ‚΄μ—μ„œ νŠΉμˆ˜ν•œ λ™μž‘(μ€„λ°”κΏˆ, νƒ­, λ”°μ˜΄ν‘œ λ“±)을 ν‘œν˜„ν•˜κΈ° μœ„ν•œ 문자 쑰합이닀.
Javaμ—μ„œλŠ” \ λ°±μŠ¬λž˜μ‹œλ‘œ μ‹œμž‘ν•œλ‹€.


1.1 μ£Όμš” μ΄μŠ€μΌ€μ΄ν”„ μ‹œν€€μŠ€

μ΄μŠ€μΌ€μ΄ν”„

의미

μ˜ˆμ‹œ 좜λ ₯

\n

μ€„λ°”κΏˆ

쀄을 λ°”κΏˆ

\t

νƒ­

띄어쓰기(보톡 4~8μΉΈ)

\"

ν°λ”°μ˜΄ν‘œ 좜λ ₯

"κ·ΈλŠ” λ§ν–ˆλ‹€: \"μ•ˆλ…•\""

\'

μž‘μ€λ”°μ˜΄ν‘œ 좜λ ₯

'I\'m fine'

\\

λ°±μŠ¬λž˜μ‹œ 좜λ ₯

"C:\\Users\\Dain"

\r

캐리지 리턴

μ»€μ„œλ₯Ό 맨 μ•žμœΌλ‘œ 이동 (거의 μ•ˆ 씀)

\b

백슀페이슀

κΈ€μž ν•˜λ‚˜ μ‚­μ œ (거의 μ•ˆ 씀)

\f

폼 ν”Όλ“œ

νŽ˜μ΄μ§€ λ„˜κΉ€ (거의 μ•ˆ 씀)


1.2 μ‚¬μš© μ˜ˆμ‹œ

System.out.println("이름\tλ‚˜μ΄");
System.out.println("영희\t25");
System.out.println("κ·ΈλŠ” λ§ν–ˆλ‹€: \"μ•ˆλ…•ν•˜μ„Έμš”\"");
System.out.println("C:\\Program Files\\Java");

좜λ ₯ κ²°κ³Ό:

이름    λ‚˜μ΄
영희    25
κ·ΈλŠ” λ§ν–ˆλ‹€: "μ•ˆλ…•ν•˜μ„Έμš”"
C:\Program Files\Java

2. λ¬Έμžμ—΄ 포맷 μ„œμ‹ 문자

Javaμ—μ„œ λ¬Έμžμ—΄μ„ μ •ν•΄μ§„ ν˜•μ‹μœΌλ‘œ 좜λ ₯ν•˜κ³  싢을 λ•Œ System.out.printf() λ˜λŠ” String.format()을 μ‚¬μš©ν•œλ‹€.


2.1 κΈ°λ³Έ ν˜•μ‹

System.out.printf("ν˜•μ‹", κ°’1, κ°’2...);
String result = String.format("ν˜•μ‹", κ°’1, κ°’2...);

2.2 μ£Όμš” μ„œμ‹ 문자

μ„œμ‹ 문자

μ„€λͺ…

μ˜ˆμ‹œ 좜λ ₯

%s

λ¬Έμžμ—΄

"이름: %s" β†’ 이름 좜λ ₯

%d

μ •μˆ˜ (10μ§„μˆ˜)

"λ‚˜μ΄: %d"

%f

μ‹€μˆ˜ (μ†Œμˆ˜μ  κ°€λŠ₯)

"점수: %.2f"

%c

문자

"성별: %c"

%n

μ€„λ°”κΏˆ (OS별 ν˜Έν™˜)

"λ‹€μŒ 쀄%n"

%%

νΌμ„ΌνŠΈ(%) 좜λ ₯

"100%% μ™„λ£Œ"


2.3 자리수/μ •λ ¬ μ„€μ •

ν˜•μ‹

μ„€λͺ…

%5d

전체 5자리, 였λ₯Έμͺ½ μ •λ ¬

%-5d

전체 5자리, μ™Όμͺ½ μ •λ ¬

%05d

μ•žμžλ¦¬λ₯Ό 0으둜 채움 (총 5자리)

%.2f

μ†Œμˆ˜μ  λ‘˜μ§Έμžλ¦¬κΉŒμ§€ 좜λ ₯

%6.2f

전체 6μΉΈ 쀑 μ†Œμˆ˜μ  2자리 포함


2.4 μ‚¬μš© μ˜ˆμ‹œ

String name = "영희";
int age = 25;
double score = 93.756;

System.out.printf("이름: %s, λ‚˜μ΄: %d%n", name, age);
System.out.printf("점수: %.2f%n", score);
System.out.printf("μ§„ν–‰λ₯ : %d%%%n", 100);

좜λ ₯ κ²°κ³Ό:

이름: 영희, λ‚˜μ΄: 25
점수: 93.76
μ§„ν–‰λ₯ : 100%

3. μš”μ•½ λΉ„κ΅ν‘œ

ν•­λͺ©

μ˜ˆμ‹œ

μ„€λͺ…

μ΄μŠ€μΌ€μ΄ν”„ 문자

\n, \t, \\

λ¬Έμžμ—΄ λ‚΄λΆ€ μ œμ–΄

μ„œμ‹ 문자 (printf)

%d, %.2f, %s

ν˜•μ‹μ„ μ§€μ •ν•˜μ—¬ 좜λ ₯


4. μ½˜μ†” 색상 좜λ ₯ (ANSI 컬러)

Java μžμ²΄λŠ” μ½˜μ†” 색상 κΈ°λŠ₯을 μ œκ³΅ν•˜μ§€ μ•Šμ§€λ§Œ, ν„°λ―Έλ„μ—μ„œ ANSI μ½”λ“œλ₯Ό μ‚¬μš©ν•˜λ©΄ 좜λ ₯ 색을 λ³€κ²½ν•  수 μžˆλ‹€.

public class ColorExample {
    public static final String RED = "\u001B[31m";
    public static final String RESET = "\u001B[0m";

    public static void main(String[] args) {
        System.out.println(RED + "이 λ¬Έμž₯은 λΉ¨κ°„μƒ‰μž…λ‹ˆλ‹€." + RESET);
    }
}

색상

ANSI μ½”λ“œ

λΉ¨κ°•

\u001B[31m

초둝

\u001B[32m

λ…Έλž‘

\u001B[33m

νŒŒλž‘

\u001B[34m

리셋

\u001B[0m


5. λ‚ μ§œ 및 μ‹œκ°„ 포맷 좜λ ₯

Javaμ—μ„œλŠ” java.time.LocalDateTimeκ³Ό DateTimeFormatterλ₯Ό μ‚¬μš©ν•΄ λ‚ μ§œ/μ‹œκ°„μ„ μ›ν•˜λŠ” ν˜•μ‹μœΌλ‘œ 좜λ ₯ν•  수 μžˆλ‹€.


5.1 DateTimeFormatter κΈ°λ³Έ μ‚¬μš©

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

LocalDateTime now = LocalDateTime.now();
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
System.out.println("ν˜„μž¬ μ‹œκ°„: " + now.format(fmt));

5.2 μ£Όμš” 포맷 νŒ¨ν„΄

νŒ¨ν„΄

의미

μ˜ˆμ‹œ

yyyy

연도

2025

MM

μ›”

05

dd

일

22

HH

μ‹œκ°„ (24μ‹œκ°„μ œ)

14

hh

μ‹œκ°„ (12μ‹œκ°„μ œ)

02

mm

λΆ„

07

ss

초

59

a

μ˜€μ „/μ˜€ν›„

AM

/

PM

E

μš”μΌ

Wed


5.3 μ‚¬μš©μž μ§€μ • 포맷 μ˜ˆμ‹œ

DateTimeFormatter customFmt = DateTimeFormatter.ofPattern("yyyyλ…„ MMμ›” dd일 (E) a hh:mm");
String formatted = now.format(customFmt);
System.out.println("ν˜•μ‹ν™”λœ μ‹œκ°„: " + formatted);

6. λ‘œκΉ…μš© 포맷 좜λ ₯

Javaμ—λŠ” κΈ°λ³Έ 둜그 μ‹œμŠ€ν…œμΈ java.util.logging.Loggerκ°€ μžˆλ‹€.


6.1 Logger κΈ°λ³Έ μ‚¬μš©

import java.util.logging.*;

Logger logger = Logger.getLogger("MyLogger");

logger.info("정보 λ©”μ‹œμ§€");
logger.warning("κ²½κ³  λ©”μ‹œμ§€");
logger.severe("μ—λŸ¬ λ©”μ‹œμ§€");

6.2 포맷 λ¬Έμžμ—΄κ³Ό ν•¨κ»˜ μ“°κΈ°

String name = "닀인";
int age = 25;
logger.info(String.format("μ‚¬μš©μž 이름: %s, λ‚˜μ΄: %d", name, age));

6.3 둜그 레벨 μ’…λ₯˜

레벨

μ„€λͺ…

SEVERE

μ‹¬κ°ν•œ 였λ₯˜

WARNING

κ²½κ³ 

INFO

일반 정보

CONFIG

μ„€μ • κ΄€λ ¨ 정보

FINE

디버깅 μˆ˜μ€€μ˜ 정보


6.4 좜λ ₯ ν˜•μ‹ μ»€μŠ€ν„°λ§ˆμ΄μ§•



Java μ •κ·œμ‹(Regular Expression)


1. κ°œμš”

μ •κ·œν‘œν˜„μ‹(Regular Expression)은 νŠΉμ • λ¬Έμžμ—΄μ„ νŒ¨ν„΄μ— 맞게 검색, λŒ€μ²΄, κ²€μ¦ν•˜λŠ” 데 μ‚¬μš©λ˜λŠ” κ°•λ ₯ν•œ 도ꡬ이닀. μžλ°”μ—μ„œλŠ” java.util.regex νŒ¨ν‚€μ§€λ₯Ό 톡해 μ •κ·œν‘œν˜„μ‹μ„ μ‚¬μš©ν•  수 μžˆλ‹€.

1.1. μ •κ·œν‘œν˜„μ‹ ꡬ성 μš”μ†Œ

μ •κ·œν‘œν˜„μ‹μ€ 기본적인 문법과 특수 문자λ₯Ό μ‘°ν•©ν•˜μ—¬ λ§Œλ“€μ–΄μ§€λ©°, 자주 μ‚¬μš©λ˜λŠ” λͺ‡ κ°€μ§€ μ£Όμš” ꡬ성 μš”μ†Œκ°€ μžˆλ‹€.

1.2. 자주 μ‚¬μš©λ˜λŠ” νŒ¨ν„΄

2. μžλ°”μ—μ„œ μ •κ·œν‘œν˜„μ‹ μ‚¬μš©ν•˜κΈ°

2.1. Pattern 클래슀

Pattern ν΄λž˜μŠ€λŠ” μ •κ·œν‘œν˜„μ‹μ˜ νŒ¨ν„΄μ„ μ»΄νŒŒμΌν•˜λŠ” 데 μ‚¬μš©λœλ‹€. 이 ν΄λž˜μŠ€λŠ” μ •κ·œν‘œν˜„μ‹ νŒ¨ν„΄μ„ λ§€μΉ­ν•˜κ³  κ²€μƒ‰ν•˜λŠ” 방법을 μ œκ³΅ν•œλ‹€.

2.1.1. Pattern 컴파일

Pattern pattern = Pattern.compile("a*b");

μœ„μ˜ μ½”λ“œμ—μ„œ "a*b"λŠ” 'a'κ°€ 0번 이상 반볡되고 뒀에 'b'κ°€ μ˜€λŠ” νŒ¨ν„΄μ„ μ˜λ―Έν•œλ‹€.

2.1.2. Matcher 클래슀 μ‚¬μš©

Matcher ν΄λž˜μŠ€λŠ” Pattern 객체λ₯Ό μ‚¬μš©ν•˜μ—¬ λ¬Έμžμ—΄κ³Όμ˜ 맀칭을 μ²˜λ¦¬ν•œλ‹€.

Pattern pattern = Pattern.compile("a*b");
Matcher matcher = pattern.matcher("aaab");
boolean matches = matcher.matches(); // true

2.2. Patternκ³Ό Matcher의 μ£Όμš” λ©”μ„œλ“œ

3. μ •κ·œν‘œν˜„μ‹ ν™œμš© μ˜ˆμ‹œ

3.1. 이메일 μ£Όμ†Œ 검증

이메일 μ£Όμ†Œκ°€ μœ νš¨ν•œμ§€ κ²€μ‚¬ν•˜λŠ” μ •κ·œν‘œν˜„μ‹ μ˜ˆμ‹œ

Pattern pattern = Pattern.compile("^[a-zA-Z0-9_+&*-]+(?:\\.[a-zA-Z0-9_+&*-]+)*@(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,7}$");
Matcher matcher = pattern.matcher("example@domain.com");
boolean isValid = matcher.matches(); // true

3.2. μ „ν™”λ²ˆν˜Έ ν˜•μ‹ 검증

μ „ν™”λ²ˆν˜Έ ν˜•μ‹μ΄ λ§žλŠ”μ§€ κ²€μ‚¬ν•˜λŠ” μ •κ·œν‘œν˜„μ‹ μ˜ˆμ‹œ

Pattern pattern = Pattern.compile("^\\d{3}-\\d{3,4}-\\d{4}$");
Matcher matcher = pattern.matcher("010-1234-5678");
boolean isValid = matcher.matches(); // true


Java Arrays.sort() 정리


1. κ°œμš”


2. κΈ°λ³Έ 문법

Arrays.sort(λ°°μ—΄);

λ§€κ°œλ³€μˆ˜

μ„€λͺ…

λ°°μ—΄

μ •λ ¬ λŒ€μƒ (예: int[], char[], String[])


3. λ°˜ν™˜κ°’μ΄ void인 이유

ν•­λͺ©

μ„€λͺ…

제자리 μ •λ ¬

Arrays.sort()λŠ” 원본 λ°°μ—΄ 자체λ₯Ό μˆ˜μ •ν•¨

μƒˆλ‘œμš΄ λ°°μ—΄ λ°˜ν™˜ μ•ˆ 함

μ •λ ¬λœ 배열을 μƒˆλ‘œ λ§Œλ“€μ–΄ λ°˜ν™˜ν•˜μ§€ μ•ŠμŒ

λ©”λͺ¨λ¦¬ μ ˆμ•½

λΆˆν•„μš”ν•œ λ°°μ—΄ 볡사 없이 λΉ λ₯Έ μ •λ ¬ μˆ˜ν–‰ κ°€λŠ₯

ν• λ‹Ή X

int[] sorted = Arrays.sort(arr); ❌ 였λ₯˜ λ°œμƒ


4. μ˜ˆμ‹œ

int[] numbers = {3, 1, 4};
Arrays.sort(numbers);  // numbers μžμ²΄κ°€ 정렬됨

System.out.println(Arrays.toString(numbers)); // [1, 3, 4]

5. ν”ν•œ μ‹€μˆ˜ μ˜ˆμ‹œ ❌

int[] sorted = Arrays.sort(numbers); // ❌ 컴파일 μ—λŸ¬: voidλ₯Ό int[]에 λŒ€μž…ν•  수 μ—†μŒ

6. λŒ€μ•ˆ: μ •λ ¬λœ 배열을 μƒˆλ‘œ λ§Œλ“€κ³  μ‹Άλ‹€λ©΄?

int[] original = {3, 1, 2};
int[] copy = Arrays.copyOf(original, original.length);
Arrays.sort(copy);

7. κ΄€λ ¨ λ©”μ„œλ“œ

λ©”μ„œλ“œ

μ„€λͺ…

Arrays.sort(arr)

κΈ°λ³Έ μ˜€λ¦„μ°¨μˆœ μ •λ ¬

Arrays.sort(arr, Comparator)

μ‚¬μš©μž μ •μ˜ κΈ°μ€€ μ •λ ¬ (객체 λ°°μ—΄)

Collections.sort(list)

리슀트 μ •λ ¬ (λ°˜ν™˜κ°’ μ—†μŒ)



Java λ°°μ—΄ κ΄€λ ¨ μ£Όμš” λ©”μ„œλ“œ 정리


1. λ°°μ—΄ 비ꡐ: Arrays.equals()

Arrays.equals(array1, array2);

μ„€λͺ…

λ‚΄μš©

비ꡐ λŒ€μƒ

두 λ°°μ—΄μ˜ 크기와 μš”μ†Œ 값을 λͺ¨λ‘ 비ꡐ

λ°˜ν™˜κ°’

true(κ°™μŒ), false (닀름)

주의

== λ˜λŠ”.equals()λŠ” λ°°μ—΄ μ£Όμ†Œ λΉ„κ΅μ΄λ―€λ‘œ μ‚¬μš© ❌

πŸ” μ˜ˆμ‹œ:

int[] a = {1, 2, 3};
int[] b = {1, 2, 3};
System.out.println(Arrays.equals(a, b)); // βœ… true
System.out.println(a == b);              // ❌ false (μ£Όμ†Œ 비ꡐ)

2. λ°°μ—΄ 볡사: Arrays.copyOf()

Arrays.copyOf(원본배열, 볡사할길이);

원본 λ°°μ—΄μ˜ μ•žμ—μ„œλΆ€ν„° μ§€μ •ν•œ 길이만큼 λ³΅μ‚¬ν•˜μ—¬ μƒˆ 배열을 μƒμ„±ν•œλ‹€.
λ°˜ν™˜κ°’μ€μƒˆλ‘œμš΄ 배열이고, 원본과 λ³„κ°œμ˜ 객체이닀.

πŸ” μ˜ˆμ‹œ:

int[] original = {1, 2, 3, 4};
int[] copied = Arrays.copyOf(original, 2);  // [1, 2]

✨ ν™•μž₯ μ‚¬μš©: 길이 초과 μ‹œ 0으둜 채움

int[] extended = Arrays.copyOf(original, 6);  // [1, 2, 3, 4, 0, 0]

3. λΆ€λΆ„ 볡사: Arrays.copyOfRange()

Arrays.copyOfRange(λ°°μ—΄, μ‹œμž‘μΈλ±μŠ€, 끝인덱슀);

μ‹œμž‘ μΈλ±μŠ€λΆ€ν„° 끝 인덱슀 μ „κΉŒμ§€ λ³΅μ‚¬ν•œλ‹€.

λ°˜ν™˜κ°’μ€ μƒˆλ‘œμš΄ λ°°μ—΄ (ꡬ간 볡사)이닀.

ν•œ λ§ˆλ””λ‘œ λ°°μ—΄μ˜ μŠ¬λΌμ΄μ‹±μ„ κ΅¬ν˜„ν•œλ‹€.

πŸ” μ˜ˆμ‹œ:

int[] sub = Arrays.copyOfRange(original, 1, 3);  // [2, 3]

4. λ°°μ—΄ μ •λ ¬: Arrays.sort()

Arrays.sort(λ°°μ—΄);

배열을 μ˜€λ¦„μ°¨μˆœ μ •λ ¬ν•  λ•Œ μ“΄λ‹€. (in-place μ •λ ¬, λ°˜ν™˜κ°’ μ—†μŒ void)

voidνƒ€μž…μ„ λ°˜ν™˜ν•˜κΈ° λ•Œλ¬Έμ— μƒˆλ‘œμš΄ λ³€μˆ˜μ— 담을 수 μ—†λ‹€.

μ •λ ¬ κΈ°μ€€(숫자: μ˜€λ¦„μ°¨μˆœ, λ¬Έμžμ—΄: μœ λ‹ˆμ½”λ“œ κΈ°μ€€)

πŸ” μ˜ˆμ‹œ:

int[] arr = {5, 1, 3};
Arrays.sort(arr);  // arr β†’ [1, 3, 5]

5. λ°°μ—΄ 좜λ ₯: Arrays.toString()

Arrays.toString(λ°°μ—΄);

λ°°μ—΄μ˜ λ‚΄μš©μ„ λ¬Έμžμ—΄λ‘œ 좜λ ₯ν•œλ‹€. (λ””λ²„κΉ…μš©)

πŸ” μ˜ˆμ‹œ:

System.out.println(Arrays.toString(arr)); // [1, 3, 5]

6. λ°°μ—΄ μ±„μš°κΈ°: Arrays.fill()

Arrays.fill(λ°°μ—΄, κ°’);

λͺ¨λ“  μš”μ†Œλ₯Ό λ™μΌν•œ κ°’μœΌλ‘œ μ΄ˆκΈ°ν™”ν•œλ‹€.

πŸ” μ˜ˆμ‹œ:

int[] arr = new int[5];
Arrays.fill(arr, 7); // arr β†’ [7, 7, 7, 7, 7]

7. λ°°μ—΄ 이진 탐색: Arrays.binarySearch()

Arrays.binarySearch(μ •λ ¬λœλ°°μ—΄, 찾을값);

μ •λ ¬λœ λ°°μ—΄μ—μ„œ 이진 탐색을 μˆ˜ν–‰ν•œλ‹€.
λ°˜ν™˜κ°’μ€ μΈλ±μŠ€μ΄λ‹€. (μ—†μœΌλ©΄ 음수)

πŸ” μ˜ˆμ‹œ:

int[] sorted = {1, 2, 3, 4};
int idx = Arrays.binarySearch(sorted, 3); // 2

βœ… μš”μ•½

κΈ°λŠ₯

λ©”μ„œλ“œ

λ°°μ—΄ λ‚΄μš© 비ꡐ

Arrays.equals()

전체 볡사

Arrays.copyOf()

λΆ€λΆ„ 볡사

Arrays.copyOfRange()

λ°°μ—΄ μ •λ ¬

Arrays.sort()

λ°°μ—΄ 좜λ ₯

Arrays.toString()

λ°°μ—΄ μ΄ˆκΈ°ν™”

Arrays.fill()

이진 탐색

Arrays.binarySearch


βœ… μ½”ν…Œμ—μ„œ 자주 μ“°λŠ” μ‘°ν•©

상황

μΆ”μ²œ μ‘°ν•©

두 λ¬Έμžμ—΄μ΄ 같은 문자둜 μ΄λ£¨μ–΄μ‘ŒλŠ”μ§€ 확인

toCharArray() β†’ Arrays.sort() β†’ Arrays.equals()

원본 λ°°μ—΄ μœ μ§€ν•˜λ©° μ •λ ¬

Arrays.copyOf() + Arrays.sort()

λ°°μ—΄ 슬라이슀

Arrays.copyOfRange()