//////
Search

220927

메소드 오버라이딩

오버라이딩 된 메소드를 객체 외부에서 호출 하는 방법은 없지만, 상속 받은 클래스 내부에서는 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(가비지 콜렉터)가 해당 메모리를 회수 해도 좋다.