자바 클래스 형변환 개념을 잘 알아두어야지, 안드로이드 프로젝트 시에도 혼동이 없을 것이다.
클래스 형 변환은 상속 개념에서도 존재한다.
(여기서는 기본 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.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();
즉, 부모 참조변수 들은 자식의 타입들을 이런식으로 가리 킬 수 있기에
다형성 코드로 손쉽게 구현이 가능하다. 이는 상속 뿐만 아니라 인터페이스 에서도 동일하다.
인터페이스 는 다음 포스팅에서 만나봅시다.
감사합니다. ^^*
'앱 만들기 > 안드로이드 study' 카테고리의 다른 글
안드로이드 스튜디오 unescaped apostrophe in string 에러가 발생시 (0) | 2020.03.22 |
---|---|
자바 String 비교 하기 == , equals() (14) | 2020.03.15 |
안드로이드 뷰 페이저 만들기. (13) | 2020.03.12 |
안드로이드 스튜디오 창 여러개 열기 (2) | 2020.03.05 |
안드로이드 개발자 옵션 켜기. (10) | 2020.02.10 |
댓글