ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Java - 캐스팅(Casting)
    Language/Java 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

    'Language > Java' 카테고리의 다른 글

    Java - 동일성(identity) & 동등성(equality)  (0) 2022.03.03
    Java - Call by Value & Call By Reference  (0) 2022.02.21
    Java - 문자열 클래스  (0) 2022.02.19
    Java - Boxing & Unboxing  (0) 2022.02.19
    Java - Primitive Type & Reference Type  (0) 2022.02.19

    댓글

Designed by Tistory.