업 캐스팅 & 다운 캐스팅
업 캐스팅
업캐스팅이란 자식클래스 객체가 부모클래스로 형변환되는 것을 말함.
class Person{ // 부모클래스
String name;
Person(String name){
this.name = name;
}
}
class Student extends Person{ // 자식클래스
String check; // 자식클래스만 가진 멤버변수
Student(String name){
super(name);
}
}
public class Main{
public static void main(String[] args){
Student student = new Student("조윤재");
Person person = student; // 업캐스팅되어 오직 Person 클래스의 멤버만 참조할 수 있음
person.name = "참조 가능!";
person.check = "XX참조 불가능XX"; // 컴파일 에러 발생
}
}
Java
복사
다운 캐스팅
다운캐스팅이란 업캐스팅된 자식클래스 객체를 다시 원상태로 되돌리는 것을 말함.
class Person{ // 부모클래스
String name;
Person(String name){
this.name = name;
}
}
class Student extends Person{ // 자식클래스
String check; // 자식클래스에만 있는 멤버
Student(String name){
super(name);
}
}
public class Main{
public static void main(String[] args){
Person person = new Student("조윤재"); // Student클래스의 새 인스턴스를 Person클래스로 업캐스팅
Student student = (Student)person; // 다운캐스팅
s.name = "당연히 가능";
s.check = "이거도 가능!"; // 다시 자식클래스로 다운캐스팅되었기에 참조 가능!
}
}
Java
복사
추상 클래스
추상클래스란 여러 클래스 간의 공통적인 부분을 하나로 묶어 분류한 클래스를 지칭함.
이해하기 편하게 갤럭시와 아이폰 클래스의 공통 성질은 Phone 이라는 추상클래스로 정의해봤음.
public abstract Class Phone {
public String model;
public void call() {
System.out.println("따르릉 따르릉");
}
public abstract void useVoice(); // 추상메소드, 자식클래스에서 오버라이딩해서 사용
public Class Galaxy extends Phone { // 추상 클래스 Phone을 상속받은 갤럭시
public Galaxy() {
this.model = "제트제트제트플립플립플립";
}
@Override
public void useVoice() { // 부모클래스에서 상속받은 추상메소드를 오버라이딩해 갤럭시에 맞게 빅스비를 부름
System.out.println("하이 빅스비~");
}
}
public Class IPhone extends Phone { // 추상 클래스 Phone을 상속받은 아이폰
public IPhone() {
this.model = "아이폰 14 프로";
}
@Override
public void useVoice() { // 부모클래스에서 상속받은 추상메소드를 오버라이딩해 아이폰에 맞게 시리를 부름
System.out.println("시리야~~~!");
}
}
Java
복사
인터페이스
인터페이스란 클래스들이 동일한 목적 하에 동일한 기능을 수행하게끔 명세하는 것을 말함.
자바8 이후로 default, static, private 메소드 등을 사용하여 무조건적 수행은 하지는 않음.
부모클래스는 다중상속할 수 없지만(어떤 클래스에서 상속받은 메소드인지 알 수 없기에)
인터페이스는 다중상속이 가능하다(인터페이스는 모두 추상메소드라서 오버라이딩 해야하기에).
public interface TV { // TV 인터페이스 -- (1)
public int MIN_VOLUME = 0;
public int MAX_VOLUME = 100;
public void turnOn(String tv); // 추상메소드이나 abstract 키워드 생략가능
public void turnOff(String tv);
public void changeVolume(int volume);
}
public interface Electronics { // 가전제품 인터페이스 -- (2)
public void powerOn();
public void powerOff();
}
// (1), (2) 인터페이스를 다중상속받는 LedTV 클래스
public class LedTV implements TV, Electronics {
@Override // 상속받은 추상메소드를 재정의해야하기에 오버라이딩
public void turnOn(String tv) {
System.out.println(tv+" tv켜다.");
}
@Override
public void turnOff(String tv) {
System.out.println(tv+" tv끄다.");
}
@Override
public void changeVolume(int volume) {
System.out.println("볼륨을 조정하다.");
}
@Override
public void powerOn() {
System.out.println("전자제품 모두 power on");
}
@Override
public void powerOff() {
System.out.println("전자제품 모두 power off");
}
}
// example
public class tvExam {
public static void main(String[] args) {
TV tv = new LedTV();
Electronics electronics = new LedTV();
tv.turnOn("거실"); // 거실 tv켜다.
tv.turnOff("안방"); // 안방 tv끄다.
tv.changeVolume(10); // 볼륨을 조정하다.
electronics.powerOn(); // 전자제품 모두 power on
electronics.powerOff(); // 전자제품 모두 power off
}
}
Java
복사