앱 만들기/안드로이드

JAVA 클래스 형변환을 알아보자.

나도 처음이야 2020. 3. 8.

자바 클래스 형변환 개념을 잘 알아두어야지, 안드로이드 프로젝트 시에도 혼동이 없을 것이다.

클래스 형 변환은 상속 개념에서도 존재한다.

(여기서는 기본 Type 클래스 (String, Integer etc...) 의 형변환은 제외한다.

 

1. 부모와 자식 클래스를 만들자. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// 부모 클래스
class Parent {
    int old = 35;
    String name = "James";
    private int asset = 100;
    
    void introduce() {
        System.out.println("I am " + name );
        System.out.println("And " + old + " years old.");
        System.out.println("My asset is " + asset );
    }    
}
 
//자식 클래스
class Child extends Parent{
    int old = 7;
    String name = "tom";    
    String school = "Seoul";
    
    void introduce() {
        System.out.println("I am " + name );
        System.out.println("And " + old + " years old");
        System.out.println("My school is " + school );
    }        
    
cs

 

2. 메인 메서드에서 하나씩 테스트 해보자.

 2-1. 결과는, 당연히 부모클래스 내의 메서드 및 멤버 변수만 접근 가능하다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class TypeCasting {
 
    public static void main(String[] args) {
 
        // TODO Auto-generated method stub
         //2-1.부모 클래스 인스턴스를 만들고 참조변수 타입을 부모로 받는 경우.
        Parent parent = new Parent() ;
        System.out.println("//2-1.부모 클래스 인스턴스를 만들고 참조변수 타입을 부모로 받는 경우.");
        parent.introduce();
        System.out.println("");
        
        /*  결과
            I am James
           And 35 years old.
           My asset is 100
        */        
cs

2-2. 자식클래스 와 상속받은 부모클래스의 메서드,멤버 변수 접근이 가능하다.

1
2
3
4
5
6
7
8
9
10
11
     //2-2.자식 클래스 인스턴스 만들고 참조변수 타입을 자식으로 받는 경우.
        Child child = new Child() ;
        System.out.println("//2-2.자식 클래스 인스턴스 만들고 참조변수 타입을 자식으로 받는 경우.");
        child.introduce();
        System.out.println("");    
       
        /*  결과     
I am Tom
             And 7 years old
             My school is Seoul
         */        
cs

2-3. 부모의 객체의 구성요소에만 접근이 가능하다,

      다만 상속받은 클래스에서 오버라이딩을 했다면 자식 메소드가 호출된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 //2-3.자식 클래스 인스턴스 만들고 참조변수 타입을 부모로 받는 경우.
        Parent parent2 = new Child() ;
        System.out.println("//2-3.자식 클래스 인스턴스 만들고 참조변수 타입을 부모로 받는 경우.");
        //오버라이딩 된 자식 메서드가 호출됨.
        parent2.introduce(); 
        //부모 객체의 변수 및 메서드 만 접근 가능.
        System.out.println("parent2.old = "  + parent2.old);
        System.out.println("");
        
        /* 결과
           I am tom
            And 7 years old
            My school is Seoul
            parent2.old = 35
         */            
cs

 

2-3 을 그림으로 표현하자면..

2.4  부모 인스턴스를 메모리에 만들었더라도, 자식 인스턴스 참조 변수가 가리킬 수 없다.

     왜냐면, 부모안에 자식 속성은 포함 되어 있지 않기때문이다.

     강제 형 변환을 해도 하기 주석문 같은 컴파일 에러가 발생한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//2-4 부모 클래스 인스턴스 만들고 참조 변수 타입을 자식으로 받는 경우.
        //Child child2 = (Child)new Parent() ;
        /*Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
            Type mismatch: cannot convert from Parent to Child */
        Parent parent3 = new Child();      
        Child child3 = (Child)parent3;
        System.out.println("//2-4.부모 클래스 인스턴스 만들고 참조 변수 타입을 자식으로 받는 경우.");
        //자식,상속받은 부모객체 모두 접근이 가능하다.
        child3.introduce();        
        System.out.println("");
        
        /* 결과
            I am tom  
            And 7 years old
            My school is Seoul
         */
cs

    사용하고 싶다면,

    2-3 번 처럼, 먼저 메모리에 자식 인스턴스를 생성하고 부모 객체 참조변수로 받아야 한다.

 

 

3. 다형성 

2-3 예제의 경우는 오버라이딩 등의 다형성을 위한 기술에 사용될 것이다.

그럼 2-4 는 언제 사용이 될까? 처음부터 그냥 자식 참조 변수로 받으면 될 것 아니냐? 란 질문이 있을 수 있다

안드로이드 에선 바로 하기 처럼 사용이 가능하다.

 

setContentView(R.layout.activity_main);

TextView text1 = (TextView)findViewById(R.id.textView);

 

setContentView(R.layout.activity_main); 로 xml 에서 레이아웃을 가져와 메모리에 인플레이트 한다. 

즉, new 로 객체를 메모리 상에 인스턴스화 하는 과정과 동일하다. findViewById 에선 textView 란 아이디를 가진 객체인스턴스를 가져온다. 그런데, findViewById 의 반환값이 바로 View 클래스 이다. 참조변수는 View 를 상속받는 TextView 이고, 즉, 2-4 가 바로 이런 경우이다. 메모리 상에는 자식 인스턴스(TextView)를 만들었지만, 부모 타입(View)으로 반환한다. View 를 TextView 로 형변환 하고 자식 참조변수인 TextView 로 받는다.

 

        Parent parent3 = new Child();       
        Child child3 = (Child)parent3; 
        child3.introduce();     

 

즉, 부모 참조변수 들은 자식의 타입들을 이런식으로 가리 킬 수 있기에

다형성 코드로 손쉽게 구현이 가능하다.  이는 상속 뿐만 아니라 인터페이스 에서도 동일하다.

인터페이스 는 다음 포스팅에서 만나봅시다.

감사합니다. ^^*

 

반응형

댓글