반응형
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
'🌈 백엔드 > JAVA_기초' 카테고리의 다른 글
JAVA 개념_ Scanner 스캐너 클래스 (0) | 2023.07.04 |
---|---|
JAVA 개념_Math 클래스 (0) | 2023.07.04 |
JAVA 개념 _print() , println() , printf() (0) | 2023.06.03 |
JAVA 개념 _데이터소진, 파일 읽고 쓰기 (0) | 2023.06.03 |
웹 프로그래밍 (0) | 2023.05.29 |