String 연산 사용시 효율적 메모리 사용과 연산 성능 향상을 위해 Scanner 보다 BufferedReader/ BufferedWriter/ StringBuilder를 사용할 것을 권장한다. BufferedReader/ BufferedWriter/ StringBuilder 를 설명하기에 앞서 알아야할 개념이 hashCode()메소드와 String이 불변 객체라는 것이다.
1. hashCode()
ㆍhashCode() 메소드를 호출하면 hashcode가 리턴
ㆍHashcode는 객체를 식별하는 Integer 값 (String값을 int로 리턴)
ㆍJava에서 hashCode()는 Object 클래스에 구현되어있음
2. String은 불변객체
ㆍ아래 예시를 보면, 동일 변수 text1이지만, hashCode값이 다 다르다.
ㆍ새로 내용을 더하면서 새로운 메모리를 사용하므로 용량이 계속 증가.
ㆍString이 변하는 것은 아님.
예1) String은 불변객체, hashCode() 사용법
package stringTest;
public class StringHashCode {
public static void main(String[] args) {
System.out.println("text1's hashCode");
String text1 = "test1";
System.out.println(text1.hashCode());
text1 = text1 + "222";
System.out.println(text1.hashCode());
text1 = text1 + "333";
System.out.println(text1.hashCode());
}
}
/*
<출력결과>
text1's hashCode
110251487
-1147882573
-40070848
*/
예2) java에서 String 클래스를 확인해보면 String are constant라고 적혀있다.
3. BufferedReader/ BufferedWriter/ StringBuilder
ㆍ메모리의 효율적 사용, 속도 향상 목적으로 사용
ㆍ대표적 I/O(input/Output) Class
ㆍ불변객체인 String을 자주 연산하는 방식은 비효율적(새로운 메모리를 계속 차지하기 때문)
ㆍ문자열을 결합하는 +연산자를 많이 사용할수록 String 객체수가 증가 → 프로그램 속도 저하
ㆍ따라서 BufferedReader/ BufferedWriter/ StringBuilder 사용
ㆍ특히, StringBuilder 사용권장
1) BufferedReader/BufferedWriter
ㆍ문자데이터 입출력시 사용
(1) 문자기반 보조스트림
- 보조스트림
ㆍ실제로 데이터를 주고받는 스트림이 아니라서 데이터 입출력 불가
ㆍ스트림 기능 향상위해 사용(보조스트림 단독사용불가)
ㆍ스트림 생성 후 보조 스트림을 생성해서 사용
- 문자기반 스트림
ㆍ ↔ 바이트기반 스트림 : 입출력 단위가 1 byte
ㆍJava는 1문자 char형이 2byte인 경우가 있다.( 특히, 한글)
ㆍ2byte문자 처리위해 문자기반 스트림 사용
(2) Buffer를 이용해 입출력 효율 향상 : 데이터를 Buffer에 저장했다가 기반 스트림으로 전송
ㆍBuffer : 데이터를 임시로 저장하는 메모리
ㆍBufferedReader
- readLine() : 데이터를 라인단위로 읽음
ㆍBufferedWriter
- newLine() : 줄바꿈 메서드
ㆍScanner 클래스와의 차이점
- Scanner : Space, Enter를 경계로 입력값 인식
- BufferedReader : Enter를 경계로 입력값 인식
ㆍ즉, 다량의 데이터 처리시 BufferedReader가 훨씬 빠르다.
<예시1 : BufferedReader 예시>
package bufferedReader;
//BufferedReader
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class testBufferedReader {
public static void main(String[] args) throws IOException {
//######선언하기######
// 선언1
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 선언2 : 파일에서 입력받는 경우
/*
FileReader fr = new FileReader(".\\test\\textFile1.java");
BufferedReader br = new BufferedReader(fr);
*/
//######입력받기######
// 1. 문자열 입력 : Enter를 경계로 line단위로 입력받기
// 항상 String 형태로 입력 받는다.
String line = br.readLine();
//2. 정수형 입력시 형변환1
/*
int num = Integer.parseInt(br.readLine());
//3. 정수형 입력시 형변환2
String str = br.readLine();
int number = Integer.parseInt(str);
*/
//4. space나 공백으로 구분된 값 입력받기
String arr[] = line.split(" ");
// 자원해제
br.close();
} // main
}
<예시2 : BufferedWriter 예시>
package bufferedReader;
//BufferedWriter
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
public class testBufferedWriter {
public static void main(String[] args) throws IOException {
//BufferedWriter 선언
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
String str = "Test BufferedWriter";
//출력
bw.write(str);
//개행
bw.newLine();
//Buffer 비우기
bw.flush();
//자원해제
bw.close();
}
}
2) StringBuilder
ㆍStringBuffer와 StringBuilder는 완전히 동일한 기능
ㆍ문자열의 잦은 변경 필요할 때 사용
ㆍ내부 Buffer에 문자열 저장, buffer에서 추가, 수정, 삭제
ㆍStringBuffer는 멀티 쓰레드에 thread safe하게 동기화 적용 → StringBuffer의 성능 저하
ㆍStringBuilder는 StringBuffer에서 쓰레드 동기화만 제거 → 멀티 쓰레드 환경에서 사용 O
<StringBuilder 예시 >
package stringBuilderTest;
// StringBuilder
public class test {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder(); //16개의 문자들을 저장할 수 있는 초기 버퍼 내장
StringBuilder sb2 = new StringBuilder(50); //50개의 초기 버퍼크기 설정 _ 부족시 자동증가됨
StringBuilder sb3 = new StringBuilder("java"); //문자열을 버퍼의 초기값으로 설정
// 용례
System.out.println(sb); //초기 sb는 아무것도 없는 상태
//1. append : 문자열 끝에 매개값 추가
sb.append("Plus");
sb.append("Test");
System.out.println(sb.toString()); //PlusTest
//2. insert : index위치에 값 추가
sb.insert(4, "2");
System.out.println(sb.toString()); //Plus2Test
//3. setCharAt : 해당 index의 문자열 변경
sb.setCharAt(4, '9');
System.out.println(sb.toString()); //Plus9Test
//4. replace(Start index, End index, String)
sb.replace(5, 9, "Good");
System.out.println(sb.toString()); //Plus9Good
//5. delete (int start, int end)
sb.delete(4, 5);
System.out.println(sb.toString()); //PlusGood
//6. StringBuilder 길이 출력
int length = sb.length();
System.out.println("총 문자수: " + length);
//7. StringBuilder 출력 방법
String result = sb.toString();
System.out.println(result);
}
}
참고 자료
codechacha.com
SNUPI
moveuk.log
도서 자바의 정석, 남궁석
'언어 > JAVA' 카테고리의 다른 글
자바 문자열 분리, 구분: split, StringTokenizer 차이 (0) | 2022.06.09 |
---|---|
for each문 (0) | 2022.04.20 |
Eclipse 이클립스 폰트 변경 (0) | 2022.04.14 |
가위바위보(Rock-Paper-Scissors Game) (0) | 2022.04.07 |
숫자를 입력 받는 Timer (0) | 2022.04.07 |