: 한 객체가 여러 형태를 가질 수 있는 성질로 상위 클래스 타입의 참조 변수를 통해 하위 클래스의 객체를 참조하듯이 한 타입의 참조변수를 통해 여러 타입의 객체를 참조할 수 있도록 만든 것
class Person {
public void eat() {
System.out.println("밥을 먹습니다.");
}
}
class Programmer extends Person {
Public void eat() {
System.out.println("프로그래머가 밥을 먹습니다.");
}
}
public class Test {
public static void main(String[] args) {
Person person = new Person();
Person programmer = new Programmer(); // 객체와 참조 변수의 타입이 달라도 하위 클래스가 상위 클래스 참조 가능
}
}
: 사용 가능한 멤버의 개수를 조절하는 것
class Person {
public void eat() {
System.out.println("밥을 먹습니다.");
}
}
class Programmer {
public void eat() {
System.out.println("프로그래머가 밥을 먹습니다.");
}
}
public class Test {
public static void main(String[] args) {
Programmer programmer = new Programmer();
Person person = (Person) programmer; // 괄호 생략 가능
Programmer programmer2 = (Programmer) person; // 괄호 생략 불가
}
}
: 참조 변수가 검사한 타입으로 캐스팅이 가능한지 여부를 boolean으로 반환
참조변수 instanceof 타입
: 기존 클래스들의 공통 요소들을 추출해 상위 클래스를 만들어 내는 것
: 클래스나 메서드 앞에 붙여 추상 클래스, 추상 메서드임을 표시하는 기타 제어자
: 메서드의 시그니처만 존재하고 바디는 선언되지 않은 추상 메서드를 포함하는 미완성 설계도로 객체 생성이 불가하다. 하지만 오버라이딩을 통해 하위 클래스에서 각각 상황에 맞는 메서드 구현이 가능하다.
abstract class Person {
public String name;
Public abstract void eat();
}
class Programmer extends Person {
public void eat() {
System.out.println("프로그래머가 밥을 먹습니다.");
}
}
: 변경이 불가하거나 확장되지 않는 성질을 가지게 하는 기타 제어자
키워드 위치 | 의미 |
---|---|
클래스 앞 | 변경, 확장, 상속 불가한 클래스 |
메서드 앞 | 오버라이딩 불가한 메서드 |
변수 앞 | 값 변경 불가한 상수 |
: 서로 다른 두 개의 대상 사이를 연결하는 부분으로 상수와 추상 메서드만을 멤버로 가질 수 있다.
public interface InterfaceEx {
public static final int num = 1; // 인터페이스에서 변수 정의할 때는 **public static final** 사용, 생략 가능
public abstract void printNum(); // 인터페이스에서 메서드 정의할 때는 **public abstract** 사용, 생략 가능
}
: 클래스명 뒤 implements 인터페이스명 으로 인터페이스를 사용 가능하고, 클래스 내에 인터페이스의 모든 추상 메서드를 구현해야 한다. 그리고 인터페이스는 상속과 달리 다중 구현이 가능하다.
class 클래스명 implements 인터페이스명 {
... // 인터페이스의 모든 추상 메서드 구현
}
class 클래스명 implements 인터페이스명1, 인터페이스명2, 인터페이스명3 {
... // 인터페이스의 모든 추상 메서드 구현
}
: 기능이 가지는 역할과 구현을 분리해 개발 시간을 단축하고, 독립적인 프로그래밍을 통해 한 클래스의 변경이 다른 클래스에 미치는 영향을 최소화할 수 있다.