Day 10(8/12) Abstract, Interface
2016. 8. 16. 10:42ㆍProgramming/Java
**오늘 배운 내용**
1) Abstract 클래스
2) Interface
//생성자를 가진다 => class가 가지는 속성을 다 가진다.
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 | abstract class A{ A(){} abstract public void a();//{} => body, abstract는 body 못 가짐 public void b(){} //추상클래스 is class with abstract method //abstract: 구현 강제 명령 //추상 클래스와 인터페이스 차이: 추상 클래스는 인터페이스와 달리 "구현"을 가질 수 있다. 하지만 인스턴스를 가질 수는 없다. class B extends A{ //The type B must implement the inherited abstract method A.a() //(해석) 상속 받은 추상 메소드 A.a()을 구현(implement)하라. public void a(){} //implement == 구현: {} body를 작성하라, 살을 붙여라 //인터페이스는 {}가 없으므로 다른 클래스가 구현해야함 //인터페이스는 다중 상속이 가능(=여러 설계도) //class B implements A{}로 정하면 (A는 인터페이스) //A a = new B();로 구현 가능 } public class L01Abstract { //추상 클래스 사용 이유? 캡슐화를 위해 public static void main(String[] args) { B b = new B(); b.a(); //부모의 메소드 사용 가능 }; //익명 클래스의 body end }//main }//class | cs |
/* 클래스가 객체로 생성되려면
* 1. 모든 메소드가 body 가지고 있어야
* 2. 추상 메소드는 객체 생성시 익명클래스로 바디를 구현해 주면 된다.
* 3. 생성자가 존재해야 > 프로그래머가 생성자 작성 X면, 컴파일시 default 생성자가 자동 작성
*/
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 32 33 34 35 36 37 38 39 40 41 | import java.awt.Frame; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.awt.event.WindowListener; class FrameDemo extends Frame{ public FrameDemo(){ super("익명클래스 수업"); this.setBounds(300, 200, 600, 400); this.setVisible(true); //Listener class > event가 발생하는 대기 타면서 기다리는 클래스 super.addWindowListener(new WindowAdapter(){ //this와 super 동일, (WindowAdapter~:익명 객체) 대신 EventHandler 사용해도 됨) @Override public void windowClosing(WindowEvent e) { e.getWindow().setVisible(false); //화면을 끈다. e.getWindow().dispose(); //메모리를 제거 -> 자동 종료됨 System.exit(0); //프로그램 강제 종료 } }); }//생성자 end }//class end class EventHandler implements WindowListener{ public void windowOpened(WindowEvent e) {} public void windowClosing(WindowEvent e) {} public void windowClosed(WindowEvent e) {} public void windowIconified(WindowEvent e) {} public void windowDeiconified(WindowEvent e) {} public void windowActivated(WindowEvent e) {} public void windowDeactivated(WindowEvent e) {} } public class L02AnonymousClass { public static void main(String[] args) { new FrameDemo(); } } | cs |
//익명 클래스: 클래스 명이 없는 클래스, 클래스 선언과 객체 생성을 동시에
//ex. new 클래스명(){오버라이드로 1회용 메소드 구현}
//1회용이기 때문에 생성자도 없고, 1번만 상속에, 하나의 인터페이스만 구현 가능
//Adapter 추상클래스는 interface로 익명클래스 작성시 작성하지 않을 메소드들을 구현하는
//번거로운 일을 막기 위해 보조해주는 보조 클래스다.
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | interface I{ abstract void a(); void b();//b() 앞에 abstract가 생략돼 있음 -> interface의 모든 메소드는 추상 메소드다:내용 없이 구현 강요 }//I end interface I2{ //interface는 뼈대일 뿐, 구현은 밑의 놈 시킴(설문조사 비유) void c(); void d(); }//I2 end interface I3{ void a(); void c(); }//I3 end class A implements I, I2{ @Override public void a() {System.out.println("I.a() 호출");} @Override public void b() {System.out.println("I.b() 호출");} @Override public void c() {System.out.println("I.c() 호출");} @Override public void d() {System.out.println("I.d() 호출");} } class B implements I,I2,I3{ @Override public void a() {System.out.println("I.a() 호출");} //I3.a()는 I.a()와 같기 때문에 둘 중 하나만 구현되도 됨 @Override public void b() {System.out.println("I.b() 호출");} @Override public void c() {System.out.println("I.c() 호출");} @Override public void d() {System.out.println("I.d() 호출");} } public class L01Interface { public static void main(String[] args) { //객체 new A()로 함수 a() b() 호출하는 용도로 사용할 것이다. //이 때 객체 new A()의 데이터 타입으로 사용될 인터페이스는? I. a(), b() 포함하므로 I calla = new A(); //인터페이스 변수 = new 객체(); calla.a(); //A 객체의 a() 호출 calla.b(); }//main }//class | cs |
'Programming > Java' 카테고리의 다른 글
Day 12(8/16) Equals (0) | 2016.08.23 |
---|---|
Day 11(8/15) Object, hashCode (0) | 2016.08.23 |
Day 9(8/11) extends, @Override, frame (0) | 2016.08.16 |
Day 8(8/10) Review (Constructor, Instance) (0) | 2016.08.16 |
Day 7(8/9) MainMethod (0) | 2016.08.09 |