상속과 인터페이스
📘자바
상속
상속 = 기존 클래스를 확장하는 것 상속의 장점 = 코드 중복을 줄이고 프로그램 확장성을 증가시킨다 class A extends B {} = A 클래스는 B를 상속 (또는 확장)
이러한 상속 관계에서, 근간이 되는 클래스를 부모클래스(A)라 부르고, 부모 클래스를 통해 확장된 클래스를 자식클래스(B)라 한다.
업 캐스팅
업 캐스팅이란, 자식 객체를 부모의 타입으로 해석하는 것
class Animal{}
class Cat extends Animal{}
class Dog extends Animal{}
class Rabbit extends Animal{}
//이러한 상속관계가 있을경우
Cat c = new Cat(); // 고양이 객체 생성
Animal a = c; // 고양이 객체를 동물로 해석이 가능
// 하지만 역은 성립하지 않음
Animal aaa = new Animal();
Cat ccc = aaa; // 동물 객체를 고양이로 해석이 불가능
//이러한 업 캐스팅은, 다양한 객체들을 부모의 타입으로 관리할 수 있게 한다.(그룹화가 가능)
Animal c = new Cat();
Animal d = new Dog();
Animal r = new Rabbit();
Animal [] animals = {c,d,r};
메소드 오버라이딩
메소드 오버라이딩이란, 부모의 메소드를 자식 클래스에서 재정의하는것이다.
동물이라는 부모클래스의 잠자기는 sleep이라 했을때 자식클래스인 고양이의 잠자기는 many sleep으로 하고싶다. 이럴때 쓰는 개념이 메소드 오버라이딩이다.
class Animal{
public void sleep(){
System.out.println("sleep");
}
}
class Cat extends Animal{
public void sleep(){
System.out.println("many sleep");
}
}
//이렇게 메소드 오버라이딩을 쓴 결과는?
Animal A = new Animal();
A.sleep(); // "sleep"
Cat C = new Cat();
C.sleep(); // "many sleep"
super
자식 객체를 생성과 동시에 초기화하려먼, 먼저 부모의 생성자가 호출되어야한다, 이때 쓰는것이 super이다.
//생성자 호출 영역
Zed z = new Zed("Zed",100,0);
//생성자 정의 영역
class Lol{
protected String name;
protected int hp;
public Lol(String name, int hp){
this.name = name;
this.hp = hp;
}
public String toString(){
return String.format("%s,%d",this.name,this.hp);
}
}
class Zed extends Lol{
protected int mp
public Zed(String name, int hp, int mp){
super(name,hp); // 부모 클래스 생성자 호출
this.mp = mp;
}
public String toString(){ // 메소드 오버라이딩
return String.format("%s,%d,%d",super.name,super.hp,this.mp);
//super을this로 써도 됨
}
}
인터페이스
인터페이스 = 메소드 묶음의 역할 정의 방법 프로토타입(추상) 메소드 = 내용이 없는 껍데기 메소드 implements 키워드란? = 클래스에게 역할을 부여하는 것 인터페이스의 장점 = 인터페이스를 통한 업캐스팅 가능 , 프로그램 설계의 명확성 증가
//인터페이스 선언
interface Alarm{
public void beep(); //프로토타입 메소드 (추상 메소드)
public void playMusic(); // 프로토타입 메소드
}
class SmartPhone implements Alarm{
public void beep(){
System.out.println("삐삐삐");
}
public void playMusic(){
System.out.println("나나나");
}
}
인터페이스를 통한 업캐스팅 가능
class SmartPhone implements Alarm, phone, Messanger{ //내부생략 } //스마트폰 객체 생성 SmartPhone sp = new SmartPhone(); //스마트폰을 다양하게 해석(업캐스팅 - 상위 타입으로 해석) Alarm a = sp; // 스마트폰은 알람이다 (O) Phone p = sp; // 스마트폰은 전화기이다(O) Messanger m = sp; // 스마트폰은 메신저이다(O)
이렇게 하나의 객체가 다양한 타입으로 해석되는 것을 다형성 이라고한다