언어 Language/자바 Java

자바 추상 클래스 abstract Class 예제

Tap to restart 2021. 4. 17. 17:00

정보처리기사에 실기 시험에 나왔던 자바 추상 클래스 예제를 약간 바꿨다.

 

abstract class Vehicle{
    String name;
    
    # 1번
    public String getName(){
        return "Vehicle name:" + name;
    }
}

class Car extends Vehicle{
    public Car(String val){
        name = val;
    }
    
    # 2번
    public String getName(String val){
        return "Car name:" + val;
    }
}

class Main {
    public static void main(String[] args) {
        Vehicle vehicle = new Car("IONIQ5");
        System.out.println(vehicle.getName());
        
        Car kiaCar = new Car("EV6");
        System.out.println(kiaCar.getName("GENESIS"));
    }
}

출력 결과

Vehicle name:IONIQ5
Car name:GENESIS

 

1번 메소드와 2번 메소드는 서로 다른 메소드다.

이름이 같지만 1번 메소드는 파라미터가 없고, 2번 메소드는 파라미터가 있다.

그래서 실행 결과가 위처럼 나오는 것이다.

 

Car name:GENESIS라고 나온 것을 통해서 2번 메소드가 실행된 것을 확인할 수 있다.

 

만약 아래 코드를 추가해서 실행한다면 어떻게 될까?

        Vehicle genesis = new Car("GENESIS");
        System.out.println(genesis.getName("GV90"));

 

에러가 발생한다. Vehicle 클래스는 getName(String val) 메소드가 없기 때문이다.

 

만약 추상 클래스 Vehicle에 getName(String val)을 추가한다면 어떻게 될까?

abstract class Vehicle{
    String name;
    
    public String getName(){
        return "Vehicle name:" + name;
    }
    
    public String getName(String val){
        return "Vehicle:" + val;
    }
}

class Car extends Vehicle{
    public Car(String val){
        name = val;
    }
    
    public String getName(String val){
        return "Car name:" + val;
    }
}

class Main {
    public static void main(String[] args) {
        Vehicle vehicle = new Car("IONIQ5");
        System.out.println(vehicle.getName());
        
        Car kiaCar = new Car("EV6");
        System.out.println(kiaCar.getName("GENESIS"));
        
        
        Vehicle genesis = new Car("GENESIS");
        System.out.println(genesis.getName("GV90"));
    }
}

작동할까? 작동하지 않을까?

작동한다면?

Vehicle:GV90이라고 나올까? 아니면 Car name:GV90이라고 나올까?

 

출력 결과는 다음과 같다.

Vehicle name:IONIQ5
Car name:GENESIS
Car name:GV90

 

Vehicle:GV90이라고 나올 거 같지만, Car name:GV90이 나온다.

 

System.out.println(genesis);

을 실행해 보면

Car@1be6f5c3

이런 식으로 Car Class를 바탕으로 객체를 만들었고, 해당 메소드를 override 뒤엎었으므로 Car name:GV90이라고 나오게 된다.

 

추상 클래스 자체로 객체로 만드는 것이 가능할까?

안 된다. 추상 클래스라서 에러가 난다. 추상 클래스는 객체로 만들 수 없다. 추상 클래스는 반드시 상속받아서 써야 한다.

Vehicle gm = new Vehicle();

에러 코드

error: Vehicle is abstract; cannot be instantiated
        Vehicle gm = new Vehicle();