///////
Search
📙

조윤재

업 캐스팅 & 다운 캐스팅

업 캐스팅

업캐스팅이란 자식클래스 객체가 부모클래스로 형변환되는 것을 말함.
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
복사