Language/Java

Java - 캐스팅(Casting)

임빈영 2022. 2. 19. 12:08

캐스팅(Cating)

캐스팅이란?

 - 자바에서 캐스팅은 타입을 변환하는 것이다.

 - 이때, 상속 관계에 있는 부모와 자식 클래스 간에는 서로 형 변환이 가능하다.

 

업 캐스팅
class Human {
}

class Student extends Human {
}

public class Main {
    public static void main(String[] args) {
        Student student = new Student();
        
        Human human = student;   // 자식 클래스인 student는 부모 클래스 타입으로 캐스팅됨
    }
}

 

 - 자식 클래스가 부모 클래스 타입으로 캐스팅되는 것을 말한다.

 

다운 캐스팅
class Human {
}

class Student extends Human {
}

public class Main {
    public static void main(String[] args) {
        Human human = new Human();
        
        Student student = (Student) human   // 부모 클래스인 human이 자식 클래스 타입으로 캐스팅됨
    }
}

 - 부모 클래스가 자식 클래스 타입으로 캐스팅되는 것을 말한다.

 -  위 코드는 오류가 나며, 실제로 다운 캐스팅이 수행되기 위해서는 업 캐스팅이 선행되어야 한다.


업 캐스팅

업 캐스팅이란?

 - 자바에서 서브 클래스는 슈퍼 클래스의 모든 속성을 상속받는다. 그렇기 때문에, 서브 클래스는 슈퍼 클래스로 취급될 수 있다.

 - 여기서 업 캐스팅이란 서브 클래스의 객체가 슈퍼 클래스 타입으로 형 변환되는 것을 말한다.

 - 즉, 슈퍼 클래스의 참조 변수가 서브 클래스로 객체화된 인스턴스를 가리킬 수 있게 된다는 의미이다.

 

class person {
    String name;
    
    public Person(String name) {
        this.name = name;
    }
}

class Student extends Person {
    String age;
    
    public Student(String name) {
        super(name);
    }
}

public class Main {
    public static void main(String[] args) {
        Student student = new Student("홍길동");   // student 참조변수를 이용하면 age, name 속성에 접근이 가능하다.
        
        Person person = student;   // 업 캐스팅 (person 참조변수를 이용하면 name 속성에만 접근이 가능하다.)
        
        person.name = "이순신";
        person.age = "20";   // 컴파일 오류

 - 위 코드에서 person 참조 변수는 Student 객체는 가리킨다.

 - 이때, person 참조 변수는 Person 타입이므로, 자신의 클래스에 속한 멤버에만 접근이 가능하다.

 - 이와 같이 업 캐스팅을 하게 되면, Student 객체의 멤버 필드뿐만 아니라 메서드에도 접근이 불가능하게 된다.

 - 서브 클래스인 Student는 Person 타입을 상속받았기 때문에 명시적인 타입 캐스팅을 선언하지 않아도 된다.

 

업 캐스팅을 하는 이유 - 다형성
class 음식 {
    public void 간맞추기() {
    
    }
}

class 라면 extends 음식 {
    @Override
    public void 간맞추기() {
        System.out.println("라면 간 맞추기");
    }
}

class 볶음밥 extends 음식 {
    @Override
    public void 간맞추기() {
        System.out.println("볶음밥 간 맞추기");
    }
}

class 피자 extends 음식 {
    @Override
    public void 간맞추기() {
        System.out.println("피자 간 맞추기");
    }
}

class 사람 {
    public void 음식먹기(음식 어떤음식) {
        어떤음식.간맞추기();
    }
}

public class CastingTest {
    public static void main(String[] args) {
        사람 사람01 = new 사람();
        음식 음식01 = new 라면();   // 업 캐스팅
        
        사람01.음식먹기(음식01);   // "라면 간 맞추기" 출력
    }
}

 - 위 코드에서, 사람 클래스의 참조 변수인 "사람01"이 "음식먹기" 메서드를 실행시키면 "라면 간 맞추기"가 출력된다.

 - 이처럼 업 캐스팅을 통해 "사람01" 변수는 어떠한 음식 객체를 받든 지 간에 오버 라이딩된 메서드를 호출할 수 있다.

 - 슈퍼 클래스(음식)가 여러 서브 클래스(라면, 볶음밥, 피자)의 메서드를 호출하는 것과 같이 다형성의 장점을 위해 업 캐스팅이 사용된다.


다운 캐스팅

다운 캐스팅이란?
Person person = new Student();   // 업 캐스팅

Student student = (Student) person;   // 다운 캐스팅

 - 다운 캐스팅은 자신의 고유한 특성을 잃은 서브 클래스의 객체를 복구시키는 것이다.

 - 업 캐스팅과 다른 점은 명시적으로 타입을 지정해주어야 하며, 업 캐스팅이 선행된 후 진행되어야 한다.

 

class Person {
    String name;
    
    public Person(String name) {
        this.name = name;
    }
}

class Student extends Person {
    String age;
    
    public Student(String name) {
        super(name)
    }
}

public class Main {
    public static void main(String[] args) {
        Person person = new Student("홍길동");   // 업 캐스팅
        
        Student student = (Student) person;   // 다운 캐스팅
        
        student.name = "임꺽정";   // name 속성에 접근
        
        student.age = "27";   // age 속성에 접근
    }
}

 - 위 코드와 같이 다운 캐스팅을 진행한 후, 서브 클래스의 속성에 접근이 가능하다.


출처

https://velog.io/@sezzzini/Java-Casting

 

728x90