File I/O

๋ฌธ์ž์—ด (String I/O)

ํ•œ ๋‹จ์–ด ๋˜๋Š” ํ•œ ๋ฌธ์ž์—ด ์ฒ˜๋ฆฌ

  • ๋ฌธ์ž ํ•˜๋‚˜ํ•˜๋‚˜ ๋˜๋Š” ๋ฌธ์ž์—ด์„ ์„ค์ •๋œ ์ธ์ฝ”๋”ฉ์— ๋งž๊ฒŒ ๋ณ€ํ™˜ํ•ด์„œ ๋ฌธ์ž์—ด ๋‹ค๋ฃธ
    • Supplementary Planes ์— ํ•ด๋‹นํ•˜๋Š” ๋ฌธ์ž์—ด์€ char[]๋ฅผ ํ•˜๋‚˜ ๋” ์ฝ์–ด์•ผ ๋จ
    • ํ™•์ธ๋ฒ•: Character.isSupplementaryCodePoint(codePoint)
  • ๊ธฐ๋ณธ Stream์— ๋ฌธ์ž ์ธ์ฝ”๋”ฉ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ์ธ์ฝ”๋”๊ฐ€ ์ถ”๊ฐ€๋œ ๊ฑฐ๋ผ ๋‹น์—ฐํ•˜๊ฒŒ๋„
    ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ํ•ด๋‹น ๊ฐ์ฒด๋“ค๋กœ ๋‹ค๋ฃจ๋ฉด ๋ฐ์ดํ„ฐ ๊นจ์ง
  • ์ž๋ฐ”์—์„œ ๋ฌธ์ž์—ด์„ ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹
    • ๋ฌธ์ž์—ด์„ UTF-16 ์œผ๋กœ ์ธ์ฝ”๋”ฉ ํ•˜๊ณ  ์žˆ๋‹ค๊ฐ€ ๋”ฐ๋กœ ์ฐธ์กฐํ• ์ผ ์žˆ์„๋•Œ ๋””์ฝ”๋”ฉ ํ•ด์„œ ํ‘œํ˜„

Reader & Writer

๊ธฐ๋ณธ String I/O ๊ฐ์ฒด

BufferedReader & BufferedWriter

๋ฉ”๋ชจ๋ฆฌ ๋ฒ„ํผ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” String I/O ๊ฐ์ฒด

FileReader & FileWriter

ํŒŒ์ผ ์ž…์ถœ๋ ฅ String I/O ๊ฐ์ฒด

InputStreamReader & OutputStreamWriter

binry I/O ์ŠคํŠธ๋ฆผ์„ String I/O ๋กœ ๋ณ€ํ™˜ ํ•ด์ฃผ๋Š” ๊ฐ์ฒด

  • ์•„๋ž˜ ๋ฐ”์ด๋„ˆ๋ฆฌ ํ•ญ๋ชฉ์ฒ˜๋Ÿผ Stream ๋‚ด ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฌธ์ž์—ด์ธ ๊ฒฝ์šฐ binry I/O ๋กœ ๋ฌธ์ž์—ด์„ ๋‹ค๋ฃจ๊ฒŒ ๋˜๋ฉด ๋น„ํšจ์œจ์ ์ด๋ฏ€๋กœ
  • ์ด๊ฑธ String I/O๋กœ ๋ณ€ํ™˜ ์‹œ์ผœ ์คŒ

๋ฐ”์ด๋„ˆ๋ฆฌ (binry I/O)

๋ฐ์ดํ„ฐ๋ฅผ 1๋ฐ”์ดํŠธ ๋‹จ์œ„๋กœ ์ฒ˜๋ฆฌํ•จ

  • ํ•ด๋‹น ๊ฐ์ฒด๋“ค๋กœ ํ…์ŠคํŠธ ๋ฌธ์ž๋„ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ
    ์ถ”๊ฐ€์ ์ธ ์ธ์ฝ”๋”ฉ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๊ณ , ๋น„ํšจ์œจ์ ์ž„
  • ์ธ์ฝ”๋”ฉ ๋งˆ๋‹ค ๊ฐ๊ฐ ํ• ๋‹น๋˜๋Š” ๋ฐ”์ดํŠธ ์ˆ˜๊ฐ€ ๋‹ฌ๋ผ์„œ 1๋ฐ”์ดํŠธ ์ฝ๊ณ  ๊ทธ๊ฑธ ๋ฌธ์ž์—ด๋กœ ์ธ์ฝ”๋”ฉ ํ•œ๋‹ค๋ฉด ๋‹น์—ฐํ•˜๊ฒŒ๋„ ๋ฌธ์ž๊ฐ€ ๊นจ์ง
  • ๊ทธ๋ ‡๊ธฐ์— ๋ชจ๋“  ๋ฐ”์ดํŠธ ์ฝ๊ณ  ๊ทธ๊ฑธ ์ธ์ฝ”๋”ฉ ํ•ด์„œ ์ „์ฒด ๋ฐ”์ดํŠธ๋ฅผ ํ•ด์„ํ•˜๊ฒŒ ํ•ด์•ผ ํ•จ

InputStream & OutputStream

๊ธฐ๋ณธ binry I/O ๊ฐ์ฒด

BufferedInputStream & BufferedOutputStream

๋ฉ”๋ชจ๋ฆฌ ๋ฒ„ํผ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” binry I/O ๊ฐ์ฒด

FileInputStream & FileOutputStream

ํŒŒ์ผ ์ž…์ถœ๋ ฅ binry I/O ๊ฐ์ฒด

  • ํ…์ŠคํŠธ ํŒŒ์ผ์ด ์•„๋‹Œ ๋ชจ๋“ ๊ฑด ์ด๊ฑธ๋กœ ํ•ด์•ผํ•จ

Stream์—์„œ ๋ฌธ์ž์—ด ๋‹ค๋ฃจ๊ธฐ

  • ์ž˜๋ชป๋œ ์˜ˆ

    InputStream stream = new FileInputStream("test.txt");
    byte buffer[] = new byte[1024];
     
    int head = 0;
    while ((head = stream.read(buffer)) > 0) {
    	System.out.println(new String(buffer, 0, head));
    }
    • 1024 ๋ฐ”์ดํŠธ ์”ฉ ๋Š์–ด์„œ ์ฝ๋Š”๋ฐ ๋งŒ์•ฝ 1023๋ฐ”์ดํŠธ์— ํ•ด๋‹น ํ•˜๋Š” ๋ฌธ์ž์—ด์ด 3๋ฐ”์ดํŠธ์— ๊ฑธ์ณ์„œ ํ•ด์„๋˜์•ผ ํ•˜๋Š”๊ฒฝ์šฐ
    • ์ค‘๊ฐ„์— ๋ฐ”์ดํŠธ๊ฐ€ ๋Š๊ธฐ๊ธฐ ๋–„๋ฌธ์— ๋ฌธ์ž์—ด์ด ๊นจ์ง
  • ์˜ณ์€ ์˜ˆ

    InputStream stream = new FileInputStream("test.txt");
    byte buffer[] = new byte[1024];
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
     
     
    int head = 0;
    while ((head = stream.read(buffer)) > 0) {
    	bos.write(buffer, 0, head);
    }
     
    bos.flush();
    System.out.println(bos.toString());
    • ์ด๋ ‡๊ฒŒ ์ „์ฒด ๋ฐ”์ดํŠธ๋ฅผ ๋ฐ›๊ณ  ๊ทธ๊ฑธ String ์œผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์จ์•ผํ•จ

Buffered ์˜ ์žฅ/๋‹จ์ 

๊ตฌ๋ถ„Non-BufferedBuffered
์ตœ๊ณ ํšจ์œจ์ž‘์€ํฌ๊ธฐ & ์ ์€๋นˆ๋„ ์ ‘๊ทผํฐํฌ๊ธฐ & ๋ฐ˜๋ณต์  ์ ‘๊ทผ
๊ฒฐ๋ก ์ž‘์€ ๋ฐ์ดํ„ฐ๋‚˜ ํ•œ ๋ฒˆ์— ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๋Š” ๊ฒฝ์šฐ ์ ํ•ฉํฐ ๋ฐ์ดํ„ฐ ํŒŒ์ผ, ๋ฐ˜๋ณต์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๋Š” ๊ฒฝ์šฐ ์ ํ•ฉ

Stream API

collection ๊ฐ์ฒด๋“ค์—์„œ ๋žŒ๋‹ค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ œ์–ด ํ•  ์ˆ˜์žˆ๋Š”

  • JS ๊ฐ™์ด filter ๋‚˜ map, foreach ํ•จ์ˆ˜๋“ค์„ ๋žŒ๋‹ค ํ‘œํ˜„์œผ๋กœ ์‚ฌ์šฉ๊ฐ€๋Šฅ

์ง„์ˆ˜ ํ‘œํ˜„ (n์ง„์ˆ˜ ๋ฆฌํ„ฐ๋Ÿด ํ‘œ๊ธฐ๋ฒ•)

  • 2์ง„์ˆ˜

    int a=0b10;
  • 16์ง„์ˆ˜

    int b=0x10

Java ์—์„œ์˜ ๋ฐ”์ดํŠธ ํ‘œํ˜„

  • ์˜ˆ๋ฅผ๋“ค์–ด 0xFF ์ฆ‰ 1111 1111 ์€ 10์ง„์ˆ˜๋กœ ํ‘œํ˜„ํ•˜๋ฉด 255
    • unsigned byte ๋กœ ํ‘œํ˜„ ํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€๊ฐ’
  • ํ•˜์ง€๋งŒ byte ์ž๋ฃŒํ˜•์€ ๋ถ€ํ˜ธ๊ฐ€ ์žˆ๋Š” 2์˜ ๋ณด์ˆ˜๋กœ ํ‘œํ˜„๋˜๊ธฐ์— -128 ~ 127 ๊นŒ์ง€์˜ ์ˆซ์ž๋งŒ ์ €์žฅ ๊ฐ€๋Šฅํ•˜๋‹ค
byte num = (byte) 0xFF;
// ๊ฐ’์€ -1
  • unsigned byte ์ž๋ฃŒ๋ฅผ ๋‹ค๋ฃฐ๋• byte ๋กœ ํ˜•๋ณ€ํ™˜ ํ•˜์—ฌ 2์˜ ๋ณด์ˆ˜๋ฒ• ์œผ๋กœ ํ•ด์„ ํ•˜๊ฒŒํ•œ๋‹ค
  • ์‹ค์ œ๋กœ File ์ด๋‚˜ ๊ธฐํƒ€ ๋ฐ”์ด๋„ˆ๋ฆฌ ์ž๋ฃŒ๋ฅผ ๋‹ค๋ฃฐ ๋•Œ byte[] ๋‹จ์œ„๋กœ ์ €์žฅ๋ ํ…๋ฐ ๊ฐ ๋ฐฐ์—ด ๊ฐ’์„ ๋ฐ”์ดํŠธ ๊ฐ’์„ 2์˜ ๋ณด์ˆ˜๋ฒ•์œผ๋กœ ํ•ด์„ ํ•˜๊ฒŒ ๋œ๋‹ค, ๊ทธ๋ž˜์„œ ์Œ์ˆ˜๊ฐ€ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋Š”๊ฒƒ

String ์ €์žฅ๋ฐฉ์‹

https://cl8d.tistory.com/39

์—…์ผ€์ŠคํŒ… & ๋‹ค์šด์ผ€์ŠคํŒ…

๋™์  ๋ฐ”์ธ๋”ฉ

  • ๋ถ€๋ชจ๋กœ ๋ถ€ํ„ฐ Overriding๋œ ๋ฉ”์†Œ๋“œ๋Š” ๋ถ€๋ชจ ๋ฉ”์†Œ๋“œ๋Š” ๋ฌด์‹œ๋˜๊ณ  ์ž์‹ ๋ฉ”์†Œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค
// ์Šˆํผํด๋ž˜์Šค
class Animal {
    public void sound() {
        System.out.println("Animal makes a sound");
    }
}
 
class Cat extends Animal {
    @Override
    public void sound() {
        System.out.println("Cat meows");
    }
}
 
public class Main {
    public static void main(String[] args) {
        Cat mycat = new Cat();
        mycat.sound();
	    // ์ž์‹ ๋ฉ”์†Œ๋“œ์— ๊ตฌํ˜„๋œ sound() ๊ฐ€ ์ˆ˜ํ–‰๋จ
    }
}

์—…์ผ€์ŠคํŒ… (Upcasting)

// ์Šˆํผํด๋ž˜์Šค
class Animal {
    public void sound() {
        System.out.println("Animal makes a sound");
    }
}
 
// ์„œ๋ธŒํด๋ž˜์Šค
class Dog extends Animal {
    @Override
    public void sound() {
        System.out.println("Dog barks");
    }
}
 
class Cat extends Animal {
    @Override
    public void sound() {
        System.out.println("Cat meows");
    }
}
 
public class Main {
    public static void main(String[] args) {
        Animal myDog = new Dog();
        Animal myCat = new Cat(); 
        
        myDog.sound();
        myCat.sound();
        
        Animal[] animals = { new Dog(), new Cat() };
        for (Animal animal : animals) {
            animal.sound();
        }
    }
}
  • ์ž์‹ ํด๋ž˜์Šค๋ฅผ ๋ถ€๋ชจ ๊ฐ์ฒด๋กœ ์ดˆ๊ธฐํ™” ํ•˜๋Š” ๋ฐฉ๋ฒ•
  • ์ด๋ ‡๊ฒŒ ์ดˆ๊ธฐํ™” ํ•˜๋”๋ผ๋„ ๋™์ ๋ฐ”์ธ๋”ฉ์ด ์ž‘๋™ํ•˜์—ฌ ์ž์‹์— ๊ตฌํ˜„๋œ ๋ฉ”์†Œ๋“œ๋งŒ ํ˜ธ์ถœํ•œ๋‹ค

์‚ฌ์šฉํ•˜๋Š” ์ด์œ ?

  • ๊ฐ€์žฅ ํฐ ์˜๋ฌธ์ด ๊ทธ๋ƒฅ ์ž์‹ ๊ทธ ์ž์ฒด๋กœ ๊ฐ์ฒด๋ฅผ ์ดˆ๊ธฐํ™” ํ•˜๋”๋ผ๋„ ๋™์  ๋ฐ”์ธ๋”ฉ ๊ฐ™์€ ๋™์ž‘์—๋Š” ์•„๋ฌด๋Ÿฐ ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค.

  • ๊ทธ๋ž˜์„œ ์—…์ผ€์ŠคํŒ…์ด ํ•„์š”ํ•œ ์ด์œ ๋ฅผ ๊ฐ€์žฅ ์ž˜ ์„ค๋ช…ํ•œ ๊ฒŒ ์•„๋ž˜ ์˜ˆ์ œ ์ด๋‹ค

    // ํ•ต์‹ฌ ๋ฉ”์†Œ๋“œ
    public void makeAnimalSound(Animal animal) {
        animal.sound();
    }
     
    Animal dog = new Dog();
    Animal cat = new Cat();
     
    makeAnimalSound(dog);  // Dog์˜ sound() ํ˜ธ์ถœ
    makeAnimalSound(cat);  // Cat์˜ sound() ํ˜ธ์ถœ
    • Dog ์™€ Cat ๋‘˜ ๋‹ค Animal ์ƒ์† ๋ฐ›์€ ์ƒํƒœ๋ผ ๋‚ด๊ฐ€ ์„ค๊ณ„ํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋Š”
      Cat, Dog ์™€ ๊ฐ™์ด Animal์„ ์ƒ์†๋ฐ›์€ ๋ชจ๋“  ๊ฐ์ฒด๋ฉด ์ƒ๊ด€์—†๋Š” ์ƒํ™ฉ์ด๋ผ๊ณ  ๊ฐ€์ •ํ•œ๋‹ค
    • ๊ทธ๋Ÿด๋•Œ๋Š” ์œ„ makeAnimalSound() ๋ฉ”์†Œ๋“œ ์ฒ˜๋Ÿผ Animal ์ด๋ผ๋Š” ํƒ€์ž…์œผ๋กœ
      ๋ญ‰๋šฑ๊ทธ๋ ค์„œ ํƒ€์ž…์„ ๋ช…์‹œ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
    • ๊ทธ๋ž˜์„œ ์—…์ผ€์ŠคํŒ…์€ ๊ทธ๋ƒฅ ํ•˜์œ„ ๊ฐ์ฒด ์ „์ฒด์˜ ํƒ€์ž…์„ ๋ช…์‹œํ•˜๊ธฐ ์œ„ํ•œ ์ˆ˜๋‹จ ์ •๋„๋กœ๋งŒ ๊ธฐ์–ตํ•˜์ž

๋‹ค์šด ์ผ€์ŠคํŒ… (DownCasting)

// ์Šˆํผํด๋ž˜์Šค
class Animal {
    public void sound() {
        System.out.println("Animal makes a sound");
    }
}
 
// ์„œ๋ธŒํด๋ž˜์Šค
class Dog extends Animal {
    @Override
    public void sound() {
        System.out.println("Dog barks");
    }
	public void bark() {
        System.out.println("์ด๊ฑด ๋‚˜ํ•œํ…Œ๋งŒ ์žˆ์Œ");
    }
}
 
// ํ•ต์‹ฌ ๋ฉ”์†Œ๋“œ
public void makeAnimalSound(Animal animal) {
	animal.sound();
 
	// ๋งŒ์•ฝ Dog ๊ฐ์ฒด๋ฉด
	if (animal instanceof Dog) {
	    Dog dog = (Dog) animal;  // ๋‹ค์šด์บ์ŠคํŒ…
	    dog.bark();  // Dog์˜ ๊ณ ์œ  ๋ฉ”์†Œ๋“œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
	}
}
  • ์œ„ ์˜ˆ์ œ ์ฒ˜๋Ÿผ makeAnimalSound() ์—์„œ Animal ํƒ€์ž…์— ๊ณตํ†ต ํ•จ์ˆ˜์ธ sound()๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ 
  • ๊ฐ๊ฐ์˜ ํ•˜์œ„ ํด๋ž˜์Šค์— ๊ตฌํ˜„๋œ ๊ณ ์œ ํ•œ ๋ฉ”์†Œ๋“œ๋‚˜, ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด
    ์™„์ „ํžˆ ์ž์‹ ํด๋ž˜์Šค๋กœ ์ „ํ™˜ ํ•˜๋Š” ๊ฒƒ
  • ์ €๋ ‡๊ฒŒ ๋ญ‰๋šฑ๊ทธ๋ ค์„œ Animal ๋กœ ํƒ€์ž…์„ ์ง€์ •ํ•œ ๊ฒฝ์šฐ ํ˜ธ์ถœํ• ๋•Œ ์‚ฌ์šฉ๋˜๋Š”
    ๊ฐ์ฒด ๊ฐ๊ฐ์— ๋Œ€ํ•ด ๋”ฐ๋กœ ์ฒ˜๋ฆฌํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค

Integer์˜ == ์—ฐ์‚ฐ ๋ฌธ์ œ

private void test() {
	Integer token_1 = Integer.parseInt(new String("1"));
	Integer token_2 = Integer.parseInt(new String("1"));
 
	if (token_1 > token_2) {
		System.out.println("1์ด ๋”ํผ");
	}
	
	if (token_1 < token_2) {
		System.out.println("2๊ฐ€ ๋”ํผ");
	}
	
	if (token_1 == token_2) {
		System.out.println("๊ฐ™์Œ");
	}
}

์—ฌ๊ธฐ์„œ ๋ฌธ์ œ๊ฐ€ token_1 == token_2์ด ์„ฑ๋ฆฝ ํ•  ์ˆ˜๋„ ์•ˆํ•  ์ˆ˜๋„ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
์ž๋ฐ” ๋ฒ„์ „์— ๋”ฐ๋ผ ๋‹ค๋ฅธ์ง€๋Š” ๋ชจ๋ฅด๊ฒ ๋Š”๋ฐ Integer์ž์ฒด๊ฐ€ ๊ฐ์ฒด๋ผ
== ์—ฐ์‚ฐ์ž๊ฐ€ ๊ฐ์ฒด๊ฐ€ ๊ฐ™์€์ง€๋ฅผ ํŒ๋‹จํ•˜๋Š” ์‹์œผ๋กœ ์น˜ํ™˜๋œ๋‹ค.

์ฆ‰ ์œ„์— ๋‚˜์˜จ ์กฐ๊ฑด์‹ ์ „๋ถ€๋ฅผ ๋งŒ์กฑํ•˜์ง€ ์•Š์„ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค๋Š” ๊ฑฐ๋‹ค!!

<, > ์—ฐ์‚ฐ์ž์˜ ๊ฒฝ์šฐ JVM์ด ์•Œ์•„์„œ int์›์‹œํƒ€์ž…์œผ๋กœ ์–ธ๋ฐ•์‹ฑ ํ•ด์ฃผ์ง€๋งŒ == ์—ฐ์‚ฐ์ž๋Š” ์•„๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๊ฐ’์— ๋Œ€ํ•œ ๋น„๊ต๋ฅผ ํ•˜๋ ค๋ฉด String ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ equals๋ฅผ ์“ฐ๊ฑฐ๋‚˜ ์•„๋‹ˆ๋ฉด int๋กœ ํ˜•๋ณ€ํ™˜ ํ•˜์—ฌ ์จ์•ผ ์ด๋Ÿฐ ๋ฌธ์ œ ์—†์ด ์ฝ”๋”ฉ ๊ฐ€๋Šฅํ•˜๋‹ค.

// int๋กœ ๋ฐ”๊ฟ”์„œ ์‚ฌ์šฉ
int token_1 = Integer.parseInt(new String("1"));
 
//๋˜๋Š” equals ์‚ฌ์šฉ
token_1.equals(token_2)