본문 바로가기
프로그래밍/JAVA

초보 자바 프로그래밍(37) - 문자열과 String 클래스

by 머니테크리더 2023. 5. 2.
반응형

문자열 String class 대표 이미지
문자열 String class 대표 이미지

🔖 INDEX

     

     

    문자열은 일련의 문자들로 이루어진 데이터 유형입니다. 자바에서 문자열은 문자를 원소로 하는 배열로 표현됩니다. 문자열은 텍스트 데이터를 처리하거나 저장하는 데 사용되며, 웹 사이트의 내용, 파일의 내용, 사용자 입력 등 다양한 상황에서 활용됩니다. 자바에서 문자열은 String 클래스를 사용하여 표현됩니다. String 클래스는 문자열을 처리하는 데 필요한 다양한 메서드를 제공하며, 문자열 객체를 생성하고 관리할 수 있습니다.

     

    String 클래스의 객체 생성

    String 클래스는 java.lang 패키지에 포함되어 있어 별도의 import 구문 없이 사용할 수 있습니다. String 클래스는 문자열을 처리하는 데 필요한 다양한 메서드를 제공하며, 문자열 객체를 생성하고 관리할 수 있습니다.

     

    String 클래스를 사용하여 문자열을 생성하는 방법은 두 가지입니다.

    첫번째 방법은 문자열 리터럴을 사용하는 것입니다. 이 방법은 문자열을 큰따옴표(" ") 안에 직접 작성하여 표현합니다. 

    String str1 = "Hello, World!";

     

    두 번째 방법은 String 클래스의 생성자를 사용하여 문자열 객체를 생성하는 것입니다. 이 방법은 다양한 문자열 생성자를 사용할 수 있습니다. 

    String str2 = new String("Hello, World!");
    String str3 = new String(new char[] {'H', 'e', 'l', 'l', 'o'});

     

    String 클래스는 불변(immutable) 객체입니다. 즉, 문자열이 한 번 생성되면 변경할 수 없습니다. 이러한 불변성 때문에 문자열 처리 작업이 많은 경우에는 String 클래스를 사용하기 어렵습니다. 대신, 문자열 조작 작업이 많은 경우에는 가변성(mutable)을 가진 StringBuilder와 StringBuffer 클래스를 사용하는 것이 효율적입니다.

     

    String 클래스의 메서드

    String 클래스는 문자열을 처리하기 위한 다양한 메서드를 제공합니다. 일부 주요 메서드는 다음과 같습니다.

    • length(): 문자열의 길이를 반환합니다.
    • charAt(int index): 지정된 인덱스의 문자를 반환합니다.
    • substring(int beginIndex, int endIndex): 지정된 범위의 부분 문자열을 반환합니다.
    • concat(String str): 현재 문자열에 다른 문자열을 연결하여 새 문자열을 반환합니다.
    • indexOf(String str): 지정된 문자열이 처음 나타나는 위치의 인덱스를 반환합니다.
    • lastIndexOf(String str): 지정된 문자열이 마지막으로 나타나는 위치의 인덱스를 반환합니다.
    • replace(char oldChar, char newChar): 문자열에서 일부 문자를 다른 문자로 교체한 새 문자열을 반환합니다.
    • trim(): 문자열 앞뒤의 공백을 제거한 새 문자열을 반환합니다.
    • toLowerCase(): 문자열의 모든 문자를 소문자로 변환한 새 문자열을 반환합니다.
    • toUpperCase(): 문자열의 모든 문자를 대문자로 변환한 새 문자열을 반환합니다.
    • equals(Object obj): 두 문자열이 같은지 여부를 확인합니다.
    • equalsIgnoreCase(String anotherString): 대소문자를 무시하고 두 문자열이 같은지 여부를 확인합니다.

     

    위의 메서드 외에도 String 클래스는 문자열 처리에 필요한 다양한 메서드를 제공합니다.

    몇 가지 추가 메서드는 다음과 같습니다.

    • startsWith(String prefix): 문자열이 지정된 접두사로 시작하는지 여부를 확인합니다.
    • endsWith(String suffix): 문자열이 지정된 접미사로 끝나는지 여부를 확인합니다.
    • split(String regex): 정규 표현식을 기준으로 문자열을 분할하여 문자열 배열로 반환합니다.
    • join(CharSequence delimiter, CharSequence... elements): 구분자와 함께 문자열 배열이나 컬렉션을 결합하여 하나의 문자열로 반환합니다.
    • valueOf(Object obj): 다양한 데이터 타입을 문자열로 변환합니다.
    • compareTo(String anotherString): 문자열을 사전식 순서로 비교하고 결과값을 반환합니다.

     

    String 클래스를 활용한 문자열 연산

    문자열 연산은 문자열에 대해 수행할 수 있는 다양한 작업을 의미합니다. 자바에서 문자열 연산을 처리하기 위해 사용되는 주요 메서드와 기능들은 다음과 같습니다.

     

    1. 문자열 연결

    문자열 연결은 두 개 이상의 문자열을 결합하여 새로운 문자열을 생성하는 작업입니다. 자바에서 문자열 연결은 + 연산자를 사용하거나 concat() 메서드를 사용할 수 있습니다.

    String str1 = "Hello";
    String str2 = "World";
    String result = str1 + " " + str2; // "Hello World"
    String result2 = str1.concat(" ").concat(str2); // "Hello World"

    문자열 연결 작업을 수행하면 새로운 문자열 객체가 생성되므로, 빈번한 연산이 발생하면 메모리 사용과 성능에 영향을 줄 수 있습니다. 이러한 경우에는 StringBuilder 또는 StringBuffer 클래스를 사용하여 문자열을 처리하면 더 효율적입니다.

     

    2. 부분 문자열 추출

    문자열에서 특정 부분을 추출하려면 substring() 메서드를 사용할 수 있습니다. 이 메서드는 시작 인덱스와 선택적으로 끝 인덱스를 인수로 사용하여 문자열의 일부를 반환합니다.

    String str = "Hello World";
    String result = str.substring(0, 5); // "Hello"

     

    3. 문자열 치환

    문자열 내의 특정 문자나 문자열을 다른 문자열로 바꾸려면 replace(), replaceAll(), replaceFirst() 등의 메서드를 사용할 수 있습니다. 우선, replace() 메서드는 문자열에서 주어진 문자 또는 문자열을 찾아 다른 문자 또는 문자열로 모두 대체합니다. 다음은 replace() 메서드를 사용하는 예시입니다.

    String str = "I love cats! Cats are so cute!";
    String replacedStr = str.replace("Cats", "Dogs"); // 대소문자 구분
    String replacedStrIgnoreCase = str.replace("cats", "Dogs"); // 대소문자 구분 없이
    
    System.out.println(replacedStr);
    // 출력: I love cats! Dogs are so cute!
    System.out.println(replacedStrIgnoreCase);
    // 출력: I love Dogs! Dogs are so cute!

    위의 예시에서는 str 문자열에서 "Cats" 또는 "cats"라는 단어를 찾아 모든 일치하는 단어를 "Dogs"로 대체합니다. 첫 번째 예시에서는 대소문자를 구분하여 "Cats"만 대체되었고, 두 번째 예시에서는 대소문자를 무시하고 "cats"와 "Cats" 모두가 "Dogs"로 대체되었습니다. 이 경우, replace() 메서드는 대소문자를 무시하려면 소문자 또는 대문자를 찾아야 합니다.

     

    다음 replaceAll() 메서드는 문자열에서 주어진 정규 표현식과 일치하는 부분을 모두 찾아서 다른 문자열로 대체합니다. 다음은 replaceAll() 메서드를 사용하는 예시입니다.

    String str = "I love cats! Cats are so cute!";
    String replacedStr = str.replaceAll("Cats", "Dogs"); // 대소문자 구분
    String replacedStrIgnoreCase = str.replaceAll("(?i)Cats", "Dogs"); // 대소문자 구분 없이
    
    System.out.println(replacedStr);
    // 출력: I love cats! Dogs are so cute!
    System.out.println(replacedStrIgnoreCase);
    // 출력: I love Dogs! Dogs are so cute!

    replaceFirst() 메서드는 문자열에서 주어진 정규 표현식과 일치하는 첫 번째 부분만 다른 문자열로 대체합니다. 다음은 replaceFirst() 메서드를 사용하는 예시입니다.

    String str = "I love cats! Cats are so cute!";
    String replacedStr = str.replaceFirst("Cats", "Dogs"); // 대소문자 구분
    String replacedStrIgnoreCase = str.replaceFirst("(?i)Cats", "Dogs"); // 대소문자 구분 없이
    
    System.out.println(replacedStr);
    // 출력: I love cats! Dogs are so cute!
    System.out.println(replacedStrIgnoreCase);
    // 출력: I love Dogs! Cats are so cute!

     

     

    4. 문자열 검색

    문자열 내에서 다른 문자열이나 문자의 위치를 찾는 작업을 문자열 검색이라 합니다. indexOf()와 lastIndexOf() 메서드를 사용하여 검색할 수 있습니다. indexOf() 메서드는 문자열 내에서 특정 문자 또는 문자열이 처음 발견되는 인덱스를 반환합니다. 만약 주어진 문자 또는 문자열이 없으면 -1을 반환합니다. 다음은 indexOf() 메서드를 사용하는 예시입니다.

    String str = "Welcome to Java world!";
    
    int index = str.indexOf("Java");
    System.out.println("Index of 'Java': " + index);
    // 출력: Index of 'Java': 11
    
    int notFound = str.indexOf("Python");
    System.out.println("Index of 'Python': " + notFound);
    // 출력: Index of 'Python': -1

    위의 예시에서는 str 문자열에서 "Java"와 "Python"이라는 단어를 찾습니다. "Java"는 문자열에서 인덱스 11에 위치해 있으므로 indexOf() 메서드가 11을 반환합니다. 반면에 "Python"은 문자열에 없으므로 indexOf() 메서드는 -1을 반환합니다.

    lastIndexOf() 메서드는 문자열 내에서 특정 문자 또는 문자열이 마지막으로 발견되는 인덱스를 반환합니다. 만약 주어진 문자 또는 문자열이 없으면 -1을 반환합니다. 다음은 lastIndexOf() 메서드를 사용하는 예시입니다.

    String str = "The quick brown fox jumps over the lazy fox.";
    
    int lastIndex = str.lastIndexOf("fox");
    System.out.println("Last index of 'fox': " + lastIndex);
    // 출력: Last index of 'fox': 40
    
    int notFound = str.lastIndexOf("elephant");
    System.out.println("Last index of 'elephant': " + notFound);
    // 출력: Last index of 'elephant': -1

    위의 예시에서는 str 문자열에서 "fox"와 "elephant"라는 단어를 찾습니다. "fox"는 문자열에서 마지막으로 인덱스 40에 위치해 있으므로 lastIndexOf() 메서드가 40을 반환합니다. 반면에 "elephant"는 문자열에 없으므로 lastIndexOf() 메서드는 -1을 반환합니다.

     

    5. 문자열 분할

    문자열을 특정 구분자를 기준으로 여러 개의 하위 문자열로 분할하는 작업을 말합니다. split() 메서드를 사용하여 문자열을 분할할 수 있습니다.

    String str = "apple,banana,orange,grape";
    String[] fruits = str.split(",");
    
    for (String fruit : fruits) {
        System.out.println(fruit);
    }
    // 출력:
    // apple
    // banana
    // orange
    // grape

    위의 예시에서는 str 문자열을 쉼표(,)를 기준으로 분리하고, 분리된 문자열들을 문자열 배열 fruits에 저장합니다. 배열에 저장된 문자열들을 순차적으로 출력하면 "apple", "banana", "orange", "grape"이 나옵니다.

     

    6. 문자열 비교

    두 문자열을 비교하여 같은지 여부를 확인하려면 equals() 메서드를 사용하며, 대소문자를 구분하지 않는 비교를 원할 경우 equalsIgnoreCase() 메서드를 사용할 수 있습니다. 또한, 사전식 순서로 문자열을 비교하려면 compareTo() 메서드를 사용합니다. 다음은 equals() 메서드를 사용하는 예시입니다.

    String str1 = "Hello, World!";
    String str2 = "Hello, World!";
    String str3 = "Goodbye, World!";
    
    boolean isEqual1 = str1.equals(str2);
    boolean isEqual2 = str1.equals(str3);
    
    System.out.println("str1 and str2 are equal: " + isEqual1);
    System.out.println("str1 and str3 are equal: " + isEqual2);
    
    // str1 and str2 are equal: true
    // str1 and str3 are equal: false

    위의 예시에서 str1과 str2는 같은 내용을 가지고 있으므로 isEqual1은 true입니다. str1과 str3는 다른 내용을 가지고 있으므로 isEqual2는 false입니다. 다음은 equalsIgnoreCase() 메서드를 사용하는 예시입니다.

    String str1 = "Hello World";
    String str2 = "hello world";
    String str3 = "HELLO WORLD";
    
    // 대소문자 구분 없이 비교
    boolean result1 = str1.equalsIgnoreCase(str2); // true
    boolean result2 = str1.equalsIgnoreCase(str3); // true
    boolean result3 = str2.equalsIgnoreCase(str3); // true
    
    System.out.println(result1);
    System.out.println(result2);
    System.out.println(result3);

    위 예제에서는 세 개의 문자열을 만들어서 equalsIgnoreCase() 메소드를 사용하여 대소문자 구분 없이 문자열을 비교하고 있습니다. result1, result2, result3 변수에 저장된 값들은 모두 true입니다. 이것은 equalsIgnoreCase() 메소드가 대소문자를 구분하지 않고 문자열을 비교하기 때문입니다.

    다음은 compareTo() 메서드를 사용하는 예시입니다.

    public class CompareToExample {
        public static void main(String[] args) {
            String str1 = "apple";
            String str2 = "banana";
            String str3 = "apple";
    
            // 문자열 str1과 str2를 compareTo 메소드로 비교하여 결과값을 출력합니다.
            int result1 = str1.compareTo(str2);
            System.out.println("str1.compareTo(str2) = " + result1);
    
            // 문자열 str1과 str3를 compareTo 메소드로 비교하여 결과값을 출력합니다.
            int result2 = str1.compareTo(str3);
            System.out.println("str1.compareTo(str3) = " + result2);
    
            // 문자열 str2과 str1을 compareTo 메소드로 비교하여 결과값을 출력합니다.
            int result3 = str2.compareTo(str1);
            System.out.println("str2.compareTo(str1) = " + result3);
        }
    }
    
    // str1.compareTo(str2) = -1
    // str1.compareTo(str3) = 0
    // str2.compareTo(str1) = 1

    첫 번째 비교에서는 "apple"과 "banana"를 비교하였고, "apple"이 "banana"보다 사전순으로 먼저 오므로 -1이 반환되었습니다. 두 번째 비교에서는 "apple"과 "apple"을 비교하였고, 두 문자열이 같으므로 0이 반환되었습니다. 마지막으로 세 번째 비교에서는 "banana"과 "apple"을 비교하였고, "banana"이 "apple"보다 사전순으로 뒤에 위치하므로 1이 반환되었습니다. 

     

    7. 문자열 길이 확인

    문자열의 길이를 알아내려면 length() 메서드를 사용할 수 있습니다. 이 메서드는 문자열에 포함된 문자의 개수를 반환합니다.

    String str = "Hello, world!";
    int len = str.length();
    System.out.println(len); // 출력 결과: 13

     

     

    8. 문자열 대소문자 변환

    문자열의 모든 문자를 대문자 또는 소문자로 변환하려면 toUpperCase() 또는 toLowerCase() 메서드를 사용할 수 있습니다.

    String str = "Hello world";
    
    String upperCase = str.toUpperCase(); // "HELLO"
    String lowerCase = str.toLowerCase(); // "hello"
    
    System.out.println(upperCase); // 출력: HELLO WORLD
    System.out.println(lowerCase); // 출력: hello world

     

    9. 문자열 앞뒤 공백 제거

    문자열의 앞뒤에 있는 공백을 제거하려면 trim() 메서드를 사용할 수 있습니다.

    String str = " Hello ";
    String trimmed = str.trim(); // "Hello"

     

    10. 문자열에 특정 문자 또는 문자열이 포함되어 있는지 확인

    문자열이 특정 문자 또는 문자열을 포함하고 있는지 확인하려면 contains() 메서드를 사용할 수 있습니다. 다음은 contains() 메소드를 사용하여 문자열에 특정 단어가 포함되어 있는지 여부를 확인하는 예시입니다.

    String sentence = "The quick brown fox jumps over the lazy dog";
    boolean containsWord = sentence.contains("fox");
    System.out.println(containsWord); // true

    위 코드에서, containsWord 변수는 sentence 문자열에 "fox" 단어가 포함되어 있는지 여부를 나타냅니다. contains() 메소드는 true를 반환하므로, containsWord 변수는 true가 됩니다.

    다음은 contains() 메소드를 사용하여 문자열에 특정 문자열이 포함되어 있는지 여부를 확인하는 또 다른 예시입니다.

    String str = "hello world";
    boolean containsChar = str.contains("l");
    System.out.println(containsChar); // true

    위 코드에서, containsChar 변수는 str 문자열에 "l" 문자가 포함되어 있는지 여부를 나타냅니다. contains() 메소드는 true를 반환하므로, containsChar 변수는 true가 됩니다.

     

    이와 같이 자바에서 문자열 연산은 다양한 메서드와 기능을 통해 문자열을 처리하고 조작할 수 있습니다. 이러한 기능들을 잘 활용하면 문자열 관련 작업을 효율적으로 수행할 수 있습니다.

     

     

    댓글