● 추상 클래스
- 필드 안에 구현이 안된 메소드가 선언되어 있는 클래스를 추상 클래스라고 한다.
- 이 때 구현되지 않은 메소드를 추상 메소드라고 부른다.
- 반드시 재정의를 통해 구현해야 메모리에 할당되기 때문에 "강제성"을 부여하기 위해서 추상 메소드로 선언한다.
※ 일반 메소드도 선언 가능하다.
● 추상 클래스 선언
abstract class 클래스명 {
abstract 리턴타입 메소드명(자료형 매개변수, ...);
}
● 인터페이스 : 틀
- 추상 클래스를 고도화 시킨 문법
- 상수와 추상메소드만 존재한다.
- 구현은 인터페이스를 지정한 클래스에서 진행하고,
인터페이스를 다른 클래스에 지정할 때에는 implements 키워드를 사용한다.
● 추상 클래스와 인터페이스 간의 관계
- 인터페이스를 클래스에 바로 지정하면 모든 메소드에 강제성이 부여되서 전부 다 구현해야 한다.
- 하지만 일반적인 상황에서는 모든 것이 아닌, 필요한 메소드를 골라서 재정의해야한다.
- 인터페이스를 직접 지정하지 않고 다른 클래스에 지정한 후 바디를 만들어 놓는다면 강제성이 소멸되고,
이 클래스를 상속받아서 필드를 구현한다면, 골라서 재정의할 수 있게 된다.
- 이 때 중간에서 강제성을 없애주는 클래스를 추상 클래스로 선언하며,
클래스 이름 뒤에 Adapter를 붙여서 목적을 알려준다.
● 다중 상속
- 여러 부모 클래스를 상속하는 것을 다중 상속이라고 한다.
- JAVA는 모호성 때문에 다중 상속을 지원하지 않는다.
- 하지만 JDK8버전 부터는 인터페이스에 default 메소드 선언을 허용하며,
여러 개를 지정할 수 있는 인터페이스 특성 상 다중 상속을 지원하는 것이나 다름이 없다.
실습(추상 클래스)
1. 추상 클래스(Electronics.java)를 생성한다.
public abstract class Electronics { // abstract : 추상 클래스
// 추상메소드(선언 O, 구현 X)
abstract void on();
abstract void off();
// final -> 재정의하지 말아라
final void intro() {
System.out.println("안녕 난 전자제품이야.");
}
}
2. 추상 클래스를 상속받는 클래스를 생성하여 추상 메소드를 재정의한다.
- WashingMachine.java
public class WashingMachine extends Electronics{
// 추상 클래스의 추상메소드 재정의
@Override
void on() {
off();
}
// 추상 클래스의 추상메소드 재정의
@Override
void off() {
System.out.println("전원 누르기");
}
}
- Refrigerator.java
public class Refrigerator extends Electronics{
@Override
void on() {
System.out.println("스위치를 올린다.");
}
@Override
void off() {
System.out.println("스위치를 내린다.");
}
}
실습(인터페이스)
1. 인터페이스(Pet.java)를 생성한다.
public interface Pet {
final static int eyes = 2; // final : 값을 변경할 수 없다.
int nose = 1; // 일반 변수
abstract void sitDown(); // 추상 메소드
void stop(); // 일반 메소드
void poop(); // 일반 메소드
void 빵야(); // 일반 메소드
}
2. 생성한 인터페이스를 사용하는 클래스를 생성하여 메소드를 재정의한다.
- Puppy.java
public class Puppy implements Pet {
@Override
public void sitDown() {
System.out.println("앉습니다.");
}
@Override
public void stop() {
System.out.println("기다립니다.");
}
@Override
public void poop() {
System.out.println("볼일을 보겠습니다.");
}
@Override
public void 빵야() {
System.out.println("총 맞은 것 처럼 눕습니다.");
}
}
- Cat.java
public class Cat implements Pet{
@Override
public void sitDown() {
System.out.println("싫어");
}
@Override
public void stop() {
System.out.println("싫어");
}
@Override
public void poop() {
System.out.println("알아서 잘 한다.");
}
@Override
public void 빵야() {
System.out.println("손가락을 뭅니다.");
}
}
실습(추상클래스(인터페이스의 강제성 제거))
1. 인터페이스(Pet.java)를 생성한다.
public interface Pet {
final static int eyes = 2;
int nose = 1;
abstract void sitDown();
void stop();
void poop();
void 빵야();
}
2. 생성한 인터페이스를 사용하는 추상 클래스를 생성하여 메소드를 재정의한다.
public abstract class PetAdapter implements Pet{ // 추상 클래스
@Override
public void sitDown() {
}
@Override
public void stop() {
}
@Override
public void poop() {
}
@Override
public void 빵야() {
}
}
3. 위의 추상 클래스를 상속받는 클래스를 생성하여 일부 메소드만 재정의한다.
- 강제성이 사라졌으므로 일부만 재정의도 할 수 있게 된다.
public class Tiger extends PetAdapter{
@Override
public void poop() {
System.out.println("알아서 한다.");
}
}
'웹 개발 > Java' 카테고리의 다른 글
[Web_JAVA] 24 (0) | 2022.03.10 |
---|---|
[Web_JAVA] 23 (0) | 2022.03.09 |
[Web_JAVA] 21 (0) | 2022.03.07 |
[Web_JAVA] 20 (0) | 2022.03.06 |
[Web_JAVA] 19 (0) | 2022.03.05 |