[ 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
: 예외 발생 시 대안 작업 실행
- try - 예외 발생 예상 지점
- catch - 예외처리
- finally - 항상 실행
- throw - 예외 발생 선언
- throws - 예외를 던진다
Transaction (작업 단위) 의사코드
try { 2. 메뉴 선택() 3. 출금액 입력() --> exception 발생 시 catch(출금액 Exception)로 4. 현금 수령() } 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()