본문 바로가기

🌈 백엔드/JAVA_기초

JAVA 개념_String 클래스

반응형
SMALL

 

 

 

[1] String 클래스

 


(1) String 객체 

  • 한번 생성되면 그 값을 변경할수 없는 불변 객체 이다
  • 문자열을 많이 연산할수록 공간이 낭비되고 속도가 느려진다 
  • 문자열 리터럴을 사용하여 생성한 객체는 동일한 주소의 객체를 바라보지만
  • new 연산자를 사용하여 문자열을 생성한 객체는 주소값이 다른 객체를 만들기 때문에 되도록 지양하자 
  • String 객체 문자열은 읽을수만 있을뿐 내용을 변경할수는 없다 
    // new 할경우 heap 메모리에 적재된다
    String str1 = new String("abc");
    
    // 상수풀 메모리에 있는 값을 주소만 가리키어 할당한다 
    String str2 = "abc";

 

 

(2) String 와 메모리 

  • 힙 메모리에 인스턴스로 생성되는 경우와 상수 풀(constant pool)에 있는 주소를 참조하는 두 가지 방법이 있다 
  • 힙 메모리는 생성될때마다 다른 주소 값을 가지지만, 상수 풀의 문자열은 모두 같은 주소 값을 가진다 
public class StringTest {

	public static void main(String[] args) {
		// 힙메모리에 생성 
        String str1 = new String("abc");
		String str2 = new String("abc");
		
		System.out.println(str1 == str2); // 같지 않다 
		
        // 상수풀에서 주소를 할당한것 
		String str3 = "abc";
		String str4 = "abc";
		
		System.out.println(str3 == str4); //같다
	}
}

 

  • String은 final로 선언되어있다 
  • String을 메모리 낭비에 취약하여 stringbuilder나 stringbuffer를 사용하는 것이 좋다
  • 한번 생성된 String은 힙메모리에 생성되든 상수값에서 주소를 불러오든 불변(immutable)이기 때문에 
  • String을 연결하면 기존의 String에 연결되는 것이 아닌 새로운 문자열이 생성됨 ( 메모리 낭비가 발생할 수도 )

 

"딸기가" 와 "좋아" 라는 2개의 변수를 "딸기가 좋아 " 라는 변수 1개로 합치기 위해 연산은 불가능하다 

"딸기가 좋아" 라는 결과물은 생겼지만 만들어진 "딸기가" 와 "좋아"는 계속 남아있기 때문에 총 3개의 변수가 만들어진다.

메모리 낭비를 방지하기 위해 변수를 계속 생성하는것이 아닌 stringbuilder나 stringbuffer를 사용하는것이 좋다 

public class Test {

	public static void main(String[] args) {
    
		String str1 = new String("딸기가");
		String str2 = new String("좋아");
		System.out.println(System.identityHashCode(str1));
		
		str1 = java.concat(str2);  // 연결한다
		
		System.out.println(str1);
		System.out.println(System.identityHashCode(str1));
		
	}
}

 

(3) String 메서드 

 

메소드 내용 타입
charAt(i) 입력한 인덱스 위치의 char 문자를 반환 
for(int j =0; j < n ; j++) {
answer += my_string.charAt(i) }
char ch = str.charAt(3)
char
compartTo() 해당 문자열을 인수로 전달한 문자열과 사전순으로 비교  int
concat() 다른 문자열의 끝에 문자열을 추가 String
contains() 문자열에 일련의 문자가 포함되어있는지 확인
 int  answer = str1.contains(str2) ? 1: 2 ;
boolean
equals() 두 문자열의 내용을 비교 (같으면 true)
<-> 같은 주소값을 가진 객체를 확인하려면 == 사용 
System.out.println(s1.equals(s2))
boolean
equalsIgnoreCase() 소/대문자 상관없이 두 문자열의 내용을 비교 (같으면 true) boolean
indexOf(String) 입력한 문자열을 찾아서 존재하면 첫째 문자 위치 값을 반환 , 없으면 -1 반환
System.out.println(s1.indexOf("녕"));
System.out.println(s1.indexOf("안",s1.indexOf("안")+1));
str.substring(1,str.indexOf("d"))) ----> bc
System.out.println(s1.substring(1,s1.indexOf("d")+1))  -----> bcd
int
isEmpty() 문자열이 비어 있는지 확인 boolean
lastIndexOf(String) 문자열에서 지정한 문자가 마지막으로 발견된 위치 반환 int
length() 문자열의 길이 반환 
int answer = message.length() * 2 ;
int
replace() 지정된 문자열을 교체
String s2 = s1.replace("안녕", "Hi");
String answer = my_string.replace(letter,""); - 문자열 비우기
String
replaceAll() 지정된 정규식과 일치하는 문자열의 하위 문자열을 지정된 대체 문자열로 바꿈
String[] arr = my_string.replaceAll("[a-zA-z]","").split("");
String answer = my_string.replaceAll("[aeiou]","");
String
split() 문자열 자르기  String []
join() 문자열 합치기  
substring(a,b) 인덱스 a부터 b까지 반환한다.
str="abcdef" 이라면 
str.substring(0,2)    // ab
String
substring(인덱스) 입력한 인덱스부터 끝까지 문자열로 출력   
Integer.parselnt() 문자열을 integer 로 형 변환  
toCharArray() 문자열을 새문자 배열로 반환 char []
toLowerCase() 문자열을 소문자로 변환 String
toUpperCase() 문자열을 대문자로 변환
System.out.println(s1.toUpperCase()) // ABCDEF
String
toString() String 객체 값을 반환 String
trim() 문자열의 양쪽 끝에서 공백을 제거 String
valueOf() 지정된 값의 문자열 표현을 반환 String

 

 

 

[2] StringBuilder & StringBuffer


(1) 공통점

  • 문자열 추가 수정 할때 사용하는 타입 자료형
  • 공간 낭비 없으며 속도도 빨라짐
  • 내부적으로 가변적인 char[]를 멤버 변수로 가짐
  • 문자열을 여러번 연결하거나 변경할 때 사용하면 유용함
  • 새로운 인스턴스를 생성하지 않고 char[] 를 변경함

 

(2) StringBuilder 만의 특징

  • 멀티 쓰레드 프로그래밍에서 동기화를 하지 않는다 
  • 단일 쓰레드 프로그램에서는 StringBuilder 사용을 권장한다
  • stringbuffer에 비해 좀더 용량이 가벼움
  • 보통은 StringBuilder을 먼저 사용한다 

(3) StringBuffer 만의 특징

  • 멀티 쓰레드 프로그래밍에서 동기화(synchronization)을 보장한다.

 

(4) 메서드 

 

메서드 내용 타입
append() 문자열 마지막에 추가 StringBuffer
S12.append("가나다라"); - String 값
sb.append(my_string);  - String의 변수명
sb.append(my_string.charAt(i)); - String의 인덱스 값 
 
capacity() 현재 용량 반환 int
delete(int start, int end) start~end 부분 문자열 제거 StringBuffer
deleteCharAt(int index) 인덱스에 해당하는 문자 제거 StringBuffer
insert() 문자열의 인덱스 위치에 추가 StringBuffer
reverse() 문자열의 인덱스를 역순으로 재배열
sb.reverse();
StringBuffer
toString() String 으로 변환
answer =sb.toString(); 
String
charAt(int) 인덱스 위치의 문자 반환  
setCharAt(int,char) 인덱스 자리에 char문자 교체한다  
substring(int) 인덱스위치에서 마지막 위치까지 잘라서 반환  
     
     

 

(5) 예시

 

package ch03;

public class StringBilder {

	public static void main(String[] args) {
		
		String str1 = new String("딸기가 ");
		String str2 = new String("좋아 ");
		
		StringBuilder buffer = new StringBuilder(str1);
		
		
		System.out.println(System.identityHashCode(buffer));  // 버퍼 주소값 일치 
		
		buffer.append("좋아 ");
		
		System.out.println(System.identityHashCode(buffer)); // 버퍼 주소값 일치 
		
		str1= buffer.toString();
		System.out.println(str1);
	}

}

 

 

 

[3] text block ()


(1) block 기능 

 

  • 문자열을 """ """ 사이에 이어서 만든다 
  • html, json 문자열을 만드는데 유용하게 사용할 수 있다

 

 

(2) 자바 클래스에서 활용하기 

package ch03;

public class textBlock {

	public static void main(String[] args) {

		String textBlocks = """ 
				1. Hello,
				2. h1,
				3. nice to me too 
				""";
		
		System.out.println(textBlocks);
	}
}

(3) html에서 활용하기 

package ch03;

public class textBlock {

	public static void main(String[] args) {

		System.out.println(getBlockOfHtml());
	}
	
	
	public static String getBlockOfHtml() {
	    return """
	            <html>

	                <body>
	                    <span>example text</span>
	                </body>
	            </html>""";
}
}
반응형
LIST