-
[Java] 클래스 및 기타 개념 정리스터디플래너/공부하기 2022. 2. 1. 10:07
요새 백준(https://www.acmicpc.net)에서 문제를 풀고 있다. 어려운 알고리즘 문제를 푸는 건 아니지만 전에 배웠던 내용을 복습할 겸 새롭게 실력을 쌓을 겸 꾸준히 푸는 것이 목표이다. 아직 문제를 푼다고 말하기 어려운 실력이지만 그래도 문제를 풀다보니 내가 모르는 것들이 거나 제대로 알지 못하는 것들이 나와서 기억할 겸 공부할 겸 겸사 겸사 기록해보기로 했다.
StringBuffer클래스
StringBuffer클래스는 String클래스와 마찬가지로 특정 순서의 문자들을 포함하는 char(문자)형 배열이라는 공통점이 있으나, StringBuffer클래스는 메소드를 이용하여 문자열의 순서나 길이를 바꿀 수 있다는 것이 특징이다. StringBuffer클래스는 인스턴스를 생성할 때 적절한 길이의 char형 배열을 생성하고, 이 배열을 문자열을 저장하고 편집하기위한 공간(buffer)으로 사용한다. StringBuffer 인스턴스를 생성할 때는 생성자 StringBuffer(int length)를 사용해서 StringBuffer인스턴스에 저장될 문자열의 길이를 고려하여 충분히 여유있는 크기로 지정해주는 것이 좋다. 버퍼의 크기를 지정하지 않으면 16개의 문자를 저장할 수 있는 공간(buffer)를 생성한다. 공간(buffer)의 크기를 변경하는 내용의 코드이다.
//새로운 길이(newCapacity)의 배열을 생성한다. char newValue[] = new char[newCapacity]; //배열 value의 내용을 배열 newValue로 복사한다. System.arraycopy(value, 0, newValue, count); //새로 생성된 배열 주소를 참조변수 value에 저장한다. value = newValue;
String클래스는 Object클래스로부터 equals메소드를 오버라이딩하여 String 인스턴스끼리 비교할 때 equals메소드를 이용했다. StringBuffer클래스는 Object클래스로부터 equals메소드를 오버라이딩하지 않아 equals메소드를 이용해도 '=='연산자로 비교한 것과 동일한 결과를 얻는다. StringBuffer클래스는 Object클래스로부터 toString메소드를 오버라이딩하여 toString()을 호출하면 해당 문자열을 String으로 반환한다. 따라서 StringBuffer를 비교할 때는 toString메소드를 호출하여 String으로 변환한 뒤 equals메소드를 사용하여 비교해야 한다.
메소드 설명 StringBuffer() 16문자 크기의 버퍼를 가진 StringBuffer 인스턴스를 생성 StringBuffer(int length) length 크기의 버퍼를 가진 StringBuffer 인스턴스를 생성 StringBuffer(String str) 지정된 문자열 값(str)을 갖는 StringBuffer 인스턴스를 생성 StringBuffer append() 매개변수로 입력된 값을 문자열로 반환하여 StringBuffer 인스턴스가 저장하고 있는 문자열 뒤에 덧붙인다. int capacity() StringBuffer인스턴스의 버퍼크기를 알려준다. char charAt(int index) 지정된 위치(index)에 있는 문자를 반환한다. StringBuffer delete(int start, int end) 끝 위치의 문자를 제외하고 시작위치(start)부터 끝 위치(end) 사이에 있는 문자를 제거한다. StringBuffer deleteCharAt(int index) 지정된 위치(index)의 문자를 제거한다. StringBuffer insert(int pos, T st) 두번째 매개변수로 전달받은 값을 문자열로 변환하여 지정된 위치(pos)에 추가한다. int length StringBuffer인스턴스에 저장되어 있는 문자열의 길이를 반환한다. StringBuffer replace(int start, int end, String str) 지정된 범위(start~end)의 문자들을 주어진 문자열로 바꾼다. end위치의 문자는 범위에 포함되지 않는다. StringBuffer reverse() StringBuffer인스턴스에 저장되어 있는 문자열의 순서를 거꾸로 나열한다. void setCharAt(int index, char ch) 지정된 위치의 문자를 주어진 문자(ch)로 바꾼다. void setLength(int newLength) 지정된 길이의 문자열로 길이를 변경한다. 나머지 공간은 널문자로 채운다. String toString() StringBuffer인스턴스의 문자열을 String으로 반환 String substring(int start(, int end)) 지정된 범위 내의 문자열을 String으로 뽑아서 반환한다. String클래스와 같이 인스턴스가 한번 생성되면 그 값을 바꿀 수 없는 것이 불변클래스(immutable class), StringBuffer클래스처럼 인스턴스 생성 후 값을 자유롭게 변경할 수 있는 것을 가변클래스(mutable class)라 한다. TCP School에서는 멀티스레드 환경에서 하나의 객체에 접근하면서 각각의 객체가 서로 영향을 주어서는 안 되는 경우에 불변 인스턴스를 사용하면 값이 변하지 않는다는 점이 보장되어 신뢰성을 높일 수 있다 하였다. 하지만 오라클 문서에서는 멀티스레드를 사용할 때 String Buffer가 안전하다고 설명하고 있다. 메소드가 동기화되어 각각의 스레드에서 만들어진 메소드의 호출에 따라 구성된 순서대로 작동한다고 설명하는 것 같다. 두 내용이 정반대라서 내가 오라클 문서를 잘못 해석했을 수도 있다. 자바의 정석에도 해당 내용은 없어서 잘 모르겠다.BufferReader와 BufferWriter
import java.io.*; import java.util.StringTokenizer; public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); StringTokenizer st; int cnt = Integer.parseInt(br.readLine()); for(int i=0; i<cnt; i++){ st = new StringTokenizer(br.readLine()); bw.write((Integer.parseInt(st.nextToken()) + Integer.parseInt(st.nextToken()) + "\n")); } bw.flush(); br.close(); bw.close(); } }
Java를 배우면 가장 먼저 배우는 System.out.print()메소드와 입력받을 때 사용하는 Scanner외에도 입력과 출력을 할 수 있는 방법이 있다. 바로 BufferedReader와 BufferedWriter를 사용하는 것이다. 이 두 클래스에 대해 제대로 배우지 않아 다른 블로그에서 문제 해설을 볼 때 이런 개념이 나오면 넘어가곤 했다. 하지만 백준 15552번은 Scanner와 System.out.print만 사용한 내가 이 두 개념에 대해 ㄱ공부해야 풀 수 있는 문제였다.
BufferedReader와 BufferedWriter는 버퍼를 이용해서 입출력의 효율을 높일 수 있도록 해주는 역할을 한다. InputStreamReader와 OutputStreamWriter를 함께 사용하여 버퍼링을 이용하면 입출력의 효율이 비교할 수 없을 정도로 좋아지기 때문에 사용하는 것이 좋다.
BuffteredReader와 메소드
메소드 설명 BufferedReader(Reader in) 기본 사이즈의 in과 연결된 문자 입력 버퍼 스트림을 생성 Bufferedeader(Reader in, int sz) sz 사이즈의 in과 연괄된 문자 입력 버퍼 스트림을 생성 void close() 스트림을 닫고 이 스트림과 관련된 시스템 자원을 풀어줌 Stream<String> lines() BufferedReader에서 읽은 줄의 요소를 Stream형태로 반환 void mark(int readAheadLimit) 스트림에 현재 위치를 표시하고 reset()메소드 호출 시 해당 위치로 위치를 이동 boolean markSupported() 이 스트림에 mark()메소드가 호출되어있는지 여부를 알려줌 int read() 문자 하나를 읽음 int read(char[] cbuf, int off, int len) cbuf배열의 off 위치에서 len만큼 읽음 String readLine() 한 줄을 읽음 boolean ready() 이 스트림이 읽을 준비가 되어있는 지 알려줌 void reset() 가장 최근에 표시된 스트림으로 재설정 long skip(long n) n의 수만큼 문자들을 생략하여 반환 BufferedWriter와 메소드
메소드 설명 BufferedWriter(Writer out) 기본 크기의 out과 연결된 문자 출력 버퍼 스트림 생성 BufferedWriter(Writer out, int sz) sz 크기의 out과 연결된 문자 출력 버퍼 스트림 생성 void flush() 스트림을 출력 void newLine() 줄 구분문자를 스트림에 출력 void write(char[] cbuf, int off, int len) cbuf 문자배열의 off위치부터 len만큼 스트림에 출력 void write(int c) 한 글자만 스트림에 출력 void write(String s, int off, int len) 문자열 s에서 off위치부터 len만큼 스트림에 출력 StringTokenizer
StringTokenizer 클래스는 문자열을 토큰들로 나누는 역할을 한다. StreamTokenizer를 사용하는 것보다 훨씬 간단하다. StringTokenizer클래스는 'String'Tokenizer라는 이름답게 다른 타입을 구별하거나 할 수 없고 String으로만 사용할 수 있다.
StringTokenizer와 메소드
메소드 설명 int countTokens() nextToken메소드를 몇 번 사용할 수 있는지 Token의 수를 계산 boolean hasMoreElements() hasMoreTokens 메소드와 같은 값을 반환 boolean hasMoreToken() 문자열 노큰들에서 더 토큰이 있는지 확인 Object nextElement() nextToken 메소드와 같은 값을 반환하나 Object타입으로 반환 String nextToken() StringTokenizer에서 다음 토큰을 반환 String nextToken(String delim) String Tokenizer의 delim에서 다음 token을 반환 EOF(End of File)
EOF(End Of File)는 10951문제로 처음 봤다. 검색해보니 End Of File의 약자라는데 검색해도 구체적으로 나오지 않아 내가 문제를 푸는데 사용한 언어인 EOF java라고 검색해서야 찾을 수 있었다. 파일의 끝이라는 해석대로 데이터의 끝임을 확인하는 것이다. 학원에서 JSP 공부할 때, DB와 연동 후 SELECT하여 여러 개의 데이터를 불러올 때, 가장 마지막 데이터가 나올 때까지 while문을 돌릴 때 사용했던 메소드도 EOF에 포함되는 것 같다(안타깝게도 지금 기억이 안 난다). 내가 본 블로그에서는 Scanner와 BufferedReader를 이용할 때 EOF를 알려줬다.
//scan.hasNext() -> 다음 데이터가 존재하면 true, 없으면 false를 반환 Scanner scan = new Scanner(System.in); while(scan.hesNext()){ System.out.println("데이터 안 끝남"); } //BufferedReader는 Scanner의 hasNext()처럼 직접 boolean을 반환하는 메소드는 없고, //BufferedReader로 스트림의 데이터를 읽어온 readLine이 Null인가 아닌가로 확인한다. BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String input = ""; while((input = br.readLine()) != null){ System.out.println("데이터 안 끝남"); }
[출처; StringBuffer]
자바의 정석 - 남궁성(도우출판)
https://docs.oracle.com/javase/7/docs/api/java/lang/StringBuffer.html#StringBuffer(int)
StringBuffer (Java Platform SE 7 )
Inserts the string into this character sequence. The characters of the String argument are inserted, in order, into this sequence at the indicated offset, moving up any characters originally above that position and increasing the length of this sequence by
docs.oracle.com
http://www.tcpschool.com/java/java_api_stringBuffer
코딩교육 티씨피스쿨
4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등
tcpschool.com
[출처; BufferedReader, BufferedWriter]
자바의 정석 - 남궁성(도우출판)
https://docs.oracle.com/javase/8/docs/api/java/io/BufferedReader.html
BufferedReader (Java Platform SE 8 )
Reads characters into a portion of an array. This method implements the general contract of the corresponding read method of the Reader class. As an additional convenience, it attempts to read as many characters as possible by repeatedly invoking the read
docs.oracle.com
https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/io/BufferedWriter.html
BufferedWriter (Java SE 11 & JDK 11 )
Writes a portion of an array of characters. Ordinarily this method stores characters from the given array into this stream's buffer, flushing the buffer to the underlying stream as needed. If the requested length is at least as large as the buffer, however
docs.oracle.com
https://docs.oracle.com/javase/7/docs/api/java/util/StringTokenizer.html
StringTokenizer (Java Platform SE 7 )
Constructs a string tokenizer for the specified string. All characters in the delim argument are the delimiters for separating tokens. If the returnDelims flag is true, then the delimiter characters are also returned as tokens. Each delimiter is returned a
docs.oracle.com
[출처; EOF]
https://steady-coding.tistory.com/227
EOF의 사용 방법을 알아보자 (JAVA)
안녕하세요? 코딩중독입니다. 저번 시간에는 입출력의 속도를 빠르게 해 주는 BufferedReader와 BufferedWriter에 대해 알아보았습니다. 이번에는 EOF가 무엇인지 알아봅시다. EOF는 무엇일까? EOF는 End of F
steady-coding.tistory.com
'스터디플래너 > 공부하기' 카테고리의 다른 글
[백준] 1110번 더하기 사이클 (0) 2022.02.03 [자바의 정석] Chapter06-1. 객체지향 프로그래밍1 (0) 2022.02.03 [자바의 정석] Chapter05. 배열(Array) (0) 2022.01.30 [자바의 정석] Chapter04. 조건문과 반복문 (0) 2022.01.08 [자바의 정석] Chapter03. 연산자 (0) 2022.01.02