메소드 오버라이딩
•
오버라이딩 된 메소드를 객체 외부에서 호출 하는 방법은 없지만, 상속 받은 클래스 내부에서는 super키워드를 통해 호출 가능.
class Cake {
public void yummy() {
System.out.println("yummy cake");
}
}
class CheeseCake extends Cake {
@Override
public void yummy() {
super.yummy(); // 오버라이딩 했지만, 하위 클래스 내부에선 오버라이딩 되기 전의 상위 클래스 메소드 사용 가능.
System.out.println("yummy Cheesecake");
}
}
public class example1 {
public static void main(String[] args) {
Cake c1 = new CheeseCake();
CheeseCake c2 = new CheeseCake();
c1.yummy(); // 오버라이딩 된 메소드만 출력 가능.
c2.yummy(); // 오버라이딩 된 메소드만 출력 가능.
}
}
Java
복사
업캐스팅과 다운캐스팅
•
업캐스팅 : 하위 클래스의 객체를 상위 클래스 타입의 참조 변수에 대입하는 것 = 다형성의 활용.
•
다형성의 활용 예 : 함수의 매개변수로 상위 클래스를 지정할 경우, 실제로는 그 상위 클래스를 상속한 하위 클래스 전부를 매개변수에 대입할 수 있음.
•
다운캐스팅 : 업캐스팅한 하위 클래스를 다시 자기 자신의 타입으로 캐스팅 하는 것.
•
다운캐스팅의 활용 예 : 오직 하위 클래스에만 존재하는 멤버를 사용하고 싶을 때 다운캐스팅을 사용함.
class Cake {
public void yummy() {
System.out.println("yummy cake");
}
}
class CheeseCake extends Cake {
@Override
public void yummy() {
super.yummy();
System.out.println("yummy Cheesecake");
}
}
public class example1 {
public static void main(String[] args) {
Cake cc = new CheeseCake(); // 업캐스팅 = 다형성의 활용.
CheeseCake cheesecake = cc;
CheeseCake cheesecake = (CheeseCake) cc; // 다운캐스팅 = 자기 자신으로 돌아가기.
Java
복사
•
instanceof 연산자
◦
업캐스팅 된 객체의 원래 클래스가 무엇인지 확인함 = 다운캐스팅 가능 여부를 알 수 있음
Cake ccc = new CheeseCake();
// obj instanceof class -> obj의 원래 타입이 class인지 확인해서 true, false 리턴
if (ccc instanceof CheeseCake) {
System.out.println("실제 타입은 CheeseCake");
} else {
System.out.println("타입을 알 수 없어요.");
}
Java
복사
추상 클래스
•
추상 클래스 = 미완 클래스 = 하위 클래스를 통해 완성 필수!
•
abstract 키워드를 사용해서 작성함.
•
추상 클래스 자체로는 객체생성 불가능.
•
반드시 하나 이상의 추상 메소드를 지님(일반 메소드도 가질 수는 있음)
•
추상 메소드란, 메소드 바디(내용)이 없는 메소드.
•
추상 메소드는 반드시 하위 클래스를 통해 오버라이딩 되어야 함.
•
즉, 오버라이딩의 강제성이 생김. → 실수 방지 효과.
// abstract 키워드를 사용해서 추상 클래스와 추상 메소드 작성.
abstract class Animal {
public abstract void move();
}
// 추상 클래스를 상속한 하위 클래스는 반드시 오버라이딩!!
class Lion extends Animal {
@Override
public void move() {
System.out.println("사자의 move 메소드 입니다.");
}
}
public class Example2 {
public static void main(String[] args) {
Lion lion = new Lion();
lion.move();
}
}
Java
복사
인터페이스
•
인터페이스란, 협업관계에서 공유되는 하나의 설계도, 약속, 강제, 표준 이다.
•
사용 방법 : 상속과 유사. class대신 interface로 작성, extends 대신 implements로 활용.
•
인터페이스 내부에는 상수(final)와 추상 메소드만 작성이 가능했으나…
•
자바 1.8 버전 이후로는 default 메소드도 작성이 가능해짐 = 사실상 추상 클래스와의 차이가 모호해짐.
•
default 메소드란, default 키워드를 붙인 일반 메소드. 즉, 메소드 바디(내용)을 지니고 있음.
•
default 메소드를 통해, 하나의 인터페이스를 상속한 수 많은 하위 클래스에 동시에 메소드를 추가 가능해짐. (원래는 추상 메소드 작성 후 각 하위 클래스마다 따로 오버라이딩 했어야 했음.)
•
인터페이스 자체는 객체 생성 불가능. 참조 변수로만 선언 가능 → 다형성 활용 가능!
// 인터페이스 작성
interface Printable {
public abstract void print(String doc);
}
// 인터페이스를 상속(?)한 하위 클래스가 오버라이딩1
class SPrinterDriver implements Printable {
@Override
public void print(String doc) {
System.out.println("삼성 프린터 입니다.");
System.out.println(doc);
}
}
// 인터페이스를 상속(?)한 하위 클래스가 오버라이딩2
class LPrinterDriver implements Printable {
@Override
public void print(String doc) {
System.out.println("엘쥐 프린터 입니다.");
System.out.println(doc);
}
}
public class DriverTest {
public static void main(String[] args) {
// 인터페이스 자체로는 객채 생성 불가능.
// Printable p1 = new Printable();
// 참조 변수로 선언은 가능
Printable p1 = new SPrinterDriver();
p1.print("출력해 주세요.");
p1 = new LPrinterDriver();
p1.print("출력해 주세요.");
Java
복사
인터페이스와 추상 클래스의 차이.
•
default 메소드가 추가된 자바 1.8버전 이후로는 차이가 모호해짐.
•
단, 추상 클래스는 인터페이스와는 달리 인스턴스 변수, 생성자, private 메소드를 가질 수 있고.
•
인터페이스는 추상 클래스와는 달리 (유사)다중 상속을 지원함.
•
클래스 간 다중 상속을 지원하지 않는 이유.
변수의 종류
1.
인스턴스(객체) 변수
•
class 내부, 메소드 외부에서 선언하는 변수
•
변수 초기화를 하지 않았을 때, null값을 자동으로 입력
2.
static(클래스) 변수
•
static 키워드가 붙고, class 내부, 메소드 외부에서 선언하는 변수
3.
지역 변수
•
메소드 내부에서 선언 된 변수 → 해당 메소드 안에서만 사용 가능.
•
변수 초기화를 하지 않았을 때, null값을 자동 입력 안 해줌.
null
•
참조형 변수에만 사용되는 기본값.
•
의미
◦
가리키는 객체(값)이 없다.
◦
GC(가비지 콜렉터)가 해당 메모리를 회수 해도 좋다.