20220916(금)
- 목차
- 추상 클래스
- 추상 메소드
- 인터페이스
< 추상 클래스 > - 실체 클래스는 추상 클래스를 무조건 상속받아 작성
실체 클래스가 공통적으로 가져야 할 필드와 메소드를 정의해 놓은 추상적인 클래스
- 상속을 목적으로 한다.
클래스들 보니까 공통적인 특성이 있네? 뽑아내서 상속하게 하자.
왜? ➡ 이 클래스들이 추상 클래스의 추상 메서드를 구현하려고. - 객체를 생성할 수 없다.
실체 클래스들의 공통되는 필드와 메서드 정의한 클래스
추상 클래스는 실체 클래스의 부모 클래스 역할 (단독 객체 X)
- (실체) 클래스와 추상 클래스의 차이
(실체) 클래스 | 추상클래스 |
설계도로 객체를 만든다. (실체 클래스 : 객체를 만들어 사용할 수 있는 클래스) |
미완성 설계도 - 필드, 메서드, 생성자도 만들 수 있고 + 추상메서드 - 객체생성 불가능. A a = new A(); 작업 불가능 |
- 재사용, 코드량 줄이기 목적 | - 상속이 목적 |
- 추상 클래스의 용도
실체 클래스의 공통된 필드와 메소드의 이름 통일할 목적
ex) 개발자마다 "에이3만드세요~" ➡ aaa(); AAA(); aAa(); 개발자별로 난리남
기본적으로 만들어야 할 기능들을 ➡ 추상 클래스에 강제적으로 집어넣으면 개발자별로 맘대로 만들 수 없다! - 추상 클래스 선언
클래스 선언에 abstract 키워드 사용
New 연산자로 객체 생성하지 못하고 상속 통해 자식 클래스만 생성 가능
public abstract class 클래스 { // 필드 // 생성자 // 메소드 }
< 추상 메서드 >
메소드의 선언만 통일화하고, 실행 내용은 실체 클래스마다 달라야 하는 경우
일반메서드 | 추상메서드 |
void methodA() { } 메소드의 실행 내용 작성(오버라이딩(Overriding)) |
abstract void methodA(); 메소드의 선언부만 작성 (추상 메소드) |
* 추상메서드가 하나라도 있으면 클래스에도 abstract를 달아줘야 한다. abstract class A { abstract void methodA(); } |
- 메소드 이름 동일하지만, 실행 내용이 실체 클래스마다 다른 메소드?
➡ ex) 동물은 소리를 낸다. 하지만 실체 동물들의 소리는 제각기 다르다.
- 원하지 않아도 상속받아야 하는 추상 메소드
상속받았으면 Horse가 원하지 않아도 Animal의 sound를 상속받아야 한다.
작업할 때마다 상속받아서 작업해야 함 ➡ 강제적으로 쓰게 하기 위함
(이렇게 미리 설계되어 있으면 개발자가 바뀌어도 추가되는 작업에 대해 일관성이 생긴다.)
만약 구성 안 하고 넘기려면 Horse도 abstract으로 만든 뒤 넘긴다.
* 하지만 Horse를 상속받는 HorseSon에는 Animal의 추상 메서드를 써야 함.
(끝없이 대물림 되는 abstract 메서드 ㅎㅎ)
< 인터페이스 역할과 선언 >
- 클래스 vs 추상 클래스 vs 인터페이스
클래스 : 완성 설계도 | 추상 클래스 : 미완성 설계도 | 인터페이스 : 추상메소드 목적 |
- 객체 생성, 상속 목적 선택적 - 필드, 메소드, 생성자 |
- 객체 생성 불가, 상속 목적 - 필드, 메소드, 생성자, 추상메소드 |
- 객체 생성 불가, 상속 목적 ( = 추상 클래스) - 상수, 추상메소드, 디폴트메소드, static 메소드 |
- | - 단일 상속 : 2개 이상의 부모 클래스를 상속 X |
- 다중 상속 : 2개 이상의 인터페이스를 상속할 수 있다. |
- 인터페이스란?
- 객체의 사용방법을 정의한 타입
- 개발 코드와 객체가 서로 통신하는 접점 / 데이터를 저장할 수 없음
- 인터페이스의 역할
개발 코드가 객체에 종속되지 않게 ➡ 객체 교체할 수 있도록 하는 역할
개발 코드 변경 없이 리턴 값 또는 실행 내용이 다양해질 수 있음 (다형성)
- 인터페이스 선언
➡ 인터페이스는 객체 사용 설명서이므로 런타임 시 데이터를 저장할 수 있는 필드 선언 X
interface 인터페이스명 {
// 상수
타입 상수명 = 값;
// 추상 메소드
타입 메소드명(매개변수, ...);
// 디폴트 메소드
default 타입 메소드명(매개변수, ...) {...}
// 정적 메소드
static 타입 메소드명(매개변수) {...}
}
(1) 상수 필드 | - 인터페이스는 상수 필드만 선언 가능 ➡ 데이터 저장하지 않음 - 인터페이스에 선언된 필드는 모두 public static final 자동적으로 컴파일 과정에서 붙음 |
(2) 추상 메소드 | - 인터페이스 통해 호출된 메소드는 최종적으로 객체에서 실행 - 인터페이스의 메소드는 기본적으로 실행 블록이 없는 추상 메소드로 선언 - public abstract를 생략하더라도 자동적으로 컴파일 과정에서 붙게 됨 |
(3) 디폴트 메소드 | - 자바8에서 추가된 인터페이스의 새로운 멤버 - 실행 블록을 가지고 있는 메소드 |
(4) 정적 메소드 |
< 인터페이스 구현 >
(1) 구현 클래스
public class 구현클래스명 implements 인터페이스명 { // 인터페이스에 선언된 추상 메소드의 실체 메소드 선언 }
(2) 익명 구현 객체
인터페이스 변수 = new 인터페이스() { // 인터페이스에 선언된 추상 메소드의 실체 메소드 선언}
- 이름이 없다. / 소스 파일을 만들지 않고 구현 객체를 만들 수 있는 방법 제공
- 일회성으로 쓰겠단 의미 (클래스는 영구적으로 사용 가능)
(3) 다중 인터페이스 구현 클래스
public class 구현클래스명 implements 인터페이스A, 인터페이스B {
// 인터페이스 A에 선언된 추상 메소드의 실체 메소드 선언
// 인터페이스 B에 선언된 추상 메소드의 실체 메소드 선언
}
✨ 추상메소드는 무조건 필수이나,
디폴트 메소드와 static 메소드는 상속클래스에서 선택적으로 사용가능.
'🏫 Open API_JAVA' 카테고리의 다른 글
[41일차] 자동 리소스 닫기 / 사용자 정의 예외와 예외 발생 / java.lang과 java.util 패키지 / Object 클래스 / Tomcat 설치 (0) | 2022.09.21 |
---|---|
[40일차] 인터페이스 상속 / 디폴트 메소드와 인터페이스 확장 / 중첩 클래스 / 익명 객체 / 예외처리 (0) | 2022.09.20 |
[38일차] 필수 이론 정리 / 오라클 테이블 생성 / 매개 변수의 다형성 (0) | 2022.09.19 |
[37일차] final / 접근 제한자 / 타입 변환과 다형성 / Oracle Database 설치 (0) | 2022.09.15 |
[36일차] static / 싱글톤 / final / import 문 / 디버깅 / getter setter / 상속 / 재정의 (0) | 2022.09.14 |