GiantStepDEV
article thumbnail

μΈν„°νŽ˜μ΄μŠ€?

μ™„μ „ 좔상화 κ°œλ…μœΌλ‘œ μΈν„°νŽ˜μ΄μŠ€μ— ν¬ν•¨λœ λ©”μ†Œλ“œλŠ” 일반적으둜 μ „λΆ€ 좔상 λ©”μ†Œλ“œμ΄λ‹€.
λ©”μ†Œλ“œλ₯Ό μ„ μ–Έν•˜λ©΄ κΈ°μž… μ—¬λΆ€ 상관없이 public abstract ν‚€μ›Œλ“œλ‘œ λ™μž‘ν•œλ‹€.
(=> μ•ˆλΆ™μ—¬λ„ JVM이 μžλ™μœΌλ‘œ λΆ™μž„)
μΈν„°νŽ˜μ΄μŠ€ 상속 ν‚€μ›Œλ“œλŠ” implements

쑰금 더 μžμ„Ένžˆ ν’€μ–΄μ„œ μ„€λͺ…ν•˜μžλ©΄...

μš°μ„  μžλ°”μ—μ„œλŠ” 닀쀑상속을 μ§€μ›ν•˜μ§€ μ•ŠλŠ”λ‹€. (λ©”μ†Œλ“œ μΆœμ²˜κ°€ λͺ¨ν˜Έν•΄μ§€λŠ” λ¬Έμ œκ°€ 있기 λ•Œλ¬Έμ—)

ν•˜μ§€λ§Œ! μžμ‹ ν΄λž˜μŠ€κ°€ μ—¬λŸ¬ λΆ€λͺ¨ 클래슀λ₯Ό 상속받을 수 μžˆλ‹€λ©΄ λ‹€μ–‘ν•œ λ™μž‘μ„ μˆ˜ν–‰ν•  수 μžˆλŠ” 닀쀑상속을 버릴 수 없기에 μžλ°”μ—μ„œλŠ” μΈν„°νŽ˜μ΄μŠ€λΌλŠ” 것을 톡해 닀쀑 상속을 μ§€μ›ν•˜κ³  μžˆλ‹€.
즉, μΈν„°νŽ˜μ΄μŠ€(interface)λž€ λ‹€λ₯Έ 클래슀λ₯Ό μž‘μ„±ν•  λ•Œ 기본이 λ˜λŠ” 틀을 μ œκ³΅ν•˜λ©΄μ„œ,
λ‹€λ₯Έ 클래슀 μ‚¬μ΄μ˜ 쀑간 맀개 μ—­ν• κΉŒμ§€ λ‹΄λ‹Ήν•˜λŠ” μΌμ’…μ˜ 좔상 클래슀λ₯Ό μ˜λ―Έν•œλ‹€.
μΈν„°νŽ˜μ΄μŠ€λŠ” μ˜€λ‘œμ§€ 좔상 λ©”μ†Œλ“œμ™€ μƒμˆ˜λ§Œ 포함 κ°€λŠ₯!!!!!!!!!!!!!

  • μƒμˆ˜ : λͺ¨λ“  ν•„λ“œλŠ” μžλ™μœΌλ‘œ μƒμˆ˜(final static)으둜 λ³€ν™˜
  • λ©”μ†Œλ“œ : λͺ¨λ“  λ©”μ†Œλ“œλŠ” μžλ™μœΌλ‘œ public abstractκ°€ μΆ”κ°€λ˜μ–΄ 좔상 λ©”μ†Œλ“œλ‘œ λ³€κ²½λœλ‹€.
                  λ‹Ήμ—°ν•˜κ²Œλ„ 상속 받은 ν΄λž˜μŠ€μ—μ„œ 무쑰건 κ΅¬ν˜„ν•΄μ•Ό 함.
  • default λ©”μ†Œλ“œ : μ΄λ¦„μ—μ„œ μ•Œ 수 μžˆλ“―μ΄ μ ‘κ·Όμ œν•œμžμ΄λ©°, μžλ°” 버전 1.8λΆ€ν„° μΆ”κ°€λœ 문법이닀.
                              μœ μΌν•˜κ²Œ κ΅¬ν˜„λΆ€λ₯Ό κ°€μ§ˆ 수 있으며, 상속 받은 ν΄λž˜μŠ€μ—μ„œ μž¬μ •μ˜ν•˜μ—¬ μ‚¬μš© κ°€λŠ₯함.
  • 정적 λ©”μ†Œλ“œ : 객체와 상관없이 μΈν„°νŽ˜μ΄μŠ€ νƒ€μž…μœΌλ‘œ μ‚¬μš© κ°€λŠ₯

μΈν„°νŽ˜μ΄μŠ€ μ„ μ–Έ

μ ‘κ·Όμ œμ–΄μž interface μΈν„°νŽ˜μ΄μŠ€μ΄λ¦„ {
    public static final λ°μ΄ν„°νƒ€μž… λ³€μˆ˜λͺ… = κ°’;
    
    ...
    
    public abstract λ©”μ†Œλ“œμ΄λ¦„(λ§€κ°œλ³€μˆ˜ λͺ©λ‘) {
    
    }
}
μΈν„°νŽ˜μ΄μŠ€μ˜ λͺ¨λ“  ν•„λ“œλŠ” public static final , λͺ¨λ“  λ©”μ†Œλ“œλŠ” public abstract μ—¬μ•Ό 함.
이 뢀뢄은 λͺ¨λ“  μΈν„°νŽ˜μ΄μŠ€μ— κ³΅ν†΅μœΌλ‘œ 적용되기 λ•Œλ¬Έμ— μƒλž΅ κ°€λŠ₯^^
μ»΄νŒŒμΌν•  λ•Œ μ»΄νŒŒμΌλŸ¬κ°€ μžλ™μœΌλ‘œ μΆ”κ°€ν•΄ 쀌.

μΈν„°νŽ˜μ΄μŠ€ κ΅¬ν˜„

μΈν„°νŽ˜μ΄μŠ€λŠ” 좔상 ν΄λž˜μŠ€μ™€ λ§ˆμ°¬κ°€μ§€λ‘œ μžμ‹ μ΄ 직접 객체λ₯Ό 생성할 수 μ—†μŒ.
λ”°λΌμ„œ μΈν„°νŽ˜μ΄μŠ€κ°€ ν¬ν•¨ν•˜κ³  μžˆλŠ” 좔상 λ©”μ†Œλ“œλ₯Ό κ΅¬ν˜„ν•΄ 쀄 클래슀λ₯Ό μž‘μ„±ν•΄μ•Ό ν•œλ‹€.
class ν΄λž˜μŠ€μ΄λ¦„ implements μΈν„°νŽ˜μ΄μŠ€μ΄λ¦„ {...}

μΈν„°νŽ˜μ΄μŠ€ κΈ°λ³Έ 예제)

NetworkAdapter(interface Class..λΆ€λͺ¨ 클래슀)

public interface NetworkAdapter {
    void connect(); // public abstractκ°€ ν¬ν•¨λ˜μ–΄ 있음..
}

Wifi(상속받은 μžμ‹ 클래슀)

class Wifi implements NetworkAdapter {
    String company;
    Wifi(String company) {
        this.company = company;
    }
    @Override
    public void connect() {
        System.out.println(company + "의 Wifi에 μ—°κ²°λ˜μ—ˆμŠ΅λ‹ˆλ‹€.");
    }
}

5G(상속받은 μžμ‹ 클래슀)

class FiveG implements NetworkAdapter {
    String company;
    FiveG(String company) {
        this.company = company;
    }
    
    @Override
    public void connect() {
        System.out.println(company + "의 5G에 μ—°κ²°λ˜μ—ˆμŠ΅λ‹ˆλ‹€.");
    }
}

LTE(상속받은 μžμ‹ 클래슀)

class Lte implements NetworkAdapter {
    String company;
    Lte(String company) {
        this.company = company;
    }
    
    @Override
    public void connect() {
        System.out.println(company + "의 LTE에 μ—°κ²°λ˜μ—ˆμŠ΅λ‹ˆλ‹€.");
    }
}

Main

public class InterfaceMain {
    public static void main(String[] args) {
        NetworkAdapter adapter = null;
        Scanner sc = new Scanner(System.in);
        System.out.print("μ—°κ²°ν•  λ„€νŠΈμ›Œν¬λ₯Ό μ„ νƒν•˜μ„Έμš”. [1]Wi-Fi [2]5G [3]LTE : ");
        int network = sc.nextInt();
        switch(network) {
            case 1 : new Wifi("SKT"); break;
            case 2 : new FiveG("KT"); break;
            case 3 : new Lte("LG"); break;
            default: System.out.println("λ„€νŠΈμ›Œν¬λ₯Ό 잘λͺ» μ„ νƒν•˜μ…¨μŠ΅λ‹ˆλ‹€.");
        }
        adapter.connect();
    }
}

μΈν„°νŽ˜μ΄μŠ€ μ‘μš© 예제)

RemoteControl (interface 클래슀..λΆ€λͺ¨ 클래슀)

public interface RemoteControl {
    // 1) 주석 μ°Έκ³ 
    int MAX_VOL = 100;
    int MIN_VOL = 0;
    int Basic_VOL = 20;
    
    // 2) 주석 μ°Έκ³ 
    void turnOn();
    void turnOff();
    void setVol(int volume);
    void getInfo();
    
    // 3) 주석 μ°Έκ³ 
    default void setMute(boolean mute) {
        if(mute) System.out.println("무음 처리 ν•©λ‹ˆλ‹€.");
        else System.out.println("무음 ν•΄μ œ ν•©λ‹ˆλ‹€.");
    }
    
    // 4) 주석 μ°Έκ³ 
    static void changeBattery() {
        System.out.println("건전지λ₯Ό κ΅μ²΄ν•΄μ£Όμ‹­μ‹œμ˜€.");
    }
}
1)
μΈν„°νŽ˜μ΄μŠ€ 내에 μžˆλŠ” ν•„λ“œλŠ” μƒμˆ˜λ‘œ μ •μ˜ν•˜μ§€ μ•Šμ•„λ„ λͺ¨λ‘ final static으둜 λ³€ν™˜λœλ‹€.
2)
λ©”μ†Œλ“œ λ˜ν•œ μžλ™μœΌλ‘œ public abstract λΆ™λŠ”λ‹€.
=> μ™œλƒ? μΈν„°νŽ˜μ΄μŠ€λŠ” 기본적으둜 λͺ¨λ“  λ©”μ†Œλ“œκ°€ 좔상 λ©”μ†Œλ“œμ΄κΈ° λ•Œλ¬Έ...
3)
λ§Œμ•½ νŠΉμ • κΈ°λŠ₯을 νŠΉμ • ν΄λž˜μŠ€μ—λ§Œ μΆ”κ°€ν•˜κ³  싢은데 default λ©”μ†Œλ“œκ°€ μ—†μœΌλ©΄ 상속받은 λͺ¨~λ“  ν΄λž˜μŠ€μ— λ©”μ†Œλ“œ κ΅¬ν˜„ν•΄μ€˜μ•Ό ν•œλ‹€. μ§€κΈˆ μž‘μ„±ν•˜λŠ” 예제 μ½”λ“œλŠ” 상속받은 λ©”μ†Œλ“œκ°€ 2κ°œλ‹ˆκΉŒ μˆ˜λ™μœΌλ‘œ λ„£λŠ”λ‹€ 쳐도..
λ§Œμ•½ 상속받은 ν΄λž˜μŠ€κ°€ 100000개 라면?.. (λ…Έλ‹΅)

ꡉμž₯히 λΉ„νš¨μœ¨μ μ΄κΈ° λ•Œλ¬Έμ— μœ μΌν•˜κ²Œ μ˜ˆμ™Έμ²˜λ¦¬ ν•  수 μžˆλ„λ‘ λ§Œλ“  것이 default λ©”μ†Œλ“œ 이닀.
(κ·Έλ ‡λ‹€κ³  λ‚¨λ°œν•˜μ§€λŠ” 말기)
4)
μΈν„°νŽ˜μ΄μŠ€ μ΄λ¦„μœΌλ‘œ μ ‘κ·Ό κ°€λŠ₯
상속과 무관함!

Audio (상속받은 μžμ‹ 클래슀)

public class Audio implements RemoteControl {
    // 1번 주석 μ°Έκ³ 
    private int volume;
    
    // 2번 주석 μ°Έκ³ 
    @Override
    public void turnOn() {
        System.out.println("Audioλ₯Ό μΌ­λ‹ˆλ‹€.");
    }
    
    @Override
    public void turnOff() {
        System.out.println("Audioλ₯Ό λ•λ‹ˆλ‹€.");
    }
    
    // 3번 주석 μ°Έκ³ 
    @Override
    public void setVol(int volume) {
        if(volume > RemoteControl.MAX_VOL) {
            this.volume = RemoteControl.MAX_VOL;
        } else if(volume < RemoteControl.MIN_VOL) {
            this.volume = RemoteControl.MIN_VOL;
        } else this.volume = volume;
        System.out.println("ν˜„μž¬ Audio λ³Όλ₯¨ : " + this.volume);
    }
    
    @Override
    public void getInfo() {
       System.out.println("ν˜„μž¬ λ³Όλ₯¨μ€ " + volume + " μž…λ‹ˆλ‹€.");
   }
   
   @Override
   public void setMute(boolean mute) {
       if(mute) System.out.println("μ˜€λ””μ˜€λ₯Ό 무음 처리 ν•©λ‹ˆλ‹€.");
       else {
           System.out.println("μ˜€λ””μ˜€λ₯Ό 무음 ν•΄μ œ ν•©λ‹ˆλ‹€.");
           this.volume = RemoteControl.Basic_VOL;
           System.out.println("ν˜„μž¬ λ³Όλ₯¨μ€ " + volume + " μž…λ‹ˆλ‹€.");
        }
    }
}
1)
μΈμŠ€ν„΄μŠ€ ν•„λ“œλŠ” private으둜 μ„ μ–Έν•˜μ—¬ 클래슀 λ‚΄λΆ€μ—μ„œλ§Œ μ ‘κ·Ό κ°€λŠ₯ν•˜λ„λ‘ ν–ˆμŒ
2)
μΈν„°νŽ˜μ΄μŠ€μ˜ 좔상화 λ©”μ†Œλ“œλ₯Ό μ“Έ λ•ŒλŠ” public κΌ­ 써쀄 것
3)
λ³Όλ₯¨ ν—ˆμš©μΉ˜λ₯Ό μ ˆλŒ€ λ²—μ–΄λ‚˜μ§€ μ•ŠλŠ” λ©”μ†Œλ“œ 생성!
이둜 인해 ꡳ이 λ³Όλ₯¨ 쑰건문을 μž‘μ„±ν•˜μ§€ μ•Šμ•„λ„ 되고, μžλ™μœΌλ‘œ 섀정해놓은 κ°’μœΌλ‘œ λ³€ν™˜λ¨.

Television (상속받은 μžμ‹ 클래슀)

public class Television implements RemoteControl {
    private int volume;
    
    @Override
    public void turnOn() {
        System.out.println("TVλ₯Ό μΌ­λ‹ˆλ‹€.");
    }
    
    @Override
    public void turnOff() {
        System.out.println("TVλ₯Ό λ•λ‹ˆλ‹€.");
    }
    
    @Override
    public void setVol(int volume) {
        if(volume > RemoteControl.MAX_VOL) {
            this.volume = RemoteContrl.MAX_VOL;
        } else if(volume < RemoteControl.MIN_VOL) {
            this.volume = RemoteControl.MIN_VOL;
            else this.volume = volume;
        System.out.println("ν˜„μž¬ TV λ³Όλ₯¨ : " + this.volume);
    }
    
    @Override
    public void getInfo() {
        System.out.println("ν˜„μž¬ λ³Όλ₯¨μ€ " + volume + " μž…λ‹ˆλ‹€.");
    }
}
Audio ν΄λž˜μŠ€μ™€ λ™μΌν•˜λ‚˜.. ν•œ κ°€μ§€ λ‹€λ₯Έ 점!!
interface ν΄λž˜μŠ€μ—μ„œ μ„ μ–Έν•œ λ©”μ†Œλ“œλ₯Ό 상속받은 ν΄λž˜μŠ€μ—μ„œ κ΅¬ν˜„ μ•ˆν•˜λ©΄ 였λ₯˜κ°€ λ‚œλ‹€.
근데 setMute()λŠ” TVν΄λž˜μŠ€μ—μ„œλŠ” κ΅¬ν˜„μ„ μ•ˆν–ˆλŠ”λ°λ„ λΆˆκ΅¬ν•˜κ³  였λ₯˜κ°€ μ•ˆλ‚œλ‹€. 
μ™œ?!
default λ©”μ†Œλ“œλ‘œ μƒμ„±ν–ˆκΈ° λ•Œλ¬Έμ—!

Main

import java.util.Scanner;

public class RemoConMain {
    public static void main(String[] args) {
        RemoteControl remote = null;
        Scanner sc = new Scanner(System.in);
        System.out.print("μ œν’ˆμ„ μ„ νƒν•˜μ„Έμš”. [1]TV [2]μ˜€λ””μ˜€ : ");
        int sel = sc.nextInt();
        if(sel == 1) {
            remote = new TeleVision;
            remote.turnOn();
            remote.setVol(30);
            remote.getInfo();
            remote.setMute(true); // 1번 주석 μ°Έκ³ 
        } else {
            remote = new Audio;
            remote.turnOn();
            remote.setVol(150);
            remote.getInfo();
            remote.setMute(false); // 2번 주석 μ°Έκ³ 
        }
        RemoteControl.changeBattery(); // 3번 주석 μ°Έκ³ 
    }
}
1)
default λ©”μ†Œλ“œμ΄κ³ , λΆ€λͺ¨μ—μ„œ λ§Œλ“  λ©”μ†Œλ“œ μ‚¬μš©
2)
default λ©”μ†Œλ“œμ΄κ³ , Audioν΄λž˜μŠ€μ—μ„œ μ˜€λ²„λΌμ΄λ”© ν•œ λ©”μ†Œλ“œ μ‚¬μš©
=> false 일 경우 무음 ν•΄μ œν•˜κ³ , κΈ°λ³Έ λ³Όλ₯¨ μ„€μ •κ°’μœΌλ‘œ μ΄ˆκΈ°ν™”ν•˜λŠ” κΈ°λŠ₯ μΆ”κ°€
3)
μΈν„°νŽ˜μ΄μŠ€ μ†Œμ†μ˜ λ©”μ†Œλ“œ

profile

GiantStepDEV

@kongmi

ν¬μŠ€νŒ…μ΄ μ’‹μ•˜λ‹€λ©΄ "μ’‹μ•„μš”β€οΈ" λ˜λŠ” "κ΅¬λ…πŸ‘πŸ»" ν•΄μ£Όμ„Έμš”!