Phone, HandPhone (extends 상속받기)
HandPhone.java에서 extends Phone의 뜻은 Phone.java를 상속 받겠다는 뜻이다. 즉 HandPhone.java는 Phone.java의 필드와 메소드를 포함하게 된다.
MainClass01 (Object, 다형성)
Phone 클래스를 상속받은 HandPhone 클래스로 객체를 생성하면 Phone 객체가 미리 만들어지고 HandPhone 객체가 만들어진다. 그리고 그 두개의 객체가 동일한 heap 영역에 저장되어서 동일한 참조값으로 관리가 된다.
HandPhone 객체만 생성했는데 Phone -> HandPhone 순서로 생성자가 호출되는 것을 console에서 확인 할 수 있다. 뿐만아니라 HandPhone 객체를 담은 p1 변수로 HandPhone 메소드 뿐만 아니라 Phone 메소드도 사용 가능하다.
p1.을 해보면 extends Object 는 자동으로 상속 빋고 있는 것을 알 수 있다. 이것은 defualt 값이라고 볼 수 있다.
예시의 p1 과 같이 하나의 변수가 여러가지 type을 포함할 수 있다. 이것을 다형성이라고 한다.
MainClass02 (다형성과 type)
Object
Phone
HandPhone
위의 클래스를 상속 받고 필드 혹은 메소드를 유지하거나 추가하기 때문에 아래로 갈수록 클래스의 크기가 같거나 커진다.. HandPhone 은 Phone 과 Object 을 포함하고 있는 것이라고 볼 수 있다. (Phone은 Object를 포함한다.)
따라서 객체를 생성할때 변수를 자신이 포함하고 있는 부모 클래스의 type으로 만들 수 있다.
MainClass03 (한개의 객체로 다수의 변수 만들기)
객체는 new 할때만 생성되는 것이기 때문에 각각 다른 type의 3가지 변수를 만들었다고 하더라고 객체는 한개만 생성된 것이다.
MainClass04, SmartPhone (casting)
현재 상속관계
Object -> Phone -> HandPhone -> SmartPhone
만약 부모 클래스 type으로 만든 변수(객체는 자식 클래스)로 자식 클래스에 담긴 메소드를 실행하려면 casting 과정이 필요하다.
예시에서는 p1이 SmartPhone(자식클래스)으로 객체가 생성되었지만 type을 Phone(부모클래스)로 하였다. 때문에 Phone class가 포함한 call 메소드는 실행 가능하지만 자식 클래스에서 포함하는 메소드인 mobilecall 메소드, doInternet 메소드는 사용이 불가능하다. 이때 캐스팅 과정이 필요하다. 예시에서 p1을 p2, p3로 casting 하여 메소드를 사용 가능하게 만들었다.
MainClass05 (casting 오류 예시)
당연하게도 객체가 부모클래스인데 type만 자식클래스로 바꾼다고 자식클래스의 필드나 메소드를 사용할 수 있는 것은 아니다.
type은 설명서 역할, 객체는 내용이라고 생각하면 이해가 편하다.
MainClass06 SmartPhone (Override 메소드 재정의 하기)
만약 부모 클래스의 메소드를 수정하고 싶다면 override하면 된다.
override는 직접 코드를 작성해도 되고 빈공간에서 ctrl + space로 원하는 메소드를 선택하고 수정해도 된다.
HandPhone 클래스에도 분명 takePicture 메소드가 있음에도 SmartPhone에서 override했기 때문에 "1000만 화소의 사진을 찍어요"가 출력된다.
this 와 super 이해하기
this.takePicture()
SmartPhone에 있는 takePicture(){}을 가리킨다.
super.takePicture()
HandPhone에 있는 takePicture(){}을 가리킨다.
생성자에서 사용하는 super()도 있다. 이때 super()은 부모 생성자를 의미한다.
'java' 카테고리의 다른 글
eclipse로 git 사용하기2(gitignore) (0) | 2022.07.29 |
---|---|
Step08_Extends(protected, 객체인자) (0) | 2022.07.28 |
Step07_Array(setter, getter 예시) (0) | 2022.07.28 |
Step07_Array(setter, getter 메소드) (0) | 2022.07.28 |
eclipse로 git 사용하기 (0) | 2022.07.28 |