카테고리 없음

자바_ 추상클래스 개념과 응용 (+다형성)

lsme 2022. 4. 14. 19:57

개념)

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
//추상클래스 
 
//1. 추상클래스는 객체로 생성할 수 없다. 
//2. 추상클래스의 기능은 추상클래스를 상속받은 자식클래스 객체를 생성하여 사용한다. 
//3. 추상클래스를 부모클래스로 정의할때는 자식 클래스에 반드시 존재해야하지만, 
//자식클래스에서 구현할 기능이 너무 다르기 때문에 
//부모 클래스에서 공통적인 기능을 정의할 수 없을 때 구현을 강요하기 위해서 사용됨.
abstract class AbstractClass{
    //일반변수
    int age; 
    
    //일반 메소드
    void generalMethod() {
        System.out.println("generalMethod");
    }
    //추상메서드
    //정의부만 있고, 구현부가 없음.
    //추상메소드에는 abstract 예약어가 지정되어야 한다. 
    //추상메소드가 하나라도 정의된 클래스는 추상클래스가 된다. 
    //(일반클래스가 될 수 없다. )
    
    abstract void abstractMethod();
}
 
class AbstractClassChild extends AbstractClass{
    
    @Override
    void abstractMethod() {
        // TODO Auto-generated method stub
        System.out.println("구현");
    }
}
 
public class AbstractTest1 {
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        //1.
        //AbstractClass abstractClass = new AbstractClass(); //에러남.
        
        //2. 
        AbstractClassChild abstractClassChild = new AbstractClassChild();
        abstractClassChild.abstractMethod();
    }
}
cs
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
//추상클래스의 상속
//특정 추상클래스를 상속한 추상클래스를 상속하는 클래스가 일반클래스가 되려면
//상속구조에 있는 모든 추상클래스에 정의된 추상메소드를 구현해야 한다.
 
abstract class AbstractClass1{
    abstract void abstractMethod1();
}
abstract class AbstractClass2 extends AbstractClass1{
    //당연히 상속 받았으니까, abstractMethod1()가 포함된것이다.
    abstract void abstractMethod2();
}
class GeneralClass extends AbstractClass2{
    @Override
    void abstractMethod1() {
        // TODO Auto-generated method stub    
    }
    @Override
    void abstractMethod2() {
        // TODO Auto-generated method stub    
    }
}
public class AbstractTest2 {
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
    }
}
cs

 

예제1)

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
//추상클래스도 다형성 제공.
abstract class Vehicle{ //운송수단
    abstract void transfer();
}
class Car extends Vehicle{
    @Override
    void transfer() {
        // TODO Auto-generated method stub
        //transfer 부모 속성을 Car에 맞게 구성하자. 
        System.out.println("차도로 나른다.");
    }
}
class Ship extends Vehicle{
    @Override
    void transfer() {
        // TODO Auto-generated method stub
        //transfer 부모 속성을 Ship에 맞게 구성하자. 
        System.out.println("수로로 나른다.");
    }
}
class Plane extends Vehicle{
    @Override
    void transfer() {
        // TODO Auto-generated method stub
        //transfer 부모 속성을 Plane에 맞게 구성하자. 
        System.out.println("하늘로 나른다.");
    }
}
 
class VehicleInfo { //운송수단의 정보를 제공하는 클래스
    void printTransferStyle(Vehicle vehicle) {
        vehicle.transfer(); //오버라이딩된 후속 메소드 //부모클래스
    }
}
 
public class AbstractTest3 {
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        VehicleInfo vehicleInfo = new VehicleInfo();
        vehicleInfo.printTransferStyle(new Car());
        vehicleInfo.printTransferStyle(new Ship());
        vehicleInfo.printTransferStyle(new Plane());
    }
    
}
 
cs

 


응용

<문제>

요구사항

첫번째 클래스, 추상클래스 : Ship_1
추상메소드 
int getPersonNumber() //배가 나를 수 있는 사람 수를 반환.
int getWeaponNumber() //배가 나를 수 있는 무기 수를 반환.
String getname() //배 이름 반환

구현 클래스(자식 클래스) 
Boat, Cruise

유틸클래스 : ShipUtil
메소드
public static void search(Ship s)

메인클래스 : ShipMain
출력결과 (search 2번 호출)
이름 : 영국보트
사람 수 : 90명
무기수 :  5정
이름: 미국전함
사람수: 200명
무기수 : 210정

 


<내가 한 것>

 

<출력결과값>  //유틸 클래스를 마음대로 만듬.

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
abstract class Ship_1{ //운송수단
    abstract int getPersonNumber();
    abstract int getWeaponNumber();
    abstract String getName();
}
class Boat extends Ship_1{
    @Override
    String getName() {
        // TODO Auto-generated method stub
        return "영국보트";
    }
    @Override
    int getPersonNumber() {
        // TODO Auto-generated method stub
        return 90;
    }
    @Override
    int getWeaponNumber() {
        // TODO Auto-generated method stub
        return 5;
    }
}
class Cruise extends Ship_1{
    @Override
    String getName() {
        // TODO Auto-generated method stub
        return "미국전함";
    }
    @Override
    int getPersonNumber() {
        // TODO Auto-generated method stub
        return 200;
    }
    @Override
    int getWeaponNumber() {
        // TODO Auto-generated method stub
        return 210;
    }
}
class ShipInfo{ 
    void printShipInfo(Ship_1 ship) {
        System.out.println("이름: " + ship.getName());
        System.out.println("사람수: " +ship.getPersonNumber()+"명");
        System.out.println("무기수: " + ship.getWeaponNumber() +"정");
    }
}
public class ShipMain {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        ShipInfo shipinfo = new ShipInfo();
        shipinfo.printShipInfo(new Boat());
        shipinfo.printShipInfo(new Cruise());
    }
}
cs