Java (String, StringBuffer)

yihyun·2024년 7월 31일

Java

목록 보기
8/12

String

Programming 에서 문자열을 다루는 것은 bytechar뿐이다.

본래 문자열(String)char배열(array) 이다.

초기의 컴퓨터는 기계어로 대화하기 때문에 한 글자로 충분했지만 점차 고급언어로 발전하며 사람과 소통하기 위해 여러 문자를 사용할 수 있도록 charchar[]즉 배열로 만들어 주었다.

하지만 배열로 만들 경우 띄어쓰기, . 등 하나로 배열의 크기가 달라지는 불편함이 있기 때문에 String 라는 Class를 만들어 주게 된다

char a = 'a';   // 싱글쿼터
String a = "a"; // 더블쿼터

String 은 클래스 이기 때문에 여러가지 기능들이 있다.

문자열의 공백을 없애거나, 다른 문자로 치환할 수도 있고, String이 char[]와 같다는 점에 착안하여 배열 개념을 이용한 기능들도 있다.

문자열을 만드는 방법은 여러가지가 있는데 그 중 편한 방법을 사용해주면 된다.

// 1. 문자열 만들기 (가장 기본적인 방법)
String str1 = "abc";

// 2. 생성자로 객체화해서 만들기 (많은 생성자가 오버로드 되어있다.)
String str2 = new String("abc");

// 3. 배열로 만들기
char[] alphabet = {'a', 'b', 'c'};
String str3 = new String(alphabet);

이렇게 만든 문자열이 모두 같은지 확인해보는 메소드는 equals()가 있다.

if(str1.equals(str2) && str2.equals(str3)){
	System.out.println("모두 같은 문자열"); // 모두 같은 문자열 출력
}

String 에서 사용 가능한 메소드

🤍 문자열 비교
charAt(int index) : 인덱스에 있는 문자열을 출력
A.equals(B) : 두 문자열이 같은지 비교
A.compareTo(B) : 앞에서 부터 탐색하다가 A와 B가 같으면 0을 반환. 다르면 다른 문자열의 아스키코드 값을 빼서 반환 (ex. p(112) - j(106) = 6(반환))
A.contains(B) : 문자열1에 문자열2가 포함되어 있는지 확인

🤍 문자열 교체 및 모든 공백제거
A.replace("a", "b") : A에 있는 문자열 "a"를 "b"로 변경 (특정한 문자열을 발견하면 지정한 문자열로 변경하여 새로운 변수로 내보낸다.)
→ 공백 제거도 가능하다.

string = "my name is kim";
newStr = string.replace(" ", ""); // → mynameiskim 

🤍 문자열 공백 제거
A.trim(); : 문자열 앞, 뒤 공백제거

🤍 문자열의 시작과 끝 체크
A.startsWith("a") : 문자열 A가 a로 시작하는지 체크 (맞으면 true)
A.endsWith("b") : 문자열 A가 b로 끝나는지 체크 (맞으면 true)

🤍 문자열 반복
"*".repeat(4) : "*" 문자열 4번 반복

// 전화번호 등 개인정보를 가려야하는 경우에 주로 사용
newStr = "*".repeat(4);
System.out.println("010-1234-" + newStr); // 010-1234-**** 출력

※ java에서는 "" 안에 문자열을 만들어 주면 .을 찍고 메소드를 사용할 수 있다.

🤍 문자열 = 문자 배열임을 착안해 만든 기능들
A.length() : 문자의 길이 반환 (문자열 길이를 넘어가는지, 충족했는지 등을 체크할 때 사용할 수 있다.)
A.charAt(int index) : index 값 가져오기
A.toCharArray() : 문자열을 배열로 바꾸기
(다시 배열을 문자열로 바꿀 때에는)

// 방법 1
String str = new String(arr); // arr은 char 배열
// 방법2
String string = String.valueOf(arr); 

A.indexOf("a") : A의 문자열 중 처음 발견되는 a 문자의 인덱스를 반환
A.listIndexOf("a") : A의 문자열 중 끝에서 부터 처음 발견되는 a 문자의 인덱스를 반환

그렇다면 문자열의 시작과 마지막이 아닌 포함된 모든 인덱스를 구하고 싶다면 어떻게 해야할까?

string = "abcdabcdabcd"; 
// 전통적인 방법 (charAt() 을 이용)
for(int i = 0; i < string.length(); i++){
	if(string.charAt(i) == c){
    	System.out.println("c의 index : " + i);
    }
}

🤍 기타
.toLowerCase() : 모두 소문자로 변경
.toUpperCase() : 모두 대문자로 변경
.split() : 특정 구분자를 기준으로 쪼갠다. (배열에 넣을 경우 배열로 반환된다, "" 을 넣어주면 문자 단위로 쪼개준다.)

*프로그램에서는 더이상 없거나 에러일 때 -1을 반환한다.


StringBuffer 와 StringBuilder

String는 용량이 고정되기 때문에 문자열을 추가할 경우 객체가 계속 생성된다.

이렇게 되면 메모리를 많이 차지한다는 문제가 발생한다.

java는 Garbage Collection가 메모리를 치워주는데 이럴 때 제대로 청소하지 못하고 남아있거나 나중에 치워지는 등의 문제가 발생해서 효율성이 떨어진다. (즉 종이 한장을 버리는 것과 종이 한장을 수십장으로 찢어서 버리는 것의 차이이다.)

StringBuffer는 문자열을 추가해도 새로운 문자열이 생기는 것이 아닌 기존 생긴 문자열의 크기만 늘어나는 형태로 동작한다.

StringBuffer buffer = new StringBuffer("문자열을");
buffer.append("추가하면");
buffer.append("한 객체의 크기만 늘어 난다.");
System.out.pringln(buffer.toString()); // 한 덩어리에서 크기만 키워진다.

.reverse() : 역순으로 출력
.append("a") : "a" 문자열 추가

StringBuffer는 그냥 객체자체로 출력해도 출력은 가능하지만 객체이기 때문에 .toString()로 출력해주는게 더 좋다.

StringBuffer 와 StringBuilder의 차이점은 다수유저동시접근을 허용하지 않는다와 허용한다는 차이가 있다.

  • StringBuffer : 다수 유저 동시 접근을 허용하지 않는다.
  • StringBuilder : 다수 유저 동시 접근을 허용한다.

정리
1. 스트링은 char 배열을 다루기 위한 class 이다.
2. String 에는 문자열을 다룰 수 있는 여러 메서드 들이 존재한다.
3. String 에서 문자열을 추가 할 때마다 객체가 증가한다.
4. 그래서 객체의 남발을 막기 위해 StringBuffer 와 StringBuilder가 생겼다.

profile
개발자가 되어보자

0개의 댓글