본문 바로가기
Java & Spring Boot

인터페이스와 추상 클래스

by 향각산 2018. 11. 28.

 

 

인터페이스와 추상 클래스입니다.

public interface One { 	//Interface 	public void make(); 	 }  
public abstract class Two { 	public void remove(){ 		//Abstract Class 	}  }  

차이점이 보이시나요?

Interface는 make(); 까지만 작성하였고 abstract class는 remove(){ }까지 작성했네요.

 

인터페이스에 make() 메소드는 내용을 구성하면 안됩니다. 오직 껍데기만 존재해야 하죠. 반대로 추상클래스는 작성한 remove() 메소드는내용를 작성해야 합니다.

 

 

그 이유는 인터페이스에 구성되는 모든 메소드가 추상메소드 이기 때문입니다. 추상 메소드는 일반 변수들을 포함할 수 없습니다.

실제 interface에 작성된 make()는 아래와 같은 모습입니다. 단 interface는 모든 변수가 static final 이기 때문에 abstract를 생략할 수 있습니다.

public interface One { 	//Interface 	abstract public void make(); } 

그렇다면 추상메소드 make()와 추상클래스 내부에 있는 remove()는 무엇이 다른가?

 

1. abstract 클래스는 extends로 상속받고 interface는 Implements로 상속받습니다.

2. 추상 메소드는 무조건 오버라이드 해야합니다. 즉 interface를 상속받으면 무조건 인터페이스에 정의된 메소드를 사용해야 하죠.

 

 class Number extends Two implements One {  	@Override 	public void make() { 	}  }

위 코드를 보시면 extends를 이용, 추상클래스 Two와 인터페이스 One을 상속 받았습니다.

하지만 제가 오버라이드 한 코드는 인터페이스에 있는 make()뿐입니다.

 

 

 

그렇다면 인터페이스에 있는 모든것을 사용해야 할까요? 그것은 아닙니다. 추상메소드가 아니라면 부르지 않아도 상관없습니다.

하지만 또 다른 특징을 가지고 있습니다. 바로 static final 이기 때문에 생기는 특성이죠.

public interface One { 	//Interface 	abstract public void make();       int DATA = 10; } 
인터페이스에 int data를 선언했습니다. 실제로는 static final int DATA = 10; 이 되겠죠. (인터페이스에서 앞부분은 생략가능합니다.)
class Number extends Two implements One { 	@Override 	public void make() {            System.out.print("DATA Value = " + DATA);       //가능, 이상없음             DATA = 20;                                      //에러코드    	} }

바로 변수 값을 수정할 수 없다는 점입니다.

 

마지막으로 추상클래스는 추상 메소드를 포함할 수 없는가?

 

정답은 가능합니다. 추상클래스도 추상 메소드를 포함할 수 있으며 방법은 다음과 같습니다.

public abstract class Two { 	public void remove(){ 		//Abstract Class 	}       abstract public void reset();      //앞에 abstract를 선언하여 추상 메소드로 }  

그렇다면 Two 클래스를 상속받은 클래스에서 꼭 오버라이드 해야겠죠?

 

정리하면

1. 인터페이스에 설계된 메소드는 모두 추상메소드이며 상속받을때 implements를 사용한다.

2. 추상 클래스에 설계된 메소드는 추상메소드가 아니기 때문에 내용( { } )을 작성해야 하며 추상메소드를 만들고 싶다면 abstract를 붙여야 한다.

3. 인터페이스에 정의된 변수는 static final이여서 값을 변경할 수 없다.

4. 추상메소드는 상속받으면 꼭 오버라이드 해야한다.

 

 

 

'Java & Spring Boot' 카테고리의 다른 글

Java -jar 커맨드 명령어  (0) 2020.09.11
H2 In-Memory 사용법  (0) 2020.06.15
extends와 implements  (0) 2018.12.24
Java SE와 Java EE 차이점  (0) 2018.11.24
이클립스 패키지 차이점  (0) 2018.11.24