클래스 형변환
클래스 형변환에는 자동 타입 변환과 강제 타입 변환이 있다.
자동 타입 변환
- 실행 중 자동으로 타입 변환이 발생
- 자식클래스에서 부모클래스 방향으로 자동 변환
- 자동 타입 변환 후에는 부모 클래스에 정의된 멤버만 사용할 수 있음
- 단, 자식 클래스에 메소드 오버라이딩을 구현한 경우 자식 클래스의 메소드가 호출됨
//자식클래스
public class JavaScript extends Student{
public JavaStudent(String name){
super(name);
}
@Oberride
public void study(String subject){
System.out.println("자바 입문 강의 "+subject+"를 학습합니다");
}
}
//부모클래스
pubilc abstract class Student{
private final String name;
Student(String name){
this.name = name;
}
public Stirng getName(){
return this.name;
}
public abstract void study(String subject);
}
//자동 형변환: JavaStudent(자식) -> Student(부모)
Student student = new JavaStudent("홍길동");
//오버라이딩된 메소드 호출
student.study("클래스 자동 타입 변환"); //자바 입문 강의 클래스 자동 타입 변환를 공부합니다
자동 타입 변환 활용하기: 메소드 호출
public class Teacher{
//매개변수:: JavaStudent의 부모 클래스
public void checkStudent(Student student){
System.out.println("무엇을 공부합니까?");
student.study("클래스 자동 타입 변환");
}
}
//main 생략
//메소드 인자에 자식 클래스를 넣어 호출:: 자동 타입변환 처리
Teacher teacher = new Teacher();
JavaStudent jStu = new JavaStudent("홍길동");
//// 메소드는 자식클래스에서 오버라이딩한 메소드로 실행됨
teacher.checkStudent(jStu);
// 무엇을 공부합니까?
// 자바 입문 강의 클래스 자동 타입 변환를 공부합니다.
강제 타입 변환
- 자동 타입 변환이 불가해서 강제로 타입 변환하는 것
- 부모클래스에서 자식 클래스 방향으로 변환
- 소괄호 ()에 원하는 자식 클래스를 선언
- 자식 클래스로 강제 타입 변환을 하면 자식 클래스에 선언된 필드와 메소드를 사용할 수 있음
- 부모 클래스에는 없지만 자식 클래스에 선언된 멤버를 사용해야할 때 사용
//부모 클래스로 선언됨
Student student = new JavaStudent("홍길동");
//강제 타입 변환
JavaStudent javaStudent = (JavaStudent) student;
예제코드
public class GenesisCar extends Car{
int price;
GenesisCar(int speed, boolean operable, char grade, int price) {
super(speed, operable, grade);
this.price = price;
}
@Override
public void turnOn() {
System.out.println("제네시스 시동을 켰습니다.");
}
@Override
public void turnOff() {
System.out.println("제네시스 시동을 껐습니다.");
}
public static void main(String[] args) {
// 자동 타입변환
Car car = new GenesisCar(300, true, 'A', 8000);
//제네시스 시동을 켰습니다.
car.turnOn();
//제네시스 시동을 껐습니다.
car.turnOff();
//Car 클래스의 speed 300 출력
System.out.println(car.speed);
//강제 타입 변환
GenesisCar genesisCar = (GenesisCar) car;
//GenesisCar 클래스의 price 8000 출력
//강제 타입 변환을 하지 않으면 자식클래스의 필드를 호출할 수 없으므로 에러 발생
System.out.println(genesisCar.price);
}
}
abstract class Car {
public int speed;
public boolean operable;
public char grade;
Car(int speed, boolean operable, char grade) {
this.speed = speed;
this.operable = operable;
this.grade = grade;
}
public abstract void turnOn();
public abstract void turnOff();
}
'Language > java' 카테고리의 다른 글
java 기본 13: 중첩 클래스(중첩(인스턴스)클래스, 정적 중첩 클래스, 로컬 클래스, 익명 클래스 (0) | 2023.01.05 |
---|---|
java 기본 12: 인터페이스 (1) | 2023.01.05 |
java 기초 10: 추상 클래스(abstract class) (0) | 2023.01.05 |
java 기본 9: 접근 제한자(public/protected/friendly/default/private) (0) | 2023.01.05 |
java 기초 8: 상속 (0) | 2023.01.05 |