[[TableOfContents]] == ì¼ì‹œ == * 오후 12 : 10 ~ == ì°¸ê°€ìž == || ìœ ìž¬ë²” || ì°¸ì„ || || ìµœë‹¤ì¸ || 불참 || || ì´ì§€ìˆ˜ || ì°¸ì„ || || 김용준 || ì°¸ì„ || || ê¹€ì •ë¯¼ || ì°¸ì„ || == ì§„í–‰ ìƒí™© == * [ìœ ìž¬ë²”] í•™ìš°ì˜ ë°œí‘œ * JAVAì˜ ì •ì„ 7-5~ === 발표 ë‚´ìš© === * í´ëž˜ìФ 중첩 : 여러 í´ëž˜ìŠ¤ë¥¼ 관리 í• ë•Œ í´ëž˜ìФ ì•ˆì— ë‹¤ì‹œ í´ëž˜ìŠ¤ë¥¼ ì„ ì–¸í•˜ì—¬ 중첩시키는 것. {{{ Outer ê°ì²´1 = new Outer(); //Outer í´ëž˜ìФ ê°ì²´ ìƒì„± 방법 Outer.Inner ê°ì²´2 = ê°ì²´1.new Inner(); //Inner í´ëž˜ìФ ê°ì²´ ìƒì„± 방법 }}} * 컴파ì¼ëŸ¬ë¥¼ ëŒë¦¬ê³ 윈ë„ìš° íƒìƒ‰ê¸°ë¥¼ ì´ìš©í•˜ë©´ Outer$Inner.class ë¼ëŠ” 파ì¼ë„ ìžˆì„ ê²ƒì´ë‹¤. ì´ íŒŒì¼ì´ 바로 ì¤‘ì²©ëœ í´ëž˜ìŠ¤ë¥¼ 나타내는 것ì´ë‹¤. * Inner í´ëž˜ìФì—서는 Outer í´ëž˜ìŠ¤ì˜ ë©¤ë²„ë¥¼ ì´ìš”í• ìˆ˜ 있다. 하지만 Outer í´ëž˜ìФì—서 Inner í´ëž˜ìŠ¤ì˜ ë©¤ë²„ë¥¼ ì´ìš©í•˜ë ¤ë©´ ê°ì²´ë¥¼ ì§ì ‘ ì„ ì–¸í•´ì•¼ 한다. * Outer ë‚´ë¶€ì—서 Innerì˜ ë©¤ë²„ë¥¼ 사용하기 위해 ê°ì²´ë¥¼ ì„ ì–¸í•˜ë ¤ë©´ 현재 í´ëž˜ìŠ¤ì˜ ê°ì²´ë¥¼ 대변하는 thisê°€ 있어야 한다. * static 메서드 ë‚´ë¶€ì—서는 ì¼ë°˜ 중첩 í´ëž˜ìŠ¤ì˜ ê°ì²´ê°€ ì„ ì–¸ ë 수 없다는 것 * ë˜ Inner ë‚´ë¶€ì— staticê³¼ ê´€ë ¨ëœ ë©¤ë²„ë¥¼ ì„ ì–¸í•˜ëŠ” ê²ƒë„ ì»´íŒŒì¼ ì—러를 ë°œìƒì‹œí‚¨ë‹¤ * ì •ì 중첩 í´ëž˜ìФ : 중첩 í´ëž˜ìФ ë‚´ë¶€ì—서 staticê³¼ ê´€ë ¨ëœ ë©¤ë²„ë¥¼ ì„ ì–¸í• ìˆ˜ 있는 í´ëž˜ìФ * ì¼ë°˜ 중첩 í´ëž˜ìФ ë‚´ë¶€ì—는 staticê³¼ ê´€ë ¨ëœ ë©¤ë²„ë¥¼ ì„ ì–¸í• ìˆ˜ 없다. 그러나 Outer í´ëž˜ìŠ¤ì˜ ë©¤ë²„ë¥¼ 단지 ì´ìš©ë§Œ í• ë•Œì—는 staticì´ë“ ì•„ë‹ˆë“ ê´€ê³„ ì—†ì´ ì´ìš© í• ìˆ˜ 있다. {{{ class Outer{ static class Inner{ .......... } } }}} * ì •ì ì¤‘ì²©ì˜ í´ëž˜ìŠ¤ëŠ” staticì˜ íŠ¹ì„±ìƒ ê°ì²´ë¥¼ ë…립ì 으로 만들 수 있따. * Outer.Inner ê°ì²´ = new Outer.Inner(); * Outer í´ëž˜ìŠ¤ì˜ ê°ì²´ê°€ ì—†ì–´ë„ Inner í´ëž˜ìŠ¤ì˜ ê°ì²´ë¥¼ 만들 수 있다. * ë˜í•œ static 멤버를 ì„ ì–¸ í• ìˆ˜ ìžˆê³ static ë©”ì„œë“œë„ ë§Œë“¤ì–´ 사용 í• ìˆ˜ 있다. * 그래서 Inner í´ëž˜ìФ ë‚´ë¶€ì— staticì„ ì„ ì–¸í•˜ì—¬ ì‚¬ìš©í•˜ê³ ì‹¶ë‹¤ë©´ ì •ì 중첩 í´ëž˜ìŠ¤ë¥¼ 사용해야 한다. ê°ì²´ ì„ ì–¸ ë°©ì‹ì€ 위와 ê°™ì€ ë°©ì‹ìœ¼ë¡œë§Œ ë°œìƒì‹œí‚¬ 수 있따. * Outer í´ëž˜ìŠ¤ì˜ ë©¤ë²„ëŠ” staticì¼ ê²½ìš°ì—ë§Œ ì‚¬ìš©í• ìˆ˜ 있다. ì´ê²ƒì€ 마치 ì¼ë°˜ 멤버를 static 메서드 ë‚´ë¶€ì—서 ì‚¬ìš©í• ìˆ˜ 없는것과 ìœ ì‚¬í•˜ë‹¤ {{{ public class Round12_Ex04 { public static class Inner3{ public static void main(String[] ar){ System.out.println("Inner í´ëž˜ìФ ë‚´ë¶€ì˜ main 메서드"); } } } }}} * 위와 ê°™ì€ ê²½ìš° java Round12_Ex04로 실행하면 main() 메서드가 Inner í´ëž˜ìФ ë‚´ë¶€ì— ìžˆê¸° ë•Œë¬¸ì— ì°¾ì„ ìˆ˜ 없어 JVMì´ main()ì„ ì°¾ì„ ìˆ˜ 없다는 ì—러가 뜬다. 그래서 실행 시킬때ì—는 java Round12_Ex04$Inner3으로 ì‹¤í–‰ì„ í•´ì•¼ 한다. * ì´ê²ƒì€ ì‹¤ì œ 메서드가 있는 ê³³ì„ ì§€ì¹í•˜ëŠ” 것ì´ë‹¤. * ì§€ì— ì¤‘ì²© í´ëž˜ìФ : íŠ¹ì • ë©”ì„œë“œì— í•œì •ì ì¸ ìš©ë„로 ì‚¬ìš©í• í´ëž˜ìŠ¤ë¡œ 등장 * ì¼ë°˜ì 으로 보통 í´ëž˜ìŠ¤ì™€ ë™ì¼í•˜ë‚˜ ì ‘ê·¼ ì œí•œìžì™€ ì§€ì • 예약어를 ì‚¬ìš©í• ìˆ˜ 없다는 형태ì´ë‹¤. * ë§Œì¼ ì¼ë°˜ 중첩 í´ëž˜ìŠ¤ì²˜ëŸ¼ main() ë©”ì„œë“œì˜ ë©¤ë²„ë¥¼ ì‚¬ìš©í•˜ë ¤ë©´ ê·¸ 멤버는 반드시 final로 ì„ ì–¸ë˜ì–´ 있어야만 한다. * 컴파ì¼ì„ 하면 Round12_Ex06.class ì™¸ì— Round12_Ex06$1Inner5.classë¼ëŠ” í´ëž˜ìŠ¤ê°€ ìƒì„±ëœë‹¤. * ì¼ë°˜ 중첩 í´ëž˜ìŠ¤ì™€ ìœ ì‚¬í•˜ê°€ static 멤버를 ì„ ì–¸í•˜ì§€ 못한다. * ìµëª… 중첩 í´ëž˜ìФ : classë¼ëŠ” 예약어와 í´ëž˜ìФ ëª…ì„ ê°€ì§€ì§€ ì•Šê³ ë‹¨ì§€ instanceì˜ ìƒì„±ê³¼ ë‚´ìš©ë¶€ì˜ ì •ì˜ë§Œ ê°€ì§€ê³ ìžˆëŠ” í´ëž˜ìФ * ì§€ì— ì¤‘ì²© í´ëž˜ìŠ¤ì˜ ë³€í˜•ëœ í˜•íƒœ * 다만 ì—¬ê¸°ì— ì‚¬ìš©ë˜ëŠ” 중첩 í´ëž˜ìŠ¤ëŠ” ì´ë¯¸ ê¸°ì¡´ì— ì¡´ìž¬ 하는 것ì´ì–´ì•¼ 한다. * ë˜í•œ ì´ ë‚´ì—서 사용 í• ìˆ˜ 있는 외부 ë°ì´í„°ë„ final로 ì„ ì–¸ë˜ì–´ 있어야 한다. * 내용부가 서로 다른 íŠ¹ì • ë©”ì„œë“œì˜ ì‹¤í–‰ì„ ì£¼ê´€ 하기 위해서 사용 * ì ‘ê·¼ ì œí•œìžì˜ ì‚¬ìš©ì— ì£¼ì˜í•´ì•¼ 한다. ìžê¸° ìžì‹ ì˜ ë©¤ë²„ì¼ì§€ë¼ë„ ì •ì˜ë˜ëŠ” ì˜ì—ì´ ë‹¤ë¥´ê¸° 때문ì´ë‹¤. {{{ class Inner6{ int y = 200; public Inner6(){ this.disp(); } public void disp(){} } public class Round12_Ex07 { public static void main(String[] ar){ final int x = 100; new Inner6(){ public void disp(){ System.out.println("Default ìƒì„±ìž"); System.out.println("x = " + x); System.out.println("y = " + y); } }; } } }}} * 위 예시를 ì»´íŒŒì¼ í›„ íƒìƒ‰ê¸°ë¡œ í´ëž˜ìФ 파ì¼ì„ 찾아보면 Inner6.class, Round12_Ex07.class, Round12_Ex07$1.class. ì´ë ‡ê²Œ 3개가 ìƒì„±ì´ ëœë‹¤. * ì´ ì¤‘ ë§ˆì§€ë§‰ì´ ìµëª… 중첩 í´ëž˜ìФì¸ë‹¤ ì´ë¦„ì—서 알 수 ìžˆë“¯ì´ ìµëª…ì´ê¸°ì— 숫ìžë¡œ ê·¸ í´ëž˜ìŠ¤ë¥¼ 표시한다. * 만약 main() 메서드 ë‚´ë¶€ì— ë‹¤ë¥¸ ìµëª… 중첩 í´ëž˜ìŠ¤ê°€ 있다면 ì´ í´ëž˜ìŠ¤ëŠ” Round12_Ex07$2.classê°€ ë 것ì´ë‹¤. * ìµëª… 중첩 í´ëž˜ìŠ¤ëŠ” ë‚´ë¶€ì— ìƒì„±ìžë¥¼ ìž‘ì„±í• ìˆ˜ 없다. * 만약 작성하면 invalid 메서드 declaration ì´ë ‡ê²Œ 뜰 것ì´ë‹¤. * 다형성 : ì—¬ëŸ¬ê°œì˜ ê°œë³„ì í´ëž˜ìŠ¤ë¥¼ í•˜ë‚˜ì˜ ë¶€ëª¨ í´ëž˜ìФ ê°ì²´ë¡œ 통합하여 관리하여 ê·¸ íš¨ìœ¨ì„±ì„ ë†’ì¸ ê²ƒ * 예 : ë°°ì—´ * ë‹¤í˜•ì„±ì˜ í‘œí˜„ {{{ A ap = new A(); A bp = new B(); A cp = new C(); }}} * 여기서 중요한 ê²ƒì€ ìžì‹ ì˜ í´ëž˜ìФ ê°ì²´ê°€ 아니지만 ìžì‹ ì˜ ë¶€ëª¨ í´ëž˜ìФë¼ë©´ ì¸ìŠ¤í„´ìŠ¤ë¥¼ 부모 ê°ì²´ì— ë‹´ì„ ìˆ˜ 있다는 것ì´ë‹¤. {{{ class A3{ public String toString(){ return "A3 í´ëž˜ìФ"; } } class B3{ public String toString(){ return "B3 í´ëž˜ìФ"; } } public class Round13_Ex01 { public static void main(String[] ar){ A3 ap = new A3(); B3 bp = new B3(); System.out.println("ap = " + ap); System.out.println("bp = " + bp); } } }}} * 위 í´ëž˜ìФ A3, B3는 언뜻 ë³´ë©´ ì—°ê´€ì´ ë˜ì–´ 있지 않지만 사실 다형ì ì¸ í‘œí˜„ì„ ì‚¬ìš©í• ìˆ˜ 있다. * 왜ëƒí•˜ë©´ ëª¨ë‘ Object를 부모로 ë‘기 때문ì´ë‹¤. 그래서 ì´ë¥¼ 아래와 ê°™ì´ ì‚¬ìš© í• ìˆ˜ë„ ìžˆë‹¤. {{{ public class Round13_Ex01 { public static void main(String[] ar){ Object[] obj = new Object[2]; obj[0] = new A3(); obj[1] = new B3(); for(int a = 0; a<obj.length; a++){ System.out.println("abj[" + a + "] = " + obj[a]); } } } }}} * 다형ì ì¸ í‘œí˜„ì—서 ë©¤ë²„ì— ëŒ€í•œ ì ‘ê·¼ ê·œì • * 부모 í´ëž˜ìŠ¤ê°€ ê°€ì§€ê³ ìžˆëŠ” ëª¨ë“ ë©¤ë²„ë“¤ì— ì ‘ê·¼í• ìˆ˜ 있다. * 단, ìžì‹ í´ëž˜ìФì—서 메서드 오버ë¼ì´ë”©ì„ 했다면 오버ë¼ì´ë”©ì´ ëœ ìžì‹ì˜ ë©¤ë²„ì— ì ‘ê·¼ì´ ëœë‹¤. * 멤버 í•„ë“œì˜ ê²½ìš° 부모 í´ëž˜ìŠ¤ì˜ ë©¤ë²„ 필드ì—ë§Œ ì ‘ê·¼ í• ìˆ˜ 있다. * ìžì‹ í´ëž˜ìŠ¤ì˜ ë©¤ë²„ 필드는 오버ë¼ì´ë”©ì´ ëœ ìžì‹ í´ëž˜ìŠ¤ì˜ ë©”ì„œë“œì— ì˜í•´ì„œë§Œ ì ‘ê·¼ í• ìˆ˜ 있다. * 다형성ì—서 멤버 í•„ë“œë¡œì˜ ì ‘ê·¼ * 필드는 다형성으로 표현 ë˜ì—ˆì„ 때는 ê°ì²´ë¥¼ 통해 부모 í´ëž˜ìŠ¤ì˜ ë©¤ë²„ 필드ì—ë§Œ ì ‘ê·¼ í• ìˆ˜ 있다. * ìƒìœ„ 하위 ëª¨ë‘ ë™ì¼í•œ ì´ë¦„ì˜ í•„ë“œë¼ í•˜ë”ë¼ë„ ìƒìœ„ í´ëž˜ìŠ¤ì˜ ë©¤ë²„ í•„ë“œì˜ ê²ƒë§Œ ì ‘ê·¼ í• ìˆ˜ 있다. * 다형성ì—서 ë©”ì„œë“œë¡œì˜ ì ‘ê·¼ * ìš°ì„ ì€ ìƒìœ„ í´ëž˜ìŠ¤ì˜ ë©”ì„œë“œì— ì ‘ê·¼ í• ìˆ˜ ìžˆê³ í•˜ìœ„ í´ëž˜ìŠ¤ì˜ ë©”ì„œë“œì—는 ì ‘ê·¼ í• ìˆ˜ 없다. * 하지만 ìƒìœ„와 í•˜ìœ„ì— ë™ì‹œì— 있는 오버ë¼ì´ë”©ì´ ëœ ë©”ì„œë“œì— ëŒ€í•´ì„œëŠ” í•˜ìœ„ì˜ ë©¤ë²„ë¥¼ 실행 í• ìˆ˜ 있다. {{{ class A6{ public void aaa(){ System.out.println("aaa"); } public void bbb(){ System.out.println("bbb"); } } class B6 extends A6{ public void bbb(){ System.out.println("bbb1"); } public void ccc(){ System.out.println("ccc"); } } public class Round13_Ex11 { public static void main(String[] ar){ A6 ap = new B6(); ap.aaa();//ìƒìœ„ í´ëž˜ìŠ¤ì˜ ë©”ì„œë“œì— ì ‘ê·¼ ap.bbb();//오버ë¼ì´ë”© ëœ í•˜ìœ„ í´ëž˜ìŠ¤ì— ì ‘ê·¼ //ap.ccc();//하위 í´ëž˜ìŠ¤ì˜ ë©”ì„œë“œì— ì ‘ê·¼ } } }}} * ë‹¤í˜•ì„±ì€ ì–´ë–¤ ê°’ì´ ì˜¬ì§€ 예ìƒì„ 하면 ì–´ë µì§€ ì•Šë‹¤ê³ í•œë‹¤. {{{ class A{ ...} class B extends A{...} public class C{ public static void main(String[]ar){ A ap = new B(); B bp = ap; } } }}} * 위와 ê°™ì€ ê²½ìš° ì—러가 ë°œìƒí•œë‹¤. ì—러를 ë°œìƒí•˜ì§€ 않게 하기 위해서는 B bp = (B)ap로 명시ì 으로 ìºìŠ¤íŒ…ì„ í•´ì•¼ 한다. * 하지만 ì•„ì§ ë¬¸ì œëŠ” 있다. 만약 A ap = new A();ë¼ëŠ” 문맥ì´ì—ˆë‹¤ë©´ Exception in thread "main" java.lang.ClassCastException:Aë¼ëŠ” 런타임 ì—러가 ë°œìƒí•œë‹¤. ì´ëŸ´ 때 instanceofë¼ëŠ” 예약어가 참으로 ìœ ìš©í•˜ë‹¤. * instanceof ì—°ì‚°ìž : 참조변수가 참조하는 ì¸ìŠ¤í„´ìŠ¤ì˜ ì‹¤ì œ íƒ€ìž…ì„ ì²´í¬í•˜ëŠ”ë° ì‚¬ìš© * ì´í• ì—°ì‚°ìžì´ë©° 피연산ìžëŠ” 참조형 변수와 타입, ì—°ì‚° 결과는 true, falseì´ë‹¤. * instanceofì˜ ì—°ì‚° 결과가 trueì´ë©´ 해당 타입으로 í˜•ë³€í™˜ì´ ê°€ëŠ¥í•˜ë‹¤. {{{ class A{} class B extends A{} public class Test{ public static void main(String[] ar){ A ap = new B(); B bp = null; if(ap instanceof B){//í˜•ì‹ : ê°ì²´ instanceof ë³€í™˜í• í´ëž˜ìФ bp = (B)ap; System.out.println("형 ë³€í™˜ì´ ê°€ëŠ¥í•˜ë‹¤."); } else{ System.out.println("형 ë³€í™˜ì´ ë¶ˆê°€ëŠ¥ 하다"); } } } }}] * abstract(ì¶”ìƒ, ì¶”ìƒ ë©”ì„œë“œ, ì¶”ìƒ í´ëž˜ìФ) : 부모í´ëž˜ìŠ¤ë¥¼ ì§ì ‘ 사용하지 ì•Šê³ ìžì‹ì„ 통해서만 ì‚¬ìš©í• ëª©ì 으로 í˜¹ì€ ë‹¨ì§€ 묶어 주기만 í• ëª©ì 으로 í´ëž˜ìŠ¤ë¥¼ 만들 때 ì¶”ìƒ í´ëž˜ìŠ¤ë¥¼ 사용한다. * ì ‘ê·¼_ì œí•œìž abstract class í´ëž˜ìŠ¤ëª… extends ìƒìœ„_í´ëž˜ìФ implements ìƒìœ„_ì¸í„°íŽ˜ì´ìФ{...} * ì¶”ìƒ í´ëž˜ìŠ¤ëŠ” ì¼ë°˜ í´ëž˜ìŠ¤ì˜ ëª¨ë“ ê¸°ëŠ¥ì„ í• ìˆ˜ 있다. 다만 ê·¸ ìžì‹ ì˜ ê°ì²´ë§Œí¼ì€ ë°œìƒì‹œí‚¤ì§€ 못한다. * ì´ê²ƒì€ 주로 ë‹¤í˜•ì„±ì„ í‘œí˜„í• ëª©ì 으로 ã…ë‚³ì´ ì‚¬ìš©í•˜ëŠ”ë° ì´ëŸ° ê²ƒì„ "ë””ìžì¸ 목ì "ì´ë¼ê³ 한다. 쉽게 í•˜ë‚˜ì˜ ì œí’ˆì„ ë§Œë“¤ 때 ì°¸ê³ í•˜ëŠ” ë””ìžì¸ í˜¹ì€ ëª¨ë¸ì´ë¼ê³ ìƒê°í•´ë‘ìž. * 만약 ì¶”ìƒ í´ëž˜ìŠ¤ê°€ ì¶”ìƒ ë©”ì„œë“œë¥¼ ê°€ì§€ê³ ìžˆë‹¤ë©´ ê·¸ê²ƒì€ ë°˜ë“œì‹œ 오버ë¼ì´ë”© ë˜ì–´ì•¼ 한다. * ì¶”ìƒ í´ëž˜ìŠ¤ëŠ” ì¼ë°˜ í´ëž˜ìŠ¤ì˜ ë©¤ë²„ ì´ì™¸ì— ì¶”ìƒ ë©”ì„œë“œë¥¼ 가질 수 있다. * ì ‘ê·¼_ì œí•œìž abstract 결과형_리턴값 메서드명(매개_변수들) throws 예외_í´ëž˜ìŠ¤ë“¤; * 여기서 중요한 ê²ƒì€ ë§ˆì§€ë§‰ì— ì„¸ë¯¸í´ë¡ 으로 ë난다는 것ì´ë‹¤. 즉, 내용부를 가지지 ì•Šê³ ì´ë¦„ë§Œ 있는 메서드ì´ë‹¤. * ì´ëŸ° ì´ìœ 는 ë‹¤í˜•ì„±ì˜ í‘œí˜„ì—서 오버ë¼ì´ë”©ì´ ë˜ì—ˆìŒì„ ì˜ë¯¸í•˜ëŠ” 것ì¸ë° ì´ê²ƒì€ 반드시 오버ë¼ì´ë”©ì´ ë˜ì–´ì•¼ë§Œ 한다. * ì¶”ìƒë©”서드를 만드는 ì´ìœ 는 ìƒì†ë°›ëŠ” 하위 í´ëž˜ìФì—게 ë””ìžì¸ì´ ë˜ì–´ 있는 메서드를 ìž¬ì •ì˜ í•˜ë¼ê³ ëª…ë ¹ì„ ë‚´ë¦¬ê¸° 위해서다. * ì¶”ìƒí´ëž˜ìŠ¤ë¥¼ 통해 ì¸ìŠ¤í„´ìŠ¤ë¥¼ ë°œìƒì‹œí‚¤ë ¤ê³ 하면 ì—러가 ë°œìƒí•œë‹¤. * ì¸í„°íŽ˜ì´ìФ : ë‹¨ì¼ ìƒì†ì˜ ì œì•½ì„ ë³´ì™„í•˜ê¸° 위해 ìžë°”ì—서 ì œì•ˆí•œ 새로운 ê°œë…ì˜ í´ëž˜ìФ. ì´ë¥¼ 통하 ìžë°”는 다중 ìƒì†ì„ í• ìˆ˜ 있게 ë˜ì—ˆë‹¤. * ì ‘ê·¼_ì œí•œìž interface ì¸í„°íŽ˜ì´ìФ 명 extends ìƒìœ„_ì¸í„°íŽ˜ì´ìФ{ 내용부} * ì¸í„°íŽ˜ì´ìŠ¤ëŠ” 다중 ìƒì†ì´ 가능하다는 íŠ¹ì§•ì´ ê°•í•˜ê²Œ 나타난다. * ì¸í„°íŽ˜ì´ìŠ¤ì˜ ì •ì˜ * 1. 다중 ìƒì†ì„ 위한 í´ëž˜ìŠ¤ì˜ ëŒ€ì•ˆ * 2. ë‹¤í˜•ì„±ì— ì˜í•œ í´ëž˜ìФ ì œì–´ * ì¸í„°íŽ˜ì´ìŠ¤ì˜ ë‚´ë¶€ì— í¬í•¨ ë 수 있는 ë©¤ë²„ë“¤ì€ ì¼ë°˜ í´ëž˜ìŠ¤ì™€ 조금 ì°¨ì´ë‚œë‹¤. * ì¸í„°íŽ˜ì´ìФ í¬í•¨ 멤버 * 필드 : 무조건 public static final 멤버 필드ì´ë‹¤. ëª¨ë‘ ê¸°ìž¬í•˜ë“ staticë§Œ ê¸°ìž¬í•˜ë“ ê¸°ìž¬ë¥¼ 하지 ì•Šë“ ëª¨ë‘ public static final로 ì¸ì‹í•œë‹¤. * 메서드 : 무조건 public abstract 멤버 메서드다. ê³ ë¡œ ì •ì˜ë¶€ë¥¼ 가질 수 없다. ì¸í„°íŽ˜ì´ìŠ¤ë„ ë‹¤í˜•ì„±ì´ ëª©ì ˆì´ë¯€ë¡œ ìžë™ìœ¼ë¡œ ëª¨ë“ ë©”ì„œë“œê°€ abstractê°€ ëœë‹¤. * ì •ì 중첩 í´ëž˜ìФ : ì¸í„°íŽ˜ì´ìŠ¤ê°€ 가지는 중첩 í´ëž˜ìФì—는 ìžë™ì 으로 staticì´ ë¶™ì–´ ì •ì 중첩 í´ëž˜ìŠ¤ë§Œ 가질 수 있다는 ê°œë…ì´ ë˜ì–´ë²„린다. ë¬¼ë¡ ì¤‘ì²© í´ëž˜ìФ ë‚´ë¶€ì—는 ì¼ë°˜ í´ëž˜ìŠ¤ì²˜ëŸ¼ í• ìˆ˜ 있다.(ìƒì„±ìž ìƒì„±, ì •ì˜ë¶€ê°€ 있는 메서드 ìƒì„± 등) * ì¸í„°íŽ˜ì´ìФì—는 ìƒì„±ìž ì¡°ì°¨ 없다. ì–´ë–¤ ì˜ë¯¸ë¡œëŠ” ì œí•œì ì¸ í´ëž˜ìФë¼ê³ ìƒê° í• ìˆ˜ë„ ìžˆë‹¤. * ì¶”ìƒ ë©”ì„œë“œë¥¼ í¬í•¨ í•˜ê³ ìžˆê³ ìƒì„±ìžë„ 없어 ê°ì²´ë¥¼ ë°œìƒ ì‹œí‚¬ 수 없다. * 필드 : ì¸í„°íŽ˜ì´ìФì—서 필드를 ì‚¬ìš©í•˜ë ¤ë©´ ì§ì ‘ ê°’ì„ í• ë‹¹í•˜ëŠ” ë°©ì‹ìœ¼ë¡œ 한다. {{{ interface A1{ int w = 10; static int x = 20; final int y = 30; public static final int z = 40; } public class Round14_Ex01 { public static void main(String[] ar){ //A1 ap = new A1(); //A1.w = 100; System.out.println("w = " + A1.w); System.out.println("x = " + A1.y); System.out.println("y = " + A1.x); System.out.println("z = " + A1.z); } } }}} * 메서드 : 무조건 public abstractì´ê¸° ë•Œë¬¸ì— ë¬´ì¡°ê±´ 하위 í´ëž˜ìŠ¤ì— ì˜í•´ 오버ë¼ì´ë”©ì´ ë˜ì–´ì•¼ 한다. * ê·¸ë¦¬ê³ public ì ‘ê·¼ìžê°€ ìƒëžµë˜ì–´ 있으므로 오버ë¼ì´ë”© 시ì—는 반드시 ì ‘ê·¼ìžë¥¼ public으로 해야 한다. {{{ interface A2{ void aaa(); public abstract void bbb(); } class B2 implements A2{ void aaa(){ System.out.println("aaa 메서드"); } public void bbb(){ System.out.println("bbb 메서드"); } } public class Round14_Ex02 { public static void main(String[] ar){ B2 bp = new B2(); bp.aaa(); bp.bbb(); } } }}} * ì •ì 중첩 í´ëž˜ìФ : ì¸í„°íŽ˜ì´ìŠ¤ì— ë§ˆì§€ë§‰ìœ¼ë¡œ ìžˆì„ ìˆ˜ 있는 멤버는 ì •ì 중첩 í´ëž˜ìŠ¤ì˜¤ ã…중첩 ì¸í„°íŽ˜ì´ìФì´ë‹¤. í´ëž˜ìŠ¤ê°€ 중첩 ë 경우 무조건 public, staticì´ê¸°ì— ì •ì 중첩 í´ëž˜ìŠ¤ê°€ ë˜ëŠ” 것ì´ë‹¤. * ë”°ë¼ì„œ 외부ì—서 ê·¸ í´ëž˜ìŠ¤ì— ëŒ€í•œ ê°ì²´ë¥¼ ë°œìƒì‹œí‚¬ 때ì—는 ì •ì 중첩 í´ëž˜ìФ ê°ì²´ ìƒì„± ë°©ì‹ì„ 따르게 ëœë‹¤. {{{ interface T3{ int x = 100; class B3{ private int y; public B3(){ this.y = 200; } public void disp(){ System.out.println("x = " + x);//A.x System.out.println("y = " + y);//this.y } } } public class Round14_Ex03 { public static void main(String[]ar){ T3.B3 bp = new T3.B3(); bp.disp(); } } }}} * int x ì—시 public static final ì´ê¸° ë•Œë¬¸ì— disp() 메서드ì—서 ì‚¬ìš©í• ìˆ˜ 있는 것ì´ë‹¤. || || abstract || ì¸í„°íŽ˜ì´ìФ || || 공통ì || 1. ë””ìžì¸ì˜ ê°œë…으로 ë‹¤í˜•ì„±ì„ í‘œí˜„í•˜ê¸°ì— ì•„ì£¼ ì 당한 형태ì´ë‹¤. || 2. ê°ì²´ë¥¼ ë°œìƒ ì‹œí‚¬ 수 없다.|| 3. ì¶”ìƒ ë©”ì„œë“œë¥¼ í¬í•¨í•˜ê³ ìžˆê³ , ê·¸ 메서드를 오버ë¼ì´ë”©ì„ 해야만 하위 í´ëž˜ìŠ¤ì˜ ê°ì²´ê°€ ë°œìƒí•œë‹¤.|| 4. í‘œí˜„ì˜ ë°©ì‹ì—서 íš¨ìœ¨ì„±ì„ ê³ ë ¤í•˜ì—¬ 다형ì ì¸ í‘œí˜„ì„ ì£¼ëª©ì 으로 한다.|| || ì°¨ì´ì || 알아서 잘 ìƒê°í•˜ì„¸ìš” || * 만약 단지 하위í´ëž˜ìŠ¤ë“¤ì„ í†µí•© 관리하기 위한 목ì ë§Œ ìžˆê³ ìƒìœ„ í´ëž˜ìŠ¤ë¡œì„œ 아무런 ì—í• ë„ í• í•„ìš” 없다면 abstract보다는 ì¸í„°íŽ˜ì´ìŠ¤ê°€ ë” íš¨ìœ¨ì ì´ë‹¤. == ë‹¤ìŒ ì§„í–‰ == == ê³¼ì œ == === ìœ ìž¬ë²” === {{{ }}} === ìµœë‹¤ì¸ === {{{ }}} === ì´ì§€ìˆ˜ === {{{ }}} === 김용준 === {{{ }}} === ê¹€ì •ë¯¼ === {{{ }}} == 후기 == ---- [한ìžê³µ/시즌3]