본문 바로가기
Language/java

java 기본 11: 클래스 형변환

by S2채닝S2 2023. 1. 5.

클래스 형변환

  클래스 형변환에는 자동 타입 변환과 강제 타입 변환이 있다.

 

자동 타입 변환

  - 실행 중 자동으로 타입 변환이 발생

  - 자식클래스에서 부모클래스 방향으로 자동 변환

  - 자동 타입 변환 후에는 부모 클래스에 정의된 멤버만 사용할 수 있음

  - 단, 자식 클래스에 메소드 오버라이딩을 구현한 경우 자식 클래스의 메소드가 호출됨

//자식클래스
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();
}

최근댓글

최근글

skin by © 2024 ttuttak