추상메소드
추상 메소드는 abstract를 사용하여 껍데기만 작성한 메소드다.
추상메소드가 있는 class를 추상클래스라고 한다.
추상클래스는 미완성 설계도에 비유하며, 인스턴스화 할 수 없다.
예를 들어 TV를 만드는데 대부분의 TV는 90%가 같은 기능이라고 하자. 그렇다면 설계도의 90%는 같으므로,
미리 90%가 만들어진 설계도를 작성해놓는 것이 좋을 것이다. 이때 쓰는 것이 바로 추상 클래스이다.
추상메소드의 디테일한 내용은 추상클래스를 상속받아 오버라이딩하여 구현해야 한다.
abstract class Shape { // 추상 클래스 선언
public Shape() { } // 생성자
public void paint() { draw(); } // 일반적인 메소드도 구현할 수 있다.
abstract public void draw(); // 추상 메소드 선언
}
class Line extends Shape{
@Override // 오버라이딩하여 구현
public void draw() {
System.out.println("line");
}
}
이때 추상클래스를 오버라이딩하지 않고 그냥 상속받으면 상속받은 클래스도 추상클래스다.
추상클래스를 통해 설계와 구현을 분리할 수 있다.
인터페이스
인터페이스는 규격화를 위해서 만든다.
미리 틀을 짜 놓았다고 생각하면 된다.
interface PhoneInterface{
public static final int Timeout = 1000;
public abstract void sendCall();
void receiveCall(); // public abstract 생략 가능
public static void printLogo() {
System.out.println("**Phone**");
}
}
interface Mp3{
public abstract void play();
}
class SamsungPhone implements PhoneInterface, Mp3 {
@Override
public void sendCall() {
System.out.println("전화 거는중...");
}
@Override
public void receiveCall() {
System.out.println("전화가 왔습니다");
}
@Override
public void play() {
System.out.println("노래...");
}
//메소드 추가 작성
public void flash() {System.out.println("flash가 켜졌습니다");}
}
implements를 사용하여 구현하고, interface에서 정의한 메소드들을 override한다. interface는 여러개를 다중구현할 수 있다.
추상클래스와 인터페이스는 둘 다 다형성을 위해서 존재하고, override해야한다는 점에서 비슷해 자주 헷갈린다.
그 둘의 차이점은 다음과 같다.
목적의 차이
추상클래스
- 서브클래스에서 필요한 대부분의 기능을 구현한다.
- 서브클래스에서만 필요한 부분은 추상메소드로 선언하여 서브클래스에서 구현하도록 한다.
인터페이스
- 객체의 기능을 표준화한 문서같은 것이다.
- 목적에 따라 상속받은 인터페이스들의 모든 추상메소드를 만들게 한다.
구성의 차이
추상클래스
- 추상 메소드
- 일반메소드
- 상수, 변수 필드
인터페이스
- 변수 필드(멤버변수)는 포함하지 않음
- 상수는 포함
- 추상메소드
- 일반메소드
- default메소드
- static메소드
- protected접근지정 선언 불가
- 다중상속 지원
* 상수 : 인터페이스에서 값을 정해줄테니 함부로 바꾸지 말고 제공해주는 값만 참조해라 (절대적)
* 추상메소드 : 가이드만 줄테니 추상메소드를 overriding해서 재구현해라. (강제적)
* default 메소드 : 인터페이스에서 기본적으로 제공해주지만, 맘에 안들면 각자 구현해서 써라. (선택적)
* 정적메소드 : 인터페이스에서 제공해주는 것으로 무조건 사용 (절대적)
https://limkydev.tistory.com/197 참고
'java' 카테고리의 다른 글
[spring] @RequestBody, @ResponseBody 란, 스프링 데이터 주고받기 (0) | 2021.11.30 |
---|---|
[java] 컬렉션과 제네릭에 대해 알아보기 (0) | 2021.11.03 |
[java] 상속 개념 정리, extends (0) | 2021.10.20 |
eclipse오류 해결 (0) | 2021.09.17 |
springboot 웹프로젝트 생성 오류 해결 (0) | 2021.09.03 |