hyeonga_code
Java_53_추상화 본문
- 추상 메소드
- 메소드의 이름만 정의된 것입니다.
- 메소드의 내용은 정의되지 않았습니다.
- 객체를 생성할 수 없습니다.
- 선언부만 있고 구현부가 없습니다.
- 필요한 메소드이지만 하위 클래스마다 다르게 구현해야 하는 경우 사용합니다.
- 상속을 받은 경우 무조건 오버라이딩 해야 합니다.
- 추상클래스를 상속받는 하위 클래스에서 추상 메소드의 구현부를 완성해야 합니다.
도형{
그리다();
}
원 상속 도형{
그리다(){
동그랗게 그려요;
}
}
- 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();
}
}
}
|
'Java' 카테고리의 다른 글
Java_55_타입 추론, var (0) | 2023.10.16 |
---|---|
Java_54_Lambda_람다식 (0) | 2023.10.15 |
Java_52_extends, implements 의 차이 (0) | 2023.10.14 |
Java_51_인터페이스_다형성_다형성 멤버 필드 법칙, 업 캐스팅, 다운 캐스팅, 다형성 멤버 메소드 법칙 (0) | 2023.10.13 |
Java_50_인터페이스 (0) | 2023.10.13 |