카테고리 없음
20240823 9일차
happyst
2024. 8. 23. 17:26
[추상 클래스]
- 객체를 생성할 수 있는 클래스 (실체 클래스)들의 공통적인 필드/메소드를 추출해서 선언한 클래스
- 클래스가 설계도라면, 추상 클래스는 미완성 설계도
- 선언: [접근지정자] abstract class [클래스 이름]
- new 연산자를 이용해서 객체를 직접 만들지 못함!!
- 상속을 통해 자식 클래스만 만들 수 있음
[추상 메서드]
- 선언부만 있고 구현부가 없는 메서드
- 추상 메소드 선언: abstract [return type] method_name (params);
- 자식 클래스들의 공통 메소드를 뽑아서 추상 클래스로 작성할 때, 메소드 시그니처만 동일하고 메서드 내용은 자식 클래스마다 달라야 하는 경우가 많음
- 추상 메소드는 메소드의 필요성만 알고, 아직 메소드의 내용을 모르기 때문에, 메소드 실행 내용인 중괄호 { }가 없음
- 자식 클래스에서 반드시 추상 메소드를 오버라이딩 해야함!!
[인터페이스]
- 완전히 추상적인 개념을 정의하는 데 사용됨
- 인터페이스 내에 선언된 필드는 기본적으로 'public static final'로 선언되며, 상수로만 사용됨 (public static final 키워드 생략 가능)
- 다중 상속을 지원하기 때문에 클래스의 다중 상속 효과를 "간접적"으로 얻을 수 있음
- 여러 클래스가 공통 기능을 구현해야 하지만, 상속 계층에 속하지 않을 때 사용함
- 인터페이스 내에는 구현된 메소드를 포함 불가 (디폴트 메서드, 정적 메서드 예외)
- 인터페이스 내에서 명시가 필요한 접근지정자: default, static, private
- public, abstract는 생략 가능
- 인터페이스는 최고 조상이 없다 (class는 최고 조상이 Object임)
- default method: 인터페이스 내에서 기본적으로 제공하는 구현부가 포함된 메서드
- 인터페이스의 확장성을 높여줌 (새로운 메서드를 추가하면서 하위 호환성 유지 가능)
- 인터페이스를 구현하는 클래스에서 선택적으로 오버라이딩 하여 사용 가능
- 인터페이스에서의 static field와 static method
- static field는 인터페이스의 이름 및 인터페이스를 구현한 객체를 통해서도 접근 가능
- static method는 인터페이스의 이름을 통해서만 호출 가능
- 인터페이스 상속
- 인터페이스 - 인터페이스 상속: interface 자식인터페이스 extends 부모인터페이스
- 자식 클래스 - 인터페이스 구현: class 자식클래스 implements 부모인터페이스
- 인터페이스 - 다중 인터페이스 상속: interface 자식인터페이스 extends 부모인터페이스1, 부모인터페이스2
- 자식클래스 - 다중 인터페이스 구현: class 자식클래스 implements 부모인터페이스1, 부모인터페이스2
- 자식클래스 - 부모클래스 상속, 다중 인터페이스 구현: class 자식클래스 extends 부모클래스 extends 부모인터페이스1, 부모인터페이스2
인터페이스 vs 추상 클래스
인터페이스 | 추상 클래스 | |
---|---|---|
목적 | - 클래스가 구현해야 하는 메서드의 집합을 정의하여 다형성을 쉽게 구현함 - 특정 기능의 구현을 강제함 | - 여러 클래스 간에 공통된 코드를 재사용 - 추상 개념 표현 - 상속 구조 지원 |
구현 메소드 | 포함 ❌ * default 메서드, static 메서드는 예외 | 포함 ⭕ |
인스턴스 변수 | 포함 ❌ | 포함 ⭕ |
다중 상속 | ⭕ | ❌ |
default 메서드 | ⭕ | ❌ |
생성자, main( ) | ❌ | ⭕ |
상속에서의 부모 | 인터페이스 | 인터페이스, 추상 클래스 |
접근 범위 | 모든 멤버 공개 | 추상 메서드를 최소한 자식에게 공 |
최고 조상 | 없음 | Object Class |
[익명 클래스]
- 중첩 클래스의 특수한 형태로 코드가 단순해지기 때문에 이벤트 처리나 스레드 등에서 자주 사용
- 이름이 없는 일회성 클래스로, 클래스를 정의하고 즉시 인스턴스화할 때 사용됨
- 인터페이스나 추상 클래스를 구현하거나 기존 클래스의 메서드를 오버라이딩할 때 사용