저를 포함한 초보자분들에게 도움이 됐으면 좋겠습니다.
초보자분들은 수박 겉핥기 식으로 알고 넘어가지 마시고, 조금이라도 왜 이렇게 프로그램이 돌아가는지 알고 가시는 시간이 됐으면 좋겠습니다.

오늘은 추상 클래스가 좀 더 '추상화'된 인터페이스에 대해서 살펴보겠습니다.
추상 클래스를 잘 모르시겠다면 다시 한번 보고 오시면 더욱 도움이 될 것입니다.
http://sims-solve.tistory.com/10?category=747624

추상 클래스 편에서도 '추상'이라는 단어를 살펴보았습니다. 위에서 언급했지만, 인터페이스(interface)는 추상 클래스보다 한 단계 더 '추상화' 된 것입니다.
잠깐 추상 클래스에 대해서 떠올려봅시다. 추상 클래스는 하나 이상의 추상메소드로 구성되어있으며, 상속받는 클래스에서 반드시 추상메소드를 구상메소드로 구현해야 했습니다.(구상메소드 => 구현된 메소드) 그럼! 추상 클래스보다 더 추상화된 인터페이스는 어떨까요? 
'추상화' 한다는 건 추상메소드처럼 공통되는 특성, 속성을 추출하여 선언만 하고 다른 곳에서 알맞게 구현하는 것이었습니다.
인터페이스는 추상 클래스에서 더 나아가 모든 메소드를 abstract 한 것입니다. 변수는 상수만 정의할 수 있습니다.
예시를 보면서 이야기해 봅시다.

 (1)public interface shapeInterface {
	public int k = 3;
    public void area();
}
=========================================
public class rectangle implements shapeInterface {
	public static void main(String args[]) {
		rectangle test = new rectangle();
		
		//test.k=5;  ------> shapeInterface의 k를 변경하려고 할 때 error
		System.out.println(shapeInterface.k); // 3
		System.out.println(k); // 3 
		
	}
	@Override
	public void area() {
		System.out.println("넓이구하기");
	}
}

(1)처럼 간단하게 예시를 보도록 하겠습니다.
일단 Class를 만드는 것처럼 만들되, class가 아닌 interface 키워드를 사용하여 Interface로 만들게 됩니다. 이렇게 인터페이스(interface)로 만들게 되면 자동으로 결정되는 것이 있습니다. 변수는 static final, 메소드는 abstract 키워드를 써주지 않아도 변수는 static final, 메소드는 abstract 키워드를 사용 한 것처럼 됩니다. 증명해봅시다.
rectangle에서 객체 test를 만들어 test.k를 통하여 interface의 k 값을 5로 변경하려고 하면
"The final field shapeInterface.k cannot be assigned"라는 에러를 볼 수 있습니다. final 필드를 바꿔줄 수 없다는 소리죠. interface에서 변수를 선언하면 자동으로 상수(final)이 된다는 소리죠.
한 가지 더 있습니다."System.out.println(shapeInterface.k);" 이 부분입니다. 이 부분을 보시고 한 가지 떠올라야 하는 키워드가 있습니다. 바로 static이죠. 하지만 우리는 interface에 static을 지정하지 않았죠. 여기서 알 수 있듯, interface에서 선언한 변수는 반드시 static이 된다는 것 또한 알 수 있습니다.
정리해보자면, 따로 명시해주지 않아도 자동으로 final static 변수가 되는 것이죠.

이번엔 메소드 입니다. 메소드는 추상메소드와 같습니다. interface 안에서도 구상메소드(구체적으로 구현된 메소드)를 선언하지 못합니다. 하지만 추상메소드처럼 abstract 키워드를 명시적으로 사용하지 않아도 자동으로 abstract 됩니다. 즉. "public void area();"만 하더라도 자동으로 abstract 된다는 것이죠.
이제 상속받는 클래스에선 반드시 interface의 메소드들을 구상메소드로 구현해 줘야 하죠.
내용은 추상메소드와 같습니다. 그럼 interface를 사용하는 이유는 뭘까요? 무슨 이점이 있는 걸까요?
객체지향 프로그래밍은 클래스 간에 결합도가 낮을수록 좋습니다. 이유는 A 클래스가 바뀌면 B 클래스까지 수정해야 한다면, 개발자 입장에선 좋을까요? 싫습니다. 이러한 결합도를 낮추기 위해 '추상화'를추구하는 것입니다.

자 그럼 추상 클래스 vs 인터페이스를 정리하고 마무리해보겠습니다.
추상 클래스 =  추상메소드(1개 이상) + 구상메소드 / 인터페이스 = 추상메소드(only)
추상 클래스 변수 = 일반 변수 / 인터페이스 변수 = static final 변수
추상 클래스 상속 = extends / 인터페이스 상속 = implements 
클래스 상속 개수 =  1개(추상 클래스 or 클래스) / 인터페이스 상속 개수 = 무한대

이렇게 간단하게 정리해 보았습니다. '추상'이라는 말이 계속 나오고 있습니다. 한번 다시 곰곰이 생각해보시고 정리하시길 권합니다. 오늘은 여기까지입니다!

다음 편은 내재 클래스(Nested class)를 살펴보겠습니다.

+ Recent posts