Java - String

제훈·2024년 7월 18일

Java

목록 보기
17/34

String

String : 문자열을 나타내는 자료형

String 인스턴스는 한 번 생성되면 그 값을 읽기만 가능하고 변경할 수는 없다. 이러한 객체를 불변 객체(immutable object) 라고 한다.

즉, 덧셈(+) 연산자를 이용해 문자열을 결합하는 경우 기존 문자열이 변경되는 것 X
문자열이 합쳐진 새로운 String 인스턴스가 생성되는 것

주요 메소드

메소드설명
charAt()해당 문자열의 특정 인덱스에 해당하는 문자를 반환한다. 인덱스는 0부터 시작하는 숫자 체계를 의미하며 인덱스를 벗어난 정수를 인자로 전달하는 경우에는 IndexOutOfBoundsException이 발생한다.
compareTo()인자로 전달된 문자열과 사전 순으로 비교를 하여 두 문자열이 같다면 0 을 반환, 인자로 전달된 문자열보다 작으면 음수를, 크면 양수를 반환한다. 단, 이 메소드는 대소문자를 구분하여 비교한다.
compareToIgnoreCase()대소문자를 구분하지 않고 비교한다
concat()문자열에 인자로 전달된 문자열을 합치기해서 새로운 문자열을 반환한다. 원본 문자열에는 영향을 주지 않는다.
indexOf()문자열에서 특정 문자를 탐색하여 처음 일치하는 인덱스 위치를 정수형으로 반환한다. 단, 일치하는 문자가 없는 경우 -1을 반환한다.
lastIndexOf()문자열 탐색을 뒤에서부터 하고 처음 일치하는 위치의 인덱스를 반환한다. 단, 일치하는 문자가 없는 경우 -1을 반환한다.
trim()문자열의 앞 뒤에 공백을 제거한 문자열을 반환한다.
toLowerCase()모든 문자를 소문자로 변환시킨다. 원본에는 영향을 주지 않는다.
toUpperCase()모든 문자를 대문자로 변환시킨다. 원본에는 영향을 주지 않는다.
substring()문자열의 일부분을 잘라내어 새로운 문자열을 반환한다. 원본에 영향을 주지 않는다.
replace()문자열에서 대체할 문자열로 기존 문자열을 변경해서 반환한다. 원본에 영향을 주지 않는다.
length()문자열의 길이를 정수형으로 반환한다.
isEmpty()문자열의 길이가 0이면 true를 반환, 아니면 false를 반환한다. 길이가 0인 문자열은 null과는 다르다.
split()정규표현식을 이용하여 문자열을 분리한다.

활용

charAt()

해당 인덱스에 있는 문자를 반환한다.

Application

public class Application1 {
    public static void main(String[] args) {
        String str1 = "apple";
        for (int i = 0; i < str1.length(); i++) {
            System.out.println("charAt(" + i + ") = " + str1.charAt(i));
        }
    }
}


compareTo

인자로 전달된 문자열과 사전 순으로 비교를 하여 두 문자열이 같다면 0 을 반환, 인자로 전달된 문자열보다 작으면 음수를, 크면 양수를 반환한다.
단, 이 메소드는 대소문자를 구분하여 비교한다.

Application

public class Application1 {
    public static void main(String[] args) {
        String str1 = "apple";
        for (int i = 0; i < str1.length(); i++) {
            System.out.println("charAt(" + i + ") = " + str1.charAt(i));
        }

        String str2 = "java";
        String str3 = "java";
        String str4 = "JAVA";
        String str5 = "mariaDB";
        
        System.out.println(str2.compareTo(str3));
        System.out.println(str2.compareTo(str4));
        System.out.println(str4.compareTo(str2));
        System.out.println(str2.compareTo(str5));
        System.out.println(str5.compareTo(str2));
    }
}

(int) j : 106, (int) J : 74 라서 32 차이가 나는 것이다.

대소문자 비교 안 할거면 compareToIgnoreCase() 사용하기


concat()

concat() : 문자열 합치기

System.out.println("concat : " + str2.concat(str5));


indexOf(), lastIndexOf()

indexOf() : 문자열에서 특정 문자를 탐색하여 처음 일치하는 인덱스 위치를 정수형으로 반환한다. 단, 일치하는 문자가 없는 경우 -1을 반환한다.

lastIndexOf() : 문자열 탐색을 뒤에서부터 하고 처음 일치하는 위치의 인덱스를 반환한다. 단, 일치하는 문자가 없는 경우 -1을 반환한다.

String indexOf = "java mariaDB";
System.out.println("indexOf('a') = " + indexOf.indexOf('a'));
System.out.println("indexOf('b') = " + indexOf.indexOf('b'));


trim()

trim() : 문자열 앞, 뒤의 공백을 제거한 문자열 반환

String trimStr = "    java    ";
System.out.println("trimStr = #" + trimStr + "#");
System.out.println("trim() = #" + trimStr.trim() + "#");


toLowerCase(), toUpperCase()

toLowerCase() : 모든 문자를 소문자로 변환
toUpperCase() : 모든 문자를 대문자로 변환

String caseStr = "javamariaDB";

System.out.println("toLowerCase() = " + caseStr.toLowerCase());
System.out.println("toUpperCase() = " + caseStr.toUpperCase());
System.out.println("caseStr : " + caseStr);


substring()

substring : 문자열의 일부분을 잘라내 새로운 문자열을 반환하는 것

String javamariaDB = "javamariaDB";

System.out.println("substring(3, 6) : " + javamariaDB.substring(3, 6));
System.out.println("substring(3) : " + javamariaDB.substring(3));
System.out.println("javamariaDB : " + javamariaDB);
  • substring(start, end) : start번째부터 (end - 1)번째 인덱스까지 자른다.
    즉, substring(3, 6) -> 3 ~ 5 인덱스까지 자르기

  • substring(start) : start 인덱스부터 끝까지


replace()

replace() : 문자열에서 대체할 문자열로 기존 문자열을 변경

System.out.println("replace() : " + javamariaDB.replace("java", "python"));
System.out.println("javamariaDB : " + javamariaDB);


length()

length() : 문자열의 길이를 정수형을 반환

System.out.println("length() : " + javamariaDB.length());
System.out.println("빈 문자열 길이 :" + "".length());


isEmpty()

isEmpty() : 문자열의 길이가 0이면 true, 아니면 false

System.out.println("isEmpty() : " + javamariaDB.isEmpty());
System.out.println("isEmpty() : " + "abc".isEmpty());
System.out.println("isEmpty() : " + "".isEmpty());


split()

split() : 특정 문자열을 기준으로 기존 문자열 분리

String emp1 = "100/홍길동/서울/영업부";
String emp2 = "200/유관순//총무부";
String emp3 = "300/이순신/경기도/";
String emp4 = "400/우왕우?마라도/";

위와 같은 데이터들을 특정 문자열을 기준으로 나눠보자.

  1. split()을 활용해서 배열에 저장하기
String[] empArr1 = emp1.split("/");
String[] empArr2 = emp2.split("/");
String[] empArr3 = emp3.split("/");
String[] empArr4 = emp4.split("[/?]"); // 이건 / 하고 ? 2개의 기준으로 split 한다.

System.out.println(Arrays.toString(empArr1));
System.out.println(Arrays.toString(empArr2));
System.out.println(Arrays.toString(empArr3));
System.out.println(Arrays.toString(empArr4));

  1. StringTokenizer 활용
String colors = "red, yellow, green, purple, blue";
StringTokenizer colorStringTokenizer = new StringTokenizer(colors, ", ");

while (colorStringTokenizer.hasMoreTokens()) {
	// System.out.println(colorStringTokenizer.nextToken());
    
    // nextToken은 한 번 저장하고 다음 커서로 이동하기 때문에 연달아 사용하고 싶으면 아래처럼 사용해야 한다.
    String token = colorStringTokenizer.nextToken(); 
    System.out.println(token);
}

"," 문자열 기준으로 토큰 단위로 저장한다.


String 클래스 인스턴스 생성 방식

1. 문자열 비교하는 방식 2가지 확인

아래와 같은 코드가 있을 때 어떻게 출력될까?

public class Application2 {
    public static void main(String[] args) {
        String str1 = "java";
        String str2 = "java";
        String str3 = new String("java");
        String str4 = new String("java");

        System.out.println("str1 == str2 : " + (str1 == str2));
        System.out.println("str2 == str3 : " + (str2 == str3));
        System.out.println("str3 == str4 : " + (str3 == str4));
    }
}

나는 기존에 String 클래스는 == 비교 연산자로 하면 false가 나온다고 알고 있었기에 셋 다 false라고 생각했지만

str1 == str2 에서 주소값을 비교하는데 true? -> str1, str2 는 객체가 1개라는 뜻이다.

  • stack 영역에는 str1, str2, str3, str4 가 생긴다.
  • heap 영역에는 str1, str2는 리터럴 문자열 형태로 받는 경우에 상수 풀 (constant pool)에 "java"라는 동일한 값의 인스턴스가 들어가고, 그 데이터에 대한 주소 값은 str1, str2가 얕은 복사와 같이 되는 것이다.
  • 하지만, new 연산자로 만든 str3, str4 는 각각 다른 주소값을 가진 다른 객체인 것이다.

Application2

public class Application2 {
    public static void main(String[] args) {
        String str1 = "java";
        String str2 = "java";
        String str3 = new String("java");
        String str4 = new String("java");

        System.out.println("str1 == str2 : " + (str1 == str2)); // 주소값을 비교하는데 true? -> str1, str2 는 객체가 1개라는 뜻이다.
        System.out.println("str2 == str3 : " + (str2 == str3));
        System.out.println("str3 == str4 : " + (str3 == str4));

        System.out.println("str1.equals(str3) : " + (str1.equals(str3)));
        System.out.println("str1.hashCode() == str3.hashCode() : " + (str1.hashCode() == str3.hashCode()));
    }
}

즉, 문자열을 비교하고 싶으면 equals() 를 쓰자.


2. 문자열은 불변객체

문자열은 불변객체로 변화를 주면 항상 새로운 객체를 생성한다.

String str = "apple";
System.out.println(System.identityHashCode(str));

str += ", banana";
System.out.println(System.identityHashCode(str));
System.out.println("fruit : " + str);


특수 기능을 위한 문자

이스케이프 문자

이스케이프 문자 : 문자열 내에서 사용하는 특수기능을 위한 문자

  • \n : 개행
  • \t : 탭
  • \' : 작은 따옴표
  • \" : 큰 따옴포
  • \\ : 역슬래시 표기
System.out.println("안녕하세요 \n저는 홍길동입니다.");
System.out.println("안녕하세요 \t저는 홍길동입니다.");

System.out.println("안녕하세요 저는 '홍길동'입니다.");
System.out.println("안녕하세요 저는 \"홍길동\"입니다.");

System.out.println("역슬래시(\\)입니다.");

  • "탭"은 이미 일정 구간으로 나눠논 공간이 있다면 현재 구간에서 다음 구간으로 이동하는데 사용하는 특수기능이기 때문에 어쩔 때는 멀리, 어쩔 때는 조금 이동하기도 한다.

printf 관련 문법

/* %.2f : 소수점 둘째자리까지 실수를 표현하며 셋째자리에서 반올림 */
/* %d : 정수형에서 표현 */
        
System.out.printf("원주율은 %.2f입니다. 우린 %d로 하죠", 3.141592, 3);


문자열을 다양한 기본 자료형을 바꾸기

byte b = Byte.valueOf("1");
short s = Short.valueOf("2");
int i = Integer.valueOf("4");
long l = Long.valueOf("8");
float f = Float.valueOf("4.0");
double d = Double.valueOf("8.0");
boolean isTrue = Boolean.valueOf("true");
char c = "abc".charAt(0);                   // Character가 제공하지 않아 String의 charAt() 사용

반대로 기본 자료형을 문자열로 바꾸기

public class Application3 {
    public static void main(String[] args) {
        String b = Byte.valueOf((byte)1).toString();
        String s = Short.valueOf((short)2).toString();
        String i = Integer.valueOf(4).toString();
        String l = Long.valueOf(8L).toString();
        String f = Float.valueOf(4.0f).toString();
        String d = Double.valueOf(8.0).toString();
        String isTrue = Boolean.valueOf(true).toString();
        String ch = Character.valueOf('a').toString();
        
        /* 기본 자료형을 문자열로 바꿀 때는 간단히 ""을 더해준다 */
        String floatString = 4.0f + "";
    }
}
profile
백엔드 개발자 꿈나무

0개의 댓글