ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Live Study - Java Interface
    Hello, World πŸ’»/Java β˜•οΈ 2021. 1. 7. 21:14

    μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ •μ˜ν•˜λŠ” 방법

    public interface μΈν„°νŽ˜μ΄μŠ€λͺ… {
        
        public static final νƒ€μž… μƒμˆ˜λ³€μˆ˜λͺ… = κ°’; // public static final μƒλž΅ κ°€λŠ₯
        
        public abstract λ°˜ν™˜νƒ€μž… λ©”μ„œλ“œλͺ…(); // public abstarct μƒλž΅ κ°€λŠ₯
        
        static λ°˜ν™˜νƒ€μž… λ©”μ„œλ“œλͺ…() {
        }
    
        default λ°˜ν™˜νƒ€μž… λ©”μ„œλ“œλͺ…() {
        }
        
        private λ°˜ν™˜νƒ€μž… λ©”μ„œλ“œλͺ…() {
        }
        
        private static λ°˜ν™˜νƒ€μž… λ©”μ„œλ“œλͺ…() {
        }
        
    }
    


    μΈν„°νŽ˜μ΄μŠ€μ—λŠ”
    - μƒμˆ˜

    - abstract method (Java 7 λΆ€ν„°)
    - static method (Java 8 λΆ€ν„°)
    - default method (Java 8 λΆ€ν„°)
    - private
    method (Java 9 λΆ€ν„°)
    - private static method (Java 9 λΆ€ν„°)

    μœ„μ˜ 6가지 ν•­λͺ©μ„ Java 버전에 따라 μ œκ³΅ν•œλ‹€.

    - μΈν„°νŽ˜μ΄μŠ€λŠ” interface ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•΄ μ •μ˜ν•œλ‹€. ν΄λž˜μŠ€μ™€ λ§ˆμ°¬κ°€μ§€κ³  public, default μ ‘κ·Όμ œμ–΄μžλ₯Ό μ μš©ν•  수 μžˆλ‹€.
    - λͺ¨λ“  μƒμˆ˜λŠ” public static final 으둜 μ„ μ–Έλ˜μ–΄μ•Ό ν•˜κ³ , μƒλž΅ν•  수 μžˆλ‹€. μƒλž΅λœ μ œμ–΄μžλŠ” μ»΄νŒŒμΌλŸ¬κ°€ μžλ™μœΌλ‘œ μΆ”κ°€ν•΄μ€€λ‹€.
    - λͺ¨λ“  λ©”μ„œλ“œλŠ” public abstract 이어야 ν•˜κ³ , μƒλž΅ν•  수 μžˆλ‹€. μ—­μ‹œ μ»΄νŒŒμΌλŸ¬κ°€ μžλ™μœΌλ‘œ μΆ”κ°€ν•΄μ€€λ‹€.

     

    μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜λŠ” 방법

    클래슀λ₯Ό 상속 λ°›κΈ° μœ„ν•΄μ„  λΆ€λͺ¨ 클래슀λ₯Ό 선택해 extends ν‚€μ›Œλ“œλ₯Ό λΆ™μ—¬ μ„ μ–Έν•˜λ“―μ΄, μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜κΈ° μœ„ν•΄μ„œλŠ” implements ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•΄ μ„ μ–Έν•˜λ©΄ λœλ‹€.

    interface Movable {
        void walk();
        void run();
    }
    
    class Character implements Movable {
        @Override
        public void walk() {
            
        }
    
        @Override
        public void run() {
    
        }
    }

    클래슀λ₯Ό 상속받을 λ•ŒλŠ” 1개의 클래슀만 상속이 κ°€λŠ₯ν–ˆλŠ”λ°, μΈν„°νŽ˜μ΄μŠ€λŠ” μ—¬λŸ¬κ°œλ₯Ό κ΅¬ν˜„ν•  수 μžˆλ‹€.

    interface Flyable {
        void fly();
    }
    
    class Character implements Movable, Flyable {
        @Override
        public void walk() {
    
        }
    
        @Override
        public void run() {
    
        }
    
        @Override
        public void fly() {
            
        }
    }

     

    읡λͺ… 클래슀λ₯Ό μ΄μš©ν•œ μΈν„°νŽ˜μ΄μŠ€ κ΅¬ν˜„

    Java λŠ” 읡λͺ… ν΄λž˜μŠ€λΌλŠ” 것이 μžˆλ‹€. 이름이 μ—†λŠ” 클래슀라고 ν•΄μ„œ 읡λͺ… 클래슀라고 ν•˜κ³ , 일회용 클래슀둜 쓰인닀. 클래슀의 μ„ μ–Έκ³Ό 객체의 생성을 λ™μ‹œμ— ν•˜λŠ” 것이닀.

    interface Movable {
        void walk();
        void run();
    }
    
    public class Main {
    
        public static void main(String[] args) {
            Movable movable = new Movable() {
                @Override
                public void walk() {
                    
                }
    
                @Override
                public void run() {
    
                }
            };
        }
    
    }


    읡λͺ… ν΄λž˜μŠ€λŠ” μƒμ„±μžλ₯Ό κ°€μ§ˆ 수 μ—†λ‹€. 단 ν•˜λ‚˜μ˜ 클래슀λ₯Ό μƒμ†λ°›κ±°λ‚˜, 단 ν•˜λ‚˜μ˜ μΈν„°νŽ˜μ΄μŠ€λ§Œμ„ κ΅¬ν˜„ν•  수 μžˆλ‹€.

     

    μΈν„°νŽ˜μ΄μŠ€ 상속

    μΈν„°νŽ˜μ΄μŠ€λŠ” μΈν„°νŽ˜μ΄μŠ€λ‘œλΆ€ν„°λ§Œ 상속 받을 수 μžˆλ‹€. 그리고 ν΄λž˜μŠ€μ™€λŠ” λ‹€λ₯΄κ²Œ μΈν„°νŽ˜μ΄μŠ€λŠ” 닀쀑 상속 받을 수 μžˆλ‹€.
    extends ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•΄ λ‹€λ₯Έ μΈν„°νŽ˜μ΄μŠ€λ₯Ό 상속 받을 수 μžˆλ‹€.

    interface InterfaceA {
        void methodA();
    }
    
    interface InterfaceB {
        void methodB();
    }
    
    interface InterfaceC extends InterfaceA, InterfaceB {
        void methodC();
    }


    InterfaceC μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜λ©΄ InterfaceA, B, C 에 μžˆλŠ” λ©”μ„œλ“œλ₯Ό λͺ¨λ‘ κ΅¬ν˜„ν•΄μ•Ό ν•œλ‹€.

    class ClassA implements InterfaceC {
        @Override
        public void methodA() {
            
        }
    
        @Override
        public void methodB() {
    
        }
    
        @Override
        public void methodC() {
    
        }
    }

     

    μΈν„°νŽ˜μ΄μŠ€ 레퍼런슀λ₯Ό 톡해 κ΅¬ν˜„μ²΄λ₯Ό μ‚¬μš©ν•˜λŠ” 방법

    μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ ν΄λž˜μŠ€λŠ” μΈν„°νŽ˜μ΄μŠ€μ™€ λΆ€λͺ¨ - μžμ‹ 관계라고 ν•  수 있기 λ•Œλ¬Έμ—,
    ν•΄λ‹Ή μΈν„°νŽ˜μ΄μŠ€ νƒ€μž…μ˜ μ°Έμ‘°λ³€μˆ˜λ‘œ 이λ₯Ό κ΅¬ν˜„ν•œ 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό μ°Έμ‘°ν•  수 μžˆλ‹€.

    interface InterfaceA {
        void methodA();
    }
    
    interface InterfaceB {
        void methodB();
    }
    
    interface InterfaceC extends InterfaceA, InterfaceB {
        void methodC();
    }
    
    class ClassA implements InterfaceC {
        @Override
        public void methodA() {
    
        }
    
        @Override
        public void methodB() {
    
        }
    
        @Override
        public void methodC() {
    
        }
    }

     

    public class Main {
    
        public static void main(String[] args) {
            InterfaceA interfaceA = new ClassA();
            interfaceA.methodA();
    
            InterfaceB interfaceB = new ClassA();
            interfaceB.methodB();
    
            InterfaceC interfaceC = new ClassA();
            interfaceC.methodA();
            interfaceC.methodB();
            interfaceC.methodC();
        }
    
    }


    λ‹Ήμ—°νžˆ, μ°Έμ‘°λ³€μˆ˜μ˜ νƒ€μž…μ— 따라 μ°Έμ‘°ν•  수 μžˆλŠ” λ©€λ²„λŠ” 달라진닀.

     

    μΈν„°νŽ˜μ΄μŠ€μ˜ κΈ°λ³Έ λ©”μ„œλ“œ (Default Method), μžλ°” 8

    JDK 1.8 λΆ€ν„° μΈν„°νŽ˜μ΄μŠ€μ— Default Method λ₯Ό μΆ”κ°€ν•  수 있게 λ˜μ—ˆλ‹€.

    public interface μΈν„°νŽ˜μ΄μŠ€λͺ… {
    
        default λ°˜ν™˜νƒ€μž… λ©”μ„œλ“œλͺ…() {
        }
        
    }
    
    


    μΈν„°νŽ˜μ΄μŠ€μ— λ©”μ„œλ“œλ₯Ό ν•˜λ‚˜ μΆ”κ°€ν•œλ‹€λŠ” 것은 ν•΄λ‹Ή μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ 기쑴의 λͺ¨λ“  ν΄λž˜μŠ€λ“€μ΄ μƒˆλ‘œ μΆ”κ°€λœ λ©”μ„œλ“œλ₯Ό κ΅¬ν˜„ν•΄μ•Όν•œλ‹€λŠ” 것이닀. 

    μΈν„°νŽ˜μ΄μŠ€κ°€ λ³€κ²½λ˜μ§€ μ•ŠμœΌλ©΄ κ°€μž₯ μ’‹κ² μ§€λ§Œ, 아무리 섀계λ₯Ό μž˜ν•΄λ„ μ–Έμ  κ°€ 변경은 λ°œμƒν•˜κΈ° λ•Œλ¬Έμ—, κ²°κ΅­ Default Method λŠ” ν•˜μœ„ ν˜Έν™˜μ„±μ„ μœ„ν•΄μ„œ κ³ μ•ˆλœ 것이닀.

    Default Method λŠ” κ΅¬ν˜„μ²΄λ₯Ό μ œκ³΅ν•˜λŠ” 것이고, 좔상 λ©”μ„œλ“œκ°€ μ•„λ‹ˆκΈ° λ•Œλ¬Έμ— ν•΄λ‹Ή μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ ν΄λž˜μŠ€λ“€μ€ λ³€κ²½ν•˜μ§€ μ•Šμ•„λ„ λœλ‹€.

    μ•„λž˜λŠ” μ΄νŽ™ν‹°λΈŒ μžλ°”μ—μ„œ λ‚˜μ˜¨ λ””ν΄νŠΈ λ©”μ„œλ“œμ— λŒ€ν•œ λ‚΄μš©μ΄λ‹€.

    μ΄νŽ™ν‹°λΈŒ μžλ°” Item 20 μ°Έκ³ , '좔상 ν΄λž˜μŠ€λ³΄λ‹€λŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό μš°μ„ ν•˜λΌ'

    ... λ””ν΄νŠΈ λ©”μ„œλ“œλ₯Ό μ œκ³΅ν•  λ•ŒλŠ” μƒμ†ν•˜λ €λŠ” μ‚¬λžŒμ„ μœ„ν•œ μ„€λͺ…을 λ¬Έμ„œν™” ν•΄μ•Όν•œλ‹€. (@implSpec μ‚¬μš©)

    ... λ§Žμ€ μΈν„°νŽ˜μ΄μŠ€κ°€ equals, hashCode 와 같은 Object 의 λ©”μ„œλ“œλ₯Ό μ •μ˜ν•˜κ³  μžˆμ§€λ§Œ, 이듀은 λ””ν΄νŠΈ λ©”μ„œλ“œλ‘œ μ œκ³΅ν•΄μ„œλŠ” μ•ˆλœλ‹€.

    μ΄νŽ™ν‹°λΈŒ μžλ°” Item 21 μ°Έκ³ , 'μΈν„°νŽ˜μ΄μŠ€λŠ” κ΅¬ν˜„ν•˜λŠ” μͺ½μ„ 생각해 μ„€κ³„ν•˜λΌ'


    ... λ””ν΄νŠΈ λ©”μ„œλ“œλ₯Ό μ„ μ–Έν•˜λ©΄, κ·Έ μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ ν›„ λ””ν΄νŠΈ λ©”μ„œλ“œλ₯Ό μž¬μ •μ˜ν•˜μ§€ μ•Šμ€ λͺ¨λ“  ν΄λž˜μŠ€μ—μ„œ λ””ν΄νŠΈ κ΅¬ν˜„μ΄ μ“°μ΄κ²Œ λœλ‹€. 이처럼 μžλ°”μ—λ„ κΈ°μ‘΄ μΈν„°νŽ˜μ΄μŠ€μ— λ©”μ„œλ“œλ₯Ό μΆ”κ°€ν•˜λŠ” 길이 μ—΄λ Έμ§€λ§Œ λͺ¨λ“  κΈ°μ‘΄ κ΅¬ν˜„μ²΄λ“€κ³Ό λ§€λ„λŸ½κ²Œ μ—°λ™λ˜λ¦¬λΌλŠ” 보μž₯은 μ—†λ‹€. μžλ°” 7 κΉŒμ§€μ˜ μ„Έμƒμ—μ„œλŠ” λͺ¨λ“  ν΄λž˜μŠ€κ°€ "ν˜„μž¬μ˜ μΈν„°νŽ˜μ΄μŠ€μ— μƒˆλ‘œμš΄ λ©”μ„œλ“œκ°€ 좔가될 일은 μ˜μ›νžˆ μ—†λ‹€"κ³  κ°€μ •ν•˜κ³  μž‘μ„±λμœΌλ‹ˆ 말이닀. λ””ν΄νŠΈ λ©”μ„œλ“œλŠ” κ΅¬ν˜„ ν΄λž˜μŠ€μ— λŒ€ν•΄ 아무것도 λͺ¨λ₯Έ 채 ν•©μ˜ 없이 λ¬΄μž‘μ • 'μ‚½μž…' 될 뿐이닀.
    ... ν•˜μ§€λ§Œ 생각할 수 μžˆλŠ” λͺ¨λ“  μƒν™©μ—μ„œ λΆˆλ³€μ‹μ„ ν•΄μΉ˜μ§€ μ•ŠλŠ” λ””ν΄νŠΈ λ©”μ„œλ“œλ₯Ό μž‘μ„±ν•˜κΈ°λž€ μ–΄λ €μš΄ 법이닀.
    ... λ””ν΄νŠΈ λ©”μ„œλ“œλŠ” μ»΄νŒŒμΌμ— μ„±κ³΅ν•˜λ”λΌλ„ κΈ°μ‘΄ κ΅¬ν˜„μ²΄μ— λŸ°ν„°μž„ 였λ₯˜λ₯Ό μΌμœΌν‚¬ 수 μžˆλ‹€.


    μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ„€κ³„λŠ” μ–Έμ œλ‚˜ λ§Žμ€ 것을 κ³ λ €ν•˜κ³  μƒκ°ν•΄μ„œ ν•΄μ•Όν•˜λŠ” 것 κ°™λ‹€.

     

    μΈν„°νŽ˜μ΄μŠ€μ˜ static λ©”μ„œλ“œ, μžλ°” 8

    JDK 1.8 λΆ€ν„° μΈν„°νŽ˜μ΄μŠ€μ— Static Method λ₯Ό μΆ”κ°€ν•  수 있게 λ˜μ—ˆλ‹€. static λ©”μ„œλ“œλŠ” μΈμŠ€ν„΄μŠ€μ™€ 관계가 μ—†λŠ” 독립적인 λ©”μ„œλ“œμ΄κΈ° λ•Œλ¬Έμ— μ˜ˆμ „λΆ€ν„° μΈν„°νŽ˜μ΄μŠ€μ— μΆ”κ°€ν•˜μ§€ λͺ»ν•  μ΄μœ κ°€ μ—†μ—ˆλ‹€.

    public interface μΈν„°νŽ˜μ΄μŠ€λͺ… {
        
        static λ°˜ν™˜νƒ€μž… λ©”μ„œλ“œλͺ…() {
        }
        
    }
    
    
    μžλ°”μ˜ 정석 μ°Έκ³ 

    ... μžλ°”λ₯Ό 보닀 μ‰½κ²Œ 배울 수 μžˆλ„λ‘ κ·œμΉ™μ„ λ‹¨μˆœνžˆ ν•  ν•„μš”κ°€ μžˆμ–΄μ„œ μΈν„°νŽ˜μ΄μŠ€μ˜ λͺ¨λ“  λ©”μ„œλ“œλŠ” 좔상 λ©”μ„œλ“œμ΄μ–΄μ•Ό ν•œλ‹€λŠ” κ·œμΉ™μ— μ˜ˆμ™Έλ₯Ό 두지 μ•Šμ•˜λ‹€. 덕뢄에 μΈν„°νŽ˜μ΄μŠ€μ™€ κ΄€λ ¨λœ static λ©”μ„œλ“œλŠ” λ³„λ„μ˜ ν΄λž˜μŠ€μ— λ”°λ‘œ 두어야 ν–ˆλ‹€.

    λŒ€ν‘œμ μΈ 예둜 java.util.Collection μΈν„°νŽ˜μ΄μŠ€κ°€ μžˆλ‹€. static λ©”μ„œλ“œλ₯Ό μΆ”κ°€ν•  수 μ—†μ—ˆκΈ° λ•Œλ¬Έμ— λ³„λ„μ˜ Collections λΌλŠ” ν΄λž˜μŠ€μ— λ“€μ–΄κ°€κ²Œ λ˜μ—ˆλ‹€. λ§Œμ•½ μΈν„°νŽ˜μ΄μŠ€μ— static λ©”μ„œλ“œλ₯Ό μΆ”κ°€ν•  수 μžˆμ—ˆλ‹€λ©΄, Collections ν΄λž˜μŠ€λŠ” μ‘΄μž¬ν•˜μ§€ μ•Šμ•˜μ„ 것이닀. 

    (이런 μ΄μœ κ°€!!)

    μΈν„°νŽ˜μ΄μŠ€μ˜ private λ©”μ„œλ“œ, μžλ°” 9

    μžλ°” 9 λΆ€ν„° μΈν„°νŽ˜μ΄μŠ€μ— private method, static private method λ₯Ό μΆ”κ°€ν•  수 μžˆλ‹€.

    private λ©”μ„œλ“œλ₯Ό μΆ”κ°€ν•¨μœΌλ‘œμ¨ μΈν„°νŽ˜μ΄μŠ€ λ‚΄λΆ€μ—μ„œ μ½”λ“œ μž¬μ‚¬μš©μ„±μ„ 높일 수 있게 λ˜μ—ˆλ‹€. 외뢀에 λ©”μ„œλ“œλ₯Ό λ…ΈμΆœμ‹œν‚¬ ν•„μš” 없이 λ””ν΄νŠΈ λ©”μ„œλ“œμ—μ„œ μ½”λ“œλ₯Ό κ³΅μœ ν•΄ μ‚¬μš©ν•  수 μžˆλ‹€.

    interface MyInterface {
        default void methodA() {
            calculateSomething();
        }
    
        default void methodB() {
            calculateSomething();
        }
    
        private void calculateSomething() {
    
        }
    }

    private λ©”μ„œλ“œλŠ” 4가지 κ·œμΉ™μ΄ μžˆλ‹€.

    1. Private interface method λŠ” 좔상 λ©”μ„œλ“œκ°€ 될 수 μ—†λ‹€. λ©”μ„œλ“œλ₯Ό μ •μ˜ν•΄λ†”μ•Ό ν•œλ‹€.
    2. Private method λŠ” μΈν„°νŽ˜μ΄μŠ€ λ‚΄λΆ€μ—μ„œλ§Œ μ‚¬μš©λ  수 μžˆλ‹€.
    3. Private static method λŠ” λ‹€λ₯Έ static λ©”μ„œλ“œ, non-static λ©”μ„œλ“œμ—μ„œ μ‚¬μš©λ  수 μžˆλ‹€.
    4. Private non-static methods λŠ” private static methods λ‚΄λΆ€μ—μ„œ μ‚¬μš©λ  수 μ—†λ‹€.

     

    References

    μžλ°”μ˜ 정석 (www.yes24.com/Product/Goods/24259565)
    μ΄νŽ™ν‹°λΈŒ μžλ°” (www.yes24.com/Product/Goods/65551284)
    howtodoinjava.com/java9/java9-private-interface-methods/

    'Hello, World πŸ’» > Java β˜•οΈ' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

    Live Study - Java Exception  (0) 2021.01.23
    Live Study - Java Package  (0) 2020.12.30
    Live Study - Java 상속 (Inheritance)  (0) 2020.12.23
    Live Study - Java 의 Class  (0) 2020.12.14
    Live Study - Java 선택문, 반볡문  (0) 2020.12.06
Designed by Tistory.