hyeonga_code

Java_53_추상화 본문

Java

Java_53_추상화

hyeonga 2023. 10. 15. 05:59
반응형


 - 추상 메소드 
    - 메소드의 이름만 정의된 것입니다.
    - 메소드의 내용은 정의되지 않았습니다.
    - 객체를 생성할 수 없습니다.
    - 선언부만 있고 구현부가 없습니다.
    - 필요한 메소드이지만 하위 클래스마다 다르게 구현해야 하는 경우 사용합니다.
    - 상속을 받은 경우 무조건 오버라이딩 해야 합니다.
    - 추상클래스를 상속받는 하위 클래스에서 추상 메소드의 구현부를 완성해야 합니다.
        도형{
            그리다();    
        }

        원 상속 도형{
            그리다(){
             동그랗게 그려요;
            }
        }

 - Abstract_추상 클래스
    - 추상 메소를 한 개 이상 가지고 있는 클래스입니다.
    - 일반 메소드를 가질 수 있습니다.
    - 다른 클래스를 작성하는 데에 도움을 주는 역할입니다.
    - 반드시 추상 클래스임을 명시해야 합니다.
    - 일반 메소드가 추상 메소드를 호출할 수 있습니다.
        - 선언부가 필요합니다.
    - 객체를 직접 생성할 수 없습니다.
    - 객체를 생성하는 방법
        1) 익명 중첩 클래스로 생성합니다.
        2) 업 캐스팅 하여 생성합니다.

    package '패키지 이름';
    public abstract class '클래스 이름' {
    }


'oop.abstract_ex' 패키지 생성
'RunningRace.java' 클래스 생성
    - Modifiers : Abstract  > finish
=====

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
package oop.abstract_ex;
 
// 추상 클래스
public abstract class RunningRace {
    /*
        - 추상 클래스
             - 추상 메소드를 가질 수 있습니다.
             - 인스턴스를 생성할 수 없습니다.
     */
    
    private void ready() {
        // 자기 자신이 관리하기 위해 private으로 작성합니다.
        System.out.println("Ready.");
    }
    
    // 추상 메소드
    protected abstract void run();    // 외부에서 접근할 수 없습니다.
 
    private void finish() {
        System.out.println("Finish.");
    }
    
    // 템플릿 메소드 패턴_template method pattern
    public void race() {
        ready();
        run();
        finish();
        // 사용자는 run() 메소드를 정의하고 race() 메소드를 호출하면 사용할 수 있습니다.
    }
}




 - 'Run100.java' 클래스 생성
    - Superclass : oop.abstract_ex.RunningRace
=====

1
2
3
4
5
6
7
8
9
10
package oop.abstract_ex;
 
public class Run100 extends RunningRace {
 
    // 추상 메소드를 구현합니다.
    @Override
    protected void run() {
        System.out.println("Running 100m");
    }
}



 - 'RunHuddle.java' 클래스 생성
    - Superclass : oop.abstract_ex.RunningRace
=====

1
2
3
4
5
6
7
8
9
10
package oop.abstract_ex;
 
public class RunHuddle extends RunningRace {
 
    // 추상 메소드를 구현합니다.
    @Override
    protected void run() {
        System.out.println("Running Huddle");
    }
}



- 'Race.java' 클래스 생성
=====

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package oop.abstract_ex;
 
public class Race {
 
    public static void main(String[] args) {
        
        // 기본 생성자 생성
        RunningRace race1 = new Run100();
        race1.race();        // 메소드를 호출합니다.
            /*
                Ready.
                Running 100m
                Finish.
             */
        RunningRace race2 = new RunHuddle();
        race2 .race();        // 메소드를 호출합니다.
            /*
                Ready.
                Running Huddle
                Finish.
             */
    }
}



 - 메소드 하나를 선언하기 위해 클래스 하나를 선언하고 있습니다.
    - 인터페이스를 양산하는 과정에서 절차가 너무 많으므로 메소드만 바로 생성할 수 있게 합니다.

=====

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
import java.util.Scanner;
 
abstract class Animal{
    // 추상 메소드를 하나라도 가지고 있다면 추상 클래스가 된다.
    public abstract void run();
    // 추상 메소드는 내용이 없고 이름만 존재
    public void move() {
        System.out.println("Move function");
    }
}
 
class Rabbit extends Animal{
    public void run() {
        System.out.println("Rabbit run");
    }
    public void move() {
        System.out.println("Rabbit Move");
    }
}
 
class Dog extends Animal{
    public void run() {
        System.out.println("Dog run");
    }
    public void move() {
        System.out.println("Dog Move");
    }
}
public class same {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        
        Animal ani;
        System.out.print("1.Rabbit 2.Dog : ");
        int select1 = in.nextInt();
        System.out.print("1.Run 2.Move : ");
        int select2 = in.nextInt();
        
        if (select1 == 1 ) {
            ani = new Rabbit();
        }else {
            ani = new Dog();
        }
        if (select2 == 1) {
            ani.run();
        }else {
            ani.move();
        }
    }
}
반응형