일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- Linux
- mybatis
- 정보처리기사필기요약
- 프론트엔드
- 자바
- 입출력
- MySQL
- 데이터 조회
- Git
- select문
- 프로그래밍
- Java
- 형변환
- 메서드
- sql문
- 개발자
- JavaScript
- 프로그래머스 SQL
- 알고리즘
- 스프링
- scanner
- SQL
- StringBuilder
- 웹개발
- 클래스
- 백준
- select
- DML
- String클래스
- 프로그래머스 sql 고득점 kit
- 예외처리
- 리눅스
- 자바스크립트
- BufferedReader
- github
- 정보처리기사
- where
- 백엔드
- html
- order by
- Today
- Total
ToBe끝판왕
[ JAVA ] String 클래스 (2) 본문
■ java.lang 패키지 에 관하여 알아보자 !
• 자바 언어를 이루는 가장 기본이 되는 클래스들을 보관하는 패키지
• java.lang 패키지의 대표적인 클래스
- Object : 모든 자바 객체의 부모 클래스
- String : 문자열
- Integer, Long, Double : 래퍼타입 , 기본형 데이터 타입을 객체로 만든 것
String 클래스
• 자바에서 문자를 다루는 대표적인 타입은 char , String 2가지가 있다.
• Char
- 문자 하나 다룰 때 사용
- 여러 문자를 나열하기 위해선 char[] 배열을 사용해야 함
• String 클래스
- 문자열을 매우 편리하게 다룰 수 있다.
- String은 클래스이기 때문에, 기본형이 아닌 참조형이다.
- String은 불변객체이다.
StringBuilder - 가변 String
• 불변 객체인 String 클래스의 단점
- 문자를 더하거나 변경할때 마다 새로운 객체를 생성해야 한다.
- 더 많은 String 객체가 생성되고 GC( Garbage Collection) 한다.
- 결과적으로 컴퓨터의 CPU, 메모리 자원을 더 많이 사용하게 된다.
// 두 문자를 더하는 경우 다음과 같이 작동
// 불변객체인 String 내부의 값은 변경 불가능 X
// 변경된 값을 기반으로 새로운 String 객체 생성
"A" + "B"
String("A") + String("B") //문자는 String 타입이다.
String("A").concat(String("B"))//문자의 더하기는 concat을 사용한다.
new String("AB") //String은 불변이다. 따라서 새로운 객체가 생성된다.
• StringBuilder( 가변 String )
- 가변 String 이 존재해야 한다.
- 값을 변경하면 되기 때문에 새로운 객체 생성 필요 X
- 성능과 메모리 사용면에서 불변보다 더 효율적이다.
//StringBuilder 는 내부에 final 이 아닌 변경할 수 있는 byte[] 을 가지고 있다. ```java
public final class StringBuilder {
char[] value;// 자바 9 이전
byte[] value;// 자바 9 이후
//여러 메서드
public StringBuilder append(String str) {...}
public int length() {...}
...
}
```
//
(실제로는 상속 관계에 있고 부모 클래스인 AbstractStringBuilder 에 value 속성과 length() 메서드가 있
다.)
• StringBuilder 예시
- append( ) 메서드 : 여러 문자열 추가
- insert( ) 메서드 : 특정 위치에 문자열 삽입
- delete( ) 메서드 : 특정 범위의 문자열 삭제
- reverse( ) 메서드 : 문자열을 뒤집는다.
- toString( ) 메서드 : StrinBuilder 결과를 String 을 생성해 반환
package lang.string.builder;
public class StringBUilderMain {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
sb.append("Hello");
sb.append("Java");
System.out.println("sb = " + sb);
sb.insert(5,"Hello");
System.out.println("sb insert() = " + sb);
sb.delete(5,10);
System.out.println("sb delete() = " + sb);
sb.reverse();
System.out.println("sb reverse() = " + sb);
// StringBuilder --> String
String str = sb.toString();
System.out.println("str = " + str);
}
}
// 실행 결과
sb = HelloJava
sb insert() = HelloHelloJava
sb delete() = HelloJava
sb reverse() = avaJolleH
str = avaJolleH
▶ StringBuilder는 문자열을 변경하는 동안만 사용하다가 문자열 변경이 완료되면 불변객체인 String으로
변환하는 것이 좋다.
String 최적화
• 자바 컴파일러는 문자열 리터럴 더하는 부부은 자동으로 합쳐준다.
// 문자열 리터럴 더하는 부분은 자동으로 합쳐줌
// 컴파일 전
String str = "Hello, " + "Java!";
// 컴파일 후
String str = "Hello, Java!";
• 반복문에서의 String 최적화
// 최적화를 위해 직접 StringBuilder 를 사용
package lang.string.builder;
public class StringBuilderMain {
public static void main(String[] args) {
long startTime = System.currentTimeMillis();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 100000; i++) {
sb.append("Hello Summer");
}
String result = sb.toString();
long endTime = System.currentTimeMillis();
System.out.println("result = " + result);
System.out.println("Time = " + (endTime - startTime) + "ms");
}
}
• StringBuilder 를 직접 사용하면 더 좋은 경우
- 반복문에서 반복해서 문자를 연결
- 조건문을 통해 동적으로 문자열을 조합
- 복잡한 문자열의 특정부분을 변경해야 할 때
- 매우 긴 대용량 문자를 다룰 때
메서드 체이닝
• 메서드 체이닝 예시
// add 메서드에서 자기 자신의 참조값 this를 반환
package lang.string.chaining;
public class ValueAdder {
private int value;
public ValueAdder add(int addValue ) {
value += addValue;
return this;
}
public int getValue() {
return value;
}
}
// add() 메서드의 반환값은 사용 X
package lang.string.chaining;
public class MethodChainingMain1 {
public static void main(String[] args) {
ValueAdder adder = new ValueAdder();
adder.add(1);
adder.add(2);
adder.add(3);
int result = adder.getValue();
System.out.println("result = " + result);
}
}
// 실행 결과
result = 6
• add( ) 메서드의 반환값을 사용하여, 메서드 체이닝 기법을 활용한 예시
- add( ) 메서드는 자기 자신(this)의 참조값 반환
- 이 반환값을 변수에 담아 두지 않고, 참조값을 사용하여 바로 메서드를 호출할 수 있다.
- 메서드가 끝나는 지점에 바로 . 를 찍어 변수명을 생략 가능하다.
package lang.string.chaining;
public class MethodChainingMain3 {
public static void main(String[] args) {
ValueAdder adder = new ValueAdder();
int result = adder.add(1).add(2).add(3).getValue();
System.out.println("result = " + result);
}
}
// 실행 결과
result = 6
// 실행 순서
adder.add(1).add(2).add(3).getValue() //value=0
x001.add(1).add(2).add(3).getValue() //value=0, x001.add(1)을 호출하면 그 결과로 x001
을 반환한다.
x001.add(2).add(3).getValue() //value=1, x001.add(2)을 호출하면 그 결과로 x001을 반환한
다.
x001.add(3).getValue() //value=3, x001.add(3)을 호출하면 그 결과로 x001을 반환한다.
x001.getValue() //value=6
▶ 메서드 체이닝 기법은 코드를 간결하고 읽기 쉽게 만든다.
• StringBuilder + 메서드 체이닝 기법
- StringBuilder 기법은 메서드 체이닝 기법을 제공
- StringBuilder 에서 대부분의 메서드도 메서드 체이닝 기법을 제공하기 위해 자기 자신을 반환한다.
// 위의 StringBuilder 코드를 메서드체이닝 기법을 활용하여 아래와 같이 변경
package lang.string.builder;
public class StringBuilderMain {
public static void main(String[] args) {
// StringBuilder + 메서드 체이닝 기법
StringBuilder sb1 = new StringBuilder();
String string = sb1.append("Hello").append("Java")
.insert(5, "Hello")
.delete(5,10)
.reverse()
.toString();
System.out.println("string = " + string);
}
}
// 실행 결과
string = avaJolleH
• 메서드 예시
package lang.string.builder;
public class StringBuilderMain {
public static void main(String[] args) {
// startWith() 메서드
String url = "https://www.naver.com";
boolean result = url.startsWith("https://");
System.out.println("startWith() result = " + result);
// length() 메서드
String[] arr = {"hello", "java","summer","night"};
int sum = 0;
for (String s : arr) {
System.out.println(s + ":" + s.length());
sum += s.length();
}
System.out.println("length() sum = " + sum);
// indexOf() 메서드
String str = "abcdefg.pdf";
int idx = str.indexOf(".pdf");
System.out.println("indexOf() idx = " + idx);
// substring() 메서드 + indexOf() 메서드
String ext = ".pdf";
int extIndex = str.indexOf(ext);
String fileName = str.substring(0,extIndex);
String extName = str.substring(extIndex);
System.out.println("fileName = " + fileName);
System.out.println("extName = " + extName);
// trim() 메서드
String original = " Hello Summer ";
String trimmed = original.trim();
System.out.println("trim() trimmed = " + trimmed);
// split() 메서드
String email = "hello@example.com";
String[] parts = email.split("@");
String idPart = parts[0];
String domainPart = parts[1];
System.out.println("idPart = " + idPart);
System.out.println("domainPart = " + domainPart);
}
}
// 실행 결과
startWith() result = true
hello:5
java:4
summer:6
night:5
length() sum = 20
indexOf() idx = 7
fileName = abcdefg
extName = .pdf
trim() trimmed = Hello Summer
split() idPart = hello
split() domainPart = example.com
※ 해당 내용은 인프런 김영한 강사님의 "실전 자바 중급1" 인강의 참고자료와 예시들을 참고하였습니다
'■ 프로그래밍 SKILLS > JAVA' 카테고리의 다른 글
[ JAVA ] 열거형 ( ENUM ) (0) | 2024.08.20 |
---|---|
[ JAVA ] 래퍼 클래스 ( Wrapper Class ) (0) | 2024.08.20 |
[ JAVA ] String 클래스 (1) (0) | 2024.08.13 |
[ JAVA ] 불변 객체 ( 기본형과 참조형 ) (0) | 2024.08.12 |
[ JAVA ] Object 클래스 (0) | 2024.08.11 |