본문 바로가기

(Before)BitSchool

2014/05/13 Java - Abstract추상클래스, interface 인터페이스, final, 예외처리, try, catch, throws

반응형


예) 스타크래프트의 질럿, 드라군 등등.. 이것을 유닛이라고 부르지만 유닛이라는 이름을 가진 유닛은 없다.     동물원에 동물이라는 이름을 가진 동물이 없는 것과 같다.

자식들의 공통 속성과 기능을 갖게 용도로만 쓰이고 인스턴스화가 될수 없다.


추상클래스

1
2
3
4
5
6
7
8
9
 
public class Horse extends Animal {
    // 추상클래스를 상속하려면 추상메서드를 무조건 정의해야한다.
    public void eating() {
        // TODO Auto-generated method stub
        System.out.println("채식을 좋아합니다.");
    }
}
 


1
2
3
4
5
6
7
8
9
 
public class Lion extends Animal{
 
    public void eating() {
        // TODO Auto-generated method stub
        System.out.println("육식을 좋아합니다.");
    }
}
 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 동물 클래스 ==> 상속만을 위한 부모
abstract public class Animal {
    // 클래스에서 1개이상의 추상메서드(가상메서드)가 있다면 추상클래스로 정의해야한다.
    
    // 추상클래스
    //--> 실제 프로그램에 등장하지 않지만-->실체화-->객체화 될수 없지만...
    //--> 자식에 상속만을 위해 만들어지는 클래스.
    private int age;
    private int size;
    
    //추상메서드 : 실제로 직접 행위를 하지는 않는다. 가상메서드
    //자식에서 재정의 되어야하는 메서드
    abstract public void eating();  // 실제 먹는 행위는 못한다.
    
}
 


추상클래스는 일반메소드도 존재 할 수 있다.

추상클래스의 제약을 더욱 확대 시켜 오직 추상메서드만 존재하는 interface라는 새로운 형태의 클래스를 java에서 제공한다.



인터페이스

interface용도 : 기능의 통일을 위한 용도, 다중상속의 보완으로 사용되는 용도


interface

-> 공통점 --> 접점 --> 약속

-> 외장하드의 인터페이스가 무엇이냐 --> 컴퓨터<==USB==>외장하드


1
2
3
4
5
6
7
8
9
 
 public abstract class Phone {
    private String no;
    
    abstract public void Send();
    abstract public void Call();
    abstract public void End();
}
 


1
2
3
4
5
6
//기계 인터페이스
public interface IMachine {
    public abstract void On();
    void Off();  // 인터페이스에서 abstract를 생략해도된다.
}
 

1
2
3
4
5
6
7
 
public interface ICamera extends IMachine {
    void Shot();
    void Save();
    void PreView();
}
 

1
2
3
4
5
6
7
8
 
public interface Mp3 extends IMachine {
    void Play();
    void Pause();
    void Stop();
    
}
 

1
2
3
4
5
 
public interface IupVersion {
    void Up();
}
 


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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
//is-a 관계 상속
public class SmartPhone extends Phone implements  ICamera,Mp3,IupVersion{
 
    /*스마트폰의 나머지 기능들은 어떻게 구현할까?
    1. 포함관계를 통해
    2. 인터페이스를 통한 인터페이스 상속
    */
    
    // implements는 다중구현이 가능하다.
    public void Send() {
        // TODO Auto-generated method stub
        
    }
 
    public void Call() {
        // TODO Auto-generated method stub
 
    }
 
    public void End() {
        // TODO Auto-generated method stub
 
    }
 
    public void On() {
        // TODO Auto-generated method stub
        
    }
 
    public void Off() {
        // TODO Auto-generated method stub
        
    }
 
    public void Shot() {
        // TODO Auto-generated method stub
        
    }
 
    public void Save() {
        // TODO Auto-generated method stub
        
    }
 
    public void PreView() {
        // TODO Auto-generated method stub
        
    }
 
    public void Play() {
        // TODO Auto-generated method stub
        
    }
 
    public void Pause() {
        // TODO Auto-generated method stub
        
    }
 
    public void Stop() {
        // TODO Auto-generated method stub
        
    }
 
    public void Up() {
        // TODO Auto-generated method stub
        this.ver++;
    }
 
}
 

1
2
3
4
5
6
7
8
9
10
11
 
public class base {
    public static void main(String[] args) {
        Mp3 g3 = new SmartPhone();
        g3.Play();  // mp3기능만 쓸수있다.
        
        SmartPhone g2 = new SmartPhone();
        g2.Up();
// main에서 건드리지않고 version을 바꿀수 있다. 
    }
}
 


예) 스타크래프트
1
2
3
4
5
6
 
public interface IClocking {
    void Clocking();
    void UnClocking();
}
 

1
2
3
4
5
6
7
8
 
public abstract class UNIT {
    private int hp;
    
    public abstract void Move();
    public abstract void Die();
}
 

1
2
3
4
5
6
7
8
9
10
11
12
 
public abstract class MagicUnit extends UNIT {
 
    protected int mana;
    
    public void InCreaseMana(){
        //마나가 일정시간되면 증가하는 코드
        this.mana++;
    }
    public abstract void UseMagic();
}
 

1
2
3
4
5
 
public interface IFusion {
    void Fusion();
}
 

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
 
public class Templer extends MagicUnit implements IFusion{
 
    public void UseMagic() {
        // TODO Auto-generated method stub
        // 스톰사용코드
        this.mana-=75;
 
    }
 
    public void Move() {
        // TODO Auto-generated method stub
 
    }
 
    public void Die() {
        // TODO Auto-generated method stub
 
    }
 
    public void Fusion() {
        // TODO Auto-generated method stub
        
    }
 
}
 



final

final class : 상속을 금지하는 클래스

final method : 재정의를 금지하는 메소드(오버라이딩금지)

final variable : 변경할 수 없는 변수(상수)

final메서드와 abstract메서드는 반대 개념의 메서드이다.

1
2
3
4
5
6
public class Person {
    private final String LastName="홍길동";
    
    public final void Study(){}
    
}


예외(Exception)

* 오류의 종류  

문법오류 : 오타와 같은 자바구문에 어긋난 코드때문에 발생하고, 컴파일할 때 발생하는 오류 

실행오류 : 프로그램 실행 할 때 발생하는 오류

 치명적인 오류 : 메모리가 부족하거나 JVM자체에 발생하는 오류들

 경미한 오류 : 코딩의 실수 들중 하나

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
public class base {
    public static void main(String[] args) {
        
        try{  // 시도 --> 실제 로직이 실행되어야하는 구문
            int Result = 3/0;
        }catch(ArithmeticException e1){
            System.out.println("e.getMessage()");
        }catch(Exception e2){// 가상머신으로부터 날라온 예외를 잡는다. 
        
            System.out.println(e2.getMessage());
            
            if(e2 instanceof ArithmeticException){
                System.out.println("에러");
            }
        }     
    }
}


finally : 연관된 블럭이 어떠한 이유로 실행이 끝나더라도 반드시 실행된다. 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class base {
    public static void main(String[] args) {
        
        try{  // 시도 --> 실제 로직이 실행되어야하는 구문
            String str="";
            
            System.out.println(str);
            
        }catch(ArithmeticException e1){
            System.out.println("e.getMessage()");
        }catch(NullPointerException e2){// 가상머신으로부터 날라온 예외를 잡는다. 
        
            System.out.println("nullpointException");
        }finally{
            System.out.println("finally");
        }
    }
}



예외발생시키기 throws절 선언

메서드 내에서 발생할 수 있는 예외 중 '처리해야 하는 예외'를 처리 하지 않을 경우에는 throw절에서 선언해야 한다. 호출한 곳으로 예외 처리를 떠 넘기는 효과를 갖는다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 
public class base {
    
    public static void foo() throws ArithmeticException{// 호출한곳으로 던진다.
        int x = 10;
        x/=0;
    }
    public static void main(String[] args) {
        try{  // 시도 --> 실제 로직이 실행되어야하는 구문
            foo();
            // static메서드는 this를 못받기 때문에 호출할 함수도 static메서드여야 한다.
        }catch(ArithmeticException e1){
            System.out.println("e.getMessage()");
        }catch(NullPointerException e2){// 가상머신으로부터 날라온 예외를 잡는다. 
        
            System.out.println("nullpointException");
        }finally{
            System.out.println("finally");
        }
    }
}
 


반응형