[Java] 문자열 (String)

2022. 7. 31. 19:27·Language/Java
728x90

문자열이랑 문장을 뜻한다.

"Happy Java"
"a"
"123"

자바에서 문자열을 나타내는 자료형은 String 이다.

다음과 같이 사용한다.

String a = "Happy Java";
String b = "a";
String c = "123";
String a = new String("Happy Java");
String b = new String("a");
String c = new String("123");

new 키워드는 객체를 만들 때 사용한다.

보통 문자열을 표현할 때는 가급적 첫번째 방식(리터럴 표기)을 사용하는 것이 좋다. 첫 번째 처럼 사용하면 가독성에 이점이 있고 컴파일 시 최적화에 도움을 주기 때문이다.

리터럴 표기
String a = "happy java" 와 String a = new String("happy java")는 같은 값을 갖게 되지만 완전히 동일하지는 않다. 첫번째 방식을 리터럴(literal) 표기라고 하는데 객체 생성없이 고정된 값을 그대로 대입하는 방법을 말한다. 위 예에서 리터럴 표기법은 "happy java" 라는 문자열을 intern pool 이라는 곳에 저장하고 다음에 다시 동일한 문자열이 선언될때는 cache 된 문자열을 리턴한다. 두번째 방식은 항상 새로운 String 객체를 만든다.

원시(primitive) 자료형

int, long, double, float, boolean, char 등을 자바는 원시(primitive) 자료형 이라고 부른다. 이런 primitive 자료형은 new 키워드로 그 값을 생성할 수 없다.

primitive 자료형은 다음과 같이 리터럴(literal)로만 값을 세팅할 수 있다.

boolean result = true;
char capitalC = 'C';
int i = 100000;

String 은 "Happy Java"와 같이 리터럴로 표기가 가능하지만 primitive 자료형은 아니다. String은 리터럴 표현식을 사용할 수 있도록 자바에서 특별 대우 해 주는 자료형이다.

원시 자료형의 Wrapper 클래스

int, long, double, float, boolean, char 등의 원시 자료형은 다음처럼 각각에 대응하는 Wrapper 클래스들이 존재한다.

원시자료형 Wrapper 클래스
int Integer
long Long
double Double
float Float
boolean Boolean
char Char

ArrayList, HashMap, HashSet 등은 데이터 저장시 원시 자료형 대신 그에 대응하는 Wrapper 클래스들을 사용해야 한다. 원시 자료형 대신 Wrapper 클래스를 사용하면 값 대신 객체를 주고 받을 수 있어 코드를 객체 중심적으로 작성하는데 유리하다. 또한 멀티스레딩 환경에서 동기화를 지원하기 위해서는 Wrapper 클래스가 반드시 필요하다.

문자열 내장 메소드

String 자료형의 내장 메소드 중에서 자주 사용되는 것들

equals

equals는 두개의 문자열이 동일한지를 비교하여 결과값을 리턴한다.

String a = "hello";
String b = "java";
String c = "hello";
System.out.println(a.equals(b)); // false 출력
System.out.println(a.equals(c)); // true 출력

문자열 a 와 문자열 b 는 "hello"와 "java"로 서로 같지 않다. 따라서 equals 메소드 호출 시 false 를 리턴한다. 문자열 a 와 문자열 c 는 "hello"와 "hello"로 서로 같다. 따라서 true 를 리턴한다.

문자열의 값을 비교할때는 반드시 equals 를 사용해야 한다. == 연산자를 사용할 경우 다음과 같은 경우가 발생할 수 있다.

String a = "hello";
String b = new String("hello");
System.out.println(a.equals(b));  // true
System.out.println(a == b);  // false

문자열 a와 b는 모두 "hello"로 같은 값이지만 equals 를 호출했을 때는 true 를 == 연산자를 이용했을 때는 false를 리턴한다. a와 b는 값은 같지만 서로 다른 객체이다. == 은 두개의 자료형이 동일한 객체인지를 판별할 때 사용하는 연산자이기 때문에 false를 리턴한다.

indexOf

indexOf는 문자열에서 특정 문자가 시작되는 위치(인덱스)를 리턴한다.

String a = "Hello Java";

위와 같은 a 문자열에서 "Java"라는 문자열이 시작되는 위치를 알고 싶은 경우 indexOf를 다음과 같이 사용할 수 있다.

String a = "Hello Java";
System.out.println(a.indexOf("Java"));  // 6 출력

"Hello Java" 라는 문자열에서 "Java"라는 문자열은 일곱번째 문자('J')부터 시작이다. 결과값이 6으로 나온 이유는 자바는 숫자를 0부터 세기 때문이다.

contains

contains는 문자열에서 특정 문자열이 포함되어 있는지의 여부를 리턴한다.

String a = "Hello Java";
System.out.println(a.contains("Java"));  // true 출력

문자열 a는 "Java"라는 문자열을 포함하고 있기 때문에 true를 리턴한다.

charAt

charAt은 문자열에서 특정 위치의 문자(char)를 리턴한다.

String a = "Hello Java";

위와 같은 a 문자열에서 "j"라는 문자는 6번째 인덱스에 위치한 문자이다. 6이라는 숫자로 "j"라는 문자를 얻기 위해서는 다음과 같이 chatAt을 사용한다.

String a = "Hello Java";
System.out.println(a.charAt(6));  // "J" 출력

"Hello Java"라는 문자열에서 "j"라는 문자는 일곱번째 문자이다. 하지만 6으로 문자를 찾아야 하는 이유는 자바는 숫자를 0부터 세기 때문이다.

replaceAll

replaceAll은 문자열 중 특정 문자열을 다른 문자열로 바꾸고자 할 때 사용한다.

String a = "Hello Java";
System.out.println(a.replaceAll("Java", "World"));  // Hello World 출력

"Hello Java"라는 문자열에서 "Java" 가 "World"로 바뀌었다.

substring

substring은 문자열 중 특정 부분을 뽑아낼 경우에 사용한다.

String a = "Hello Java";
System.out.println(a.substring(0, 4));  // Hell 출력

위처럼 substring(시작위치, 끝위치)와 같이 사용하면 문자열의 시작위치에서 끝위치까지의 문자를 뽑아내게 된다. 단 끝위치는 포함이 안된다는 점에 주의한다. 이것은 다음과 같은 수학의 식과 비슷하다.

시작위치 <= a < 끝위치

toUpperCase

toUpperCase는 문자열을 모두 대문자로 변경할 때 사용한다. (모두 소문자로 변경할때는 toLowerCase를 사용한다.)

String a = "Hello Java";
System.out.println(a.toUpperCase());  // HELLO JAVA 출력

split

split 메소드는 문자열을 특정 구분자로 분리하는 메소드이다.

String a = "a:b:c:d";
String[] result = a.split(":");  // result는 {"a", "b", "c", "d"}

"a:b:c:d" 라는 문자열을 ":" 문자로 나누어 {"a", "b", "c", "d"} 문자열 배열을 만들수 있다.

문자열 포매팅

문자열 포맷 코드

코드 설명
%s 문자열(String)
%c 문자 1개(character)
%d 정수(Integer)
%f 부동소수(floating-point)
%o 8진수
%x 16진수
%% Literal % (문자 % 자체)
3을 문자열 안에 삽입하려면 %d를 사용하고, 3.234를 삽입하려면 %f를 사용해야 한다. 하지만 %s를 사용하면 이런 것을 생각하지 않아도 된다. 왜냐하면 %s는 자동으로 % 뒤에 있는 값을 문자열로 바꾸기 때문이다.

문자열 포맷 코드인 %d와 %가 같은 문자열 안에 존재하는 경우, %를 나타내려면 반드시 %%로 써야하는 법칙이 있다. 하지만 문자열 안에 %d 같은 포매팅 연산자가 없으면 %는 홀로 쓰여도 상관이 없다.
System.out.println(String.format("Error is %d%%.", 98));
// "Error is 98%." 출력

포맷 코드와 숫자 함께 사용하기

%d, %s 등의 포맷 코드는 문자열 안에 어떤 값을 삽입하기 위해 사용한다. 하지만 포맷 코드를 숫자와 함께 사용하면 더 유용하게 사용할 수 있다.

정렬과 공백

System.out.println(String.format("%10s", "hi"));  // "        hi" 출력

%10s는 전체 길이가 10개인 문자열 공간에서 대입되는 값을 오른쪽으로 정렬하고 그 앞의 나머지는 공백으로 남겨 두라는 의미이다.

그렇다면 반대쪽인 왼쪽 정렬은 %-10s가 될 것이다.

System.out.println(String.format("%-10sjane.", "hi"));  // "hi        jane." 출력

hi를 왼쪽으로 정렬하고 나머지는 공백으로 채웠음을 볼 수 있다.

소수점 표현하기

System.out.println(String.format("%.4f", 3.42134234));  // 3.4213 출력

3.42134234를 소수점 네 번째 자리까지만 나타내고 싶은 경우에는 위와 같이 사용한다. 즉 여기서 '.'의 의미는 소수점 포인트를 말하고 그 뒤의 숫자 4는 소수점 뒤에 나올 숫자의 개수를 말한다.

System.out.println(String.format("%10.4f", 3.42134234));  // '    3.4213' 출력

위 예는 숫자 3.42134234를 소수점 네 번째 자리까지만 표시하고 전체 길이가 10개인 문자열 공간에서 오른쪽으로 정렬하는 예를 보여 준다.

System.out.printf

String.format 메소드는 포매팅된 문자열을 리턴한다. 따라서 포매팅된 문자열을 출력하려면 다음처럼 System.out.println 메소드를 함께 사용해야 한다.

System.out.println(String.format("I eat %d apples.", 3));  // "I eat 3 apples." 출력

하지만 System.out.printf 메소드를 사용하면 String.format 메소드 없이도 동일한 형식으로 포매팅된 문자열을 출력할 수 있다.

System.out.printf("I eat %d apples.", 3);  // "I eat 3 apples." 출력

String.format 과 System.out.printf의 차이는 전자는 문자열을 리턴하는 메소드이고 후자는 문자열을 출력하는 메소드라는 점이다. 상황에 맞게 선택하여 사용해야 한다.

 

'Language > Java' 카테고리의 다른 글

[Java] 리스트 (List)  (0) 2022.07.31
[Java] StringBuffer  (0) 2022.07.31
[Java] 문자 (char)  (0) 2022.07.31
[Java] 불리언 (boolean)  (0) 2022.07.31
[Java] 숫자 (Number)  (0) 2022.07.31
'Language/Java' 카테고리의 다른 글
  • [Java] 리스트 (List)
  • [Java] StringBuffer
  • [Java] 문자 (char)
  • [Java] 불리언 (boolean)
arajo
arajo
  • arajo
    아라 메모장
    arajo
  • 전체
    오늘
    어제
    • 분류 전체보기 (509)
      • Language (298)
        • HTML (55)
        • CSS (11)
        • JavaScript (70)
        • TypeScript (8)
        • Python (33)
        • Java (119)
        • C (0)
        • C# (2)
      • Programming (92)
        • Programming (14)
        • Web (51)
        • Apache (1)
        • MySQL (23)
        • AWS (3)
      • Framework | Library (26)
        • Framework | Library (3)
        • Vue.js (2)
        • React.js (5)
        • React Native (4)
        • Node.js (1)
        • Ajax (1)
        • Bootstrap (8)
        • Spring (1)
        • Flutter (1)
      • etc (2)
      • 휴식 (19)
        • 책 (13)
        • 일기 (5)
        • 게임 일기 (1)
      • A (71)
        • 공부 (18)
        • 기타 (6)
        • 일 (47)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    HTML
    array
    MySQL
    파이썬
    JavaScript
    리액트
    react
    event
    TypeScript
    Java
    제어문
    객체
    object
    Python
    자바스크립트
    변수
    CSS
    web
    next.js
    타입스크립트
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
arajo
[Java] 문자열 (String)
상단으로

티스토리툴바