Section1-자바 기초2

솜씨좋은 개발자·2022년 7월 7일
0

Section1

목록 보기
8/18

📖 학습목표

  • String(문자열)

  • String 메서드

  • StringTokenizer

  • StringBuilder / StringBuffer


✍ String(문자열)

String 타입 변수는 다른 타입의 변수와는 다른 특성이 있다. 문자열의 내용을 리터럴로 가지는 게 아니라, 문자열이 존재하는 메모리 공간 상의 주소값을 저장하고 있다. 즉, 참조 타입 변수에 할당된다는 것이다.

String str1 = "Hello World";
String str2 = new String("Hello World");//String클래스의 인스턴스를 생성

System.out.print(str1); // "Hello World"
System.out.print(str2); // "Hello World"

하지만, 문자열을 출력해보면 주소값이 아니라 문자열의 내용이 출력된다. 그 이유는 String 타입의 변수를 참조하면 String 클래스의 메서드인 toString()이 자동으로 호출되기 때문이다. toString()이 자동으로 호출되면 String 타입 변수가 저장하고 있는 주소값에 위치한 String 인스턴스의 내용을 문자열로 변환해준다.

String str1 = "Hello World";
String str2 = "Hello World";

String str3 = new String("Hello World");
String str4 = new String("Hello World");

boolean comparison1 = str1 == "Hello World";    // true
boolean comparison3 = str1 == str3;           // false
boolean comparison4 = str3 == str4;           // false
boolean comparison5 = str1.equals("Hello World");// true
boolean comparison6 = str1.equals(str3);        // true
boolean comparison7 = str3.equals(str4);        // true

String 클래스의 인스턴스를 생성하게 되면 문자열의 내용이 같을지라도, 별개의 인스턴스로 생성된다. 그래서 str3과 str4가 할당받게 되는 인스턴스의 참조값은 서로 다르다. 즉, str3과 str4는 서로 다른 인스턴스의 주소값을 저장하고 있게 된다.

✍ String 클래스의 메서드

위 예제에서 equals()메서드는 .앞의 변수가 저장하고 있는 문자열의 내용과 () 안의 문자열의 내용이 같은지 비교하여 Boolean타입으로 반환

1. charAt() 메서드
해당 문자열의 특정 인덱스에 해당하는 문자를 반환한다. 만약 해당 문자열의 길이보다 큰 인덱스나 음수를 전달하면, 오류가 발생한다.

String str = new String("Java");
System.out.println("문자열 : " + str); // "문자열 : Java"

System.out.println(str.charAt(0)); // 'J'

2. compareTo() 메서드
해당 문자열을 인수로 전달된 문자열과 사전 편찬 순으로 비교(대소문자 구분)한다. 두 문자열이 같으면 0을 반환하며, 해당 문자열이 인수로 전달된 문자열보다 작으면 음수, 크면 양수를 반환한다. 만약 문자열을 비교할 때 대소문자를 구분하지 않을 땐 compareToIgnoreCase() 메서드를 사용한다.

String str = new String("abcd");
System.out.println(str.compareTo("bcef")); //-1
System.out.println(str.compareTo("Abcd")); //32

3. concat() 메서드
해당 문자열의 뒤에 인수로 전달된 문자열을 추가한 새로운 문자열을 반환한다. 만약 인수로 전달된 문자열의 길이가 0이면, 해당 문자열을 그대로 반환합니다. concat() 메서드로 문자열 추가할 때마다, 새로운 인스턴스를 생성하기 때문에 성능, 속도 면에서 좋지 않다.

String str = new String("Java");
ystem.out.println(str.concat("수업")); //Java수업

4. indexOf() 메서드
해당 문자열에서 특정 문자나 문자열이 처음으로 등장하는 위치의 인덱스를 반환한다. 만약 해당 문자열에 전달된 문자나 문자열이 포함되어 있지 않으면 -1을 반환한다.

String str = new String("Oracle Java");
System.out.println(str.indexOf('o'));		//-1
System.out.println(str.indexOf('a'));		//2
System.out.println(str.indexOf("Java"));	//7

5. trim() 메서드
해당 문자열의 맨 앞과 맨 뒤에 포함된 모든 공백 문자를 제거
String str = new String(" Java ");
System.out.println("문자열 : " + str);
System.out.println(str + '|');
System.out.println(str.trim() + '|');
System.out.println("trim() 메서드 호출 후 문자열 : " + str);

6. toLowerCase()와 toUpperCase() 메서드
해당 문자열의 모든 문자를 소문자로 변환하거나 대문자로 변환

String str = new String("Java");
System.out.println(str.toLowerCase());	//java
System.out.println(str.toUpperCase());	//JAVA

StringTokenizer

문자열을 우리가 지정한 구분자로 문자열을 쪼개주는 클래스로, 그렇게 쪼개어진 문자열을 토큰(token)이라고 한다. 먼저 StringTokenizer를 사용하기 위해서는 java.util.StringTokenizer를 import해야한다.

import java.util.StringTokenizer;

public static void main(String[] args){
	String str = "This is a coding study";
	StringTokenizer tokenizer = new StringTokenizer(str);
	System.out.println(str);
		
	System.out.println("total tokens:"+tokenizer.countTokens());
	
	while(tokenizer.hasMoreTokens()){
		System.out.println(tokenizer.nextToken());
	}
	System.out.println("total tokens:"+tokenizer.countTokens());
}

결과
This is a coding study
total tokens:5
This
is
a
coding
study
total tokens:0

📌 자주 사용하는 메서드

countTokens() int반환
남아있는 token의 개수를 반환한다. 전체 token의 개수가 아닌 현재 남아있는 token 개수다.

hasMoreElements(), boolean hasMoreTokens() boolean반환
두 메서드의 성능적인 차이는 없고, 둘다 동일한 값을 반환한다. 메서드는 현재 위치 뒤에 있는 문자열에서 하나 이상의 토큰을 사용할 수 있는 경우 true를 반환하고 그렇지 않으면 false를 반환한다.

Object nextElement(), String nextToken() Object/String반환
이 두 메서드는 다음의 토큰을 반환한다. 두 가지 메서드는 같은 객체를 반환하는데 반환형은 다르다. nextElement는 Object를, nextToken은 String을 반환한다.

StringBuilder

한번 생성된 String 클래스의 인스턴스는 여러 개의 문자열을 더할 때 매번 새로운 인스턴스를 생성한다.
그래서 이 문제를 해결하기 위해 StringBuilder를 사용한다.

public class Main {
    public static void main(String[] args) {
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("자바 ").append("문자열").append("StringBuilder");
        String str = stringBuilder.toString();
        System.out.println(stringBuilder);
        System.out.println(str);
    }
}

결과
자바 문자열StringBuilder
자바 문자열StringBuilder

StringBuilder의 객체를 생성한 후, 연결하고자 하는 문자열을append()의 인자로 넣어서 StringBuilder의 객체를 통해 호출한다.
또한, 문자열을 출력할 때, 그리고 변수에 문자열을 할당할 때에는 toString()메서드를 사용한다.

✍ StringBuffer

String 클래스의 인스턴스는 한 번 생성되면 그 값을 읽기만 할 수 있고, 수정할 수는 없다. 하지만 StringBuffer 클래스의 인스턴스는 그 값을 수정할 수 있다. 이를 위해 StringBuffer 클래스는 내부적으로 버퍼(buffer)라고 하는 독립적인 공간을 가진다. 버퍼 크기의 기본값은 16개의 문자를 저장할 수 있는 크기이며, 생성자를 통해 그 크기를 별도로 설정할 수도 있다. 인스턴스 생성 시 사용자가 설정한 크기보다 언제나 16개의 문자를 더 저장할 수 있도록 여유 있는 크기로 생성된다.

덧셈(+) 연산자를 이용한 String 인스턴스의 문자열 결합은 내용이 합쳐진 새로운 String 인스턴스를 생성한다. 따라서 문자열을 많이 결합하면 결합할수록 공간 낭비와 속도 저하를 야기한다. 하지만 StringBuffer 인스턴스를 사용하면 문자열을 바로 추가할 수 있으므로, 공간 낭비가 발생하지 않고 속도를 향상시킬 수 있다.

📌 StringBuffer의 메서드

1. append()
append() 메서드는 인수로 전달된 값을 문자열로 변환한 후, 해당 문자열의 마지막에 추가한다. 이 메서드는 String 클래스의 concat() 메서드와 같은 결과를 반환하지만, 내부적인 처리 속도가 훨씬 빠르다.

StringBuffer str = new StringBuffer("Java");
System.out.println("문자열 : " + str);
System.out.println(str.append(" love"));
System.out.println("append() 메서드 호출 후 문자열 : " + str);

결과
문자열 : Java
Java love
append() 메서드 호출 후 문자열 : Java love

2. capacity()
capacity() 메서드는 StringBuffer 인스턴스의 현재 버퍼 크기를 반환한다.

StringBuffer str01 = new StringBuffer();
StringBuffer str02 = new StringBuffer("Java");
System.out.println(str01.capacity());
System.out.println(str02.capacity());

결과
16
20

길이가 4인 문자열로 StringBuffer 인스턴스를 생성하면, 기본적으로 생성되는 여유 버퍼 크기인 16에서 문자의 길이인 4를 더해 총 20개의 문자를 저장할 수 있는 버퍼가 생성되는 것을 확인할 수 있다.

3. delete()
delete() 메서드는 해당 인덱스에 해당하는 문자열을 제거한다. 또한, deleteCharAt() 메서드를 사용하면 특정 위치의 문자 한 개만 제거할 수도 있다.

StringBuffer str = new StringBuffer("Java");
System.out.println("문자열 : " + str);
System.out.println(str.delete(2, 3));
System.out.println(str.deleteCharAt(1));
System.out.println("deleteCharAt() 메소드 호출 후 문자열 : " + str);

결과
문자열 : Java
Jaa
Ja
Ja

delete() 메서드는 첫 번째 매개변수로 전달된 인덱스부터 두 번째 매개변수로 전달된 인덱스 바로 앞 문자까지 삭제하는 메서드다. 여기서는 2, 3이라고 되어있으니까 인덱스가 2인 문자만 삭제한다. 그리고 deleteCharAt()메서드에서 1을 받고 있으니까 인덱스 1번의 문자를 삭제한다. 그 결과 Jaa에서 인덱스 1번의 a가 삭제되어 Ja가 된다.

4. insert()
insert() 메서드는 인수로 전달된 값을 문자열로 변환한 후, 문자열의 지정된 인덱스 위치에 문자열을 추가한다.

StringBuffer str = new StringBuffer("Java love");
System.out.println("문자열 : " + str);
System.out.println(str.insert(4, "Script"));
System.out.println("insert() 메서드 호출 후 문자열 : " + str);

결과
문자열 : Java love
JavaScript love
insert() 메서드 호출 후 문자열 : JavaScript love

insert() 메서드를 사용하여 문자열에서 인덱스가 4인 위치부터 두 번째 매개변수로 전달된 문자열을 추가한다.

profile
개발의 방으로

0개의 댓글

관련 채용 정보