클래스 형변환
자식을 부모에 대입하는 건 안전하지만
부모를 자식에 대입하는 건 되는 경우, 안되는 경우도 있지만 일단 컴파일에서 막아버린다.
자식을 부모에게 대입하는건 암시적 형변환이다.
cat cat1 = new cat(“Rubi”, 2, “female”);
animal animal = cat1;
위와 같이 작성 해도 컴파일러가 animal animal = (animal)cat1; 로 작성한 것처럼 해준다.
반대로 부모를 자식에게 대입하려면 명시적 형변환을 해야한다.
cat cat1 = new cat(“Rubi”, 2, “female”);
animal animal = cat1;
cat cat2 = (cat)animal;
이때 cat cat2 = (cat)dog; 같은 코드는
상속 관계가 아니기에 형변환을 허용하지 않는다.
부모, 자식 관계는 가능하지만 형제 관계는 가능하지 않다.
instanceof
객체가 특정 클래스의 인스턴스인지 판단하는 연산자가 instanceof 연산자 이다.
클래스간 형변환이 가능한지 여부를 확인할 수 있으며, ture / false로 결과값이 나온다.
사용방법은 : 변수명 instanceof 클래스명
public class Main {
public static void main(String[] args) {
dog dog1 = new dog("B",4,"male");
cat cat1 = new cat("A",3,"female");
System.out.println( dog1 instanceof animal ); //true
System.out.println( cat1 instanceof animal ); //true
System.out.println( cat1 instanceof Object ); //true
}
}
class animal{
( . . . )
}
}
class dog extends animal{
( . . . )
}
}
class cat extends animal{
( . . . )
}
}
animal의 자식 클래스로 생성된 인스턴스인 dog1, cat1라 부모클래스인 animal로 형변환이 가능하기에 true로 출력
.getClass()
변수명.getClass()
instanceof 연산자와 비슷한 기능을 가진 메서드이다.
실행 중에 객체의 클래스 정보를 얻어올 수 있으며, 주로 클래스의 이름을 찾을 때 사용한다.
.getClass().getName()
변수명.getClass().getName()
클래스명을 반환해준다. 이때 클래스명은 패키지 경로까지 포함한다.
주로 로그(log) 메시지를 출력할 때 사용한다.
Object 클래스
모든 클래스의 부모로는 Object 클래스가 있다.
부모가 없는 클래스는 자동으로 Object 클래스를 상속받게 된다.
Object 클래스를 상속받으니 Object의 메서드들도 같이 딸려와 사용할 수 있다.
그 이유로 인해 Object 클래스의 메서드인 getClass(), getName() 같은 메서드들을 사용할 수 있는 것이다.
이렇게 클래스를 재사용하면 설계와 코딩 시간을 절약할 수 있는 장점이 있지만,
프로그램이 미래에 어떻게 변할지 완전히 예측이 불가하기에
재사용성만 보다가 잘못된 클래스를 사용할 수도 있는 단점이 있다.