CodeGym/Java Blog/๋ฌด์ž‘์œ„์˜/์ถ”์ƒ ํด๋ž˜์Šค์™€ ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ฐจ์ด์ 
John Squirrels
๋ ˆ๋ฒจ 41
San Francisco

์ถ”์ƒ ํด๋ž˜์Šค์™€ ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ฐจ์ด์ 

๋ฌด์ž‘์œ„์˜ ๊ทธ๋ฃน์— ๊ฒŒ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค
ํšŒ์›
์•ˆ๋…•! ์ด ๋‹จ์›์—์„œ๋Š” ์ถ”์ƒ ํด๋ž˜์Šค๊ฐ€ ์ธํ„ฐํŽ˜์ด์Šค์™€ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅธ์ง€ ์„ค๋ช…ํ•˜๊ณ  ์ผ๋ฐ˜์ ์ธ ์ถ”์ƒ ํด๋ž˜์Šค์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ์˜ˆ๋ฅผ ๊ณ ๋ คํ•ฉ๋‹ˆ๋‹ค. ์ถ”์ƒ ํด๋ž˜์Šค์™€ ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ฐจ์ด์  - 1์ด ์ฃผ์ œ๋Š” ๋งค์šฐ ์ค‘์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ถ”์ƒ ํด๋ž˜์Šค์™€ ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ฐจ์ด์ ์— ๋Œ€ํ•ด ๋ณ„๋„์˜ ๊ฐ•์˜๋ฅผ ํ• ์• ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ–ฅํ›„ ์ธํ„ฐ๋ทฐ์˜ 90%์—์„œ ์ด๋Ÿฌํ•œ ๊ฐœ๋…์˜ ์ฐจ์ด์ ์— ๋Œ€ํ•ด ์งˆ๋ฌธ์„ ๋ฐ›๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ์ฝ๊ณ  ์žˆ๋Š” ๋‚ด์šฉ์„ ํŒŒ์•…ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฌด์–ธ๊ฐ€๋ฅผ ์™„์ „ํžˆ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ ์ถ”๊ฐ€ ์†Œ์Šค๋ฅผ ์ฝ์œผ์‹ญ์‹œ์˜ค. ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ์ถ”์ƒ ํด๋ž˜์Šค๊ฐ€ ๋ฌด์—‡์ธ์ง€, ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์••๋‹ˆ๋‹ค. ์ด์ œ ์ฐจ์ด์ ์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
  1. ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋™์ž‘๋งŒ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์ƒํƒœ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ถ”์ƒ ํด๋ž˜์Šค๋Š” ์ƒํƒœ๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

    ์˜ˆ๋ฅผ ๋“ค์–ด Bird์ถ”์ƒ ํด๋ž˜์Šค์™€ CanFly์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

    public abstract class Bird {
       private String species;
       private int age;
    
       public abstract void fly();
    
       public String getSpecies() {
           return species;
       }
    
       public void setSpecies(String species) {
           this.species = species;
       }
    
       public int getAge() {
           return age;
       }
    
       public void setAge(int age) {
           this.age = age;
       }
    }

    MockingJay์ƒˆ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค๊ณ  ์ƒ์†ํ•˜๋„๋ก ํ•ฉ์‹œ๋‹ค Bird.

    public class MockingJay extends Bird {
    
       @Override
       public void fly() {
           System.out.println("Fly, bird!");
       }
    
       public static void main(String[] args) {
    
           MockingJay someBird = new MockingJay();
           someBird.setAge(19);
           System.out.println(someBird.getAge());
       }
    }

    ๋ณด์‹œ๋‹ค์‹œํ”ผ ์ถ”์ƒ ํด๋ž˜์Šค์˜ ์ƒํƒœ(๊ทธ๊ฒƒ species๊ณผ age๋ณ€์ˆ˜)์— ์‰ฝ๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ๊ทธ๋Ÿฌ๋‚˜ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์ƒํ™ฉ์ด ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค. ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๊ณ  ์‹œ๋„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    public interface CanFly {
    
       String species = new String();
       int age = 10;
    
       public void fly();
    }
    
    public interface CanFly {
    
       private String species = new String(); // Error
       private int age = 10; // Another error
    
       public void fly();
    }

    ์ธํ„ฐํŽ˜์ด์Šค ๋‚ด๋ถ€์— ๊ฐœ์ธ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•  ์ˆ˜๋„ ์—†์Šต๋‹ˆ๋‹ค . ์™œ? ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ๊ตฌํ˜„์„ ์ˆจ๊ธฐ๊ธฐ ์œ„ํ•ด private ํ•œ์ •์ž๊ฐ€ ๋งŒ๋“ค์–ด์กŒ๊ธฐ ๋•Œ๋ฌธ ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ธํ„ฐํŽ˜์ด์Šค์—๋Š” ๋‚ด๋ถ€์— ๊ตฌํ˜„์ด ์—†์Šต๋‹ˆ๋‹ค. ์ˆจ๊ธธ ๊ฒƒ์ด ์—†์Šต๋‹ˆ๋‹ค.

    ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋™์ž‘๋งŒ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ธํ„ฐํŽ˜์ด์Šค ๋‚ด๋ถ€์— getter ๋ฐ setter๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์ธํ„ฐํŽ˜์ด์Šค์˜ ํŠน์„ฑ์ž…๋‹ˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ƒํƒœ๊ฐ€ ์•„๋‹ˆ๋ผ ๋™์ž‘๊ณผ ํ•จ๊ป˜ ์ž‘์—…ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

    Java 8์—๋Š” ๊ตฌํ˜„์ด ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ๋ฉ”์„œ๋“œ๊ฐ€ ๋„์ž…๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ์ด๋ฏธ ๊ทธ๋“ค์— ๋Œ€ํ•ด ์•Œ๊ณ  ์žˆ์œผ๋ฏ€๋กœ ์šฐ๋ฆฌ๋Š” ๋ฐ˜๋ณตํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  2. ์ถ”์ƒ ํด๋ž˜์Šค๋Š” ๋งค์šฐ ๋ฐ€์ ‘ํ•˜๊ฒŒ ๊ด€๋ จ๋œ ํด๋ž˜์Šค๋ฅผ ์—ฐ๊ฒฐํ•˜๊ณ  ํ†ตํ•ฉํ•ฉ๋‹ˆ๋‹ค. ๋™์‹œ์— ๋‹จ์ผ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ „ํ˜€ ๊ณตํ†ต์ ์ด ์—†๋Š” ํด๋ž˜์Šค์— ์˜ํ•ด ๊ตฌํ˜„๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ์ƒˆ์˜ ์˜ˆ๋กœ ๋Œ์•„๊ฐ€ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

    ์ถ”์ƒ ํด๋ž˜์Šค Bird๋Š” ํ•ด๋‹น ํด๋ž˜์Šค๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒˆ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ๋งŒ ์žˆ๊ณ  ๋‹ค๋ฅธ ๊ฒƒ์€ ์—†์Šต๋‹ˆ๋‹ค! ๋ฌผ๋ก  ๋‹ค์–‘ํ•œ ์ข…๋ฅ˜์˜ ์ƒˆ๋“ค์ด ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

    ์ถ”์ƒ ํด๋ž˜์Šค์™€ ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ฐจ์ด์  - 2

    ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด CanFly๋ชจ๋“  ์‚ฌ๋žŒ์ด ์ž์‹ ์˜ ๋ฐฉ์‹์œผ๋กœ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฆ„๊ณผ ๊ด€๋ จ๋œ ๋™์ž‘(๋น„ํ–‰)๋งŒ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ๊ด€๋ จ ์—†๋Š” ๋งŽ์€ ๊ฒƒ๋“ค์ด '๋‚  ์ˆ˜ ์žˆ๋‹ค'.

    ์ถ”์ƒ ํด๋ž˜์Šค์™€ ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ฐจ์ด์  - 3

    ์ด 4๊ฐœ์˜ ์—”ํ„ฐํ‹ฐ๋Š” ์„œ๋กœ ๊ด€๋ จ์ด ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ๋ชจ๋‘ ์‚ด์•„ ์žˆ์ง€๋„ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๋“ค์€ ๋ชจ๋‘ CanFly.

    ์ถ”์ƒ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„ค๋ช…ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋™์ผํ•œ ์ƒํƒœ ๋˜๋Š” ๋™์ผํ•œ ํ•„๋“œ๋ฅผ ๊ณต์œ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•ญ๊ณต๊ธฐ๋ฅผ ์ •์˜ํ•˜๋ ค๋ฉด ๋ชจ๋ธ, ์ƒ์‚ฐ ์—ฐ๋„ ๋ฐ ์ตœ๋Œ€ ์Šน๊ฐ ์ˆ˜์— ๋Œ€ํ•œ ํ•„๋“œ๊ฐ€ ํ•„์š”ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. Carlson์˜ ๊ฒฝ์šฐ ์˜ค๋Š˜ ๋จน์€ ๋ชจ๋“  ๊ณผ์ž๋ฅผ ์œ„ํ•œ ํ•„๋“œ์™€ ๋‚จ๋™์ƒ๊ณผ ํ•จ๊ป˜ ํ•  ๊ฒŒ์ž„ ๋ชฉ๋ก์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๊ธฐ์˜ ๊ฒฝ์šฐ, ...์–ด... ๋‚˜๋„ ๋ชจ๋ฅด๊ฒ ์–ด... ์•„๋งˆ๋„ '์„ฑ๊ฐ€์‹ฌ ์ˆ˜์ค€'? :)

    ์š”์ ์€ ๊ทธ๊ฒƒ๋“ค์„ ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•ด ์ถ”์ƒ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ๋„ˆ๋ฌด ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๋“ค์€ ๊ณต์œ ๋œ ํ–‰๋™์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋‚ ๊ณ , ์ˆ˜์˜ํ•˜๊ณ , ์ ํ”„ํ•˜๊ฑฐ๋‚˜, ๋‹ค๋ฅธ ํ–‰๋™์„ ๋ณด์ผ ์ˆ˜ ์žˆ๋Š” ์„ธ์ƒ์˜ ๋ชจ๋“  ๊ฒƒ์„ ์„ค๋ช…ํ•˜๋Š” ๋ฐ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

  3. ํด๋ž˜์Šค๋Š” ์›ํ•˜๋Š” ๋งŒํผ ๋งŽ์€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๋งŒ ์ƒ์†ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ์šฐ๋ฆฌ๋Š” ์ด๋ฏธ ์ด๊ฒƒ์„ ๋‘ ๋ฒˆ ์ด์ƒ ์–ธ๊ธ‰ํ–ˆ์Šต๋‹ˆ๋‹ค. Java๋Š” ํด๋ž˜์Šค์˜ ๋‹ค์ค‘ ์ƒ์†์ด ์—†์ง€๋งŒ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋‹ค์ค‘ ์ƒ์†์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ ์€ ์ด์ „ ํ•ญ๋ชฉ์—์„œ ๋ถ€๋ถ„์ ์œผ๋กœ ์ด์–ด์ง‘๋‹ˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ข…์ข… ๊ณตํ†ต์ ์ด ์—†๋Š” ๋งŽ์€ ๋‹ค๋ฅธ ํด๋ž˜์Šค๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐ˜๋ฉด ์ถ”์ƒ ํด๋ž˜์Šค๋Š” ๋งค์šฐ ๋ฐ€์ ‘ํ•˜๊ฒŒ ๊ด€๋ จ๋œ ํด๋ž˜์Šค ๊ทธ๋ฃน์— ๋Œ€ํ•ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋Ÿฌํ•œ ํด๋ž˜์Šค๋ฅผ ํ•˜๋‚˜๋งŒ ์ƒ์†ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด ์ด์น˜์— ๋งž์Šต๋‹ˆ๋‹ค. ์ถ”์ƒ ํด๋ž˜์Šค๋Š” 'is-a' ๊ด€๊ณ„๋ฅผ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

ํ‘œ์ค€ ์ธํ„ฐํŽ˜์ด์Šค: InputStream ๋ฐ OutputStream

์šฐ๋ฆฌ๋Š” ์ด๋ฏธ ์ž…๋ ฅ ๋ฐ ์ถœ๋ ฅ ์ŠคํŠธ๋ฆผ์„ ๋‹ด๋‹นํ•˜๋Š” ๋‹ค์–‘ํ•œ ํด๋ž˜์Šค๋ฅผ ์‚ดํŽด๋ณด์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  InputStream. OutputStream_ ์ผ๋ฐ˜์ ์œผ๋กœ ์ด๋“ค์€ ์ „ํ˜€ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์•„๋‹ˆ๋ผ ์™„์ „ํžˆ ์ˆœ์ˆ˜ํ•œ ์ถ”์ƒ ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค. ์ด์ œ ๊ทธ๊ฒƒ์ด ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋Š”์ง€ ์•Œ์•˜์œผ๋ฏ€๋กœ ์ž‘์—…ํ•˜๊ธฐ๊ฐ€ ํ›จ์”ฌ ์‰ฌ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. :) InputStream๋Š” ๋ฐ”์ดํŠธ ์ž…๋ ฅ์„ ๋‹ด๋‹นํ•˜๋Š” ์ถ”์ƒ ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค. Java์—๋Š” InputStream. ๊ฐ๊ฐ์€ ์„œ๋กœ ๋‹ค๋ฅธ ์†Œ์Šค์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์‹ ํ•˜๋„๋ก ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ถ€๋ชจ์ด๊ธฐ ๋•Œ๋ฌธ์— InputStream๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆผ ์ž‘์—…์„ ์‰ฝ๊ฒŒ ํ•˜๋Š” ์—ฌ๋Ÿฌ ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์˜ ๊ฐ ์ž์†์—๋Š” InputStream๋‹ค์Œ ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
  • int available()์ฝ์„ ์ˆ˜ ์žˆ๋Š” ๋ฐ”์ดํŠธ ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • close()์ž…๋ ฅ ์ŠคํŠธ๋ฆผ์„ ๋‹ซ์Šต๋‹ˆ๋‹ค.
  • int read()์ŠคํŠธ๋ฆผ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋‹ค์Œ ๋ฐ”์ดํŠธ์˜ ์ •์ˆ˜ ํ‘œํ˜„์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ŠคํŠธ๋ฆผ์˜ ๋์— ๋„๋‹ฌํ•˜๋ฉด -1์ด ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.
  • int read(byte[] buffer)๋ฐ”์ดํŠธ๋ฅผ ๋ฒ„ํผ๋กœ ์ฝ์œผ๋ ค๊ณ  ์‹œ๋„ํ•˜๊ณ  ์ฝ์€ ๋ฐ”์ดํŠธ ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ ๋์— ๋„๋‹ฌํ•˜๋ฉด -1์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • int read(byte[] buffer, int byteOffset, int byteCount)๋ฐ”์ดํŠธ ๋ธ”๋ก์˜ ์ผ๋ถ€๋ฅผ ์”๋‹ˆ๋‹ค. ๋ฐ”์ดํŠธ ๋ฐฐ์—ด์ด ์™„์ „ํžˆ ์ฑ„์›Œ์ง€์ง€ ์•Š์•˜์„ ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ ๋์— ๋„๋‹ฌํ•˜๋ฉด -1์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • long skip(long byteCount)์ž…๋ ฅ ์ŠคํŠธ๋ฆผ์—์„œ byteCount ๋ฐ”์ดํŠธ๋ฅผ ๊ฑด๋„ˆ๋›ฐ๊ณ  ๋ฌด์‹œ๋œ ๋ฐ”์ดํŠธ ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
์ „์ฒด ๋ฐฉ๋ฒ• ๋ชฉ๋ก์„ ๊ณต๋ถ€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค . ์‹ค์ œ๋กœ 10๊ฐœ ์ด์ƒ์˜ ํ•˜์œ„ ํด๋ž˜์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ์€ ๋ช‡ ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.
  1. FileInputStream: ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ์œ ํ˜•์˜ InputStream. ํŒŒ์ผ์—์„œ ์ •๋ณด๋ฅผ ์ฝ๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  2. StringBufferInputStream: ์˜ ๋˜ ๋‹ค๋ฅธ ์œ ์šฉํ•œ ์œ ํ˜•์ž…๋‹ˆ๋‹ค InputStream. ๋ฌธ์ž์—ด์„ InputStream;
  3. BufferedInputStream: ๋ฒ„ํผ๋ง๋œ ์ž…๋ ฅ ์ŠคํŠธ๋ฆผ์ž…๋‹ˆ๋‹ค. ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ๊ฐ€์žฅ ์ž์ฃผ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
์šฐ๋ฆฌ๊ฐ€ ๊ฐ€์„œ BufferedReader๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๊ณ  ๋งํ–ˆ๋˜ ๋•Œ๋ฅผ ๊ธฐ์–ตํ•˜์‹ญ๋‹ˆ๊นŒ? ์šฐ๋ฆฌ๊ฐ€ ์“ธ ๋•Œ:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))
...์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค BufferedReader. An์ด InputStreamReader์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ BufferedReader์„ฑ๋Šฅ์ด ํ–ฅ์ƒ๋˜๊ณ  ๊ฐœ๋ณ„ ๋ฌธ์ž๊ฐ€ ์•„๋‹Œ ์ „์ฒด ๋ฐ์ดํ„ฐ ํ–‰์„ ์ฝ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์—๋„ ๋™์ผํ•˜๊ฒŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค BufferedInputStream! ์ด ํด๋ž˜์Šค๋Š” ์ž…๋ ฅ ์žฅ์น˜์— ์ง€์†์ ์œผ๋กœ ์•ก์„ธ์Šคํ•˜์ง€ ์•Š๊ณ  ํŠน์ˆ˜ ๋ฒ„ํผ์— ์ž…๋ ฅ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ•์ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.InputStream;

public class BufferedInputExample {

   public static void main(String[] args) throws Exception {
       InputStream inputStream = null;
       BufferedInputStream buffer = null;

       try {

           inputStream = new FileInputStream("D:/Users/UserName/someFile.txt");

           buffer = new BufferedInputStream(inputStream);

           while(buffer.available()>0) {

               char c = (char)buffer.read();

                System.out.println("Character read: " + c);
           }
       } catch(Exception e) {

           e.printStackTrace();

       } finally {

           inputStream.close();
           buffer.close();
       }
   }
}
์ด ์˜ˆ์ œ์—์„œ๋Š” ์ปดํ“จํ„ฐ์˜ ' D:/Users/UserName/someFile.txt '์— ์žˆ๋Š” ํŒŒ์ผ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” 2๊ฐœ์˜ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. a FileInputStream์™€ BufferedInputStream๊ทธ๊ฒƒ์„ '๊ฐ์‹ธ๋Š”' a์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ํŒŒ์ผ์—์„œ ๋ฐ”์ดํŠธ๋ฅผ ์ฝ๊ณ  ๋ฌธ์ž๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ์ด ๋๋‚  ๋•Œ๊นŒ์ง€ ๊ทธ๋ ‡๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ๋ณด์‹œ๋‹ค์‹œํ”ผ ์—ฌ๊ธฐ์—๋Š” ๋ณต์žกํ•œ ๊ฒƒ์ด ์—†์Šต๋‹ˆ๋‹ค. ์ด ์ฝ”๋“œ๋ฅผ ๋ณต์‚ฌํ•˜์—ฌ ์ปดํ“จํ„ฐ์˜ ์‹ค์ œ ํŒŒ์ผ์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค :) ํด๋ž˜์Šค๋Š” OutputStream๋ฐ”์ดํŠธ์˜ ์ถœ๋ ฅ ์ŠคํŠธ๋ฆผ์„ ๋‚˜ํƒ€๋‚ด๋Š” ์ถ”์ƒ ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค. ์ด๋ฏธ ์•Œ๊ณ  ์žˆ๋“ฏ์ด ์ด๊ฒƒ์€ InputStream. ์–ด๋”˜๊ฐ€์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋”˜๊ฐ€๋กœ ๋ณด๋‚ด๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค . ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ InputStream์ด ์ถ”์ƒ ํด๋ž˜์Šค๋Š” ๋ชจ๋“  ํ•˜์œ„ ํ•ญ๋ชฉ์— ํŽธ๋ฆฌํ•œ ๋ฉ”์„œ๋“œ ์ง‘ํ•ฉ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • void close()์ถœ๋ ฅ ์ŠคํŠธ๋ฆผ์„ ๋‹ซ์Šต๋‹ˆ๋‹ค.
  • void flush()๋ชจ๋“  ์ถœ๋ ฅ ๋ฒ„ํผ๋ฅผ ์ง€์›๋‹ˆ๋‹ค.
  • abstract void write(int oneByte)์ถœ๋ ฅ ์ŠคํŠธ๋ฆผ์— 1๋ฐ”์ดํŠธ๋ฅผ ์”๋‹ˆ๋‹ค.
  • void write(byte[] buffer)์ถœ๋ ฅ ์ŠคํŠธ๋ฆผ์— ๋ฐ”์ดํŠธ ๋ฐฐ์—ด์„ ์”๋‹ˆ๋‹ค.
  • void write(byte[] buffer, int offset, int count)์˜คํ”„์…‹ ์œ„์น˜์—์„œ ์‹œ์ž‘ํ•˜์—ฌ ๋ฐฐ์—ด์—์„œ ์นด์šดํŠธ ๋ฐ”์ดํŠธ ๋ฒ”์œ„๋ฅผ ์”๋‹ˆ๋‹ค.
๋‹ค์Œ์€ ํด๋ž˜์Šค์˜ ์ผ๋ถ€ ํ›„์†์ž…๋‹ˆ๋‹ค OutputStream.
  1. DataOutputStream. ํ‘œ์ค€ Java ๋ฐ์ดํ„ฐ ์œ ํ˜•์„ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•œ ๋ฉ”์†Œ๋“œ๋ฅผ ํฌํ•จํ•˜๋Š” ์ถœ๋ ฅ ์ŠคํŠธ๋ฆผ์ž…๋‹ˆ๋‹ค.

    ๊ธฐ๋ณธ Java ๋ฐ์ดํ„ฐ ์œ ํ˜• ๋ฐ ๋ฌธ์ž์—ด์„ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•œ ๋งค์šฐ ๊ฐ„๋‹จํ•œ ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค. ์„ค๋ช…์ด ์—†์–ด๋„ ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

    import java.io.*;
    
    public class DataOutputStreamExample {
    
       public static void main(String[] args) throws IOException {
    
           DataOutputStream dos = new DataOutputStream(new FileOutputStream("testFile.txt"));
    
           dos.writeUTF("SomeString");
           dos.writeInt(22);
           dos.writeDouble(1.21323);
           dos.writeBoolean(true);
    
       }
    }

    writeDouble(), writeLong(), writeShort()๋“ฑ ๊ฐ ์œ ํ˜•์— ๋Œ€ํ•ด ๋ณ„๋„์˜ ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค .


  2. FileOutputStream. ์ด ํด๋ž˜์Šค๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋””์Šคํฌ์˜ ํŒŒ์ผ๋กœ ๋ณด๋‚ด๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฑด ๊ทธ๋ ‡๊ณ , ์šฐ๋ฆฌ๋Š” ์ด๋ฏธ ๋งˆ์ง€๋ง‰ ์˜ˆ์ œ์—์„œ ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ˆˆ์น˜์ฑ„์…จ๋‚˜์š”? '๋ž˜ํผ' ์—ญํ• ์„ ํ•˜๋Š” DataOutputStream์— ์ „๋‹ฌํ–ˆ์Šต๋‹ˆ๋‹ค.

  3. BufferedOutputStream. ๋ฒ„ํผ๋ง๋œ ์ถœ๋ ฅ ์ŠคํŠธ๋ฆผ. ์—ฌ๊ธฐ์—๋„ ๋ณต์žกํ•œ ๊ฒƒ์€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ ๋ชฉ์ ์€ BufferedInputStream(๋˜๋Š” BufferedReader)์™€ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์ธ ์ˆœ์ฐจ์  ๋ฐ์ดํ„ฐ ์ฝ๊ธฐ ๋Œ€์‹  ํŠน์ˆ˜ '๋ˆ„์ ' ๋ฒ„ํผ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์”๋‹ˆ๋‹ค. ๋ฒ„ํผ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐ์ดํ„ฐ ์‹ฑํฌ์— ์•ก์„ธ์Šคํ•˜๋Š” ํšŸ์ˆ˜๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์„ฑ๋Šฅ์ด ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค.

    import java.io.*;
    
    public class DataOutputStreamExample {
    
         public static void main(String[] args) throws IOException {
    
               FileOutputStream outputStream = new FileOutputStream("D:/Users/Username/someFile.txt");
               BufferedOutputStream bufferedStream = new BufferedOutputStream(outputStream);
    
               String text = "I love Java!"; // We'll convert this string to a byte array and write it to a file
    
               byte[] buffer = text.getBytes();
    
               bufferedStream.write(buffer, 0, buffer.length);
         }
    }

    ๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ, ์ด ์ฝ”๋“œ๋ฅผ ์ง์ ‘ ๊ฐ€์ง€๊ณ  ๋†€๋ฉด์„œ ์ปดํ“จํ„ฐ์˜ ์‹ค์ œ ํŒŒ์ผ์—์„œ ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

FileInputStream, FileOutputStream๋ฐ ์— ๋Œ€ํ•œ ๋ณ„๋„์˜ ๊ฐ•์˜๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ BuffreredInputStream์ฒ˜์Œ ์•„๋Š” ์‚ฌ๋žŒ์—๊ฒŒ๋Š” ์ถฉ๋ถ„ํ•œ ์ •๋ณด์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒŒ ๋‹ค์•ผ! ์šฐ๋ฆฌ๋Š” ๋‹น์‹ ์ด ์ธํ„ฐํŽ˜์ด์Šค์™€ ์ถ”์ƒ ํด๋ž˜์Šค์˜ ์ฐจ์ด์ ์„ ์ดํ•ดํ•˜๊ณ  ์–ด๋–ค ์งˆ๋ฌธ, ์‹ฌ์ง€์–ด ์†์ž„์ˆ˜ ์งˆ๋ฌธ์—๋„ ๋Œ€๋‹ตํ•  ์ค€๋น„๊ฐ€ ๋˜์–ด ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค :)
์ฝ”๋ฉ˜ํŠธ
  • ์ธ๊ธฐ
  • ์‹ ๊ทœ
  • ์ด์ „
์ฝ”๋ฉ˜ํŠธ๋ฅผ ๋‚จ๊ธฐ๋ ค๋ฉด ๋กœ๊ทธ์ธ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค
์ด ํŽ˜์ด์ง€์—๋Š” ์•„์ง ์ฝ”๋ฉ˜ํŠธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค