πŸ“š μ°Έκ³ ν•œ μ±…

 

: 좜처 예슀24 ν™ˆνŽ˜μ΄μ§€

 

 

 

- 기본적인 κ°œλ…μ„ μ •λ¦¬ν•˜κ³  μΆ”κ°€μ μœΌλ‘œ κΆκΈˆν•œ 것듀을 μ •λ¦¬ν–ˆμŠ΅λ‹ˆλ‹€ -

 

 

πŸ₯ πŸ₯ πŸ₯

 


 

βœ”οΈ   읡λͺ… μ΄λ„ˆ 클래슀_ 436p

 

 μ΅λͺ… μ΄λ„ˆ 클래슀

: 이름을 μ•Œ 수 μ—†λŠ” μ΄λ„ˆ 클래슀λ₯Ό μ˜λ―Έν•˜λ©°, μΈμŠ€ν„΄μŠ€ 읡λͺ… ν΄λž˜μŠ€μ™€ μ§€μ—­ 읡λͺ… μ΄λ„ˆ ν΄λž˜μŠ€κ°€ μžˆλ‹€.

 

 

μ΄λ„ˆν΄λž˜μŠ€μ™€ 읡λͺ… μ΄λ„ˆ 클래슀 λΉ„κ΅ν•˜κΈ°.

interface MyInterface {
    public abstract void myMethod1();
}

class OuterClass {
     MyInterface inner = new InnerClass();
     void myMethod2(){
         inner.myMethod1();
     }
     
     class InnerClass implements MyInterface {
         public void myMethod1() {
             System.out.println("μΈμŠ€ν„΄μŠ€ μ΄λ„ˆ 클래슀!");
         }
     }
}

public class PracticeInnerClass {
     public static void main(String[] args) {
     
         OuterClass outer = new OuterClass();
         outer.myMethod2();
     }
}
μœ„μ˜ μ½”λ“œλŠ” μ΄λ„ˆν΄λž˜μŠ€μ—μ„œ μΈν„°νŽ˜μ΄μŠ€λ₯Ό 상속 λ°›μ•„ μΈν„°νŽ˜μ΄μŠ€ myMethod1을 κ΅¬ν˜„ν•œ μ½”λ“œμ΄λ‹€. 좜λ ₯λ˜λŠ” μ½”λ“œλŠ” 'myMethod1!'이 좜λ ₯될 것이닀. μœ„μ˜ μ½”λ“œκ°€ 읡λͺ… μ΄λ„ˆ 클래슀 μ½”λ“œμ™€ μ–΄λ–»κ²Œ λ‹€λ₯Έμ§€ λΉ„κ΅ν•˜λ©΄ 더 쒋을 것 κ°™λ‹€.
interface MyInterface {
    public abstract void myMethod1();
}

class OuterClass {

	 MyInterface myinter = new MyInterface() {
         public void myMethod1() {
              System.out.println("읡λͺ… μ΄λ„ˆ 클래슀");
         }
     };
     
     void myMethod2() {
         myinter.myMethod1();
     }    
     
}

public class PracticeAnonymousClass {
     public static void main(String[] args) {
     
         OuterClass outer = new OuterClass();
         outer.myMethod2();
     }
}
읡λͺ… μ΄λ„ˆ ν΄λž˜μŠ€λŠ” μΈν„°νŽ˜μ΄μŠ€μΈ MyInterfaceλ₯Ό μ°Έμ‘° λ³€μˆ˜ νƒ€μž…μœΌλ‘œ λ°›μ•„ μƒμ„±μžλ₯Ό ν˜ΈμΆœν–ˆλ‹€. 그리고 κ·Έ μƒμ„±μž μ€‘κ΄„ν˜Έ μ•ˆμ— μΈν„°νŽ˜μ΄μŠ€μ˜ 좔상 λ©”μ„œλ“œμΈ myMethod1λ₯Ό κ΅¬ν˜„ν–ˆλ‹€. 그러면 μ»΄νŒŒμΌλŸ¬κ°€ μ•Œμ•„μ„œ MyInterfaceλ₯Ό 상속받아 클래슀λ₯Ό λ‚΄λΆ€μ μœΌλ‘œ μƒμ„±ν•œ ν›„(읡λͺ… 클래슀) ν•΄λ‹Ή 클래슀둜 객체λ₯Ό 생성해 μ°Έμ‘° λ³€μˆ˜μ— λŒ€μž…ν•œλ‹€.

읡λͺ… μ΄λ„ˆ 클래슀λ₯Ό μ‚¬μš©ν•˜λ©΄μ„œ μ£Όμ˜ν•΄μ•Όν•  것은 항상 λΆ€λͺ¨ νƒ€μž…μœΌλ‘œλ§Œ μ„ μ–Έν•  수 있으며, λΆ€λͺ¨νƒ€μž…μœΌλ‘œ μ„ μ–Έλ˜μ—ˆκΈ°μ— λΆ€λͺ¨μ—κ²Œ μ—†λŠ” λ©”μ„œλ“œλŠ” ν˜ΈμΆœν•  수 μ—†λ‹€.

 

Q. 그런데 μΈν„°νŽ˜μ΄μŠ€λŠ” 객체λ₯Ό 생성할 수 μ—†λŠ”λ°, 읡λͺ… μ΄λ„ˆ ν΄λž˜μŠ€λŠ” μ–΄λ–»κ²Œ μΈν„°νŽ˜μ΄μŠ€ 객체λ₯Ό μƒμ„±ν•œκ±ΈκΉŒ?

A. μœ„μ˜ μ„€λͺ…κ³Ό κ°™λ‹€. ν•΄λ‹Ή μ½”λ“œκ°€ 였λ₯˜ 없이 μ‹€ν–‰λ˜λŠ” μ΄μœ λŠ”, μΈν„°νŽ˜μ΄μŠ€ 자체λ₯Ό μΈμŠ€ν„΄μŠ€ν™”ν•œ 것이 μ•„λ‹ˆλΌ, μ»΄νŒŒμΌλŸ¬κ°€ μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ 읡λͺ… 클래슀λ₯Ό μžλ™μœΌλ‘œ μƒμ„±ν•΄μ„œ κ·Έ μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν–ˆκΈ° λ•Œλ¬Έμ΄λ‹€. μ‰½κ²Œ λ§ν•˜λ©΄, μš°λ¦¬κ°€ μ½”λ“œμ—μ„œ μΈν„°νŽ˜μ΄μŠ€λ₯Ό 직접 μ‚¬μš©ν•˜λŠ” κ²ƒμ²˜λŸΌ λ³΄μ΄μ§€λ§Œ, μ‹€μ œλ‘œλŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ 이름 μ—†λŠ” ν΄λž˜μŠ€κ°€ λ‚΄λΆ€μ—μ„œ μƒμ„±λ˜μ–΄ κ·Έ 객체가 μΈν„°νŽ˜μ΄μŠ€ νƒ€μž… λ³€μˆ˜μ— μ €μž₯λ˜μ—ˆκΈ° λ•Œλ¬Έμ— κ°€λŠ₯ν•œ 것이닀.

 

Q. 책에 보면 'λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœμ„ ν•  수 μ—†μœΌλ―€λ‘œ μ• μ΄ˆμ— λ§Œλ“€ ν•„μš”κ°€ μ—†μ„κΉŒ? κ·Έλ ‡μ§€ μ•Šλ‹€. μ˜€λ²„λΌμ΄λ”© λ©”μ„œλ“œ λ‚΄λΆ€μ—μ„œλŠ” ν˜ΈμΆœν•  수 μžˆμœΌλ―€λ‘œ μž‘μ„±ν•΄μ•Όν•  λ‚΄μš©μ΄ λ§Žμ„ λ•Œ λ©”μ„œλ“œλ₯Ό 뢄리해 μž‘μ„±ν•˜λŠ” 것이 효율적이며, μ΄λ•Œ 읡λͺ… μ΄λ„ˆ 클래슀 μ •μ˜μ‹ 내뢀에 μΆ”κ°€ λ©”μ„œλ“œλ₯Ό μ •μ˜ν•΄ μ‚¬μš©ν•˜λŠ” 것이 νŽΈν•  수 μžˆλ‹€.'라고 λ˜μ–΄μžˆλ‹€. 이게 무슨 말일까?

A. λ¬Έμž₯을 μ°¨κ·Όμ°¨κ·Ό μ‚΄νŽ΄λ³΄κ² λ‹€. μ˜€λ²„λΌμ΄λ”© λ©”μ„œλ“œ λ‚΄λΆ€λž€ μœ„μ˜ μ½”λ“œμ—μ„œλŠ” OuterClass에 μžˆλŠ” myMethod1을 μ˜λ―Έν•œλ‹€. ν•΄λ‹Ή λ©”μ„œλ“œλŠ” μΈν„°νŽ˜μ΄μŠ€μ— μžˆλŠ” λ©”μ„œλ“œλ₯Ό μ˜€λ²„λΌμ΄λ”© ν•œ 것이닀. μœ„μ—μ„œ μ„€λͺ…ν•˜κΈΈ 읡λͺ… μ΄λ„ˆ ν΄λž˜μŠ€λŠ” 항상 λΆ€λͺ¨ νƒ€μž…μœΌλ‘œλ§Œ μ„ μ–Έλ˜κΈ° λ•Œλ¬Έμ— λΆ€λͺ¨μ—κ²Œ μ—†λŠ” λ©”μ„œλ“œλŠ” ν˜ΈμΆœν•  수 μ—†λ‹€κ³  ν–ˆμ§€λ§Œ λ§Œμ•½ μ–΄λ–€ κΈ°λŠ₯을 myMethod1 μ•ˆμ—μ„œ μ‹€ν–‰λ˜λŠ” κ²ƒμœΌλ‘œ μΆ©λΆ„ν•˜λ‹€λ©΄ ꡳ이 외뢀에 λ§Œλ“€μ§€ 말고 myMethod1에 μ›ν•˜λŠ” λ©”μ„œλ“œλ₯Ό κ΅¬ν˜„ν•˜μ—¬, μ›λž˜ 있던 λ©”μ„œλ“œμ™€ 뢄리해 μž‘μ„±ν•˜λ©΄ λœλ‹€κ³  ν•˜λŠ” 것이닀. μ‰½κ²Œ ν•œ μ€„λ‘œ μ •λ¦¬ν•˜μžλ©΄ μƒˆλ‘œμš΄ λ©”μ„œλ“œλ₯Ό λ§Œλ“€κ³  싢을 경우 λΆ€λͺ¨μ—κ²Œ μ—†λŠ” λ©”μ„œλ“œμ—¬λ„, μ˜€λ²„λΌμ΄λ”© λ©”μ„œλ“œ 내뢀에 λ§Œλ“€λ©΄ λœλ‹€λΌκ³  ν•˜λŠ” 것이닀.

 

 

 


 

 

 

βœ”οΈ   읡λͺ… μ΄λ„ˆ 클래슀λ₯Ό ν™œμš©ν•œ μΈν„°νŽ˜μ΄μŠ€ νƒ€μž…μ˜ μž…λ ₯λ§€κ°œλ³€μˆ˜ 전달_ 439p

 

μΈν„°νŽ˜μ΄μŠ€ νƒ€μž…μ˜ μž…λ ₯λ§€κ°œλ³€μˆ˜ 전달 방법_ μ½”λ“œ: 읡λͺ…μ΄λ„ˆν΄λž˜μŠ€ + μ°Έμ‘°λ³€μˆ˜ν™œμš©X

interface Messenger {
    void send(String message);
}

class MessageProcessor {
    void process(Messenger messenger) {
        messenger.send("읡λͺ… μ΄λ„ˆ 클래슀 λ©”μ‹œμ§€ 전솑!");
    }
}

public class Main {
    public static void main(String[] args) {
        MessageProcessor processor = new MessageProcessor();
        
        // μ°Έμ‘° λ³€μˆ˜ 없이 읡λͺ… μ΄λ„ˆ 클래슀λ₯Ό 직접 인자둜 전달
        processor.process(new Messenger() {
            public void send(String message) {
                System.out.println("보낸 λ©”μ‹œμ§€: " + message);
            }
        });
    }
}
μΈν„°νŽ˜μ΄μŠ€ νƒ€μž…μ˜ μž…λ ₯ λ§€κ°œλ³€μˆ˜λ₯Ό μ „λ‹¬ν•˜λŠ” 방법은 총 4κ°€μ§€κ°€ μžˆλ‹€. μžμ‹ 클래슀λ₯Ό 직접 μƒμ„±ν•˜μ—¬ μ°Έμ‘° λ³€μˆ˜λͺ…을 ν™œμš©ν•˜λŠ” 방법과 μ°Έμ‘° λ³€μˆ˜λͺ… 없이 ν™œμš©ν•˜λŠ” 방법이 μžˆλ‹€. 그리고 읡λͺ… μ΄λ„ˆ 클래슀λ₯Ό ν™œμš©ν•˜λŠ”λ° μ΄λ•Œ μ°Έμ‘° λ³€μˆ˜λͺ…을 ν™œμš©ν•˜λŠ” 방법과 μ°Έμ‘° λ³€μˆ˜λͺ…을 ν™œμš©ν•˜μ§€ μ•ŠλŠ” 방법이 μžˆλ‹€. 

객체 μ°Έμ‘° λ³€μˆ˜μ˜ 역할은 객체의 참쒃값을 μ „λ‹¬ν•˜κΈ° μœ„ν•¨μ΄λ‹€. λ‹¨μˆœνžˆ 객체의 μ°Έμ’ƒκ°’λ§Œμ„ μ „λ‹¬ν•˜κ³ μž ν•œλ‹€λ©΄ ꡳ이 μ°Έμ‘° λ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šκ³  λ©”μ„œλ“œ μž…λ ₯λ§€κ°œλ³€μˆ˜ μœ„μΉ˜μ—μ„œ λ°”λ‘œ 객체λ₯Ό μƒμ„±ν•˜λ©΄ μƒμ„±λœ 객체의 참쒃값이 λ©”μ„œλ“œλ‘œ 전달될 것이닀.

 

 

 

 


 

 

 

 

βœ”οΈ   μ΄λ„ˆ μΈν„°νŽ˜μ΄μŠ€_ 444p

 

 μ •적 μ΄λ„ˆ μΈν„°νŽ˜μ΄μŠ€

: 클래슀 내뢀에 μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ •μ˜ν•˜μ—¬ ν•΄λ‹Ή ν΄λž˜μŠ€μ— 의쑴적인 κΈ°λŠ₯을 μˆ˜ν–‰ν•œλ‹€.

// κ΅¬ν˜„ 클래슀

class Outer {
    interface MyInterface {
        void hello();
    }
}

public class Main {
    public static void main(String[] args) {

        Outer.MyInterface obj1 = new Outer.MyInterface() {
            public void hello() {
                System.out.println("읡λͺ… 클래슀!!");
            }
        };
        obj1.hello();

        class Impl implements Outer.MyInterface {
            public void hello() {
                System.out.println("κ΅¬ν˜„ 클래슀!!");
            }
        }

        Outer.MyInterface obj2 = new Impl();
        obj2.hello();
    }
}

 

μ΄λ„ˆ μΈν„°νŽ˜μ΄μŠ€λŠ” 무쑰건 정적 μ΄λ„ˆ μΈν„°νŽ˜μ΄μŠ€λ§Œ μ‘΄μž¬ν•  수 μžˆλ‹€. λ§Œμ•½ static μ œμ–΄μžλ₯Ό μƒλž΅ν•˜λ©΄, μ»΄νŒŒμΌλŸ¬κ°€ μžλ™μœΌλ‘œ μΆ”κ°€ν•΄μ€€λ‹€. μœ„μ˜ μ½”λ“œμ—μ„œ μ»΄νŒŒμΌμ„ ν•˜κ²Œ 되면 λ‚΄λΆ€ μΈν„°νŽ˜μ΄μŠ€μ˜ λ°”μ΄νŠΈ μ½”λ“œλŠ” 'Outer$MyInterface.class'둜 ν˜•μ„±λœλ‹€. μ•„μš°ν„° 클래슀 내에 속해 μžˆλŠ” μΈν„°νŽ˜μ΄μŠ€λ„ λ‹Ήμ—°ν•˜κ²Œ μΈν„°νŽ˜μ΄μŠ€λ―€λ‘œ 직접 객체 생성은 λΆˆκ°€ν•˜λ‹€. κ·Έλž˜μ„œ 객체 생성을 ν•˜κΈ° μœ„ν•΄ λ‹€λ₯Έ ν΄λž˜μŠ€λ‘œλΆ€ν„° 상속을 λ°›κ±°λ‚˜, 읡λͺ… μ΄λ„ˆ 클래슀λ₯Ό ν™œμš©ν•΄μ•Όν•œλ‹€.

μœ„μ˜ μ½”λ“œμ—μ„  두가지 λͺ¨λ‘λ₯Ό λ°˜μ˜ν•œ μ½”λ“œλ‘œ, obj1μ΄λΌλŠ” 객체λ₯Ό μƒμ„±ν•œ 방법 그리고 Impl 클래슀λ₯Ό λ§Œλ“€μ–΄ Outer.MyInterfaceλ₯Ό μƒμ†ν•œ 방법을 보여주고 μžˆλ‹€.

 

 

 

 μ΄λ²€νŠΈ 처리 방법

class Button {

    // μΈν„°νŽ˜μ΄μŠ€ OnClickListenerνƒ€μž…μ„ κ°€μ§€λŠ” ocl λ³€μˆ˜μΈ ν•„λ“œ
    OnClickListner ocl;
    
    // OnClickListenerνƒ€μž…μ˜ ocl λ³€μˆ˜λ₯Ό 인자둜 λ°›μ•„
    // Button 클래슀의 ocl λ³€μˆ˜λ₯Ό μž¬μ •μ˜ν•˜λŠ” setOnClickListener λ©”μ„œλ“œ
    void setOnClickListener(OnClickListener ocl) {
         this.ocl = ocl;
    }
    
    // 클래슀 내뢀에 μžˆλŠ” μΈν„°νŽ˜μ΄μŠ€
    // 좔상 λ©”μ„œλ“œ onClick이 μžˆμŒμ„ μ •μ˜
    interface OnclickListener {
        public abstract void onClick();
    }
    
    void click() {
         ocl.onClick();
    }
}
public static void main(String[] ar) {
    // Button 클래슀의 객체인 button1
    Button button1 = new Button();
    
    // Button 클래슀의 λ‚΄λΆ€ μΈν„°νŽ˜μ΄μŠ€λ₯Ό 읡λͺ… 클래슀둜 κ΅¬ν˜„
    button1.setOnClickListener(new Button.OnClicklistener() {
        @Override
        public void onClick() {
             System.out.println("개발자 1. μŒμ•…μž¬μƒ");
        }
    });
    button1.click();
}
mainμ—μ„œ Button 클래슀의 객체인 button1이 λ§Œλ“€μ–΄μ§€κ³ , 이 κ°μ²΄λŠ” OnClickListener νƒ€μž…μ˜ ocl ν•„λ“œλ₯Ό κ°€μ§€κ³  μžˆλ‹€. OnClickListenerμ—μ„œ onClick λ©”μ„œλ“œλ₯Ό κ΅¬ν˜„ν•˜κ³  있으며 setOnclickListenerλŠ” 이 객체λ₯Ό λ°›μ•„μ„œ λ²„νŠΌ μ•ˆμ— μžˆλŠ” ocl ν•„λ“œμ— μ €μž₯ν•œλ‹€. this.ocl = ocl둜 κ°œλ°œμžκ°€ μ „λ‹¬ν•œ λ™μž‘μ„ λ²„νŠΌμ΄ κΈ°μ–΅ν•˜κ²Œ λœλ‹€.

button1.click();둜 λ²„νŠΌμ΄ 클릭되면, onClick λ©”μ„œλ“œκ°€ ν˜ΈμΆœλ˜μ–΄ "개발자 1. μŒμ•…μž¬μƒ"이 좜λ ₯λœλ‹€.

+ Recent posts