다형성을 위해 메서드의 선언은 통일해야 하지만,
실제로 구현하는 내용은 자식 클래스마다 달라야 할 때
부모 클래스의 메서드는 비워두고 자식 클래스에서
오버라이딩하여 구현해낼 수 있다.
자바는 이와 같은 경우를 공식 지원하여 방법을 제공하는데
그것이 바로 '추상 메서드' 이다.
[ 추상 메서드 ]
추상 메서드를 선언할 때는 반드시
abstarct 키워드를 함께 표기해야 한다.
또한 메서드 구현부인 중괄호{} 대신
구현부가 없다는 의미로 선언부 끝에
세미콜론 ; 을 사용한다.
[접근 제한자] abstract 반환 타입 메서드 이름 (매개변수);
public class Aniomal{
abstract void cry();
}
추상 메서드의 제약 조건은 아래와 같다.
추상 메서드를 1개 이상 선언하면,
그 클래스는 추상 클래스로 선언되어야 한다.
[ 추상 클래스 ]
추상 메서드의 제약 조건인
추상 클래스는 무엇인가?
하나 이상의 추상 메서드를 포함하는
클래스를 가리켜 추상 클래스라고 한다.
추상 메서드를 포함하고 있다는 것을 제외하고는
일반 클래스와 다르지 않다.
추상 클래스에서도 생성자가 있으며,
멤버변수와 메서드도 가질 수 있다.
추상 클래스를 선언하는 방법도 유사하다.
추상 메서드와 마찬가지로 abstract 선언
[접근 제한자] abstract class 클래스 이름{
//필드
//생성자
//메서드 (추상 메서드 포함)
}
추상 클래스로 선언되는 클래스는
다음과 같은 제약 조건을 가진다.
일반 클래스처럼 독립적으로 생성자를 호출해
객체를 생성할 수 없다.
자식 클래스의 생성자에서 super()를 통해
추상 클래스의 생성자를 호출하여
부모 객체를 생성한 후 자식 객체를 생성한다.
추상 클래스는 직접 부모 클래스 객체를
생성하지 못한다는 큰 특징을 갖고 있기 때문에
추상 메서드가 반드시 있어야 하는 것은 아니다.
그럼 언제 추상 클래스에 추상 메서드가 구현되어야 할까?
자식 클래스들이 반드시 구현해야만 하는
메서드가 있다면 추상 메서드로 해당 메서드를
부모 클래스(추상 클래스)에 선언해 둘 수 있다.
추상 클래스를 상속받은 모든 자식 클래스는
반드시 추상 메서드를 오버라이딩 및 재정의하여
구현해야만 한다. (안할 시 컴파일 에러 발생)
이를 통해 결과적으로
자식 클래스들의 규격과 내용이 통일되며,
객체 지향 프로그래밍의 다형성을 구현하게 된다.
예시) 추상 클래스 용도
전구 클래스 : 빛난다 메서드
→ 주황색 전구 클래스 : 주황색 빛남
→ 백색 전구 클래스 : 백색 빛남
→ 노란색 전구 클래스 : 노란색 빛남
전규 규격은 동일하고 색상만 다른 것처럼,
추상 클래스는 동일한 규격을 제공하고
자식 클래스들은 각각 독립적인 메서드를 가질 수 있다.
[ 인터페이스 ]
모든 메서드가 추상 메서드인 일종의 추상 클래스를
우리는 인터페이스 라고 부른다.
인터페이스는 추상 메서드와 상수로만 이루어져 있으며,
추상 클래스와 마찬가지로 스스로 객체를 생성할 수 없다.
추상 클래스와 같은 역할 같지만 완전히 다른 취지를 갖고 있다.
추상 클래스
> 자식 클래스들의 공통적 특징을 추출하고 제공
인터페이스
> 다른 클래스 코드들과의 중간 매개 역할을 함
▼ 인터페이스 선언
[접근 제한자] interface 인터페이스 이름 {
접근 제한자 abstract 메서드 이름(매개변수)
}
public interface Phone {
abstract void openingLogo();
abstract void powerOn();
abstract void powerOff();
}
인터페이스를 선언하는 방법은 클래스와 동일하며
class 대신 interface 키워드를 작성한다.
또한 다른 클래스들과의 매개체 역할을 하므로
누구나 접근할 수 있는 public으로 작성되어야 한다.
클래스와 달리 인터페이스의 모든 필드는
public / static / final 이어야 하며
모든 메서드는 public / abstract 여야 한다.
단 이는 모든 인터페이스의 공통사항이므로
생략할 수 있으며 컴파일 시 자동으로 추가된다.
필드 대신 선언되는 상수는 명명 규칙이 있다.
1) 영문 대문자로 작성
2) 2개 이상의 단어를 조합할 때는 언더바_로 연결
▼ 인터페이스 상수 선언 예시
public interface Phone {
public static final int MAX_BATTERY_CAPACITY = 100;
abstract void openingLogo();
abstract void powerOn();
abstract void powerOff();
}
[ 인터페이스 사용 ]
인터페이스도 자신이 가지고 있는
추상 메서드를 구현해줄 클래스가 있어야 한다.
이를 '구현 클래스' 라고 한다.
구현 클래스는 인터페이스를 사용해 구현하겠다는
선언을 해야하며 implements 키워드를 사용해 명시한다.
[접근 제한자] class 클래스이름 implements 인터페이스 이름{
//필드
//생성자
//구현메서드(추상메서드 오버라이딩)
}
다중 인터페이스 구현
, 콤마를 활용하여 여러개 기재
[접근 제한자] class 클래스이름 implements 인터페이스1, 인터페이스2...{
//필드
//생성자
//구현메서드(추상메서드 오버라이딩)
}
참고로 인터페이스의 모든 추상 메서드를
오버라이딩하지 않으면 에러가 발생한다.
인터페이스 장점
- 실제 구현 클래스의 내용을 전혀 보지 않고도
개발 코드로 객체를 사용할 수 있다. => 정보 은닉 - 구현 클래스들이 독립적으로 구현되고 사용될 수 있으며
객체 변경이 필요할 때, 수정을 최소화할 수 있다.
=> 모듈화
인터페이스 상속
인터페이스끼리도 상속 관계가 가능하다.
클래스 상속과 마찬가지로 extends 키워드를 사용하며,
다중 상속이 가능하기 때문에 ,콤마도 쓸 수 있다.
(클래스는 다중 상속이 불가능하다.)
상속을 선언하면 하위 인터페이스는
상위 인터페이스의 모든 멤버를 상속받게 되므로
하위 인터페이스를 구현하는 '구현 클래스'는
'하위 인터페이스의 추상 메서드'를 포함하여
'상위 인터페이스의 추상 메서드'까지 구현해야 한다.
'개주 훈련일지 > 📚 코살대 교본 학습' 카테고리의 다른 글
| 프로젝트 계획과 관리 (0) | 2025.12.01 |
|---|---|
| 소프트웨어 개발 방법론 (0) | 2025.12.01 |
| 소프트웨어 개발 애자일 모델 (0) | 2025.11.30 |
| 소프트웨어 개발 프로세스의 전통적인 모델 (0) | 2025.11.15 |
| 소프트웨어 개발 프로세스 (1) | 2025.11.11 |