λ΄λΆ ν΄λμ€μ μ’ λ₯
λ΄λΆ ν΄λμ€λ ν΄λμ€ μμ λ€λ₯Έ ν΄λμ€λ₯Ό μ μΈνκ³ νμ©νλ κ²μΈλ° μ΄λ λ©€λ²λ³μμ κ°μ΄ μ μΈλλ μμΉμ λ°λΌμ μ’ λ₯κ° λλλ€. μ¬μ©λλκ²λ λ©€λ²λ³μμ λΉμ·νλ€. (JDK 1.1 μ΄νμ μΆκ°λ κΈ°λ₯)
λ΄λΆν΄λμ€λ μ£Όλ‘ AWTλ Swingκ³Ό κ°μ GUIμ΄ν리μΌμ΄μ μ μ΄λ²€νΈμ²λ¦¬ μΈμλ μ μ¬μ©νμ§ μμ μ λλ‘ μ¬μ©λΉλκ° λμ§ μκΈ° λλ¬Έμ λ΄λΆ ν΄λμ€μ κΈ°λ³Έ μ리μ νΉμ§μ μ΄ν΄νλ μ λκΉμ§λ§ νμ΅ν΄λ μΆ©λΆνλ€.
λ΄λΆ ν΄λμ€μ μ’ λ₯λ λ€μκ³Ό κ°λ€
1. λ©€λ² λ΄λΆ ν΄λμ€
- λ©€λ² λ³μ μ μΈνλ μμΉμ μ μνλ λ΄λΆ ν΄λμ€
- μΈλΆ ν΄λμ€μ μΈμ€ν΄μ€κ° μμ±λμ΄μΌλ§ κ°μ²΄ μμ± κ°λ₯
- μ£Όλ‘ μΈμ€ν΄μ€ λ©€λ²λ€κ³Ό κ΄λ ¨λ μμ μ μ¬μ©λ λͺ©μ μΌλ‘ μ μΈ
2. static λ΄λΆ ν΄λμ€ (μ€μ²©ν΄λμ€)
- λ©€λ² λ³μλ₯Ό μ μΈνλ μμΉμμ staticμΌλ‘ μ μν λ΄λΆ ν΄λμ€
- μΈλΆ ν΄λμ€μ μκ΄μλ ν΄λμ€λΌκ³ μκ°ν΄λ λ¨
- staticλ©€λ², νΉν staticλ©μλμμ μ¬μ©λ λͺ©μ μΌλ‘ μ μΈ
3. μ§μ λ΄λΆ ν΄λμ€
3-1. μ΄λ¦μ΄ μλ μ§μ ν΄λμ€
- μΈλΆ ν΄λμ€μ λ©μλλ μ΄κΈ°νλΈλ μμ μ μΈνλ©°, μ μΈλ μμ λ΄λΆμμλ§ μ¬μ© κ°λ₯
3-2. μ΄λ¦μ΄ μλ μ§μ ν΄λμ€ (μ΅λͺ ν΄λμ€) - λλ€ ννμ(lambda expression)
- ν΄λμ€μ μ μΈκ³Ό κ°μ²΄μ μμ±μ λμμ νλ μ΄λ¦μλ ν΄λμ€(μΌνμ©)
ν ν΄λμ€λ₯Ό λ€λ₯Έ ν΄λμ€μ λ΄λΆ ν΄λμ€λ‘ μ μΈνλ©΄ λ ν΄λμ€μ λ©€λ²λ€κ°μ μλ‘ μ κ·Όμ΄ μ¬μμ§κ³ μΈλΆμλ λΆνμν ν΄λμ€λ₯Ό κ°μΆ€μΌλ‘μ μ½λμ 볡μ‘μ±μ μ€μΌ μ μλ€.
μμλλ‘ μμ λ₯Ό μ΄ν΄λ³΄μ.
μμ 1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | class InnerEx1 { class InstanceInner { int iv=100; // static int cv=100; // μλ¬! staticλ³μλ₯Ό μ μΈν μ μλ€. final static int CONST = 100; // static finalμ μμμ΄λ―λ‘ νμ©νλ€. } static class StaticInner { int iv=200; static int cv=200; // staticν΄λμ€λ§ staticλ©€λ²λ₯Ό μ μν μ μλ€. } void myMethod() { class LocalInner { int iv=300; // static int cv=300; // μλ¬! staticλ³μλ₯Ό μ μΈν μ μλ€. final static int CONST = 300; // static finalμ μμμ΄λ―λ‘ νμ©νλ€. } } public static void main(String args[]) { System.out.println(InstanceInner.CONST); System.out.println(StaticInner.cv); } } | cs |
[μ€νκ²°κ³Ό]
100
200
λ΄λΆ ν΄λμ€μ μ ν μ€μμ static λ΄λΆ ν΄λμ€(μ€μ²©ν΄λμ€)λ§ staticλ©€λ²λ₯Ό κ°μ§ μ μλ€. κ±°μ μ°μ΄μ§ μμ§λ§ λ΄λΆν΄λμ€μμ staticλ³μλ₯Ό μ μΈν΄μΌνλ κ²½μ° static λ΄λΆ ν΄λμ€λ₯Ό μ μΈν΄μΌλ§ νλ€.
μμ 2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | class InnerEx2 { class InstanceInner {} static class StaticInner {} InstanceInner iv = new InstanceInner(); // μΈμ€ν΄μ€ λ©€λ²κ°μλ μλ‘ μ§μ μ κ·Όμ΄ κ°λ₯νλ€. static StaticInner cv = new StaticInner(); // static λ©€λ²κ°μλ μλ‘ μ§μ μ κ·Όμ΄ κ°λ₯νλ€. static void staticMethod() { // staticλ©€λ²λ μΈμ€ν΄μ€ λ©€λ²μ μ§μ μ κ·Όν μ μλ€. // InstanceInner obj1 = new InstanceInner(); StaticInner obj2 = new StaticInner(); // κ΅³μ΄ μ κ·Όνλ €λ©΄ μλμ κ°μ΄ κ°μ²΄λ₯Ό μμ±ν΄μΌνλ€. // μΈμ€ν΄μ€ λ΄λΆν΄λμ€λ μΈλΆν΄λμ€λ₯Ό λ¨Όμ μμ±ν΄μΌλ§ μμ±ν μ μλ€. InnerEx2 outer = new InnerEx2(); InstanceInner obj1 = outer.new InstanceInner(); } void instanceMethod() { // μΈμ€ν΄μ€ λ©μλμμλ μΈμ€ν΄μ€λ©€λ²μ staticλ©€λ² λͺ¨λ μ κ·Ό κ°λ₯νλ€. InstanceInner obj1 = new InstanceInner(); StaticInner obj2 = new StaticInner(); // λ©μλ λ΄μ μ§μμ μΌλ‘ μ μΈλ λ΄λΆν΄λμ€λ μΈλΆμμ μ κ·Όν μ μλ€. // LocalInner lv = new LocalInner(); } void myMethod() { class LocalInner {} LocalInner lv = new LocalInner(); } } | cs |
μΈμ€ν΄μ€ λ©€λ²λ κ°μ ν΄λμ€μ μλ μΈμ€ν΄μ€λ©€λ²μ staticλ©€λ² λͺ¨λ μ§μ νΈμΆμ΄ κ°λ₯νμ§λ§, staticλ©€λ²λ μΈμ€ν΄μ€λ©€λ²λ₯Ό μ§μ νΈμΆν μ μλ―μ΄, λ΄λΆν΄λμ€μ μΈμ€ν΄μ€ν΄λμ€μ staticν΄λμ€ μμ λ§μ°¬κ°μ§λ€. μλ₯Όλ€μ΄ λ€μκ³Ό κ°μ μμ μμ μΈμ€ν΄μ€ν΄λμ€λ μΈλΆ ν΄λμ€μ μΈμ€ν΄μ€ λ©€λ²λ₯Ό κ°μ²΄ μμ±μμ΄ λ°λ‘ μ¬μ©ν μ μμ§λ§, μ€νν±ν΄λμ€λ μΈλΆν΄λμ€μ μΈμ€ν΄μ€λ©€λ²λ₯Ό κ°μ²΄ μμ±μ ν΄μ£Όμ΄μΌ μ¬μ©ν μ μλ€.
μμ 3
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | class InnerEx3 { private int outerIv = 0; static int outerCv = 0; class InstanceInner { int iiv = outerIv; // μΈλΆν΄λμ€μ privateλ©€λ²λ μ κ·Όκ°λ₯νλ€. int iiv2 = outerCv; } static class StaticInner { // staticν΄λμ€λ μΈλΆν΄λμ€μ μΈμ€ν΄μ€ λ©€λ²μ μ κ·Όν μ μλ€. // int siv = outerIv; static int scv = outerCv; } void myMethod() { int lv = 0; final int LV = 0; class LocalInner { int liv = outerIv; int liv2 = outerCv; // μΈλΆν΄λμ€μ μ§μλ³μλ finalμ΄ λΆμ λ³μ(μμ)λ§ μ κ·Όκ°λ₯νλ€. // int liv3 = lv; int liv4 = LV; } } } | cs |
μ§μ ν΄λμ€λ μΈλΆ ν΄λμ€μ μΈμ€ν΄μ€λ©€λ²μ staticλ©€λ²λ₯Ό λͺ¨λ μ¬μ©ν μ μμΌλ©°, μ§μ ν΄λμ€κ° ν¬ν¨λ λ©μλμμ μ μλ μ§μλ³μλ μ¬μ©ν μ μλ€. λ¨, finalμ΄ λΆμ μ§μλ³μλ§ μ κ·Ό κ°λ₯νλ€. λ©μλκ° μνμ λ§μ³μ μ§μλ³μκ° μλ©Έλ μμ μλ, μ§μ ν΄λμ€μ μΈμ€ν΄μ€κ° μλ©Έλ μ§μλ³μλ₯Ό μ°Έμ‘°νλ €λ κ²½μ°κ° λ°μν μ μκΈ° λλ¬Έμ κ·Έλ λ€κ³ νλ€.
μμ 4
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | class Outer { int value=10; // Outer.this.value class Inner { int value=20; // this.value void method1() { int value=30; System.out.println(" value :" + value); System.out.println(" this.value :" + this.value); System.out.println("Outer.this.value :" + Outer.this.value); } } } class InnerEx5 { public static void main(String args[]) { Outer outer = new Outer(); Outer.Inner inner = outer.new Inner(); inner.method1(); } } | cs |
[μ€νκ²°κ³Ό]
value :30
this.value :20
Outer.this.value :10
μμ μμ λ λ΄λΆν΄λμ€μ μΈλΆν΄λμ€μ μ μΈλ λ³μμ μ΄λ¦μ΄ κ°μ λ λ³μ μμ 'this' λλ 'μΈλΆν΄λμ€λͺ .this'λ₯Ό λΆμ¬μ μλ‘ κ΅¬λ³ν μ μλ€λ κ²μ 보μ¬μ€λ€.
μ΅λͺ ν΄λμ€ μμ
μ΅λͺ ν΄λμ€λ μ΄λ¦μ΄ μκΈ° λλ¬Έμ μμ±μλ κ°μ§ μ μμΌλ©°, μ‘°μν΄λμ€μ μ΄λ¦μ΄λ ꡬννκ³ μ νλ μΈν°νμ΄μ€μ μ΄λ¦μ μ¬μ©ν΄μ μ μνλ€. λλ¬Έμ νλμ ν΄λμ€λ‘ μμλ°λ λμμ μΈν°νμ΄μ€λ₯Ό ꡬννκ±°λ νλ μ΄μμ μΈν°νμ΄μ€λ₯Ό ꡬνν μ μλ€. μ€λ‘μ§ λ¨ νλμ ν΄λμ€λ₯Ό μμλ°κ±°λ λ¨ νλμ μΈν°νμ΄μ€λ§μ ꡬνν μ μλ€.
1 2 3 4 5 6 7 8 | class InnerEx{ Object iv = new Object(){ void method(){} }; // μ΅λͺ
ν΄λμ€ static Object cv = new Object(){ void method(){} }; // μ΅λͺ
ν΄λμ€ void myMethod() { Object lv = new Object(){ void method(){} }; // μ΅λͺ
ν΄λμ€ } } | cs |
μμ μμ λ λ¨μν μ΅λͺ ν΄λμ€μ μ¬μ© μλ₯Ό λ³΄μ¬ μ€ κ²μ΄λ€. μ΄ μμ λ₯Ό μ»΄νμΌ νλ©΄ λ€μκ³Ό κ°μ΄ 4κ°μ ν΄λμ€νμΌμ΄ μμ±λλ€.
InnerEx.class
InnerEx$1.class β μ΅λͺ ν΄λμ€
InnerEx$2.class β μ΅λͺ ν΄λμ€
InnerEx$3.class β μ΅λͺ ν΄λμ€
μ΅λͺ ν΄λμ€λ μ΄λ¦μ΄ μκΈ° λλ¬Έμ 'μΈλΆν΄λμ€λͺ $μ«μ.class'μ νμμΌλ‘ ν΄λμ€νμΌλͺ μ΄ κ²°μ λλ€.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | import java.awt.*; import java.awt.event.*; class InnerEx { public static void main(String[] args) { Button b = new Button("Start"); b.addActionListener(new EventHandler()); } } class EventHandler implements ActionListener { public void actionPerformed(ActionEvent e) { System.out.println("Action Event occured!!!"); } } | cs |
μμ μμ λ₯Ό μ΅λͺ ν΄λμ€λ₯Ό μ΄μ©ν΄μ λ³κ²½νλ©΄ λ€μκ³Ό κ°μ΄ λλ€.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | import java.awt.*; import java.awt.event.*; class InnerEx8 { public static void main(String[] args) { Button b = new Button("Start"); b.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { System.out.println("Action Event occured!!!"); } } ); } } | cs |
μμ μμ λ₯Ό λλ€μμ μ΄μ©ν΄μ λ³κ²½νλ©΄ λ€μκ³Ό κ°μ΄ λλ€.
1 2 3 4 5 6 7 8 9 10 11 12 13 | import java.awt.*; import java.awt.event.*; class InnerEx { public static void main(String[] args) { Button b = new Button("Start"); b.addActionListener(()->{ System.out.println("Action Event occured!!!"); ); } } | cs |
μ΄λ°μμΌλ‘ μ£Όλ‘ AWTλ Swingκ³Ό κ°μ GUIμ΄ν리μΌμ΄μ μ μ΄λ²€νΈμ²λ¦¬μ μ¬μ©λλ€.
λλ€μμ ν¨μλ₯Ό λ³μμ λ΄μλ μ μλλ° μλ° 8μμ λλ€μμ΄ μΆκ°λκ³ λμλ νλμ λ³μμ νλμ ν¨μλ₯Ό 맀νν μ μκ² λμλ€.
1 | Func add = (int a, int b) -> a + b; | cs |
μμκ°μ΄ λ³μμ ν¨μλ₯Ό λ΄κ³ μΆμλ Funcμ΄λΌλ νμ μ 무μμ΄μ΄μΌ ν κΉ?
λ°λ‘ interfaceμ΄λ€. μλμ κ°μ΄ FuncμΈν°νμ΄μ€λ₯Ό μμ±νλ©΄ λλ€
1 2 3 | interface Func { public int calc(int a, int b); } | cs |
μ΄ μΈν°νμ΄μ€μμλ calcλΌλ νλμ μΆμλ©μλλ₯Ό κ°μ§κ³ λ΄λΆ ꡬνμ μ΄λ»κ² ν μ§ μμ§ μ ν΄μ§μ§ μμλ€.
λ΄λΆ ꡬνμ μμμ λλ€μμ ν΅ν΄μ ꡬνν΄μ€ κ²μΈλ° μ¬κΈ°μ μλ¬Έμ FuncμΈν°νμ΄μ€μ λ©μλλ₯Ό μΆκ°νκ² λλ©΄?? μ΄λ»κ² λ κΉ
λλ€μμΌλ‘ ꡬννλ add ν¨μ μ½λμμ μ€λ₯κ° λ°μνλ€. κΈ°λ³Έμ μΌλ‘ λλ€μμ μν μΈν°νμ΄μ€μμ μΆμλ©μλλ λ¨ νλμ¬μΌνλ€. μ΄λ₯Ό μν΄ λλ€μμ μν μΈν°νμ΄μ€μμ νννκΈ° μν΄μ @FunctionalInterfaceλΌλ μ΄λ Έν μ΄μ μ μ¬μ©νλ€. μ€μ λ‘ μ΄ μ΄λ Έν μ΄μ μ μ μΈνλ©΄ ν΄λΉ μΈν°νμ΄μ€μ λ©μλλ₯Ό λ κ° μ΄μ μ μΈνλ©΄ μ ν¨νμ§ μλ€λ μ€λ₯λ₯Ό λΈλ€. (μ»΄νμΌλ¬ μμ€μμ μ€λ₯ νμΈμ΄ κ°λ₯)
1 2 3 4 | @FunctionalInterface interface Func { public int calc(int a, int b); } | cs |
μμ add λ³μμ λ΄μ ν¨μλ₯Ό λ€μκ³Ό κ°μ΄ νμ©ν μ μλ€.
1 | int result = add.calc(1,2) + add.calc(3, 4); // 10 | cs |
μ°Έκ³ : http://jhmocu.tistory.com/41
https://m.blog.naver.com/kjc8108/220654750643
http://linuxism.tistory.com/1002