Day 10(8/12) Abstract, Interface

2016. 8. 16. 10:42Programming/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(300200600400);
     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