소개
String
은 가장 널리 사용되는 Java 클래스 중 하나입니다. 이 기사는 String
에 관한 연습 문제와 답변을 제공하여 인터뷰 준비에 도움을 줍니다.
또한 Java String 퀴즈를 시도하여 String
클래스에 대한 지식을 테스트할 수 있습니다.
Java에서 String
클래스는 무엇인가요? String
은 데이터 유형인가요?
String
은 Java에서 정의된 java.lang
패키지에 있는 클래스입니다. int
와 long
과 같은 기본 데이터 유형이 아닙니다. String
클래스는 문자열을 나타냅니다. String
은 거의 모든 Java 애플리케이션에서 사용됩니다. String
은 Java에서 불변하고 최종적이며 JVM은 문자열 풀을 사용하여 모든 String
객체를 저장합니다. 큰따옴표를 사용하여 String
객체를 인스턴스화할 수 있으며, 연결에 대해 +
연산자를 오버로드할 수 있습니다.
Java에서 String
객체를 생성하는 다양한 방법은 무엇인가요?
new
연산자를 사용하여 String
객체를 생성하거나, 큰따옴표를 사용하여 String
객체를 생성할 수 있습니다. 예를 들어:
String str = new String("abc");
String str1 = "abc";
String
클래스에는 char 배열
, byte 배열
, StringBuffer
, StringBuilder
등으로부터 String
을 얻을 수 있는 여러 생성자가 있습니다.
큰따옴표를 사용하여 String
을 생성할 경우, JVM은 String 풀에서 동일한 값을 가진 다른 String
이 있는지 확인합니다. 만약 풀에 이미 해당 String
이 저장되어 있다면, JVM은 해당 String
객체에 대한 참조를 반환합니다. 새로운 String
이 풀에 없다면, JVM은 주어진 값으로 새로운 String
객체를 생성하고 풀에 저장합니다. new
연산자를 사용할 경우, JVM은 String
객체를 생성하지만 풀에 저장하지는 않습니다. intern()
메소드를 사용하여 String
객체를 String 풀에 저장하거나, 이미 풀에 동일한 값의 String
이 있는 경우 해당 참조를 반환할 수 있습니다.
입력 문자열이 회문인지 확인하는 자바 메소드를 작성하세요.
A string is a palindrome if its value is the same when reversed. For example, aba
is a palindrome string. The String
class doesn’t provide any method to reverse the string but the StringBuffer
and StringBuilder
classes have a reverse()
method that you can use to check whether a string is a palindrome. For example:
private static boolean isPalindrome(String str) {
if (str == null)
return false;
StringBuilder strBuilder = new StringBuilder(str);
strBuilder.reverse();
return strBuilder.toString().equals(str);
}
가끔 면접관은 회문을 확인하기 위해 다른 클래스를 사용하지 말라고 요청할 수 있습니다. 이 경우, 문자열의 양 끝에서 문자를 비교하여 회문인지 확인할 수 있습니다. 예를 들어:
private static boolean isPalindromeString(String str) {
if (str == null)
return false;
int length = str.length();
System.out.println(length / 2);
for (int i = 0; i < length / 2; i++) {
if (str.charAt(i) != str.charAt(length - i - 1))
return false;
}
return true;
}
주어진 문자열에서 주어진 문자를 제거하는 자바 메소드를 작성하세요.
replaceAll
메소드를 사용하여 문자열의 모든 발생을 다른 문자열로 대체할 수 있습니다. 중요한 점은 replaceAll()
이 String
을 인수로 받으므로 Character
클래스를 사용하여 문자열을 생성하고 빈 문자열로 모든 문자를 대체할 수 있다는 것입니다.
private static String removeChar(String str, char c) {
if (str == null)
return null;
return str.replaceAll(Character.toString(c), "");
}
자바에서 문자열을 대문자 또는 소문자로 변경하는 방법은 무엇인가요?
String
클래스의 toUpperCase
및 toLowerCase
메서드를 사용하여 String
객체를 모두 대문자 또는 소문자로 얻을 수 있습니다. 이러한 메서드에는 Locale
인수를 허용하는 변형이 있으며, 주어진 로캘이 제공하는 규칙을 사용하여 문자열을 대문자 또는 소문자로 변환합니다.
String subSequence
메서드는 무엇인가요?
Java 1.4에서는 CharSequence
인터페이스를 도입하고 String
클래스가 이 인터페이스를 구현하기 때문에 String
클래스에는 subSequence
메서드가 있습니다. 내부적으로 subSequence
메서드는 String substring
메서드를 호출합니다.
Java 프로그램에서 두 개의 문자열을 어떻게 비교하나요?
Java String
은 Comparable
인터페이스를 구현하며, compareTo()
메서드에는 두 가지 변형이 있습니다. compareTo(String anotherString)
메서드는 String
객체를 사전식으로 비교합니다. 만약 String
객체가 인자로 전달된 문자열보다 앞에 온다면 음의 정수를 반환하고, 만약 String
객체가 인자로 전달된 문자열 뒤에 온다면 양의 정수를 반환합니다. 두 String
객체가 같은 값을 가지면 0을 반환합니다. 이 경우, equals(String str)
메서드도 true
를 반환합니다. compareToIgnoreCase(String str)
메서드는 첫 번째 메서드와 비슷하지만 대소문자를 무시합니다. 대소문자를 구분하지 않는 비교를 위해 Comparator
와 CASE_INSENSITIVE_ORDER
를 사용합니다. 값이 0이면 equalsIgnoreCase(String str)
도 true를 반환합니다.
Java에서 문자열을 문자 배열로 변환하는 방법은 무엇인가요?
A String
object is a sequence of characters, so you can’t convert it to a single character. You can use use the charAt
method to get the character at given index or you can use the toCharArray()
method to convert a string to character array. Learn more about converting a string to a character array.
Java에서 문자열을 바이트 배열로 변환하는 방법은 무엇인가요?
getBytes()
메서드를 사용하여 String
객체를 바이트 배열로 변환할 수 있으며, 생성자 new String(byte[] arr)
를 사용하여 바이트 배열을 String
객체로 변환할 수 있습니다. 문자열을 바이트 배열로 변환하는 방법에 대해 더 알아보세요.
Java에서 switch case에서 String
을 사용할 수 있나요?
Java 7은 switch case의 기능을 String
에 확장했습니다. 이전 Java 버전에서는 이를 지원하지 않습니다. 문자열에 대한 조건부 흐름을 구현하는 경우, if-else 문을 사용할 수 있으며, Java 7 이상의 버전을 사용하고 있다면 switch case를 사용할 수 있습니다. Java switch case 문자열에 대해 더 알아보세요.
주어진 문자열의 모든 순열을 출력하는 Java 프로그램을 작성하세요.
문자열의 모든 순열을 찾기 위해 재귀를 사용해야합니다. 예를 들어, AAB
의 순열은 AAB
, ABA
, BAA
입니다. 또한 중복 값을 방지하기 위해 Set
을 사용해야합니다. 문자열의 모든 순열 찾기에 대해 더 알아보세요.
주어진 문자열에서 가장 긴 팰린드롬을 찾는 Java 함수를 작성하세요.
A string can contain palindrome substrings within it. Learn more about how to find the longest palindrome substring in a string.
Java에서 String
, StringBuffer
및 StringBuilder
의 차이점은 무엇인가요?
A String
object is immutable and final in Java, so whenever you manipulate a String
object, it creates a new String
object. String manipulations are resource consuming, so Java provides two utility classes for string manipulations, StringBuffer
and StringBuilder
.
StringBuffer
과 StringBuilder
는 가변 클래스입니다. StringBuffer
연산은 스레드 안전하고 동기화되어 있지만, StringBuilder
연산은 스레드 안전하지 않습니다. 따라서 멀티 스레드 환경에서는 StringBuffer
를 사용하고, 단일 스레드 환경에서는 StringBuilder
를 사용해야 합니다. StringBuilder
의 성능은 동기화 오버헤드가 없기 때문에 StringBuffer
보다 빠릅니다.
String
, StringBuffer
, StringBuilder
의 차이점과 StringBuffer와 StringBuilder의 벤치마킹에 대해 더 알아보세요.
Java에서 String
이 불변인 이유는 무엇인가요?
String
이 Java에서 불변인 이유는 여러 가지 이점을 제공합니다:
String
이 불변이기 때문에 문자열 풀(String Pool)이 가능합니다.- 값을 변경할 수 없기 때문에 보안이 강화되며, 데이터베이스의 사용자 이름이나 비밀번호와 같은 중요한 정보를 저장하는 데 사용됩니다.
String
이 불변이므로 멀티 스레딩에서 안전하게 사용할 수 있고, 동기화가 필요하지 않습니다.- 문자열은 Java 클래스 로더에서 사용되며 불변성은 올바른 클래스가
ClassLoader
클래스에 의해로드되는 것을 보장합니다.
Java에서 String
이 불변인 이유에 대해 더 알아보세요.
Java에서 문자열을 어떻게 분할하나요?
제공된 정규 표현식에 기반하여 String
을 String
배열로 분할하기 위해 split(String regex)
을 사용할 수 있습니다.
Java에서 암호를 저장하기 위해 왜 문자 배열이 String
보다 선호됩니까?
A String
object is immutable in Java and is stored in the string pool. Once it’s created it stays in the pool until garbage collection completes, so even though you’re done with the password it’s available in memory for longer duration. It’s a security risk because anyone having access to memory dump can find the password as clear text. If you use a character array to store password, you can set it to blank once you’re done with it. You can control for how long it’s available in memory and that avoids the security threat.
Java에서 두 개의 문자열이 동일한지 확인하는 방법은 무엇인가요?
두 개의 문자열이 동일한지 확인하는 두 가지 방법이 있습니다. ==
연산자나 equals()
메소드를 사용할 수 있습니다. ==
연산자를 사용하면 String
의 값과 객체 참조를 모두 확인합니다. 자바 프로그래밍에서는 일반적으로 String
값의 동일성만 확인하려고 합니다. 이 경우 두 개의 String
이 동일한지 확인하기 위해 equals()
메소드를 사용해야 합니다. 대소문자를 무시하려면 equalsIgnoreCase
함수를 사용할 수도 있습니다.
String s1 = "abc";
String s2 = "abc";
String s3 = new String("abc");
System.out.println("s1 == s2 ? " + (s1 == s2)); //true
System.out.println("s1 == s3 ? " + (s1 == s3)); //false
System.out.println("s1 equals s3 ? " + (s1.equals(s3))); //true
자바에서 문자열 풀이란 무엇인가요?
문자열 풀은 자바 힙 메모리에 저장된 String
객체들의 풀입니다. String
은 자바에서 특별한 클래스이며, new
연산자를 사용하거나 큰따옴표 안에 값을 제공하여 String
객체를 생성할 수 있습니다. 자바 문자열 풀에 대해 더 알아보세요.
Java의 String intern()
메서드는 무엇을 하는가요?
intern()
메서드가 호출되면, 풀에 이 String
객체와 동일한 내용을 가진 String
이 이미 있는 경우에는 풀에서 해당 문자열이 반환됩니다. 그렇지 않은 경우에는 이 String
객체가 풀에 추가되고 이 String
객체에 대한 참조가 반환됩니다. 이 메서드는 항상 이 String
과 동일한 내용을 가진 String
객체를 반환하지만, 고유한 문자열 풀에서 가져온 것임이 보장됩니다.
Java에서 String
은 스레드 안전한가요?
A String
object is immutable, so you can’t change its value after creation. This makes the String
object thread-safe and so it can be safely used in a multi-threaded environment. Learn more about thread Safety in Java.
Java에서 String
이 인기 있는 HashMap
키인 이유는 무엇인가요?
String
객체는 변경할 수 없으므로, 해시코드는 생성 시에 캐시되며 다시 계산될 필요가 없습니다. 이로 인해 다른 HashMap
키 객체보다 처리 속도가 빠르기 때문에 맵의 키로 사용하기에 좋은 후보입니다.
출력 결과를 추측하세요
다음 자바 코드 조각의 출력 결과를 추측하여 테스트해보세요.
public class StringTest {
public static void main(String[] args) {
String s1 = new String("digitalocean");
String s2 = new String("DIGITALOCEAN");
System.out.println(s1 = s2);
}
}
Output
DIGITALOCEAN
출력 결과는 DIGITALOCEAN
입니다. 이 코드는 String s2
의 값을 String s1
에 할당하기 때문입니다. =
는 할당 연산자로, (x = y)
형식으로 y
의 값을 x
에 할당합니다. ==
는 두 문자열의 참조 객체가 동일한지 확인하는 비교 연산자입니다.
public class Test {
public void foo(String s) {
System.out.println("String");
}
public void foo(StringBuffer sb) {
System.out.println("StringBuffer");
}
public static void main(String[] args) {
new Test().foo(null);
}
}
Output
Test.java:12: error: reference to foo is ambiguous
new Test().foo(null);
^
both method foo(String) in Test and method foo(StringBuffer) in Test match
이 코드는 컴파일 시간 오류를 발생시킵니다. 왜냐하면 두 개의 foo
메소드가 동일한 이름을 가지고 있으며, main
에서 호출하는 foo
메소드에 null
을 전달하기 때문입니다. 컴파일러는 어떤 메소드를 호출해야 할지 알 수 없습니다. 메소드 X는 타입 Y에 대해 모호합니다 에러도 참조할 수 있습니다.
String s1 = new String("abc");
String s2 = new String("abc");
System.out.println(s1 == s2);
Output
false
출력은 false
입니다. 이는 코드가 new
연산자를 사용하여 String
객체를 생성하므로 힙 메모리에 생성되고 s1
과 s2
는 서로 다른 참조를 가지기 때문입니다. 만약 따옴표만을 사용하여 문자열을 생성한다면, 문자열 풀에 저장되어 true
를 출력할 것입니다.
String s1 = "abc";
StringBuffer s2 = new StringBuffer(s1);
System.out.println(s1.equals(s2));
Output
false
출력은 false
입니다. s2
는 String
타입이 아닙니다. String
클래스의 equals()
메소드 구현은 instanceof
연산자를 사용하여 전달된 객체의 타입이 String
인지 확인하고, 객체가 String
이 아니라면 false
를 반환합니다.
String s1 = "abc";
String s2 = new String("abc");
s2.intern();
System.out.println(s1 == s2);
Output
false
출력은 false
입니다. intern()
메소드는 문자열 풀에서 String
객체 참조를 반환합니다. 그러나 코드에서는 이를 s2
에 다시 할당하지 않으므로 s2
에는 변경이 없고, 따라서 s1
과 s2
는 서로 다른 객체 참조를 가집니다. 만약 3번째 줄의 코드를 s2 = s2.intern();
으로 변경한다면 출력은 true
가 될 것입니다.
다음 코드에 의해 생성되는 String
객체는 몇 개입니까?
String s1 = new String("Hello");
String s2 = new String("Hello");
Answer
답은 세 개입니다. 1번 줄의 코드는 문자열 풀 (첫 번째 객체)에 값이 “Hello”인 String
객체를 생성한 다음 힙 메모리 (두 번째 객체)에 값이 “Hello”인 새로운 String
객체를 생성합니다. 2번 줄의 코드는 힙 메모리 (세 번째 객체)에 값이 “Hello”인 새로운 String
객체를 생성하고 문자열 풀에서 “Hello” 문자열을 재사용합니다.
결론
이 문서에서는 String
에 관한 몇 가지 Java 인터뷰 질문을 검토했습니다.
추천 도서:
Source:
https://www.digitalocean.com/community/tutorials/java-string-interview-questions-and-answers