Notice
Recent Posts
Recent Comments
관리 메뉴

Developer Gonie

[2주차] 50. 인터페이스, 추상클래스와의 차이점*** 본문

K-DigitalTraining 강의/1. Java

[2주차] 50. 인터페이스, 추상클래스와의 차이점***

이대곤 2022. 6. 1. 18:42
 

* 인터페이스란?

겉으로 보여지는 기능은 추상클래스와 같게 내부 구현을 숨기고 기능만 표시하기 위한 추상화를 위한 추상메소드를 가진다. 따라서, 기능은 추상클래스와 거의 비슷하다고 할 수 있다. 인터페이스도 클래스이지만 작성할 땐 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();
	}
}

실행결과

복사한다.
프린트한다.
팩스 보낸다.
 
Comments