Zeta Oph's Study

[Java - 기초 문법] 03. 문자열(String) 본문

프로그래밍/Java

[Java - 기초 문법] 03. 문자열(String)

Zeta Oph 2024. 1. 26. 01:17

https://crane206265.tistory.com/57

 

[Java - 기초 문법] 02. 자료형과 변수 & 상수

https://crane206265.tistory.com/56 [Java - 기초 문법] 01. 출력 정말 오랜만에 티스토리 글 쓰러 왔습니다... 이제 대학생이 되어서 수강신청을 했는데, 어쩌다 보니 2학년 전공과목부터 듣게 되어서;; 강제

crane206265.tistory.com

이 글에서는 Java의 문자열(String)에 대해 다루어보겠습니다.


자료형 String

String은 문자열을 나타내는 자료형입니다. 생성하는 방법은 두 종류가 있습니다. 단순히 ""로 감싸거나, new String("")의 형식으로 생성하거나. new 키워드 항상 새 객체를 생성한다는 특징이 있습니다. 객체에 대해서는 나중에 다루도록 하겠습니다. 지금은 그냥 "새로 생성한다" 정도로 알고 있으면 됩니다.

public class Test {
    public static void main(String[] args) {
        String a = "Astronomy is physics";
        String b = new String("Physics is mathmatics");
        System.out.println(a);
        System.out.println(b);
    }
}
TERMINAL

Astronomy is physics
Physics is mathmatics

문자열 합치기

문자열 여러개를 합치는 방법은, 문자열 사이를 +로 연결해주면 됩니다. 예를 들어, "Astronomy" + "is physics"를 하면 "Astronomy is physics"가 되는 방식이죠.

재밌는 것은, 수끼리 + 연산을 하면 덧셈 연산이 되지만, 문자열과 수 사이에 + 연산을 하면 수를 문자열로 처리하고 연산한다는 점입니다. + 연산은 앞에부터 진행하기 때문에 아래와 같은 결과를 얻을 수 있습니다.

public class Test {
    public static void main(String[] args) {
        String a = "Astronomy is physics";
        int b = 123;
        int c = 123;
        System.out.println(a+b+c);
        System.out.println(b+c+a);
    }
}

 

TERMINAL

Astronomy is physics123123
246Astronomy is physics

 

첫 번째 결과는 (a+b)+c로 처리되어서 문자열로 쭉 이어진 것이고, 두 번째 결과는 (b+c)+a로 처리되어서 덧셈을 먼저한 후 문자열로 잇게 된 것입니다.


equals 메서드

equals 메서드는 두 문자열의 값이 같은지를 비교해줍니다. 결과값은 boolean으로 반환됩니다. 문자열 a와 b를 비교하려면 a.equals(b) 또는 b.equals(a)와 같이 사용할 수 있습니다. 주의할 점은 문자열을 비교할 때 ==을 사용하는 것은 피해야한다는 것입니다. 아래 결과를 통해 설명할 수 있습니다.

public class Test {
    public static void main(String[] args) {
        String a = "Astronomy is physics";
        String b = "Astronomy is physics";
        String c = new String("Astronomy is physics");
        System.out.println(a.equals(b));
        System.out.println(a.equals(c));
        System.out.println(a==b);
        System.out.println(a==c);
    }
}
TERMINAL

true
true
true
false

 

보시다시피, equals 메서드는 값이 같으면 true, 다르면 false를 출력합니다. 반면 == 를 사용하면, new 키워드로 생성한 문자열은 값이 같아도 다르다는 결과가 나옵니다. new 키워드로 문자열을 생성하면 새로운 객체를 만들기 때문에, 두 문자열의 값은 같지만 주소가 달라서 생기는 일입니다.


indexOf 메서드

indexOf 메서드는 문자열에서 특정 문자열이 시작하는 인덱스 넘버를 반환합니다. 아래와 같이 사용할 수 있습니다.

public class Test {
    public static void main(String[] args) {
        String a = "Astronomy is physics";
        System.out.println(a.indexOf("physics"));
    }
}
TERMINAL

13

contains 메서드

contains 메서드는 문자열에서 특정 문자열이 있는지를 boolean으로 반환합니다. 아래와 같이 사용할 수 있습니다.

public class Test {
    public static void main(String[] args) {
        String a = "Astronomy is physics";
        System.out.println(a.contains("physics"));
    }
}
TERMINAL

true

charAt 메서드

charAt 메서드는 문자열에서 특정 위치의 문자를 char 형태로 반환합니다. 아래와 같이 사용할 수 있습니다.

public class Test {
    public static void main(String[] args) {
        String a = "Astronomy is physics";
        System.out.println(a.charAt(10));
    }
}
TERMINAL

i

replaceAll 메서드

replaceAll 메서드는 문자열에서 특정 문자열을 다른 문자열로 바꿔줍니다. 아래와 같이 사용할 수 있습니다.

public class Test {
    public static void main(String[] args) {
        String a = "Astronomy is physics";
        System.out.println(a.replaceAll("physics","statistics"));
    }
}
TERMINAL

Astronomy is statistics

substring 메서드

substring 메서드는 문자열에서 특정 구간을 추출해줍니다. 아래와 같이 사용할 수 있습니다. 이때 시작 위치는 포함하고, 끝 위치는 포함하지 않는다는 것을 유의해야 합니다. (python의 range 범위 지정과 비슷합니다.)

public class Test {
    public static void main(String[] args) {
        String a = "Astronomy is physics";
        System.out.println(a.substring(0, 9));
    }
}
TERMINAL

Astronomy

toUpperCase / toLowerCase 메서드

toUpperCase 메서드는 문자열을 모두 대문자로 변경합니다. toLowerCase 메서드는 문자열을 모두 소문자로 변경합니다. 이때 영어가 아닌 문자들은 바뀌지 않습니다. 아래와 같이 사용할 수 있습니다.

public class Test {
    public static void main(String[] args) {
        String a = "Astronomy is physics!";
        System.out.println(a.toUpperCase());
        System.out.println(a.toLowerCase());
    }
}
TERMINAL

ASTRONOMY IS PHYSICS!
astronomy is physics!

split 메서드

split 메서드는 문자열을 특정 문자열을 기준으로 구분하여 나누고, 이를 배열에 저장하여 문자열 배열을 반환합니다. 아래와 같이 사용할 수 있습니다.

public class Test {
    public static void main(String[] args) {
        String a = "Astronomy,Physics,Informatics,Mathmatics";
        String[] b = a.split(",");
        System.out.println(b[0]+"&"+b[2]);
    }
}
TERMINAL

Astronomy&Informatics

문자열 formatting

문자열 formatting은 문자열 안의 특정한 값을 바꿀 수 있게 해줍니다. 값이 계속 바뀔 부분만 formatting 해주면, 일일이 값을 입력하지 않고 편하게 사용할 수 있습니다. String.format 매서드를 사용합니다. formatting할 자리에 알맞은 format code를 넣어주고, 뒤에 값을 전달하면 됩니다. 여러개 하려면 순서대로 값을 전달해주면 됩니다.

public class Test {
    public static void main(String[] args) {
        String a = "Score : %d, Grade : %c";
        System.out.println(String.format("Score : %d, Grade : %c", 100, 'A'));
        System.out.println(String.format(a, 85, 'B'));
    }
}
TERMINAL

Score : 100, Grade : A
Score : 85, Grade : B

 

몇 가지 format code를 정리하면 아래와 같습니다.

%s 문자열(String) %o 8진수
%c 문자(char) %x 16진수
%d 정수(int, long) %% 문자 % 자
%f 부동소수(double, float)    

 

%s에는 어떤 것을 대입해도 문자열로 바꾸어서 작동됩니다. %s를 받는 위치에 int 자료형 123을 넣어도 "123"으로 바꾸어서 작동된다는 거죠. 하지만 다른 것은 그렇지 않으니 유의해야합니다. (%d 자리에 double형을 넣어도 정수로 바꾸어주지 않습니다.)

 

 

정렬 및 공백 표현

%10s, %10d와 같이 쓰면 오른쪽 정렬을 사용하여 10개의 칸을 사용하여 출력하게 됩니다. 길이가 10자보다 짧더라도 공백으로 남기고 10칸을 채우는 것이죠. 물론 %s, %d 말고 다른 것도 사용 가능합니다. 왼쪽 정렬을 하고 싶다면 %-10s와 같이 사용하면 됩니다.

public class Test {
    public static void main(String[] args) {
        String a = "PI : %10f...";
        String b = "PI : %-10f...";
        System.out.println(String.format(a, 3.141592));
        System.out.println(String.format(b, 3.141592));
    }
}
TERMINAL

PI :   3.141592...
PI : 3.141592  ...

 

 

 

소수점 표현

실수를 표현할 때는 소수점 아래 몇 자리까지 표시할 것인지 지정할 수 있습니다. %.4f와 같이 쓰면, 소수점 아래 넷째자리까지 표현합니다. 원래 수가 그것보다 소수점 아래 자릿수가 많으면 반올림하여 넷째자리까지만 쓰고, 그것보다 적다면 0으로 채워서 표현합니다. 소수점 표현은 %10.4f 처럼 위의 공백 표현과 같이 사용할 수 있습니다.

public class Test {
    public static void main(String[] args) {
        String a = "PI : %.4f...";
        System.out.println(String.format(a, 3.141592));
    }
}
TERMINAL

PI : 3.1416...

 

 

 

System.out.printf

System.out.printf() 메서드는 System.out.println(String.format())을 줄인 것입니다. 정확히 말하면, String.format은 문자열을 리턴하는 메서드이고, String.out.printf는 문자열을 출력하는 메서드입니다.

public class Test {
    public static void main(String[] args) {
        String a = "PI : %.4f...";
        System.out.println(String.format(a, 3.141592));
        System.out.printf(a, 3.141592);
    }
}
TERMINAL

PI : 3.1416...
PI : 3.1416...

이렇게 String에 대해 알아보았습니다. 유용한 메서드가 많은 것 같은데, 이를 기억해놓으면 은근히 편리해질 것 같습니다.