Java(추상클래스, 인터페이스)
2023. 3. 9. 01:57ㆍWEB개발/TIL
반응형
추상클래스
: 하나 이상의 추상 메서드를 포함하는 클래스
참고) 추상 메서드 없이도 abstract키워드를 붙여 추상클래스 생성 가능
추상메서드
: 선언은 되어 있으나 구현이 되어있지 않은 메서드
따라서, 추상 클래스를 상속받는 서브클래스에서 추상 메서드를 오버라이딩 해줘야 함
추상클래스 사용 이유
: 설계와 구현 분리를 위함
- 슈퍼(부모) 클래스에서 설계: 개념 정의
- 서브(자식) 클래스에서 구현: 구체적 행위 구현
추상클래스 예시)
// 추상클래스(슈퍼클래스)
public abstract class Abstract {
public int num;
public void test1() {};
// 추상메서드
public abstract void test(); // 설계
}
// 서브클래스
public class Sub_Abstract extends Abstract {
// 추상메서드 오버라이딩
public void test() {
// 구현
}
}
// Main클래스
public class Main_Abstract {
public static void main(String[] args) {
Abstract a = new Abstract(); // 에러 발생
Sub_Abstract s = new Sub_Abstract(); // 에러X
}
}
- 추상클래스는 객체 생성 불가
- 추상클래스를 상속 받는 서브클래스는 기본적으로 추상클래스가 됨
=> 서브클래스는 슈퍼클래스에서 정의된 필드와 메서드를 모두 물려받기 때문
- 서브클래스를 객체로 만들고 싶은 경우(=일반클래스가 되려면), 부모클래스의 모든 추상메서드를 구현해야 함
인터페이스
: 추상 메서드의 모음
여러 구현체(=서브 클래스)에서 공통적인 부분을 추상화하는 역할
= 서브 클래스가 같은 동작을 한다는 것을 보장하기 위해 사용
예시)
인터페이스: phone
서브클래스: samsung, iphone
- 휴대폰 공통 기능: sendCall, receiveCall, sendMessage, receiveMessage
// Phone 인터페이스
public interface Phone {
void sendCall();
void receiveCall();
void sendMessage();
void receiveMessage();
}
// Samsung 서브클래스
public class Samsung implements Phone {
@Override
public void sendCall() {
System.out.println("따르릉따르릉");
};
public void receiveCall() {
System.out.println("전화가 왔습니다!");
};
public void sendMessage() {
System.out.println("또롱");
};
public void receiveMessage() {
System.out.println("문자가 왔습니다!");
};
}
// Iphone 서브클래스
public class Iphone implements Phone {
@Override
public void sendCall() {
System.out.println("뚜둥뚜둥");
};
@Override
public void receiveCall() {
System.out.println("전화를 받으세요!");
};
@Override
public void sendMessage() {
System.out.println("슈웅");
};
@Override
public void receiveMessage() {
System.out.println("문자를 확인하세요!");
};
}
// Main 클래스
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Phone phone = null;
System.out.println("휴대폰 기종이 무엇인가요? -알파벳 소문자로 작성-");
Scanner scanner = new Scanner(System.in);
String model = scanner.next();
if (model.equals("samsung")) phone = new Samsung();
else if (model.equals("iphone")) phone = new Iphone();
else System.out.println("연결 실패");
// samsung, iphone 이외 문자 작성, "연결 실패"
if (phone != null) {
phone.sendCall();
// samsung으로 작성, "따르릉따르릉"
// iphone으로 작성, "뚜둥뚜둥"
phone.sendMessage();
// samsung으로 작성, "또롱"
// iphone으로 작성, "슈웅"
}
}
}
추상클래스와 다른점?
1) 추상메서드의 유무
추상클래스: 추상메서드가 없어도 상관없음
인터페이스: 추상메서드 무조건 있어야 함
2) 필드(=변수) 선언, 메서드 구현
추상클래스: 필드(변수) 선언 및 메서드 구현 가능
인터페이스: 필드(변수) 선언 불가(예외, public 상수 선언 가능-final 키워드 사용-)
3) 일반클래스로의 변환
추상클래스의 서브클래스는 추상클래스로 남는 것 or 일반클래스로 변환하는 것 모두 가능
인터페이스의 서브클래스는 무조건 일반클래스로 변환되어야 함
이유) 서브클래스는 인터페이스의 모든 추상메서드를 반드시 구현해야 하기 때문
인터페이스 문법
1) 변수 선언 불가, 상수 선언 가능
// Interface
public interface Interface {
public int num; // 필드(변수) 선언 불가
public final int num = 1; // 상수 선언 가능
int num2 = 2; // public final 생략 가능
public abstract void test();
void test1(int num); // public abstract 생략 가능
}
// Interface의 서브클래스
public class Sub_Interface implements Interface {
@Override // 오버라이드 메서드 위에 작성
public void test() {
};
@Override
public void test1(int num) {
};
}
2) 다중 상속 가능
: 클래스가 동시에 두 개 이상의 클래스를 상속받는 것
// 다중상속 가능
public class Sub_Interface implements Interface, InterfaceTest {
@Override
public void test() {
};
@Override
public void test1(int num) {
};
@Override
public int test2() {
return 0;
};
}
반응형
'WEB개발 > TIL' 카테고리의 다른 글
REST API (0) | 2023.03.21 |
---|---|
Spring 정의, Spring Boot, Thymeleaf 문법 (0) | 2023.03.21 |
Java(클래스의 상속) (1) | 2023.03.06 |
Java(Array, Class) (0) | 2023.03.06 |
Java(개발환경구축, 프로젝트 생성, 기본 문법) (0) | 2023.03.06 |