본문 바로가기
JAVA SE/이론 및 개념

[20.07.30/Day_16] Java SE / String, StringBuilder, StringBuffer | I/O (입력과 출력) Stream 스트림

by 파프리카_ 2020. 7. 30.
728x90
반응형

[ Review 복습 ] 

interface의 특징

1. 구현측과 사용자간의 약속

2. 다중 상속의 장점 -> 다양한 계층구조 형성을 통한 다형성 환경 제공

부모타입 

Animal a = new Person();

 

상위 인터페이스 타입

Flyer f = new Bird();

 

Collection

set : 중복 X

list : 순서(index)가 있음

Map : key-value

 

ArrayList : 빠른 검색 용이

LinkedList : 삽입/삭제 용이

 

Stack / Queue

Stack : 후입선출 Last in, First out (LIFO)

Queue : 선입선출 First in, First out (FIFO) - message처리할 때 많이 쓰임

 

<<interface>> Iterator

: 반복자

: 어떤 캔이든 따볼 수 있듯, collection 계열의 구조체들을 Iterator를 통해 모두 열어볼 수 있다.

 

Exception Handling
: 예외 발생 시 대안 작업 실행

  1. try - 예외 발생 예상 지점
  2. catch - 예외처리
  3. finally - 항상 실행
  4. throw - 예외 발생 선언
  5. throws - 예외를 던진다

Transaction (작업 단위)  의사코드

try

{
    1. 카드 삽입() --> exception 발생 시 catch(카드 Exception)로

    2. 메뉴 선택()

    3. 출금액 입력() --> exception 발생 시 catch(출금액 Exception)로

    4. 현금 수령()
    5. 작업완료 ()  --> commit / roll back

}

catch(카드 Exception)

{
    카드를 뱉어라

}

catch(출금액 Exception)

{
    출금액 경고를 띄워라

}

// Service Class

카드 삽입() throws 카드Exception
{
    new throw 카드Exception()

}

출금액 입력() throws 출금액Exception
{
    new throw 카드Exception()

}

 

 

 


String / StringBuilder / StringBuffer

  • String :  문자열 변경 시, 문자열 자체는 변하지 않는다
    - literal pool(문자열 상수영역)에 저장하고 공유해서 사용 (자원을 아끼기 위해서)
    - 문자열을 수정하면, 새로운 문자열을 만든다.

  • StringBuilder : 문자열 변경 시,  문자열 자체가 변경된다.
    - 문자열을 자주 수정할 때, 사용한다.

    - 동기화를 처리가 되어있지 않다.

  • StringBuffer  : StringBuilder와 마찬가지로, 문자열 변경 시 문자열 자체가 변경된다.
    - 동기화처리가 되어 있다. (thread - safe)

 

사용 예제

public class TestStringAndStringBuilder {
	public static void main(String[] args) {
		
		/* 
		 * String
		 */
		String s1 = "아이유";
		String s2 = "아이유";

		// concat() : 문자열 추가 메서드
		System.out.println(s1.concat(" 짱!")); //마지막에 문자열 추가
		System.out.println(s1); //기존 s1은 변화없음
		
		// replace() : 문자열 대체 메서드
		System.out.println(s1.replace("유", "셔")); //아이셔
		
		// equals() : 문자열 비교 메서드
		System.out.println(s1 == s2); //true
		// String은 그 자체가 배열이기 때문에 == 보다는 equals로 비교하는 것을 권장한다.
		System.out.println(s1.equals(s2)); //true - 여전히 s1과 s2는 같다
		
		// new String()
		String s3 = new String("아이유");
		System.out.println(s1 == s3); //false
		// -> false가 나오는 이유 : s3는 String class의 객체로 생성된 것이기 때문
		System.out.println(s1.equals(s3)); //true
		// -> equals를 이용하여 비교할 경우에는 이 경우에도 true로 반환되기에
		// 문자열 비교는 equals 메서드를 권장한다.
		
		
		/*
		 * StringBuilder
		 */
		StringBuilder sb = new StringBuilder("아이유");
		System.out.println(sb); //아이유

		//System.out.println(s1 == sb); //error : s1과 sb는 타입이 달라서 비교가 안된다
		System.out.println(s1 == sb.toString()); //false
		System.out.println(s1.equals(sb.toString())); //true <-- 타입을 ToString해줌
		
		//contentsEquals() : String 타입과 무관하게 비교 메서드
		System.out.println(s1.contentEquals(sb)); //true
		
		//append() : StringBuilder 추가 메서드
		System.out.println(sb.append(" 왕")); //아이유 왕
		System.out.println(sb); //아이유 왕 

		/*
		 * StringBuffer
		 */
		StringBuffer sbf = new StringBuffer("뻐이장가가니");
		
		// reverse() : 문자열을 한글자씩 반대로 변경
		System.out.println(sbf.reverse()); //니가가장이뻐
	}
}

 

* 추가 ) StringTokenizer 예제

String names = "클로에,엘리,엠마";
StringTokenizer stk = new StringTokenizer(names, ",");

// ','단위로 잘라서 출력
while(stk.hasMoreTokens())
{
  System.out.println(stk.nextToken());
  /*출력값:
  * 클로에
  * 엘리
  * 엠마
  */
}

 

 


[ IO ]

java.io

I/O  : Input 입력 /Output 출력

 

 

Stream

: 입출력을 위한 java 클래스 (입력과 출력의 통로) → 연속적인 데이터의 흐름의 "줄기" 

 

 

2가지 class 계열

- NodeStream 계열 : 장치에 연결되는 스트림

- ProcessingStream 계열 : 다양한 기능 지원하는 스트림

* PorcessingStream 계열 class는 반드시 NodeStream계열의 class가 필요하다.

 

4가지의 abtract super class 종류  

 

  1 byte (byte Stream) 2 byte (Character Stream)
입력 InputStream Reader
출력 OutputStream Writer
사용 차이 이미지, 바이트 처리 텍스트 처리

* java.io.InputStream | java.io.OutputStream | java.io.Reader | java.io.Writer

 

> flush() : 버퍼의 데이터를 배출 *일정량의 데이터를 임시메모리 영역에 모아, 입력받거나 한번에 출력할 때 사용

  * autoflush 옵션 : 실시간으로 데이터를 송출  (new  PrintWriter(new PrintWriter(new FileWriter(path), true)

> close() : 파일 입출력 완료 후, 파일 객체를 닫음. 내부적으로 flush를 호출

close() 실행 시, flush()가 진행되며 입출력을 진행하여 파일에 연동(output)시켜주고, 파일 객체를 닫는다.

 

 

Output 예제 : Writer class를 이용한 출력 

출력 stream을 이용해 파일을 생성하고 데이터를 출력

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;

//출력 stream을 이용해 파일을 생성하고 데이터를 출력하는 예제
public class TestOutPut1 {
	public static void main(String[] args) {

		// 디렉토리 생성 : dir.mkdirs()
		File dir = new File("C:\\kosta203\\iotest");
		boolean result = dir.mkdirs();
		System.out.println("디렉토리 생성 :"+result);

		try 
		{	//FileWriter class 로 file 객체 생성
			FileWriter fw = new FileWriter("C:\\kosta203\\iotest\\test.txt");
			
			//PrintWriter class로 입출력 객체 생성
			PrintWriter pw = new PrintWriter(fw);
			
			//println() : 파일에 정보 입력 - PrintWriter class의 메서드
			pw.println("안녕 IO");
			
			//close() : 파일 닫기 (flush 자동 진행)
			pw.close(); 
			
			//위 과정 성공 시 출력됨
			System.out.println("파일에 출력");
			/* 출력값:
			 *  파일에 출력
			 */
		} 
		
		catch (IOException e) 
		{
			e.printStackTrace();
		}
	}
}

 

1. kosta203 폴더 내에 iotest 디렉토리가 생성되고,

← File dir = new File("C:\\kosta203\\iotest") ; dir.mkdirs();  

 

[ NodeStream 계열 : 파일이 없으면 생성하고, 파일에 연결되는 계열 ]

2. fw 변수에 디렉토리를 연결한다.

← FileWriter fw = new FileWriter("C:\kosta203\iotest\test.txt") 

 

[ ProcessingStream 계열 : 다양한 기능을 지원 

3. test.txt 파일 생성 후

 ← PrintWriter pw = new PrintWriter(fw)

4. text.txt 파일에 "안녕 IO" 정보가 입력된다.

← pw.println("안녕 IO")

 

 

 

Input 예제 : Reader class를 이용한 출력 

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class TestInput1 {
	public static void main(String[] args) {
		String path = 
				"C:" + File.separator + "kosta203" 
				+ File.separator + "iotest2" 
				+ File.separator + "order.txt";
		
		// 파일로 부터 정보를 입력받는 스트림 예제
		
		try
		{	// 파일에 연결되어 입력받는 노드스트림
			FileReader fr  = new FileReader(path);
			
			// 파일의 정보를 입력받는 프로세스 스트릠
			BufferedReader br = new BufferedReader(fr);
			
			/* 한 줄 한 줄 가져오기
			 * System.out.println(br.readLine()); 
			 * System.out.println(br.readLine());
			 * System.out.println(br.readLine()); 
			 * 샐러드
			 * 요거트 
			 *  null --> 없으면 null
			 */
			
			//정보가 있을 때까지 반복하며 출력
			//방법 1.
			String str = br.readLine();
			while(str != null) {
				System.out.println(str);
				str = br.readLine();
			}
			
			//방법 2.
			//ready() : stream을 읽을 준비가 되어있는지 여부를 확인
			while(br.ready())
			{
				System.out.println(br.readLine());
			}
			
			/*출력값:
			 * 샐러드
			 * 요거트
			 */
			
			br.close();
		}
		
		catch (FileNotFoundException e) //자식
		{
			e.printStackTrace();
		} 
		
		catch (IOException e) //부모
		{
			e.printStackTrace();
		}
	}
}

 

[ NodeStream 계열 : 파일이 없으면 생성하고, 파일에 연결되는 계열 ]

1 . fw 변수에 디렉토리를 연결한다.

← FileReader fr  = new FileReader(path)

 

[ ProcessingStream 계열 : 다양한 기능을 지원 

2. br 변수에 파일 정보를 입력받아 읽어들여 저장한다.

 ← BufferedReader br = new BufferedReader(fr)

4. br 변수에 저장된 파일의 정보들을 한 줄씩 읽는다.

←br.readLine()

 


 

728x90
반응형