하루하루 살아남기

[Java / 자바 ] 클래스 형변환 본문

개발/Java

[Java / 자바 ] 클래스 형변환

막막이 2021. 3. 27. 04:16
반응형

클래스 형변환

 

 	Animal animal = new Dog();

 

위 코드는 Animal 클래스를 가르킨다고 했지만 Dog클래스를 만들었습니다. 

하지만 컴파일러는 아무런 오류도 발생시키지 않습니다.

묵시적 형변환이 일어난 경우입니다.

 

형변환은 두가지 경우가 있습니다.

 

1. 묵시적(암묵적) 형변환

2. 명시적 형변환

 

묵시적 형변환

더 큰 그릇에 작은 그릇의 값을 담는 경우입니다. 작은 그릇에서 큰 그릇으로 옮기는 것이므로 컴파일러는 문제를 발생시키지 않고 형을 바꿔줍니다. 

 

명시적 형변환

반대로 큰그릇에서 작은 그릇으로 옮기는 경우 큰그릇의 값에 따라서 실행시 오류가 발생할수 있습니다. 따라서 컴파일러는 컴파일 시 오류를 발생시키고 명시적으로 형변환을 요구합니다.

 

 

 

    public class Animal {
        
        public void bark() {
            System.out.println("동물이 울음소리를 냅니다.");
        }
        
    }

 

bark 메서드를 가지는 동물 클래스를 하나 만들었습니다.

이 동물 클래스를 상속받는 개 클래스가 있습니다. 이 개 클래스는 부모클래스에는 없는 dogRun이라는 메서드를 가지고 있습니다.

 

  public class Dog extends Animal {

      public void dogRun() {
          System.out.println("개가 달립니다.");
      }

  }

 

상속은 kind of 관계에서 성립합니다. 즉 "개는 동물이다" 라는 관계가 성립하면 Dog 객체를 Animal형의 참조변수로 참조할수 있습니다. 만약 부모객체(동물클래스)가 자식 객체(개클래스)를 참조하게 되면 부모가 가진 메서드(bark)만 사용할 수 있습니다. 

 

 

  public class Dog extends Animal {

      public void dogRun() {
          System.out.println("개가 달립니다.");
      }

      public static void main(String[] args) {
        Animal dog = new Dog();
        dog.bark();
      }

  }

 

Animal형에 Dog객체를 참조하게 하였습니다. 이를 실행시키면 

 

 

묵시적 형변이 일어나서 잘 실행됩니다. 

즉 부모 타입인 동물로 개를 가르킬수 있다는 것입니다.

개클래스는 dogRun메서드도 가지고있습니다. dogRun을 실행시켜보겠습니다.

 

 

에러가 발생합니다. 

이렇게 부모타입으로 자식을 가르킬수는 있지만 부모가 가진 메서드만 사용할 수 있습니다.

하지만 실제로 생성된 개 객체는  dogRun메서드를 가지고 있습니다. 부모 타입으로 가르키고 있어 사용할수 없는 것이므로 형변환을 이용하면 이 dogRun메서드를 사용할 수 있습니다.

 

Dog dog2 = dog;

 

Animal형인 dog변수를 Dog형인 dog2 변수에 대입해 보겠습니다.

에러를 발생시킵니다. 이때 명시적 형변환을 통해 형변환을 해주면 에러를 발생시키지 않습니다

 

 

이 형변환은 dog가 원래 Dog형이었기때문에 가능합니다. 즉 실제로 생성된게 개 객체였기 때문입니다.

728x90
반응형

'개발 > Java' 카테고리의 다른 글

[Java / 자바] 인터페이스의 Default  (0) 2021.03.30
[Java / 자바 ] 인터페이스  (0) 2021.03.28
[ Java / 자바 ] 오버라이딩  (0) 2021.03.26
[Java / 자바 ] Super  (0) 2021.03.25
[Java / 자바] 추상 클래스  (0) 2021.03.23
Comments