JAVA/이론

[JAVA] 추상클래스와 인터페이스(다형성)

Sunwoo_bang 2021. 1. 5. 21:10

1. 추상 클래스(Abstract class)
 추상클래스는 미완성 도면이라고 생각하면 이해하기 쉬울거야. 
 예를 한 번 들어볼게.

1. A회사가 만든 문은 손으로 닫는 문       

2. B회사가 만든 문은 자동으로 닫는 문    
3. C회사가 만든 문은 양쪽으로 닫는 문    


이상 A,B,C 회사 문은 닫히는 방법은 각기 다르지만 결국 '닫히다' 라는 공통점이 있어.
'닫힌다' 라는 행위를 메소드라고 본다면, 공통된 메소드만 정의해 놓은 클래스가 바로 추상 클래스라고 할 수 있어.

 

"추상 메서드를 선언하여 상속을 통해서 자손 클래스에서 완성하도록 유도하는 클래스"

 

이제는 이렇게 표현해도 이해할 수 있겠지?

추상 클래스가 가질 수 있는 것들은 다음과 같아.
 1) 필드         
 2) 생성자      
 3) 추상메서드

생성자를 가지기 때문에 객체화가 가능하고 인터페이스와 다르게 필드도 가질 수 있어.  

<추상클래스의 표현>

public abstract class Hello { 
	public String words; 
  
	//추상메소드. 선언만 해주자. 
	public abstract void voice(); 
} 

클래스 앞에 abstract 만 붙여주면 끝!
그럼 추상클래스를 정리해보자.

 

" 
추상클래스는 추상메소드 및 생성자나 필드를 가진 클래스이다. 
상속 관계가 있을 때 추상클래스가 사용될 수 있다. 
단일상속이다. 
"

 

 

 

 

 

2. 인터페이스(Interface)
인터페이스는 기본 설계도라고 보면 이해하기 쉬울거야.
예를 들어볼게.


1. 문을 만들도록 지시가 내려졌다.
2. 가로길이 90cm, 참나무를 사용한 여닫이 문을 만들어야한다.

추상클래스는 원리만 같다면 어떻게든 만들어도 돼- 라는 식이었다면
인터페이스는 내가 지정한 규격대로 만들어야해! -라는 식이야.

인터페이스가 가질 수 있는 것들은 다음과 같아.

 1) 상수              
 2) 추상메소드     
 3) 정적메소드     
 4) 디폴트 메소드

상수, 추상메소드, 정적메소드 들은 변경이 불가능한 것들이야. 인터페이스에 정해진 규격대로 만들어야 하지.
그러나 4번의 디폴트 메소드 는 변경이 가능하다는 특징을 갖고있어. 
인터페이스를 사용해서 만든 시스템이 환경적 변화 등으로 인해서 반드시 바꾸거나 추가해야하는 부분이 생길 경우 

오버라이딩을 통해 변경 가능하게 만들어둔게 디폴트 메소드라고 보면 돼!


<인터페이스의 표현>

public interface Sing{ 
	// K-pop을 부르다 
	public String singKpop(String str); 
	// pop을 부르다 
	public String singPop(String str); 
} 

public class Singer implements Sing { 
	public String singKpop(String str) { 
	// K-pop을 부르다 
	} 

	public String singPop(String str) { 
	// pop을 부르다 
	} 

	Sing sing = KpopSing(); 
	String str = sing.singKpop(str); 
} 



인터페이스를 사용하려면 implements 를 사용하면 돼.
여기서 추상클래스와 다른점은 다른 클래스를 상속받은 상태로 인터페이스 상속이 가능하다는 점이야.
이를 다중상속이라고 해. JAVA는 원래 단일상속만을 지원하는데, 인터페이스만은 예외적으로 다중상속이 가능해!

그럼 인터페이스를 정리해보자.

 

" 
인터페이스에 정의된대로 구현해야한다. 
인터페이스는 상수, 추상메소드, 정적메소드, 디폴트메소드를 가진다. 
다중상속이 가능하다. 

 

 

 

 

 

3. 추상클래스 VS 인터페이스
자, 우리는 추상클래스와 인터페이스에 대해서 살펴봤어.
그렇다면 언제 추상클래스를 사용하고 인터페이스를 사용해야할까?

지금까지 공부해오면서 내 나름의 정의를 해보자면,

추상클래스는 방향성만 갖는다.
인터페이스는 방향성 및 가는 방법이 정해져있다.

정도야. 그래서 나는,

 

공통된 내용(필드나 메소드)들을 추출하여
통일된 내용으로 작성하도록 규격화하고자 한다면 

  추상클래스

이미 추상클래스를 상속하는데 공통 기능이 필요하거나, 
개발하는데 정확한 규칙과 방향성, 기능 구현이 중요하다고 한다면 
인터페이스

 - 를 사용하는것이 적절하지 않을까라고 생각해.

'JAVA > 이론' 카테고리의 다른 글

주석에 대하여(작성중)  (0) 2021.01.20
[JAVA] String을 import 없이 사용할 수 있는 이유  (0) 2021.01.05
[JAVA] JVM (자바가상머신)  (0) 2021.01.04