Binary World

JAVA CLASS : String, StringBuffer, StringBuilder 본문

개발자의 길/JAVA

JAVA CLASS : String, StringBuffer, StringBuilder

모쿠 2017. 1. 5. 17:20

<String, StringBuffer, StringBuilder >

* 문자열을 출력해주는 클래스

* String 클래스 : 

  - immutable 클래스(내용이 바뀌지 않는 클래스)

* StringBuffer 클래스

  - mutable 클래스(내용을 바꿀 수 있는 클래스)

  - Java 1.0 버전부터 사용하던 클래스

  - 반드시 생성자를 사용해서 초기화해야함

  - 문자열 리터럴(ex. "abc")로 초기화 불가능

  - 속도가 느림

  - Thread-safe: 쓰레드에 안전한 클래스

* StringBuilder

  - Java 5 버전부터 사용하게 된 클래스

  - 반드시 생성자를 사용해서 초기화

  - 문자열 리터럴(ex. "abc")로 초기화 불가능

  - 속도가 빠름

  - Thread-safe: 쓰레드에 안전하지 않은 클래스

* 그 외에 모든 기능이 동일함(동일한 기능의 메소드들을 가지고 있음)

 


<프로그램 코드>


* StringMain01.java (String 클래스의 기본 사용)


package edu.java.string01;


public class StringMain01 {

public static void main(String[] agrs){

String str1 = "안녕하세요"; // literal로 초기화

System.out.println(str1);

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

String str2 = new String("안녕하세요"); // heap에 인스턴스 생성

System.out.println(str2);

if (str1 == str2){

System.out.println("같은 참조");

} else {

System.out.println("다른 참조");

}

// String을 저장하는 참조 변수에는 문자열이 있는 주소값이 저장

// 비교연산자(==, !=)는 단순히 주소값만 비교

// -> 실제 문자열의 내용이 같더라도 '주소값이 다르다'라는 결과를 줄 수 있음

// 문자열의 내용이 같은지 비교하려면 equals() 메소드를 사용

if (str1.equals(str2)){

System.out.println("같은 참조");

} else {

System.out.println("다른 참조");

}

// 문자열 literal은 먼저 같은 것이 있는지 검사하고 같은 문자열이 heap에 있으면 그대로 갖다 씀

} // end main()


} // end class StringMain01 



* 출력화면

안녕하세요

문자열 길이: 5

안녕하세요

다른 참조

같은 참조 



* StringMain02.java (String 클래스의 생성자 호출)


package edu.java.string02;


public class StringMain02 {


public static void main(String[] args) {

// String literal과 생성자 호출의 차이

// 생성자는 호출할 때마다 새로운 인스턴스가 생성됨.

// -> 참조 변수(str1, str2)에는 다른 주소값이 저장됨

String str1 = new String("abc");

String str2 = new String("abc");

if (str1 == str2) {

System.out.println("같은 참조");

} else {

System.out.println("다른 참조");

}

// 문자열 리터럴을 사용해서 초기화하는 경우,

// 이미 리터럴이 만들어져 있는 경우는

// 인스턴스를 새로 생성하지 않고, 기존의 인스턴스 재활용

// -> 참조 변수(str3, str4)은 같은 주소값이 저장

String str3 = "abc";

String str4 = "abc";

if (str3 == str4) {

System.out.println("같은 참조");

} else {

System.out.println("다른 참조");

}


} // end main()


} // end StringMain02 



* 출력화면


다른 참조

같은 참조 



* StringMain04.java (String 클래스의 메소드)


package edu.java.string04;


public class StringMain04 {


public static void main(String[] args) {

// String 클래스의 메소드

// (API: Application Programming Interface)

// length(): 문자열의 길이를 리턴

String str1 = "abc";

String str2 = "안녕";

System.out.println(str1.length());

System.out.println(str2.length());

// equals(): 문자열의 내용을 비교

// Object 클래스의 equals() 메소드를 override함

System.out.println(str1.equals(str2));


System.out.println();

// equalsIgnoreCase() : 대소문자 구별 없이 비교

String str3 = "Hello";

String str4 = "hello";

System.out.println(str3.equals(str4));

System.out.println(str3.equalsIgnoreCase(str4));

System.out.println();

// charAt(int): 문자열 중에서 해당 인덱스의 문자 하나를 리턴

System.out.println(str3.charAt(1));

System.out.println();

// indexOf(): 해당 문자 또는 문자열이 몇번째 인덱스에 나오는지 리턴

// lastIndexOf(): 문자 또는 문자열이 가장 마지막으로 등장하는 인덱스

String str5 = "Hello, world!";

System.out.println(str5.indexOf('l'));

System.out.println(str5.indexOf("world"));

System.out.println(str5.lastIndexOf('l'));

System.out.println();

// startsWith(string): 특정 문자열로 시작하는지 확인하는 메소드

String str6 = "http://www.google.com";

System.out.println(str6.startsWith("http://"));

System.out.println();

// contains(string) : 특정 문자열을 포함하고 있는지 아닌지 확인

System.out.println(str6.contains("google"));

System.out.println();

// split() : 특정 구분자를 기준으로 배열 형태로 짤라줌

String str7 = "2017-01-05";

String[] result = str7.split("-");

for (String x : result) {

System.out.println(x);

}

String str8 = "04:44:44";

result = str8.split(":");

for (String x : result) {

System.out.println(x);

}

System.out.println();

String str9 = "2017-01-05 16:55:15";

result = str9.split("-|:| ");

for (String x : result){

System.out.println(x);

}

System.out.println();

// compareTo()

// compareToIgnoreCase()

String str10 = "abc";

String str11 = "Abc";

System.out.println(str10.compareTo(str11)); // 다른 부분의 유니코드 값의 차이를 리턴(str10 - str11)

System.out.println(str10.compareToIgnoreCase(str11));

System.out.println();

// toUpperCase() : 대문자로 변경

// toLowerCase() : 소문자로 변경

String str12 = "Hello, Java!";

System.out.println(str12.toUpperCase());

System.out.println(str12.toLowerCase());

System.out.println();

// substring(begin, end):

//   begin 인덱스는 포함, end 인덱스는 포함되지 않음

System.out.println(str12.substring(1, 6));

System.out.println();

// concat(): 문자열을 이어주는 메소드

System.out.println(str12.concat("World!"));

} // end main()


} // end class StringMain04 



* 출력화면


3

2

false


false

true


e


2

7

10


true


true


2017

01

05

04

44

44


2017

01

05

16

55

15


32

0


HELLO, JAVA!

hello, java!


ello,


Hello, Java!World! 



* StringMain05.java(문자열 삽입, 삭제 변경, 붙이기)


package edu.java.string05;


public class StringMain05 {


public static void main(String[] args) {

// StringBuffer, StringBuilder 클래스

StringBuffer buff = new StringBuffer("abc");

// StringBuffer buffer = "abc"; // 컴파일 에러

// StringBuffer와 StringBuilder는 반드시 생성자를 사용해서 초기화(String과 다른점)

// 문자열 리터럴로 초기화 할 수는 없음

System.out.println(buff);

System.out.println(buff.hashCode());

// toString() 메소드가 override 되어서 문자열 내용만 출력(기존 String은 주소값이 출력됨)

// append(): 문자열을 덧붙이는 메소드

buff.append("def");

System.out.println(buff);

// 주소값이 변하지 않고 문자 자체가 변하게 됨

System.out.println(buff.hashCode());

System.out.println();

String str = "abc";

System.out.println(str);

System.out.println(str.hashCode());

str += "def";

System.out.println(str);

System.out.println(str.hashCode());

System.out.println();

StringBuffer buff2 = new StringBuffer("ABCDEF");

// 문자열 삽입

buff2.insert(2, "abc");

System.out.println(buff2);

StringBuffer buff3 = new StringBuffer("ABCDEF");

// 문자열 삭제

buff3.delete(2, 4);

System.out.println(buff3);

System.out.println();

StringBuffer buff4 = new StringBuffer("Hello, Java!");

// 문자열 변경

buff4.replace(0, 5, "안녕하세요");

System.out.println(buff4);


} // end main()


} // end class StringMain05 



* 출력화면


abc

366712642

abcdef

366712642


abc

96354

abcdef

-1424385949


ABabcCDEF

ABEF


안녕하세요, Java!

 



'개발자의 길 > JAVA' 카테고리의 다른 글

JAVA CLASS : Wrapper 클래스  (0) 2017.01.06
JAVA CLASS : Date ,Calendar 클래스  (0) 2017.01.06
JAVA CLASS : 인터페이스(Interface)  (0) 2017.01.04
JAVA CLASS : 상속(final, abstract)  (0) 2017.01.03
JAVA CLASS : 상속(다형성)  (0) 2017.01.03
Comments