문자열은 문장을 의미한다.
<리터럴 표기>
String a = "Be Happy";
String b = "Good job";
String a = new String("Be Happy");
String b = new String("Good job");
두 예제는 같은 의미이다.
new
는 키워드 객체를 만들 때 사용한다.
'객체'를 다루기 전까지는 "새로 생성된 자료형" 정도의 의미로 알고 있도록 하자.
리터럴 표기법은 문자열을 intern pool이라는 곳에 저장하고 동일한 문자열이 선언될 경우 cache된 문자열을 리턴한다.
반면에 두번째 방식은 항상 새로운 String 객체를 생성한다.
이전에 살펴본 int, long, double, float, boolean, char등을 자바는 원시(primitive) 자료형이라 한다.
이런 자료형들은 new
키워드로 그 값을 생성할 수 없으며, 아래와 같이 리터럴로만 생성할 수 있다.
(String은 리터럴로 표기가 가능하지만 primitive 자료형은 아니지만 리터럴로 표현식을 사용할 수 있는 특별 자료형이다!)
boolean result = true;
char capitalC = 'C';
int i = 100000;
원시 자료형의 Wrapper 클래스
원시자료형 | Wrapper 클래스 |
---|---|
int | integer |
long | Long |
double | Double |
float | Float |
boolean | Boolean |
char | Char |
앞으로 배울 ArrayList
, HashMap
, HashSet
등은 데이터 저장시 원시 자료형 대신 Wrapper 클래스 사용해야 한다.
Wrapper 클래스를 사용하면 값 대신 객체를 주고 받을 수 있어 객체 중심적 코드 작성에 유리하다.
멀티스레딩 환경에서 동기화를 지원하기 위해 Wrapper 클래스가 반드시 필요하다.
##2. 문자열 내장 메소드
String 자료형의 내장 메소드 중에 자주 사용되는 것을 알아보자
equals
String a = "hello";
String b = "java";
String c = "hello;
System.out.println(a.equals(b)); // false 출력
System.out.println(a.equals(c)); // true 출력
> == 연산자는 자료형이 동일한 객체인지 판별할 때 사용되므로 값 비교는 equals를 사용하도록 한다.
indexOf
String a = "Hello Java";
System.out.println(a.indexOf("Java")) // 6 출력
"Java" 문자열은 일곱번째 문자('J')부터 시작된다.
contains
String a = "Hello Java";
System.out.println(a.contains("Java")); // true 출력
문자열 a에 "Java"라는 문자열이 포함되었으므로 true 출력
charAt
String a = "Hello Java";
System.out.println(a.charAt(6)); // J 출력
replaceAll
String a = "Hello Java";
System.out.println(a.replcaAll("Hello","Bye")) // Bye Java 출력
substring
String a = "Hello Java";
System.out.println(a.substring(0,4)); // Hell 출력 (단, 끝 위치는 포함되지 않음)
toUpperCase
String a = "Hello Java";
System.out.println(a.toUpperCase(a)) // HELLO JAVA 출력
split
String a = "a:b:c";
String[] result = a.split(":"); // result는 {"a" "b" "c"}
":"로 문자를 나눠 문자열 배열 생성
String.format
숫자(%d) 바로 대입하기
System.out.println(String.format("I eat %d apples." 3)); // "I eat 3 apples" 출력(여기서 %d는 문자열 포맷 코드라 한다.)
문자열(%s) 바로 대입
System.out.println(String.format("I eat $s appels.", "five")); // "I eat five apples." 출력
숫자 값을 나타내는 변수로 대입
int number = 3;
System.out.println(String.format("I eat %d apples.",number)); // "I eat 3 apples." 출력
두 개 이상의 값 넣기
int number = 10;
String day = "three";
// "I ate 10 apples. so I was sick for three days." 출력
System.out.println(String.format("i ate %d apples. so I was sick for %d days.",number, days));
코드 | 설명 |
---|---|
%s | 문자열(String) |
%c | 문자 1개(character) |
%d | 정수(Integer) |
%f | 부동소수(floating-point) |
%o | 8진수 |
%x | 16진수 |
%% | Literal % (문자% 자체) |
%s 포맷 코드는 어떤 형태의 값이든 변환해 넣을 수 있다.
System.out.println(String.format("I have %s apples.",3)); // "I have 3 apples" 출력
System.out.orintln(String.format("rate is %s", 3.234)); // "rate is 3.234" 출력
코드별 포맷이 있지만, %s를 사용하면 뒤에 오는 값을 문자열로 변경한다.
System.out.println(String.format("%10s", "hi")); // " hi"출력
전체 길이가 10개인 문자열 공간에서 대입되는 값을 오른쪽 정렬, 나머지는 공백 출력System.out.println(String.format("%.4f",3.141592))' // 3.1415
소수점(.)nf 번째까지 출력 String.format
메소드는 ~.println
메소드를 함께 사용해야 하지만 prtinf
메소드를 사용한다면 String.format
메소드 없이도 동일하게 출력할 수 있다.
전자는 문자열을 리턴하는 메소드이도 후자는 문자열을 출력하는 메소드이다.
StringBuffer는 문자열을 추가하거나 변경할때 주로 사용하는 자료형이다.
다음은 StringBuffer 객체와 문자열을 생성하는 예제이다.
StringBuffer sb = new StringBuffer(); // StringBuffer 객체 sb 생성
sb.append("hello");
sb.append(" ");
sb.append("jump to java");
String result = sb.toString();
System.out.println(result);
> hello jump to java
StringBuffer 자료형은 append 메소드를 사용해 문자열을 계속해 추가할 수 있으며, 위 예제와 같이 toString()
메소드를 이용하면 String 자료형으로 변경할 수 있다.
String 자료형은 immutable하며, 다른 메소드와 사용시 새로운 String 객체를 생성해 리턴하는 것이다. 하지만 StringBuffer는 이와 반대로 mutable하며 한 번 생성된 값은 언제든지 수정할 수 있다.
StringBuffer 자료형은 String 자료형보다 무거운 축에 속하며 메모리 사용량이 많고 속도도 느리다. 따라서 문자열의 추가나 변경이 많은 경우에는 StringBuffer를,
그 외에 경우에는 String을 사용하는 것이 유리하다.
특정 위치에 원하는 문자열 삽입.
StringBuffer = new StringBuffer();
sb.append("Jump to java");
sb.insert(0,"hello")'
System.out.println(sb.toString());
>hello Jump to java
String 자료형의 substring 메소드와 동일하게 사용된다.
substring(시작위치, 끝위치)
StringBuffer sb = new StringBuffer();
sb.append("Halo jump to java");
System.out.println(sb.substring(0,4));
> Halo
출고된 계란판
배열은 크기(length)와 순서(index)가 고정되고 동일한 타입의 데이터 집합이다.
계란판은 크기와 순서, 형태가 고정되어 있으므로 배열과 비슷한 예가 아닐까 싶다
[]
기호를 사용해 표현한다. int[] odds = {1,3,5,7,9};
String[] weeks = {"월", "화", "수", "목", "금", "토", "일"}
위 요일 집합 예제는 다음과 같이 고쳐쓸 수 있다.
String[] weeks = new String[7]
weeks[0]="월";
weeks[1]="화";
weeks[3]="수";
weeks[4]="목";
weeks[5]="금";
weeks[6]="토";
weeks[7]="일";
배열은 길이를 먼저 설정해 변수를 생성하고 값은 나중에 대입하는 방식이다. 따라서 초기값이 없는 배열 변수 생성시 반드시 길이가 정의되어야 한다.
(오류)
String[] weeks = new Sting[]; // 길이 정의가 없으므로 컴파일 오류 발생
String[] weeks = {"월", "화", "수", "목", "금", "토", "일"}
System.out.println(weeks[3]);
배열의 길이는 다음과 같이 length를 이용해 구한다.
String[] weeks = {"월", "화", "수", "목", "금", "토", "일"}
for (int i=0 ; i<weeks.length ; i++){
System.out.println(weeks[i]);
}
ArrayIndexOutOfBoundsException
해당 오류는 배열에서 자주 볼 수 있는 오류이다. 이는 배열의 범위를 넘어가는 값을 리턴하려 할 때 발생하는 것임으로,
현재 배열의 길이를 다시 확인해보도록 한다.