본문 바로가기

Java

강제타입변환 Casting 및 몇가지

강제타입변환 변수 공부할때 들어본적 있는이야기다.

서로 다른 타입의 연산을 할 때 강제로 타입을 변환 시키는 방법이 있다.

작은 크기 타입 = (작은크기타입)큰크기타입

이런 방식이다 Casting도 마찬가지이다 사용하는 방법은 동일하다. 

자식클래스 변수 = (자식클래스) 부모클래스 타입;

다른점이 뭐냐하면 여기에 나오는 부모클래스타입은 부모클래스타입으로 자동변환된 자식클래스여야한다.

쉽게 말해 부모 클래스타입으로 자동변환된 자식클래스를 원래클래스로 되돌릴 때 사용한다는 것이다.

자식타입이 부모타입으로 자동변환되면 부모클래스의 멤버에만 접근 할 수 있게 된다. 오버라이딩된 메소드는 예외지만.

이 때 다시 자식클래스의 멤버를 사용해야한다? 그렇다면 Casting을 통해 다시 자식클래스타입으로 되돌리는 것이다. 

코드로 보자

class Parent {

String field1;

void method1() {...}

void method2() {...}

}


class Child extends Parent{

String field2;

void method3(){...}

}

class ChildExample{

public static void main(Stirng[] args){

Parent parent = new Child();

parent .field1 = "xxx";

parent.method1();

parent.method2();

/////////////////////////////

parent .field2 = "yyy"; << 불가능

parent.method3(); << 불가능

///////////////////////////////


Child child = (Child) parent;

child .field2 = "yyy"; <<가능

child .method3(); <<가능

}

}

위에서 부터 보자 일단 부모클래스 타입으로 자식클래스의 객체를 자동타입변환해서 생성한다. 

그래서 부모 클래스의 필드, 메소드의 사용이 가능해 진다. 

하지만  parent .field2 = "yyy"; << 불가능

parent.method3(); << 불가능

이 경우 자동타입변환의 규칙에 의해 자식클래스의 접근이 불가능해 호출이 불가능하다. 

자식클래스의 사용을 위해서 Casting을 사용한다. 

Child child = (Child) parent;

child .field2 = "yyy"; <<가능

child .method3(); <<가능

다시 자식클래스 타입으로 돌아온 객체는 자식클래스의 멤버로 접근이 가능해지고 필드와 메소드의 사용이 가능해진다.


이걸로 마무리 하고 새로 글을 쓸려고 했는데 좋지않은 기억이 떠올랐다. 

아는가 티스토리는 짧은 내용의 글이 단기간에 많이 올라오면 자동으로 그 계정을 차단한다. 

이유는 광고성 글의 남용이라는 내용이다. 

티스토리를 시작하는 분들은 참고 하시길 바랍니다. 


객체 타입확인 (instanceof)

강제타입변환은 부모를 상속받은 자식클래스가 부모타입으로 자동타입변환 되었을때만 사용이 가능하다. 

Parent parent = new Parent();

Child child = (Child)Parent; 

이런 경우에는 에초에 자식객체가 자동변환되지 않았기 때문에 불가능하다. 

그렇다면 부모 변수가 부모객체를 참조하는지 자식객체를 참조하는지 알 수 있는 방법이 있을까? 당연히 있다

여기서 사용되는 것이 Instanceof연산자이다.

instanceof의 왼쪽에 객체가오고 오른쪽에 타입이온다.

왼쪽의 객체가 오른쪽의 타입으로 객체가 생성되었다면 True를 산출하고 그렇지않으면 false를 산출한다.

boolean result = 좌항(객체)변수 instanceof 우항(타입)

void method(Parent parent){

if(parent instanceof Child){

Child child = (Child) parent;

}

}

이 코드는 메소드의 Partent 매개변수에 대입된 객체가 Child이면 True를 반환 아니면 false를 반환한다. 

Ture를 반환하면 Child로 Casting된다.



'Java' 카테고리의 다른 글

인터페이스 (Interface)  (0) 2018.12.29
추상클래스(abstract)  (0) 2018.12.23
매개변수의 다형성  (0) 2018.12.21
배열로 객체관리하기  (0) 2018.12.21
자동타입변환2 필드의 당형성  (0) 2018.12.21