[Day27] Java 27 - Enum, ์ด๋ ธํ ์ด์ , ์ ์ถ๋ ฅ(I/O), ๋ฌธ์/๋ฐ์ดํธ ์คํธ๋ฆผ
[Day27] Java 27 [9/16]
์ด๊ฑฐํ( enums )
1. ์ด๊ฑฐํ - JDK 1.5 ์๋ก ์ถ๊ฐ.
2. ์ ์ - ์๋ก ๊ด๋ จ๋ ์์๋ฅผ ํธ๋ฆฌํ๊ฒ ์ฌ์ฉํ๊ธฐ ์ํด์ ์ ์ธํ ๊ฒ
* ์) ํ ํ๋ก์ ํธ ๊ฐ์
* A ๋จ์ 1 /์ฌ์ 0 int
* B ๋จ์ 'm' /์ฌ์ 'w' char
* C ๋จ์ true /์ฌ์ fasle boolean
* D ๋จ์ "" /์ฌ์ "" String
* ํ์คํ X -> ์ฝ๋ฉ ๊ฐ๋ ์ฑX -> ์ ์ง, ๋ณด์ X
* ๋ฏธ๋ฆฌ ์ฑ๋ณ ์์ ์ ์ํ๋ ๊ฒ -> ์ด๊ฑฐํ
3. ์ด๊ฑฐํ ์ ์ธ ํ์ -> ํด๋์ค ๋ณํ
* enum ์ด๊ฑฐํ์ด๋ฆ { ์์,์์,... }
* Card
4. ์ด๊ฑฐํ ์์๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
* ์ด๊ฑฐํ์ด๋ฆ.์์๋ช
5. ์ด๊ฑฐํ์ ์กฐ์์ java.lang.Enum ํด๋์ค ์ด๋ค.
public class Ex03 {
public static void main(String[] args) {
//
System.out.println( Gender.๋จ์ ); // true
// ์์ Calendar.YEAR; // 1
} // main
} // class
class Gender{
static final boolean ๋จ์ = true;
static final boolean ์ฌ์ = false;
}
์์ 1)
// ๋, ์, ๋จ, ๋ถ ์ด๋ํ ๋ฐฉํฅ -> ์ด๊ฑฐํ ์ ์ + ์ฌ์ฉ , ๋ฉ์๋
Direction d1 = Direction.EAST; //
/*
System.out.println( d1 ); // "EAST"
// ์ด๊ฑฐํ ์์์ ์ด๋ฆ์ ๋ฌธ์์ด๋ก ๋ฐํํ๋ ๋ฉ์๋
System.out.println( d1.name() ); // "EAST"
// ordinal() ์ด๊ฑฐํ ์์๊ฐ ์ ์๋ ์์๋ฅผ ๋ฐํํ๋ค. 0 ๋ถํฐ ์์
System.out.println( d1.ordinal() ); // 0
// valueOf("๋ฌธ์์ด ์ด๋ฆ") ๋ฐํ ์ด๊ฑฐํ์ ์์๋ฅผ ๋ฐํํ๋ค. EAST
System.out.println( Direction.valueOf("EAST") );
System.out.println( Direction.EAST == Direction.valueOf("EAST") );
*/
switch ( d1 ) {
case EAST:
break;
case WEST:
break;
case NORTH:
break;
case SOUTH:
break;
} // switch
System.out.println("==== ");
Direction [] dArr = Direction.values();
for (Direction d : dArr) {
System.out.printf("%s=%d\n", d.name(), d.ordinal());
}
public enum Direction { // abstract class Direction extends Enum
EAST, // static final Direction EAST = new Direction("EAST");
SOUTH,
WEST,
NORTH
// Enum ๋ฉค๋ฒ ์์
}
์ค์ ๊ฐ์ฒด ์์ฑ:
* private String name;
* private Direction(String name){
* this.name = name;
* }
์์ 2)
์ด๊ฑฐํ์ ๋ฉค๋ฒ( ํ๋, ๋ฉ์๋, ์์ฑ์ ) ์ถ๊ฐํ๊ธฐ
* Setter๋ ํ์์ ์ด
public enum Card {
// The constructor Card(int) is undefined
CLOVER (10, '♣'), // ์์
HEART(20,'♥'),
DIAMOND(30,'โ'),
SPACE(40, '♠');
private final int value;
private final char symbol;
/*
Card(int value) {
this.value = value;
//this.symbol = '*';
}
*/
public int getValue() {
return value;
}
public char getSymbol() {
return symbol;
}
Card(int value, char symbol) {
//this(value);
this.value = value;
// The final field symbol may already have been assigned
this.symbol = symbol;
}
}
// ♠ ♥ โ ♣
/*
System.out.println( Card.HEART ); // "HEART"
System.out.println( Card.HEART.toString() ); // "HEART"
System.out.println( Card.HEART.name() ); // "HEART"
// ์ ์ธ ์์ 0,1,2,3
System.out.println( Card.HEART.ordinal() ); // 1
*/
// The field Card.value [ is not visible]
//System.out.println( Card.HEART.value ); // 20
System.out.println( Card.HEART.getValue() ); // 20
//System.out.println( Card.HEART.symbol ); // ♥
System.out.println( Card.HEART.getSymbol() ); // 20
Card [] cArr = Card.values();
for (Card c : cArr) {
System.out.println( c );
}
์์ 3)
์ถ์๋ฉ์๋ ์ ์ธ ๊ฐ๋ฅ
// ์์ก
public enum Transportation {
// ์์ก๋น(๊ธฐ๋ณธ์๊ธ)
BUS(100) { // Transportation BUS;
@Override
int fare(int distance) {
return distance * getBASIC_FARE();
}
},
TRAIN(150) {
@Override
int fare(int distance) {
return distance * getBASIC_FARE();
}
},
SHIP(100) {
@Override
int fare(int distance) {
return distance * getBASIC_FARE();
}
},
AIRPLANE(300) {
@Override
int fare(int distance) {
return distance * getBASIC_FARE();
}
};
private final int BASIC_FARE;
public int getBASIC_FARE() {
return BASIC_FARE;
}
Transportation(int basicFare) {
BASIC_FARE = basicFare;
}
// ์์ก๊ฑฐ๋ฆฌ * ๊ธฐ๋ณธ์๊ธ = ์ด ๋น์ฉ
/*
int fare() {
return this.BASIC_FARE;
}
*/
// ์ถ์๋ฉ์๋ ์ ์ธ(์ถ๊ฐ)
abstract int fare(int distance);
}
์ด๋ ธํ ์ด์
1. ์ ์ : @ํ๊ทธ
* ํ๋ก๊ทธ๋จ์ ์์ค์ฝ๋ ์์ ๋ค๋ฅธ ํ๋ก๊ทธ๋จ(javac.exe)์ ์ํ ์ ๋ณด๋ฅผ
* ๋ฏธ๋ฆฌ ์ฝ์๋ ํ์์ผ๋ก ํฌํจ์ํจ ๊ฒ์ด "์ด๋ ธํ ์ด์ "์ด๋ค.
*
* ํ๋ก๊ทธ๋จ์ ์ํฅ์ ๋ฏธ์น์ง ์์ผ๋ฉด์ ๋ค๋ฅธ ํ๋ก๊ทธ๋จ์๊ฒ ์ ์ฉํ ์ ๋ณด๋ฅผ ์ ๊ณตํ ์
* ์๋ค.( ์ฅ์ ) (ํ์ฌ ์์ค์ฝ๋ฉ์ ์ํฅ์ฃผ์ง ์์ง๋ง ์ปดํ์ผ๋ฌ์๊ฒ ์๋ ค์ฃผ๋ ์ฉ๋)
2. ์ด๋ค ์ด๋ ธํ ์ด์ ์ ๊ฐ๋ฐ์๊ฐ ์ง์ ์ ์ธํ ๋ ์ฌ์ฉ๋๋ ์ด๋ ธํ ์ด์ = ๋ฉํ ์ด๋ ธํ ์ด์
3. ํ์ค ์ด๋ ธํ ์ด์ (๋ฏธ๋ฆฌ ๋ง๋ค์ด๋์ ์ด๋ ธํ ์ด์ )
// @Test ๋จ์ง ํ
์คํธ ์ฉ๋์ ๋ฉ์๋์
๋๋ค.
// @SuppressWarnings("unused")
@SuppressWarnings("deprecation")
public static void main(String[] args) {
//
@SuppressWarnings({ "unused", "resource" })
// The value of the local variable scanner is not used
// Resource leak: 'scanner' is never closed
Scanner scanner = new Scanner(System.in);
Date d = new Date();
d.getDate(); // ์ทจ์์
/*
@Deprecated
public int getDate() {
return normalize().getDayOfMonth();
}
*/
}
@Override
public String toString() {
return "Ex06 []";
}
ex)
deprecated : ์ทจ์์
Override : ์ํ์ผ๋ฉด ์ปดํ์ผ์๋ฌ์ค
SuppressWarning : ์๋ฌ๋ฉ์ธ์ง ์๋๊ฒํด์ค
์ ์ถ๋ ฅ
* 1. I/O == ์ ๋ ฅ, ์ถ๋ ฅ == ์ ์ถ๋ ฅ Input/Output
* 2. ์ ์ถ๋ ฅ ? ์ปดํจํฐ ๋ด๋ถ ๋๋ ์ธ๋ถ์ ์ฅ์น์ ํ๋ก๊ทธ๋จ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๋ ๊ฒ( ํต์ )
* 3, ์) ํค๋ณด๋ ์ฅ์น -----> [ Ex07.java ] -----> ํ๋ฆฐํฐ๊ธฐ ์ฅ์น
* ํ๋ก๊ทธ๋จ ๋ชจ๋ํฐ ์ฅ์น
*
* ํ์ค ์ ๋ ฅ ์ฅ์น ํ์ค ์ถ๋ ฅ ์ฅ์น
*
* A[์ฑํ ] <-- ์ ์ถ๋ ฅ --> B[์ฑํ ]
*
* ์๋ฒ -> ๋ค์ด๋ก๋
* <- ์ ๋ก๋
* 4. ์๋ฐ์ ๋ชจ๋ ์ ์ถ๋ ฅ์ ์คํธ๋ฆผ(Stream)์ด๋ผ๋ ๊ฐ๋ ์ผ๋ก ์ด๋ฃจ์ด์ง๋ค.
* 1 ) ์คํธ๋ฆผ( Stream ) ? ๋ฐ์ดํฐ๋ฅผ ์ด๋ฐํ๋ ๋ฐ ์ฌ์ฉ๋๋ ์ฐ๊ฒฐ ํต๋ก , ๋จ๋ฐฉํฅ , (๋นจ๋)
* 2)์คํธ๋ฆผ์ 2๊ฐ์ง ์ข ๋ฅ ( ๋ฐฉํฅ )
* ์ฝ๊ธฐ(์ ๋ ฅ) ์คํธ๋ฆผ
* ์ฐ๊ธฐ(์ถ๋ ฅ) ์คํธ๋ฆผ
* 3) ํ( Queue ) == FIFO ๊ตฌ์กฐ
*
* 5. ์คํธ๋ฆผ 2๊ฐ์ง ์ข ๋ฅ ( ๊ธฐ๋ฅ )
* 1) ๋ฌธ์(ํ ์คํธ) ์คํธ๋ฆผ
* ใด ์ฝ๊ธฐ(์ ๋ ฅ) ์คํธ๋ฆผ : ์ต์์ ๋ถ๋ชจ ํด๋์ค Reader
* ใด ์ฐ๊ธฐ(์ถ๋ ฅ) ์คํธ๋ฆผ : " Writer
* ใด ์ ๋์ฝ๋ 2๋ฐ์ดํธ == 1๋ฌธ์ == 2๋ฐ์ดํธ(16๋นํธ)
* ใด ํ๋ฌธ์, ๋ฌธ์์ด, ๋ฌธ์ ๋ฐฐ์ด
*
* ์) XXXReader, XXXWriter
* FileReader, FileWriter
* , BufferedReader, BufferedWriter
* , InputStreamReader ๋ฑ๋ฑ
*
* 2) ๋ฐ์ดํธ ์คํธ๋ฆผ
* ใด ์ฝ๊ธฐ(์ ๋ ฅ) ์คํธ๋ฆผ : ์ต์์ ๋ถ๋ชจ ํด๋์ค InputStream
* ใด ์ฐ๊ธฐ(์ถ๋ ฅ) ์คํธ๋ฆผ : " OutputStream
* ใด 1๋ฐ์ดํธ(8๋นํธ)
* ใด ๋ฐ์ดํธ, ๋ฐ์ดํธ ๋ฐฐ์ด, ์ ์(int) [][][][]
*
* ์) XXXInputSteram, XXXOutputSteram
* FileInputSteram, FileOutputStream
* [???.exe ์คํํ์ผ , ์ด๋ฏธ์ง, ์์ ๋ฑ๋ฑ]
* ์ฑํ ๋คํธ์ํฌ ์ฝ๊ธฐ(์์ )/์ฐ๊ธฐ(์ก์ )
*
* 6. p 871 ๋ณด์กฐ์คํธ๋ฆผ - BufferedReader ํด๋์ค
* ใด ์คํธ๋ฆผ์ ๊ธฐ๋ฅ์ ๋ณด์(๋ณด์กฐ)ํ๊ธฐ ์ํ ์คํธ๋ฆผ์ "๋ณด์กฐ์คํธ๋ฆผ"์ด๋ผ๊ณ ํ๋ค.
* (== ํฅ์, ์๋ก์ด ๊ธฐ๋ฅ ์ถ๊ฐ)
*
* FileReader fw = new FileReader(); // 2๋ฐ์ดํธ ๋ฌธ์ ์คํธ๋ฆผ
* fw.read(); // 1 ๋ฌธ์ X
*
* // ํ ๋ผ์ธ ์ฝ๊ธฐ
* BufferedReader br= new BufferedReader( fw );
* br.readLine();
*
* */
<1> ๋ฐ์ดํธ์คํธ๋ฆผ
* ํ 15-1 ์ ๋ ฅ์คํธ๋ฆผ, ์ถ๋ ฅ ์คํธ๋ฆผ์ ์ข ๋ฅ
* 1) ํ์ผ : File[InputStream] File[OutputStream]
* 2) ๋ฉ๋ชจ๋ฆฌ: ByteArray[] ByteArray[]
* 3) ํ๋ก์ธ์ค: calc.exe ๊ณ์ฐ๊ธฐ ์คํํ์ผ , ๋ฉ๋ชจ๋ฆฌ ํ ๋น ์คํ ์ค์ด ํ๋ก๊ทธ๋จ์ ํ๋ก์ธ์ค
* Piped[] Piped[]
* 4)์ค๋์ค์ฅ์น: Audio[] Audio[]
* StringBuffer[] StringBuffer[]
*
* ๋ฑ๋ฑ
* ํ 15-2 InputStream, OutputStream ๋ฉ์๋
* abstract int read() 1๋ฐ์ดํธ abstract void write( int b )
* int read(byte[] b) void write( byte [] b)
* int read(byte [] b, int off, int len) void write(byte [] b, int off, int len)
* ์์ ๋ฉ์๋ ์ดํด~~ ***
*
* p 871 ๋ณด์กฐ์คํธ๋ฆผ ์ข ๋ฅ ( ํ 15-3 )
* ์ ๋ ฅ์คํธ๋ฆผ ์ถ๋ ฅ์คํธ๋ฆผ
* Filter[] Filter[] ํํฐ๋ฅผ ์ด์ฉํ ์ ์ถ๋ ฅ ์ฒ๋ฆฌ
* Buffered[] Buffered[] ๋ฒํผ๋ฅผ ์ด์ฉํ ์ ์ถ๋ ฅ + ์ฑ๋ฅ ํฅ์
* Data[] Data[] ๊ธฐ๋ณธํ 8๊ฐ์ง๋ฅผ ๋ฐ์ดํฐ ์ฒ๋ฆฌํ๋ ๊ธฐ๋ฅ
* Sequence[] X ๋ ๊ฐ์ ์คํธ๋ฆผ์ ํ๋๋ก ์ฐ๊ฒฐ
* LineNumber[] X ์ฝ์ด์จ ๋ฐ์ดํฐ์ ๋ผ์ธ ๋ฒํธ๋ฅผ ์นด์ดํธ
* Object[] Object[] ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ฒด๋จ์๋ก ์ฝ๊ณ ์ฐ๊ธฐ ( ์ง๋ ฌํ/์ญ์ง๋ ฌํ )
* X PrintStream ๋ฒํผ๋ฅผ ์ด์ฉํ๋ฉฐ, ์ถ๊ฐ์ ์ธ print ๊ธฐ๋ฅ
* PrintStream System.out. printf(), println(), print()
* Pushback[] X ๋ฒํผ๋ฅผ ์ด์ฉํด์ ์ฝ์ด์จ ๋ฐ์ดํฐ๋ฅผ ๋ค์ ๋๋ฆฌ๋ ๊ธฐ๋ฅ
* ( unread , push back to buffer )
<2> ๋ฌธ์์คํธ๋ฆผ
* p 872. ๋ฌธ์ ์คํธ๋ฆผ - Reader, Writer
* 2:00 ์์ ์์~
* Reader Writer
* File[] File[]
* CharArray[] CharArray[]
* Piped[] Piped[]
* String[] String[]
* ํ 15-5 Reader Writer
* abstract int read() 1๋ฐ์ดํธ abstract void write( int b )
* int read(byte[] b) void write( byte [] b)
* int read(byte [] b, int off, int len) void write(byte [] b, int off, int len)
* ์์ ๋ฉ์๋ ์ดํด~~ ***
์์ Ex 9~ 9_3 ์ฐธ๊ณ (URL๋ก ํ์ผ ์ป์ด์ฌ์๋)
Ex10 & 10_2 fw.write(n) // ํ์ผ copy ๋น๊ต
Ex11 ๋ฉ๋ชจ๋ฆฌ ์คํธ๋ฆผ
๋ฌธ์ ) source ๋ฌธ์์ด์์ [11๋ฒ์งธ ๋ผ์ธ]์ ๋ฌธ์์ด์ ์ถ๋ ฅ ๊ฐํ
StringReader in = new StringReader(source);
BufferedReader br = new BufferedReader( in );
int i = 1;
while( i++ <= 10) br.readLine();
String line11 = br.readLine();
System.out.println( line11 );