정보처리기사에 실기 시험에 나왔던 자바 추상 클래스 예제를 약간 바꿨다.
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();