문자열

문자열

이 문서에서는 문자열(String)에 대해서 다룬다.

원시형과 참조형

문자열을 이해하기 위해서는 원시형(raw type)참조형(reference type)에 대한 이해가 선행되어야 한다.

  • 원시형 : 프로그래밍의 근원이 되는 을 저장하기 위한 형태의 자료형

  • 참조형 : 값 이외의 다양한 기능들까지 포함하여 사용할 수 있도록 만들어진 복합 자료형

원시형

우리 주변에서 살펴볼 수 있는 원시형 저장소는 물컵 등이 있다. 물컵을 가지고 우리가 할 수 있는 행위는 크게 두 가지 뿐이다.

  • 물을 담는다

  • 물을 마신다

물을 담는것은 설정(set), 물을 마시는 것은 추출(get)의 작업을 말하며 이 두 가지를 제외한 어떠한 작업도 할 수 없다. 이렇게 단순하게 저장이나 확인 등만 가능한 저장 형태를 원시형이라고 하며, 원시형은 자바에서 기본적으로 지원되며 다음 8개 형태이다.

  • boolean

  • byte

  • short

  • char

  • int

  • long

  • float

  • double

원시형의 주된 목적은 값의 저장이며, 이 외의 모든 작업은 개발자가 직접 수행해야 한다.

참조형

원시형만으로 프로그램을 구현할 수도 있겠지만, 우리는 좀 더 복잡하고 다양한 데이터와 기능이 필요하다. 예를들어 TV에어컨과 같은 도구들이 있다고 생각해보자. 이러한 도구들은 매우 복잡한 구조와 다양한 기능을 가지고 있는 것이 특징이며, 이를 쉽게 제어할 수 있도록 리모컨이 존재한다는 것이 특징이다. 리모컨을 이용하면 TV, 에어컨 등의 도구를 직접 만지지 않고서도 제공되는 모든 기능을 이용할 수 있다는 특징이 있는데, 이 때의 상태에 대해 용어를 정리하면 다음과 같다.

  • TV : 객체, 제어 대상

  • 리모컨 : 참조 변수, 제어 도구

여기서 중요한 것은 리모컨이며, 리모컨은 자기 자신 스스로는 의미가 없지만 TV와 같은 대상을 제어할 수 있다는 점에서 복잡한 데이터를 관리하는 구조에 특화되어 있다고 볼 수 있다.

프로그래밍에서도 이와 같이 단순한 값 1개가 아닌 다양한 기능이나 복잡한 데이터를 다루어야 하는 경우에는 리모컨과 같은 형태로 참조 변수라는 것을 만들어 제어하도록 구성하며, 이를 참조형 자료형이라고 부른다.

참조형은 원시형과 다르게 이클립스 등의 편집기 상에서 색상이 변하지 않으며, 일반적으로 첫글자가 대문자이다. 가장 대표적인 참조형 데이터가 String이다.

참조형의 특징은 다음과 같다.

  • 크기를 알 수 없다.

  • 크기를 알 수 없기 때문에 주문제작 방식을 가진다.

  • 주문제작 방식으로 저장소가 생기기 때문에 원시형에 비해 처리속도가 느리다.

  • 리모컨과 같은 참조변수를 이용하여 각종 명령을 내릴 수 있다.

문자열 데모 1

import java.lang.*;

public class StringExample1 {
    public static void main(String[] args){
        String a = "Hello World!";
        System.out.println(a);
    }
}

문자열은 쌍따옴표(")를 이용하여 글자를 감싸 표기한다. 문자열은 문자가 모여 만들어진 형태이며, 각각의 문자들은 char형태이므로 2byte의 크기를 가진다. 따라서 Hello World!는 12글자이므로 24byte의 크기를 가진다. 문자열의 크기는 글자수에 따라 달라지기 때문에 String이라는 형태만 보고서 크기를 알 수 없다. 참조형은 이처럼 만들기 전까지 크기를 알 수 없다는 특징을 가진다.

문자열 데모 2

import java.lang.*;

public class StringExample2 {
    public static void main(String[] args){
        String a = "Hello Java";
        
        System.out.println(a.length());
        System.out.println(a.toUpperCase());
        System.out.println(a.toLowerCase());
    }
}

이번 예제를 통해서 참조형이 가진 기능을 사용하는 것에 대해 살펴볼 수 있다. 문자열인 String은 참조형 데이터이기 때문에 리모컨 역할을 하는 참조변수 a를 통해 String의 다양한 기능들을 이용할 수 있다. 그 중 대표적으로 살펴볼 기능들은 다음과 같다.

  • a.length() : a가 제어하는 대상의 글자수를 구한다.

  • a.toUpperCase() : a가 제어하는 대상을 모두 대문자로 바꿔 반환한다.

  • a.toLowerCase() : a가 제어하는 대상을 모두 소문자로 바꿔 반환한다.

이외에도 다양한 기능들이 존재하는데, 이를 모두 a와 참조 연산자인 .을 이용하여 사용할 수 있다. Eclipse같은 IDE에서는 자동완성이 지원되기 때문에 좀 더 편하게 사용할 수 있다.

문자열 데모 3

import java.lang.*;

public class StringExample3 { 
    public static void main(String[] args) {
        String str = "Hello";
        
        System.out.println(str + 100);
        System.out.println(str + 3.14);
        System.out.println(str + "Java");
        System.out.println(str + true);
    }
}

이번 예제를 통해서는 문자열의 특징인 연결 연산에 대해서 살펴본다. 문자열은 기본적으로 수치가 아니기 때문에 사칙연산이 불가능하지만, 예외적으로 +만은 연결의 의미로 사용할 수 있으며, 모든 데이터는 문자열과 더해지면 문자열이 된다. 이러한 특징을 사용하여 다음과 같이 덧붙여 출력이 가능하다.

import java.lang.*;

public class StringExample3_1 {
    public static void main(String[] args){
        int a = 10;
        System.out.println("a = " + a);
        
        String name = "홍길동";
        System.out.println("이름 = "+name);
    }
}

출력 결과는 다음과 같다.

a = 10
이름 = 홍길동

값만 출력하는 것보다 도움말을 붙여서 출력하게 될 경우 가독성이 좋아지는 효과를 볼 수 있다.

문자열 데모 4

import java.lang.*;

public class StringExample4 {
    public static void main(String[] args){
        //String say = "나는 오늘 "피자"가 먹고 싶다!";
        String say = "나는 오늘 \"피자\"가 먹고 싶다!";
        
        System.out.println(say);
    }
}

위의 예제를 실행하면 다음과 같은 출력결과가 나온다.

나는 오늘 "피자"가 먹고 싶다!

주석 처리한 부분을 해제하면 오류가 발생하는데, 문자열을 표시하기 위한 쌍따옴표와 글자로 인식되어야 할 쌍따옴표를 구분하지 못하기 때문이다.

"나는 오늘 "피자"가 먹고 싶다!"

색상으로 구분해보면 위와 같으며, 자바 컴파일러에게 이를 알려주기 위해 다음과 같이 앞에 역슬래시(\)를 추가한다. 글꼴에 따라 로 나오기도 하니 모양이 다르다고 해서 혼란스러워 하지 말자.

String say = "나는 오늘 \"피자\"가 먹고 싶다!";

이처럼 문자열에서는 역슬래시(\)가 특별한 의미를 가지며, 이를 이용한 다양한 조합 문자들이 존재한다.

문자열 데모 5

앞에서 배운 역슬래시(\)를 이용하여 출력 커서를 제어할 수 있다.

import java.lang.*;

public class StringExample5 {
    public static void main(String[] args){
        String str = "이름\t직업\n임꺽정\t의적\n황희\t정승\n장보고\t장군\n";
        
        System.out.println(str);
    }
}

문자열 내부를 살펴보면 \t\n이 존재하는 것을 확인할 수 있는데, 이들을 escape 문자라고 부른다.

  • \t : tab, 커서를 탭 이동한다. 탭을 이용하여 간격을 맞출 수 있다.

  • \n : new line. 커서를 다음 줄로 이동한다.

이외에도 여러 가지의 escape 문자들이 존재한다.

  • \b : backspace, 커서를 뒤로 한 칸 이동한다.

  • \r : carriage return, 커서를 줄의 처음으로 이동한다.

주로 \t\n이 많이 쓰이므로 이 두 가지는 반드시 기억하자.

문자열 데모 6

import java.lang.*;

public class StringExample6 {
    public static void main(String[] args){
        String folder = "C:\Windows";
        System.out.println(folder);
    }
}

위의 예제를 실행한 결과는 다음과 같이 출력된다.

StringExample6.java:4: error: illegal escape character
        String folder = "C:\Windows";
                            ^
1 error

역슬래시(\)는 뒤의 글자와 조합하여 특수한 명령을 실행하는데, 지금은 W와 조합하여 명령을 수행하려 했으나 해당하는 명령이 존재하지 않아 오류가 발생한 경우이다. 사실, 명령을 수행하려 했다기보다 역슬래시를 있는 그대로 출력하고 싶었지만 뜻대로 되지 않은 경우인데 이럴 경우에는 역슬래시를 2번 중첩하여 사용하여 문제를 해결한다.

  • \\ : 역슬래시를 화면에 출력한다.

다음과 같이 변경하여 출력하면 문제를 해결할 수 있다.

String folder = "C:\\Windows";
System.out.println(folder);

이처럼 자바의 문자에서는 \가 다양한 역할을 수행하기 때문에 문제가 생기지 않도록 주의하여 작성해야 한다.

Last updated