반응형

추상 클래스(Abstract Class)


1. 클래스를 정의할 때 이 클래스는 어떻게 구현되어야 하는가에 대한 정의이다.

2. 이 추상 클래스는 일반 메소드 및 추상 메소드를 포함한다.

3. 추상 클래스는 인스턴스화 될 수 없고, 
인스턴스를 만들고 싶다면 해당 클래스를 상속받는 서브 클래스를 만들어 인스턴스화 해야 한다.

즉, 추상 클래스 AA가 있는데 AA abc = new AA();로 객체를 생성(인스턴스화)할 수 없고,

또다른 클래스 BB를 만들어 이 BB클래스가 AA클래스를 상속받도록하여 AA 추상 메소드를 작성하여

BB abc = new BB();로 선언해야 한다. 





추상 클래스(Abstract Class) 생성 방식

추상 클래스를 생성하는 방식은 다음과 같다.

abstract class 클래스명{ ~ }

이때, 클래스 내부에는 일반 변수, 메소드, 추상 메소드가 들어 갈 수 있다.

이후 '어떤 클래스'가 추상 클래스를 상속하게 된다면, 

그 '어떤 클래스'는 반드시 추상 메소드의 속을 채워 넣어야한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
abstract class animal{
    
    public int leg;
 
    public void run()
    {
        System.out.println("달린다");
    }
    
    abstract public void eat();
}
 
//                                                       This source code Copyright belongs to Crocus
//                                                        If you want to see more? click here >>
Crocus




< 서브 클래스에서 추상 메소드를 상속할 때 >


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
package JavaBasic;
 
abstract class animal{
    
    public int leg;
 
    public void run()
    {
        System.out.println("달린다");
    }
    
    abstract public void eat();
}
 
class dog extends animal{
    
    public void eat()
    {
        System.out.println("추상 메소드의 속을 채우자 :: 냠냠냠");        
    }
    
}
public class Jmain{    
            
    public static void main(String []args)
    {
        dog dg = new dog();
        
        dg.eat();
        dg.leg = 4;
        dg.run();
        System.out.println("강아지의 다리 수 :: " + dg.leg);
    }
}
//                                                       This source code Copyright belongs to Crocus
//                                                        If you want to see more? click here >>
Crocus




< dog 클래스에 추상 메소드인 eat 메소드를 지운다면 >




위의 오류에서 해결책으로 나온 의미는


아직 만들어지지 않은 메소드가 있는것 같은데?? 추상 클래스를 상속 받았으면 eat() 메소드를 만들어야 되지 않을까?


라고 하는 것이다.





인터페이스(Interface)


추상 클래스와의 공통점

1. 이 클래스는 어떻게 무엇을 구현해야 하는가에 대한 이정표를 알려준다.

2. 직접 인스턴스를 생성할 수 없다.( new를 통한 객체 생성 불가 )
인스턴스를 만들고 싶다면 해당 클래스를 상속받는 서브 클래스를 만들어 인스턴스화 해야 한다.

3. 필드, 추상 메소드를 가질 수 있다.


추상 클래스와의 차이점

1. 추상 클래스와 달리 일반 메소드, 생성자를 가질 수 없다.

2. 필드도 만들기 위해서는 static final을 붙인 상수화한 필드만 사용할 수 있고, 반드시 초기화 해야한다.

3. 일반 메소드가 없다는 의미는 즉, 서브 클래스에서 인터페이스내에 있던 메소드는 모두 구현해야 한다.


4. 인터페이스는 다중 상속이 가능하다. (추상 클래스 및 일반 클래스는 단일 상속만 허용)






인터페이스(Interface) 생성 방식

인터페이스를 생성하는 방식은 다음과 같다.

interface 인터페이스명{ ~ }

1
2
3
4
5
6
7
8
9
10
11
interface animal1{
 
    final static int leg = 4;
    
    public void eat();
    
    abstract void shout();
}
 
//                                                       This source code Copyright belongs to Crocus
//                                                        If you want to see more? click here >>
Crcous

이때, 클래스 내부에는 일반 변수, 일반 메소드, 추상 메소드가 들어 갈 수 있다.

일반 메소드, 추상 메소드는 같은 역할을 하며, 서브 클래스에서 모두 작성해 주어야한다.

그리고 필드(일반 변수)는 반드시 초기화를 해주어야 한다.

이후 '어떤 클래스'가 추상 클래스를 상속하게 된다면, 

그 '어떤 클래스'는 반드시 추상 메소드의 속을 채워 넣어야한다.



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
package JavaBasic;
 
interface animal1{
 
    final static int leg = 4;
    
    public void eat();
    
    abstract void shout();
}
 
interface animal2{
 
    final static int eye = 2;
    
    public void sleep();
    
}
 
class dog implements animal1,animal2{
    
    public void eat()
    {
        System.out.println("animal1 에 있던 메소드 :: 냠냠냠");
    }
    
    public void shout()
    {
        System.out.println("animal1 에 있던 메소드 :: 왈왈왈");
    }
    
    public void sleep()
    {
        System.out.println("animal2 에 있던 메소드 :: 쿨쿨쿨");
    }
}
public class Jmain{    
            
    public static void main(String []args)
    {
        dog dg = new dog();
        
        dg.eat();
        dg.shout();
        dg.sleep();
        
        System.out.println("강아지의 다리 수 :: " + dg.leg);
    }
}
 
//                                                       This source code Copyright belongs to Crocus
//                                                        If you want to see more? click here >>
Crocus



위의 코드에서 확인할 수 있는 내용


1. dog가 implements를 통해 2개를 상속(다중 상속)받고있다.


2. 인터페이스에 있던 모든 메소드를 dog 클래스에서 작성해주었다.


3. final static int leg = 4로 초기화 되어있고 final이기에 수정 할 수 없을 것이다.






※ final static int eye를 2에서 1로 수정해볼 수 있을까?



해석 :: final 필드이기에 절대 수정안됩니다.





※ 인터페이스에 있는 메소드를 dog 클래스에서 하나 빼면 어떻게 될까?



해석 :: 너 eat이랑 shout 메소드는 잘 넣었는데 sleep 메소드가 빠진것 같아 sleep 메소드를 만들어야 되지 않을까?







반응형

'Basic > Java' 카테고리의 다른 글

Java에서의 정렬 방법  (0) 2019.01.07
Java BigInteger - 큰 수 다루기  (0) 2017.02.27
자바 클래스 상속(Java Class Inheritance)  (0) 2016.12.01
Java Thread 기초 예제 코드  (0) 2016.12.01
Math 클래스 개념 및 예제 코드  (0) 2016.11.30