abstract몸체의 구현 없이 형식만 존재하는 메소드
final과는 함께 사용할 수 없음abstract class Shape {
// 모양이 정해지지 않았기 때문에 면적을 계산할 수 없음
abstract public double getArea();
}
클래스 정의에
abstract키워드를 사용
// Shape이 추상 클래스인 경우
Shape s = new Shape("red"); // 컴파일 오류
몸체 없이, 구현되어야 할 메소드의 형식만 정의해 둠
= 100% 추상적 클래스
default 인스턴스 메소드와 static 메소드는 몸체를 구현함publicpublic static final)Runnable, Comparablepublic abstractpublic static finalinterface Comparable<T> {
// 다른 객체와 크기를 비교하는 메소드
boolean isLargerThan(T o);
}
class Box implements Comparable<Box> {
private int length, width, height;
public boolean isLargerThan(Box otherBox) {
... ...
}
}
기존 인터페이스를 상속받아 새로운 인터페이스 정의
→ 키워드extends사용
interface SuperInterface {
public void func1();
public void func2();
}
interface SubInterface extends SuperInterface {
public void func3();
}
자식은 부모가 나열한 기능(추상 메소드)를 구현해야 함
→implements사용
interface Movable {
void add(double dx, double dy);
void sub(double dx, double dy);
}
interface Scalable {
void mul(double s);
void div(double s);
}
class Point implements Movable, Scalable {
... ...
}
인터페이스에서 선언하는 메소드에 기본 구현(몸체)을 넣을 수 있음
자식 클래스에서 상속받을 때, 디폴트 메소드를 그대로 사용할 수 있음
메소드 선언시 default를 사용하고 몸체를 구현해 줌
인터페이스에 새 메소드를 추가할 때, 기존 코드(클래스 정의)의 수정을 피하기 위함
interface DoIt {
void doSomething();
int doSomethingElse(String s);
// 아래를 새로 추가한다면?
default boolean didItWork(int i, String s) {
... ...
}
}
extends와 implements에 따라 상위/하위 자료형 관꼐가 설정됨💡 정적 바인딩 VS 동적 바인딩
- 정적 바인딩: 컴파일 시점에 어떤 메서드가 호출될지 결정
- 동적 바인딩: 실행 시점에 어떤 메서드가 호출될지 결정
SuperClass sup = new SubClass(); // 자동 형변환
sup.method(); // method()를 SubClass에서 찾음
유사하지만 다양한 형상이나 다양한 기능을 가진다는 뜻
Aniaml animal = (Animal) new Dog(); // 하위 객체 참조미리 정의된 상수값의 집합을 만들기 위한 자료형
enum을 사용하여 정의static 메소드인 values()를 제공enum Day {
SUNDAY, MONDAY, TUESDAY,
WEDNESDAY, THURSDAY, FRIDAY, SATURDAY
}
public class Main {
public static void main(String args[]) {
Day day = Day.MONDAY;
for (Day d: Day.values())
System.out.println(d);
}
......
}
일회성으로 1개의 객체를 생성하기 위한 클래스
→ 익명 클래스 정의와 동시에 객체 생성 가능
부모 클래스를 상속받거나 인터페이스를 구현하도록, 익명 클래스 정의
💡 익명 클래스의 정의 방법
- 아래에서 중괄호가 익명 클래스의 몸체가 됨
- 부모 클래스를 상속받는 (익명 서브 클래스) 객체를 생성할 때
new 슈퍼클래스() {...}
- 인터페이스를 구현하는 (익명 구현 클래스) 객체를 생성할 때
new 인터페이스() {...}
외부 클래스 정의 내부에 정의된 또 다른 클래스
→ 내부(inner) 클래스라고도 하며, 외부(outer) 클래스의 멤버가 됨
✔️ 논리적 그룹화를 위한 것
private, protected 클래스가 될 수 있음non-static 중첩 클래스외부 클래스의 객체가 생성된 이후 사용 가능
→ 외부 클래스의 객체와 연관
객체 생성 방법은 외부클래스객체변수.new 내부클래스()
this 외에 외부 클래스 객체의 참조(외부클래스.this)를 가지고 있음static 중첩 클래스