✅ 문자열을 문자 배열로 변환하는 방법 - toCharArray()
String str = "hello";
char[] charArray = str.toCharArray();
✅ 문자 배열을 문자열로 변환하는 방법 - String 생성자
char[] charArray = {'h', 'e', 'l', 'l', 'o'};
String str = new String(charArray);
✅ StringBuilder 사용법
StringBuilder sb = new StringBuilder("hello");
sb.append(" world");
System.out.println(sb.toString()); // "hello world"
StringBuilder는 문자열을 효율적으로 수정할 수 있는 클래스입니다. 가변적인 문자열을 처리할 때 사용됩니다.
✅ StringBuffer 사용법
StringBuffer sb = new StringBuffer("hello");
sb.append(" world");
System.out.println(sb.toString()); // "hello world"
StringBuffer는 StringBuilder와 비슷하지만 StringBuffer는 쓰레드 안전성을 보장합니다.
하지만 StringBuilder보다 상대적으로 느리기 때문에 코딩테스트에서는 StringBuffer보다 StringBuilder를 사용하는 게 바람직합니다!
✅ 문자열 주요 메소드
☑️ 문자열 비교
String str1 = "hello";
String str2 = new String("hello");
System.out.println(str1 == str2); // false (참조 비교)
System.out.println(str1.equals(str2)); // true (값 비교)
문자열 비교는 == 대신 equals() 메소드를 사용해야 합니다. ==는 참조값을 비교하고, equals()는 문자열 값을 비교합니다.
☑️ 문자열 길이를 반환
String str = "hello world";
int length = str.length();
System.out.println("Length: " + length); // 출력: Length: 11
☑️ 특정 인덱스에 있는 문자 반환
String str = "hello world";
char charAt3 = str.charAt(3); // 0부터 인덱스가 시작되므로 4번째 문자
System.out.println("Character at index 3: " + charAt3); // 출력: Character at index 3: l
☑️ 부분 문자열 반환
String str = "hello world";
String subStr = str.substring(0, 5); // 0번 인덱스부터 5번 인덱스 전까지
System.out.println("Substring (0, 5): " + subStr); // 출력: Substring (0, 5): hello
☑️ 특정 문자열이 처음 나타나는 위치를 반환
String str = "hello world";
int indexOfWorld = str.indexOf("world");
System.out.println("Index of 'world': " + indexOfWorld); // 출력: Index of 'world': 6
☑️ 문자열에서 특정 문자를 다른 문자로 대체
String str = "hello world";
String replacedStr = str.replace('l', 'x');
System.out.println("Replaced 'l' with 'x': " + replacedStr); // 출력: Replaced 'l' with 'x': hexxo worxd
✅ char의 아스키 값을 활용한 문자 변환
char a = 'a';
char upperA = (char) (a - 32); // 'A'
char c = 'd';
char nextChar = (char) (c + 1); // 'e'
각 문자는 아스키 코드 값으로 표현될 수 있습니다.
예를 들어, 'A'는 65, 'a'는 97, '0'은 48 등의 값을 가집니다. 이를 활용하면 문자를 쉽게 변환할 수 있습니다.
☑️ 주요 문자들의 아스키 코드 값
'A' ~ 'Z': 65 ~ 90
'a' ~ 'z': 97 ~ 122
'0' ~ '9': 48 ~ 57
☑️ 대소문자 변환 (Uppercase ↔ Lowercase)
public class CaseConversion {
public static void main(String[] args) {
char lower = 'a';
char upper = (char) (lower - 32); // 'a' -> 'A'
System.out.println("Lower to Upper: " + upper); // 출력: A
char upper2 = 'Z';
char lower2 = (char) (upper2 + 32); // 'Z' -> 'z'
System.out.println("Upper to Lower: " + lower2); // 출력: z
}
}
문자를 소문자로, 소문자를 대문자로 바꾸려면 아스키 코드 값을 활용하여 32를 더하거나 뺄 수 있습니다. char에서 int로 변환 후 계산하고 다시 char로 캐스팅하면 됩니다.
☑️ 문자 배열을 이용한 대소문자 바꾸기
public class ReverseCase {
public static void main(String[] args) {
String str = "Hello World";
char[] charArray = str.toCharArray();
for (int i = 0; i < charArray.length; i++) {
char c = charArray[i];
if (Character.isLowerCase(c)) {
charArray[i] = (char) (c - 32); // 소문자를 대문자로
} else if (Character.isUpperCase(c)) {
charArray[i] = (char) (c + 32); // 대문자를 소문자로
}
}
String reversedCaseStr = new String(charArray);
System.out.println("Reversed Case: " + reversedCaseStr); // 출력: hELLO wORLD
}
}
☑️ 알파벳 순환
알파벳을 주어진 수만큼 시계방향 또는 반시계방향으로 순환시키는 문제에서 자주 활용됩니다. 특히 a부터 z에서만 순환되게 하려면 모듈러 연산을 활용할 수 있습니다.
public class AlphabetShift {
public static void main(String[] args) {
char c = 'x';
int shift = 3;
// 시계방향 순환
char shiftedChar = (char) ('a' + (c - 'a' + shift) % 26);
System.out.println("Shifted Character: " + shiftedChar); // 출력: a
// 반시계방향 순환
char shiftedCharBack = (char) ('a' + (c - 'a' - shift + 26) % 26);
System.out.println("Shifted Back: " + shiftedCharBack); // 출력: u
}
}
☑️ 숫자 ↔ 문자 변환
public class NumberCharConversion {
public static void main(String[] args) {
// 숫자를 문자로 변환
int num = 5;
char numToChar = (char) (num + '0');
System.out.println("Number to Char: " + numToChar); // 출력: '5'
// 문자를 숫자로 변환
char charToNum = '7';
int charToNumber = charToNum - '0';
System.out.println("Char to Number: " + charToNumber); // 출력: 7
}
}
⭐ Character 클래스 활용하기
✅ 문자가 숫자인지 확인하는 방법 - Character.isDigit(char c)
char digitChar = '7';
boolean isDigit = Character.isDigit(digitChar);
System.out.println("Is Digit: " + isDigit); // 출력: true
✅ 문자가 알파벳인지 확인하는 방법 - Character.isLetter(char c)
char lowerChar = 'a';
boolean isLetter = Character.isLetter(lowerChar);
System.out.println("Is Letter: " + isLetter); // 출력: true
✅ 소문자를 대문자로 변환하는 방법 - Character.toUpperCase(char c)
char lowerChar = 'a';
char toUpperCase = Character.toUpperCase(lowerChar);
System.out.println("Lower to Upper using Character.toUpperCase: " + toUpperCase); // 출력: 'A'
✅ 대문자를 소문자로 변환 - Character.toLowerCase(char c)
char upperChar = 'A';
char toLowerCase = Character.toLowerCase(upperChar);
System.out.println("Upper to Lower using Character.toLowerCase: " + toLowerCase); // 출력: 'a'
⭐ 대 ↔ 소문자 변환 : Character 클래스 메서드와 아스키 값 통해 변환하는 방법 성능 비교
- Character.toUpperCase()와 Character.toLowerCase():
- 가독성: 코드가 직관적이고 쉽게 읽힙니다. 다양한 언어와 문자(로케일)를 자동으로 처리합니다.
- 성능: 자바 내부에서 복잡한 로케일 로직을 처리할 수 있어 미세한 성능 손실이 있지만, 일반적인 코딩 테스트나 일상적인 사용에서는 성능 차이는 무시할 정도입니다.
- 범용성: 전 세계의 다양한 문자들을 처리할 수 있습니다.
- 아스키 값을 통한 변환 ((char)(c - 32) 등):
- 성능: 간단한 연산이기 때문에 빠름. 하지만 성능 차이는 미미하며, 코드에서 32를 더하거나 빼는 연산을 사용하는 것이 직관적이지 않아 가독성은 떨어집니다.
- 제한: 오직 영어 알파벳에서만 동작하며, 다른 언어의 문자를 처리할 때는 오작동할 수 있습니다.
결론: 성능 차이는 거의 없으므로 가독성과 범용성을 고려하여 Character 클래스를 사용하는 것이 더 좋은 선택입니다!
'코딩 테스트 일지 📒' 카테고리의 다른 글
[코테/JAVA] 효율적인 출력 방법: 언제 BufferedWriter, 언제 System.out.print, 언제 StringBuilder? (0) | 2024.09.23 |
---|---|
[백준] 2576 홀수 | 구현, 수학 | 브론즈 Ⅲ | JAVA 💡내가 백준 자바 부문 1등?!?! (2) | 2024.09.23 |
[코테/JAVA] 배열 & 리스트 완벽 가이드: 이 글 하나로 한번에 끝내자 🔥 (1) | 2024.09.21 |
[백준] 2439 별 찍기 - 2 | 구현 | 브론즈 Ⅳ | JAVA 💡조건문 대체 (1) | 2024.09.16 |
[백준] 2438 별 찍기 - 1 | 구현 | 브론즈 Ⅴ | JAVA 💡StringBuilder 사용 (0) | 2024.09.16 |