Java๐ŸŽ€

๐Ÿ’š์ธํ„ฐํŽ˜์ด์Šค(1)

Jeein0313 2023. 1. 16. 12:49

1๏ธโƒฃ์ธํ„ฐํŽ˜์ด์Šค ์—ญํ• 

 

์ธํ„ฐํŽ˜์ด์Šค๋Š” ์‚ฌ์ „์ ์ธ ์˜๋ฏธ๋กœ '๋‘ ์žฅ์น˜๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ์ ‘์†๊ธฐ'๋ฅผ ๋งํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ ๋‘ ์žฅ์น˜๋ฅผ ๊ฐ์ฒด๋กœ ๋ณด๋ฉด, ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ๋‘ ๊ฐ์ฒด๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

 

๊ฐ์ฒด A๊ฐ€ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด, ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๊ฐ์ฒด B์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›์•„ ๊ฐ์ฒด A๋กœ ์ „๋‹ฌํ•ด์ค€๋‹ค. ์™œ ์ด๋ ‡๊ฒŒ ์ค‘๊ฐ„์— ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ฑฐ์น˜๋„๋ก ํ•˜๋Š”๊ฒƒ์ผ๊นŒ? ๊ฐ์ฒด B๊ฐ€ ๊ฐ์ฒด C๋กœ ๊ต์ฒด๋œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž.

๊ฐ์ฒด A๋Š” ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ฉ”์†Œ๋“œ๋งŒ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ๊ฐ์ฒด B๊ฐ€ ๊ฐ์ฒด C๋กœ ๋ณ€๊ฒฝ๋œ ๊ฒƒ์—๋Š” ๊ด€์‹ฌ์ด ์—†๋‹ค. ๋งŒ์•ฝ ์ธํ„ฐํŽ˜์ด์Šค ์—†์ด ๊ฐ์ฒด A๊ฐ€ ๊ฐ์ฒด B๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ๊ฐ์ฒด A์˜ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๊ฐ์ฒด B์—์„œ ๊ฐ์ฒด C๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ์ž‘์—…์ด ์ถ”๊ฐ€๋กœ ํ•„์š”ํ•  ๊ฒƒ์ด๋‹ค. (์ฆ‰, ๊ฐ€์šด๋ฐ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋‘ ์œผ๋กœ์จ, ๊ฐ์ฒด A๋Š” ๊ฐ์ฒด B๊ฐ€ ๊ฐ์ฒด C๋กœ ๋ณ€๊ฒฝ๋˜๋“ , ๊ฐ์ฒด D๋กœ ๋ณ€๊ฒฝ๋˜๋“  ์ƒ๊ด€์—†์ด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ์„œ๋„ ๋‹ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.) ๋˜, ๊ฐ์ฒด B์™€ ๊ฐ์ฒด C์˜ ๋ฉ”์†Œ๋“œ ์‹คํ–‰ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ค๋ฅด๋‹ค๋ฉด, ๊ฐ์ฒด A๋Š” ๊ฐ์ฒด ๊ต์ฒด๋กœ ์ธํ•ด ์„œ๋กœ ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ์–ป๋Š”๋‹ค. ์ฆ‰, ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ธํ•ด ๋‹คํ˜•์„ฑ์ด ๊ตฌํ˜„๋˜๋Š” ๊ฒƒ์ด๋‹ค.

 

2๏ธโƒฃ์ธํ„ฐํŽ˜์ด์Šค ์„ ์–ธํ•˜๊ธฐ

//์ธํ„ฐํŽ˜์ด์Šค์˜ ์ ‘๊ธ‰ ์ œํ•œ์ž : default, public ๋งŒ ๊ฐ€๋Šฅ

public interface InterfaceA {
    //public ์ƒ์ˆ˜ ํ•„๋“œ
    //public ์ถ”์ƒ ๋ฉ”์†Œ๋“œ
    public void turnOn();
    //public ๋””ํดํŠธ ๋ฉ”์†Œ๋“œ
    //public ์ •์  ๋ฉ”์†Œ๋“œ
    //private ๋ฉ”์†Œ๋“œ
    //private ์ •์  ๋ฉ”์†Œ๋“œ    
}

 

3๏ธโƒฃ๊ตฌํ˜„ ํด๋ž˜์Šค ์„ ์–ธ

//implements ํ‚ค์›Œ๋“œ๋Š” ํ•ด๋‹น ํด๋ž˜์Šค๊ฐ€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋œป,
//์ธํ„ฐํŽ˜์ด์Šค์˜ ์ถ”์ƒ ๋ฉ”์†Œ๋“œ๋ฅผ ์žฌ์ •์˜ํ•œ ๋ฉ”์†Œ๋“œ๊ฐ€ ์žˆ๋‹ค๋Š” ๋œป
public class ImplClassA implements InterfaceA {
    @Override
    public void turnOn() {
        System.out.println("๊ตฌํ˜„ํด๋ž˜์Šค A๋ฅผ ํ‚ต๋‹ˆ๋‹ค.");
    }
    
}

 

4๏ธโƒฃ๋ณ€์ˆ˜ ์„ ์–ธ๊ณผ ๊ตฌํ˜„ ๊ฐ์ฒด ๋Œ€์ž…

 

์ธํ„ฐํŽ˜์ด์Šค๋„ ํ•˜๋‚˜์˜ ํƒ€์ž…์ด๋ฏ€๋กœ ๋ณ€์ˆ˜์˜ ํƒ€์ž…์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ฐธ์กฐ ํƒ€์ž…์— ์†ํ•˜๋ฏ€๋กœ null ๋Œ€์ž… ๊ฐ€๋Šฅํ•˜๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ๊ตฌํ˜„ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์ธํ„ฐํŽ˜์ด์Šค ๋ณ€์ˆ˜์— ๊ตฌํ˜„ ๊ฐ์ฒด๋ฅผ ๋Œ€์ž…ํ•ด์•ผ ํ•œ๋‹ค. (์ •ํ™•ํžˆ ๋งํ•˜๋ฉด ๊ตฌํ˜„ ๊ฐ์ฒด์˜ ๋ฒˆ์ง€ ๋Œ€์ž…) ์ธํ„ฐํŽ˜์ด์Šค ๋ณ€์ˆ˜์— ๊ตฌํ˜„ ๊ฐ์ฒด๊ฐ€ ๋Œ€์ž…๋˜์—ˆ๋‹ค๋ฉด ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ถ”์ƒ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด turnOn() ๋ฉ”์†Œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด, ์‹ค์ œ๋กœ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์€ ImplClassA์—์„œ ์žฌ์ •์˜๋œ turnOn() ๋ฉ”์†Œ๋“œ ์ด๋‹ค.

public class InterfaceExample {
    public static void main(String[] args) {
        InterfaceA a=new ImplClassA();
        a.turnOn();//๊ตฌํ˜„ํด๋ž˜์Šค A๋ฅผ ํ‚ต๋‹ˆ๋‹ค.
    }
    
}
public class ImplClassB implements InterfaceA {

    @Override
    public void turnOn() {
        System.out.println("๊ตฌํ˜„ํด๋ž˜์Šค B๋ฅผ ํ‚ต๋‹ˆ๋‹ค.");
    }
    
}
public class InterfaceExample {
    public static void main(String[] args) {
        InterfaceA a=new ImplClassA();
        a.turnOn();//๊ตฌํ˜„ํด๋ž˜์Šค A๋ฅผ ํ‚ต๋‹ˆ๋‹ค.

        a = new ImplClassB();
        a.turnOn();//๊ตฌํ˜„ํด๋ž˜์Šค B๋ฅผ ํ‚ต๋‹ˆ๋‹ค.
    }
    
}

 

5๏ธโƒฃ์ƒ์ˆ˜ ํ•„๋“œ

 

์ธํ„ฐํŽ˜์ด์Šค๋Š” public static final ํŠน์„ฑ์„ ๊ฐ–๋Š” ๋ถˆ๋ณ€์˜ ์ƒ์ˆ˜ ํ•„๋“œ๋ฅผ ๋ฉค๋ฒ„๋กœ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค์— ์„ ์–ธ๋œ ํ•„๋“œ๋Š” ๋ชจ๋‘ public static final ํŠน์„ฑ์„ ๊ฐ–๊ธฐ ๋•Œ๋ฌธ์— ์ƒ๋žตํ•ด๋„ ์ž๋™์ ์œผ๋กœ ์ปดํŒŒ์ผ ๊ณผ์ •์— ๋ถ™๊ฒŒ ๋œ๋‹ค. ์ƒ์ˆ˜๋ช…์€ ๋Œ€๋ฌธ์ž๋กœ ์ž‘์„ฑํ•˜๋˜, ์„œ๋กœ ๋‹ค๋ฅธ ๋‹จ์–ด๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์„ ๊ฒฝ์šฐ _ ๋กœ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ์ด ๊ด€๋ก€

public interface InterfaceA {
    //public ์ƒ์ˆ˜ ํ•„๋“œ
    int MAX_VALUE = 10;
    int MIN_VALUE = 0;
    //public ์ถ”์ƒ ๋ฉ”์†Œ๋“œ
    public void turnOn();
    //public ๋””ํดํŠธ ๋ฉ”์†Œ๋“œ
    //public ์ •์  ๋ฉ”์†Œ๋“œ
    //private ๋ฉ”์†Œ๋“œ
    //private ์ •์  ๋ฉ”์†Œ๋“œ    
}
public class InterfaceExample {
    public static void main(String[] args) {
        //์ƒ์ˆ˜๋Š” ๊ตฌํ˜„ ๊ฐ์ฒด์™€ ๊ด€๋ จ ์—†๋Š” ์ธํ„ฐํŽ˜์ด์Šค ์†Œ์† ๋ฉค๋ฒ„์ด๊ธฐ ๋•Œ๋ฌธ์— ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋ฐ”๋กœ ์ ‘๊ทผ ๊ฐ€๋Šฅ
        System.out.println(InterfaceA.MIN_VALUE+"~"+InterfaceA.MAX_VALUE);//1~10
    }
    
}

 

6๏ธโƒฃ์ถ”์ƒ ๋ฉ”์†Œ๋“œ

 

์ธํ„ฐํŽ˜์ด์Šค๋Š” ๊ตฌํ˜„ ํด๋ž˜์Šค๊ฐ€ ์žฌ์ •์˜ํ•ด์•ผ ํ•˜๋Š” public ์ถ”์ƒ ๋ฉ”์†Œ๋“œ๋ฅผ ๋ฉค๋ฒ„๋กœ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค. ์ถ”์ƒ ๋ฉ”์†Œ๋“œ๋Š” ๋ฆฌํ„ด ํƒ€์ž…, ๋ฉ”์†Œ๋“œ๋ช…, ๋งค๊ฐœ๋ณ€์ˆ˜๋งŒ ๊ธฐ์ˆ ๋˜๊ณ  ์ค‘๊ด„ํ˜ธ{}๋ฅผ ๋ถ™์ด์ง€ ์•Š๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ๋งํ•œ๋‹ค.(์‹คํ–‰๋ถ€๊ฐ€ ์—†๋Š”) public abstract๋ฅผ ์ƒ๋žตํ•˜๋”๋ผ๋„ ์ปดํŒŒ์ผ ๊ณผ์ •์—์„œ ์ž๋™์œผ๋กœ ๋ถ™๊ฒŒ ๋œ๋‹ค.

public interface InterfaceA {
    //public ์ƒ์ˆ˜ ํ•„๋“œ
    int MAX_VALUE = 10;
    int MIN_VALUE = 0;

    //์ถ”์ƒ ๋ฉ”์†Œ๋“œ
    void turnOn();
    void turnOff();
    void setVolume(int volume);

    //public ๋””ํดํŠธ ๋ฉ”์†Œ๋“œ
    //public ์ •์  ๋ฉ”์†Œ๋“œ
    //private ๋ฉ”์†Œ๋“œ
    //private ์ •์  ๋ฉ”์†Œ๋“œ    
}
public class ImplClassA implements InterfaceA {

    private int volume;

    //InterfaceA์— ์„ ์–ธ๋œ ๋ชจ๋“  ์ถ”์ƒ ๋ฉ”์†Œ๋“œ๋ฅผ ์žฌ์ •์˜ํ•ด์•ผ ํ•œ๋‹ค.
    @Override
    public void turnOn() {
        System.out.println("๊ตฌํ˜„ํด๋ž˜์Šค A๋ฅผ ํ‚ต๋‹ˆ๋‹ค.");
    }

    @Override
    public void turnOff() {
        // TODO Auto-generated method stub
        System.out.println("๊ตฌํ˜„ํด๋ž˜์Šค A๋ฅผ ๋•๋‹ˆ๋‹ค.");
    }

    @Override
    public void setVolume(int volume) {
        if (volume > InterfaceA.MAX_VALUE) {
            this.volume = InterfaceA.MAX_VALUE;
        } else if (volume < InterfaceA.MIN_VALUE) {
            this.volume = InterfaceA.MIN_VALUE;
        } else {
            this.volume = volume;
        }
        System.out.println("ํ˜„์žฌ ๋ณผ๋ฅจ : "+this.volume);
    }
    
}
public class ImplClassB implements InterfaceA {

    private int volume;

    @Override
    public void turnOn() {
        System.out.println("๊ตฌํ˜„ํด๋ž˜์Šค B๋ฅผ ํ‚ต๋‹ˆ๋‹ค.");
    }

    @Override
    public void turnOff() {
        System.out.println("๊ตฌํ˜„ํด๋ž˜์Šค B๋ฅผ ๋•๋‹ˆ๋‹ค.");
    }

    @Override
    public void setVolume(int volume) {
        if (volume > InterfaceA.MAX_VALUE) {
            this.volume = InterfaceA.MAX_VALUE;
        } else if (volume < InterfaceA.MIN_VALUE) {
            this.volume = InterfaceA.MIN_VALUE;
        } else {
            this.volume = volume;
        }
        System.out.println("ํ˜„์žฌ ๋ณผ๋ฅจ : "+this.volume);
    }
    
}

๊ตฌํ˜„ ํด๋ž˜์Šค์—์„œ ์ถ”์ƒ ๋ฉ”์†Œ๋“œ๋ฅผ ์žฌ์ •์˜ํ•  ๋•Œ ์ฃผ์˜ํ•  ์ ์€ ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ถ”์ƒ ๋ฉ”์†Œ๋“œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ public ์ ‘๊ทผ ์ œํ•œ์„ ๊ฐ–๊ธฐ ๋•Œ๋ฌธ์— public๋ณด๋‹ค ๋” ๋‚ฎ์€ ์ ‘๊ทผ ์ œํ•œ์œผ๋กœ ์žฌ์ •์˜ํ•  ์ˆ˜ ์—†๋‹ค. ๊ทธ๋ž˜์„œ ์žฌ์ •์˜๋˜๋Š” ๋ฉ”์†Œ๋“œ์—๋Š” ๋ชจ๋‘ public์ด ์ถ”๊ฐ€๋˜์–ด ์žˆ๋‹ค.

public class InterfaceExample {
    public static void main(String[] args) {
        InterfaceA a = new ImplClassA();
        a.turnOn();//๊ตฌํ˜„ํด๋ž˜์Šค A๋ฅผ ํ‚ต๋‹ˆ๋‹ค.
        a.setVolume(20);//ํ˜„์žฌ ๋ณผ๋ฅจ : 10
        a.turnOff();//๊ตฌํ˜„ํด๋ž˜์Šค A๋ฅผ ๋•๋‹ˆ๋‹ค.

        a = new ImplClassB();
        a.turnOn();//๊ตฌํ˜„ํด๋ž˜์Šค B๋ฅผ ํ‚ต๋‹ˆ๋‹ค.
        a.setVolume(-1);//ํ˜„์žฌ ๋ณผ๋ฅจ : 0
        a.turnOff();//๊ตฌํ˜„ํด๋ž˜์Šค B๋ฅผ ๋•๋‹ˆ๋‹ค

    }
    
}

 

7๏ธโƒฃ๋””ํดํŠธ ๋ฉ”์†Œ๋“œ

 

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

๊ตฌํ˜„ ํด๋ž˜์Šค๋Š” ๋””ํดํŠธ ๋ฉ”์†Œ๋“œ๋ฅผ ์žฌ์ •์˜ํ•ด์„œ ์ž์‹ ์— ๋งž๊ฒŒ ์ˆ˜์ •ํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ์žฌ์ •์˜ ์‹œ ์ฃผ์˜ํ•  ์ ์€ public ์ ‘๊ทผ ์ œํ•œ์ž๋ฅผ ๋ฐ˜๋“œ์‹œ ๋ถ™์—ฌ์•ผ ํ•˜๊ณ , default ํ‚ค์›Œ๋“œ๋ฅผ ์ƒ๋žตํ•ด์•ผ ํ•œ๋‹ค. ImplClassB์— setMute() ๋ฉ”์†Œ๋“œ๋ฅผ ์žฌ์ •ํ•ด ์›๋ž˜ ๋ณผ๋ฅจ์œผ๋กœ ๋ณต์›ํ•ด๋ณด์ž.

public interface InterfaceA {
    //public ์ƒ์ˆ˜ ํ•„๋“œ
    int MAX_VALUE = 10;
    int MIN_VALUE = 0;

    //์ถ”์ƒ ๋ฉ”์†Œ๋“œ
    void turnOn();
    void turnOff();
    void setVolume(int volume);

    //public ๋””ํดํŠธ ๋ฉ”์†Œ๋“œ
    default void setMute(boolean mute) {
        if (mute) {
            System.out.print("๋ฌด์Œ์ฒ˜๋ฆฌ ");
            setVolume(MIN_VALUE);
        } else {
            System.out.print("๋ฌด์Œํ•ด์ œ ");
        }
    }
    //public ์ •์  ๋ฉ”์†Œ๋“œ
    //private ๋ฉ”์†Œ๋“œ
    //private ์ •์  ๋ฉ”์†Œ๋“œ    
}
public class ImplClassA implements InterfaceA {

    private int volume;

    //InterfaceA์— ์„ ์–ธ๋œ ๋ชจ๋“  ์ถ”์ƒ ๋ฉ”์†Œ๋“œ๋ฅผ ์žฌ์ •์˜ํ•ด์•ผ ํ•œ๋‹ค.
    @Override
    public void turnOn() {
        System.out.println("๊ตฌํ˜„ํด๋ž˜์Šค A๋ฅผ ํ‚ต๋‹ˆ๋‹ค.");
    }

    @Override
    public void turnOff() {
        System.out.println("๊ตฌํ˜„ํด๋ž˜์Šค A๋ฅผ ๋•๋‹ˆ๋‹ค.");
    }

    @Override
    public void setVolume(int volume) {
        if (volume > InterfaceA.MAX_VALUE) {
            this.volume = InterfaceA.MAX_VALUE;
        } else if (volume < InterfaceA.MIN_VALUE) {
            this.volume = InterfaceA.MIN_VALUE;
        } else {
            this.volume = volume;
        }
        System.out.println("ํ˜„์žฌ ๋ณผ๋ฅจ : "+this.volume);
    }
    
}
public class ImplClassB implements InterfaceA {

    private int volume;

    @Override
    public void turnOn() {
        System.out.println("๊ตฌํ˜„ํด๋ž˜์Šค B๋ฅผ ํ‚ต๋‹ˆ๋‹ค.");
    }

    @Override
    public void turnOff() {
        System.out.println("๊ตฌํ˜„ํด๋ž˜์Šค B๋ฅผ ๋•๋‹ˆ๋‹ค.");
    }

    @Override
    public void setVolume(int volume) {
        if (volume > InterfaceA.MAX_VALUE) {
            this.volume = InterfaceA.MAX_VALUE;
        } else if (volume < InterfaceA.MIN_VALUE) {
            this.volume = InterfaceA.MIN_VALUE;
        } else {
            this.volume = volume;
        }
        System.out.println("ํ˜„์žฌ ๋ณผ๋ฅจ : " + this.volume);
    }
    
    //์ถ”๊ฐ€ํ•œ ํ•„๋“œ
    private int memoryVolume;

    //์žฌ์ •์˜ํ•œ ๋””ํดํŠธ ๋ฉ”์†Œ๋“œ
    @Override
    public void setMute(boolean mute) {
        if (mute) {
            this.memoryVolume = this.volume;
            System.out.print("๋ฌด์Œ์ฒ˜๋ฆฌ ");
            setVolume(InterfaceA.MIN_VALUE);
        } else {
            System.out.print("๋ฌด์Œํ•ด์ œ ");
            setVolume(this.memoryVolume);
        }
    }
    
}

 

8๏ธโƒฃ์ •์  ๋ฉ”์†Œ๋“œ

 

์ถ”์ƒ ๋ฉ”์†Œ๋“œ์™€ ๋””ํดํŠธ ๋ฉ”์†Œ๋“œ๋Š” ๊ตฌํ˜„ ๊ฐ์ฒด๊ฐ€ ํ•„์š”ํ•˜์ง€๋งŒ, ์ •์  ๋ฉ”์†Œ๋“œ๋Š” ๊ตฌํ˜„ ๊ฐ์ฒด๊ฐ€ ์—†์–ด๋„ ์ธํ„ฐํŽ˜์ด์Šค๋งŒ์œผ๋กœ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค. public์„ ์ƒ๋žตํ•˜๋”๋ผ๋„ ์ž๋™์œผ๋กœ ์ปดํŒŒ์ผ ๊ณผ์ •์—์„œ ๋ถ™์Œ.

public interface InterfaceA {
    //public ์ƒ์ˆ˜ ํ•„๋“œ
    int MAX_VALUE = 10;
    int MIN_VALUE = 0;

    //์ถ”์ƒ ๋ฉ”์†Œ๋“œ
    void turnOn();
    void turnOff();
    void setVolume(int volume);

    //public ๋””ํดํŠธ ๋ฉ”์†Œ๋“œ
    default void setMute(boolean mute) {
        if (mute) {
            System.out.print("๋ฌด์Œ์ฒ˜๋ฆฌ ");
            setVolume(MIN_VALUE);
        } else {
            System.out.print("๋ฌด์Œํ•ด์ œ ");
        }
    }
    //public ์ •์  ๋ฉ”์†Œ๋“œ
    static void changeBattery() {
        System.out.println("๊ฑด์ „์ง€๋ฅผ ๊ตํ™˜ํ•ฉ๋‹ˆ๋‹ค.");
    }
    //private ๋ฉ”์†Œ๋“œ
    //private ์ •์  ๋ฉ”์†Œ๋“œ    
}
public class InterfaceExample {
    public static void main(String[] args) {
        InterfaceA.changeBattery();
    }
}

์ •์  ๋ฉ”์†Œ๋“œ ์‹คํ–‰๋ถ€ ์ž‘์„ฑ์‹œ ์œ ์˜ํ•  ์ ์€, ์ƒ์ˆ˜ ํ•„๋“œ๋ฅผ ์ œ์™ธํ•œ ์ถ”์ƒ ๋ฉ”์†Œ๋“œ, ๋””ํดํŠธ ๋ฉ”์†Œ๋“œ, private ๋ฉ”์†Œ๋“œ ๋“ฑ์€ ํ˜ธ์ถœํ•  ์ˆ˜ ์—†๋‹ค๋Š” ์ ์ด๋‹ค.(๊ตฌํ˜„ ๊ฐ์ฒด๊ฐ€ ํ•„์š”ํ•œ ์ธ์Šคํ„ด์Šค ๋ฉ”์†Œ๋“œ์ด๊ธฐ ๋•Œ๋ฌธ)

 

9๏ธโƒฃprivate ๋ฉ”์†Œ๋“œ

 

์ธํ„ฐํŽ˜์ด์Šค์˜ ์ƒ์ˆ˜ ํ•„๋“œ, ์ถ”์ƒ ๋ฉ”์†Œ๋“œ, ๋””ํดํŠธ ๋ฉ”์†Œ๋“œ, ์ •์  ๋ฉ”์†Œ๋“œ๋Š” ๋ชจ๋‘ public ์ ‘๊ทผ ์ œํ•œ์„ ๊ฐ–๋Š”๋‹ค. ์ด ๋ฉค๋ฒ„๋“ค์„ ์„ ์–ธํ•  ๋•Œ๋Š” public์„ ์ƒ๋žตํ•˜๋”๋ผ๋„ ์ปดํŒŒ์ผ ๊ณผ์ •์—์„œ public ์ ‘๊ทผ ์ œํ•œ์ž๊ฐ€ ๋ถ™์–ด ํ•ญ์ƒ ์™ธ๋ถ€์—์„œ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. 

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

 

๐Ÿ”Ÿ๋‹ค์ค‘ ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„

 

๊ตฌํ˜„ ๊ฐ์ฒด๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ implements ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ตฌํ˜„ ๊ฐ์ฒด๊ฐ€ ์ธํ„ฐํŽ˜์ด์ŠคA์™€ ์ธํ„ฐํŽ˜์ด์ŠคB๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ๋‹ค๋ฉด, ๊ฐ๊ฐ์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ๊ตฌํ˜„ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ตฌํ˜„ ํด๋ž˜์Šค๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ธํ„ฐํŽ˜์ด์Šค A์™€ ์ธํ„ฐํŽ˜์ด์Šค B๋ฅผ implements ๋’ค์— ์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„ํ•ด์„œ ์ž‘์„ฑํ•ด, ๋ชจ๋“  ์ธํ„ฐํŽ˜์ด์Šค ๊ฐ€์ง„ ์ถ”์ƒ ๋ฉ”์†Œ๋“œ๋ฅผ ์žฌ์ •์˜ํ•ด์•ผ ํ•œ๋‹ค.

public class SmartTelevision implements RemoteControl, Searchable {
    
    @Override
    public void turnOn() {
        System.out.println("TV๋ฅผ ์ผญ๋‹ˆ๋‹ค.");        
    }

    @Override
    public void turnOff() {
        System.out.println("TV๋ฅผ ๋•๋‹ˆ๋‹ค.");        
        
    }
     @Override
    public void search(String url) {
        System.out.println(url+"์„ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.");        
    }

    
}
public interface RemoteControl {
    void turnOn();
    void turnOff();
}
public interface Searchable {
    void search(String url);
}

..์ธํ„ฐํŽ˜์ด์Šค(2)์—์„œ ๊ณ„์†..

 

 

โ•๋ณธ ํฌ์ŠคํŒ…์€ '์ด๊ฒƒ์ด ์ž๋ฐ”๋‹ค' ๊ต์žฌ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ๊ณต๋ถ€ํ•œ ๋‚ด์šฉ์„ ์ •๋ฆฌํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.