일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- start.spring.io
- 콜렉션
- bootstrap
- 박싱
- Jenkins
- 스프링
- Short
- 내장객체
- boxing
- 컬렉션
- dependency
- 제네릭
- 언박싱
- 루프
- 클래스
- 빌드
- suvlet
- unboxing
- wrapper
- Java
- 싱글톤
- maven
- 메소드
- 무한
- https://start.spring.io
- Scanner
- 제너릭
- 자동형변환
- 싱글턴
- 인텔리제이
- Today
- Total
Developer Gonie
[2주차] 50. 인터페이스, 추상클래스와의 차이점*** 본문
* 인터페이스란?
겉으로 보여지는 기능은 추상클래스와 같게 내부 구현을 숨기고 기능만 표시하기 위한 추상화를 위한 추상메소드를 가진다. 따라서, 기능은 추상클래스와 거의 비슷하다고 할 수 있다. 인터페이스도 클래스이지만 작성할 땐 class가 아닌 interface 키워드를 사용한다.
그런데, 둘의 역할이 같다면 모두 존재할 이유가 없지 않은가? 이 때문에 영어로 다음과 같이 영어로 추가 검색을 실시하였다.
"when use abstract class and interface in java"
"difference between abstract class and interface in java"
이 결과로 얻게된 정보는 한줄로 정리할 수 있는 심플한 것이 아니었다.
둘 다 이런 저런게 공통적으로 가능하지만, 이건 저게 안되고, 저건 이게 안되니까 상황에 맞게 사용해야한다는 결론이었다.
아래의 내용을 참고하자.
기술면접, 추상클래스와 인터페이스의 차이
* 아래의 내용을 순차적으로 말해주며, 이럴 땐 이걸쓰고, 저럴땐 저걸쓴다고 설명하면 100점짜리 답변이 될거 같다.
추상클래스
1) 상속받을시 extends 키워드 사용
2) 다중상속 불가
3) 생성자 및 완성메소드를 가질 수 있다.
4) 값이 변할 수 있는 멤버변수 선언가능
5) 멤버함수에 public 및 protected, private 접근제어자를 사용할 수 있다.
인터페이스
1) 상속받을시 implements 키워드 사용
2) 다중상속 가능(여러개 나열)
3) 생성자 및 완성메소드를 가질 수 없다.
생성자가 이러한 이유는 일반 클래스와 인터페이스를 둘 다 상속받았을 때 생성자에서 super()를 호출할텐데
상속받은 일반 클래스의 생성자가 불리도록 설계되어 있기 때문인 것으로 보임.
4) 모든 멤버변수는 public static final 이 자동으로 붙어서 상수화가 되어 숫자로 초기화 해줘야 한다.
5) 모든 멤버함수는 public abstract 이 자동으로 붙어 이외의 접근제어자는 사용이 불가하다.
6) 부모에 선언된 추상메소드가 public 이었기 때문에 자식에서 완성된 추상메소드도 public 접근제어자가 붙어야 함.
둘을 언제 사용할지에 대한 기준은 다음과 같다.
https://www.geeksforgeeks.org/difference-between-abstract-class-and-interface-in-java/
"만약, 아래의 문장 중 하나가 당신의 상황에 적용된다면 '추상클래스' 사용을 고려해라." (인터페이스는 불가능한 것들)
1) 완성된 메소드와 같은 코드라인을 공유할 필요가 있는 관련 클래스가 여럿 존재하는 경우
2) non-static 이거나, 상수가 아닌 상태를 수정할 수 있는 non-final 변수를 정의하길 원하는 경우
3) public 이상의 접근제어자(protected, private)이 필요한경우
"만약, 아래의 문장 중 하나가 당신의 상황에 적용된다면 '인터페이스' 사용을 고려해라."
1) 완전 추상화를 할 수 있어 추상메소드만 있어도 되는 경우
2) 다중상속으로 2개 이상의 인터페이스를 상속받는 클래스가 필요한 경우
3) 특정 데이터 타입의 행동을 명시하길 원하나, 이 행동을 누가 구현할지 관심이 없는 경우
즉, 관련없는 클래스가 인터페이스를 구현할 수도 예상되는 경우.
추상클래스, 인터페이스 공통점
- 추상메소드를 가지며, 자식은 상속받은 미완성 메소드를 완성시켜줘야 한다.
- 미완성 상태이기 때문에 이것 만드로는 객체를 생성할 수 없다.
상속받은 클래스에서 혹은 익명클래스에서 추상메소드를 완성시켜준 경우에만 객체를 생성할 수 있다.
인터페이스 코드
interface Copymachine{ // 인터페이스는 디폴트로 public이 앞에 자동으로 붙음
void copy(); //인터페이스 안에있는 메서드는 앞에 public abstract 가 자동으로 추가된다.
}
interface Printmachine{
void print();
}
interface Faxmachine{
void fax();
}
// 인터페이스를 상속받을 땐 implements 키워드를 사용한다.
// 상속받은 이후 오류가 뜰텐데 클래스 앞에 abstract 를 붙여줘도 추상클래스처럼 에러 사라짐.
class Compound implements Copymachine, Printmachine, Faxmachine{
public void copy() { // 여기서는 public를 꼭 사용해야 함. 왜냐면 상속받은게 public 이기 때문에(이건 자동으로 안붙어 수동으로 해줄 것)
System.out.println("복사한다.");
}
public void print() {
System.out.println("프린트한다.");
}
public void fax() {
System.out.println("팩스 보낸다.");
}
}
public class Ex06_12_인터페이스 {
public static void main(String[] args) {
//Printmachine p = new Compound(); //다형성에 의해 업캐스팅이 자동으로 이뤄져 이것도 가능
Compound c= new Compound();
c.copy();
c.print();
c.fax();
}
}
실행결과
복사한다.
프린트한다.
팩스 보낸다.
'K-DigitalTraining 강의 > 1. Java' 카테고리의 다른 글
[2주차] 52. 예외처리, try - catch - (finally) 구문 (0) | 2022.06.01 |
---|---|
[2주차] 51. 인터페이스, 인터페이스와 클래스 상속을 동시에 받는 예제 (0) | 2022.06.01 |
[2주차] 49. 추상클래스, 반드시 만들어야할 것에 대해 미완성된 밑그림을 그려두는 것 (0) | 2022.05.27 |
[2주차] 48. 다형성, 이해를 위한 또 다른 예제* (0) | 2022.05.27 |
[2주차] 47. 다형성, 자식객체들을 부모타입의 참조변수로 한 번에 관리, 매개변수도 부모타입 하나로 자식객체들을 모두 받기가능* (1) | 2022.05.26 |