java

[java] 추상클래스와 인터페이스의 차이?

희구 2021. 8. 26. 13:08

Abstrat?

abstrat란 추상을 말한다. 상속을 강제하는 일종의 규제라고 생각하면 된다.

자바에서 abstract라 하면 추상클래스와 인터페이스를 떠올릴 수 있다.

 

추상메서드

먼저 추상메서드란?

빈껍데기이다.

public abstrat String getName();    // 추상메서드

public abstrat String getName(){   // 추상메서드가 아님
return "hello World";
}

위 코드 처럼 선언은 되어있는데 코드가 구현되지 않은 메서드를 말한다.

그래서 코드의 끝이 {}로 끝나는 것이 아니라 ;로 끝난다.

 

추상클래스

일부 메서드가 구현되지 않고, 선언만 되어있는 클래스.

(선언만 되어있는 메서드 = 추상메서드 / 추상메서드를 보유하고 있는 클래스 = 추상클래스)

추상클래스를 상속하는 자식클래스에서 추상메서드를 반드시 구현해야 한다.

is a kind of의 기능을 하며, 과일 is a kind of a 복숭아 에서 과일 역할을 한다.

 

package abstract_; //추상클래스

public abstract class AbstractTest {//POJO (Plain Old Java Object)		
	protected String name;
	//자식에서 접근할 수 있도록 프로텍티드나 디폴트로 바꿔줘
    
     public String getName(){//구현부 게터
		 return name;
	 }
		 
	public abstract void setName(String name); //추상메소드..바디 안열림!
	 
}

 

추상클래스는 클래스 구현부 내부에 추상메서드가 하나 이상 포함되거나 abstract로 정의 된 경우를 말한다.

 

 

public class AbstractMain extends AbstractTest{ //상속시키고 오버라이드
	@Override
	public void setName(String name) {
		this.name = name;		
	}

	public static void main(String[] args) {
		//AbstractTest at = new AbstractTest(); - error
		AbstractTest at = new AbstractMain(); // 자식꺼 생성-> 부모꺼도 자동으로 만듦
		at.setName("홍길동"); //실질적으론 오버라이드가 호출됨 -> 자식
		System.out.println("이름 : " + at.getName());
	}


}

추상클래스는 new연산자를 사용하여 객체를 생성할 수 없고 상속을 통한 자손클래스에 의해서만 완성될 수 있다.

자손클래스에서는 추상메서드를 오버라이딩 하여 사용한다.

 

자손클래스에서 추상메서드를 오버라이딩 하지 않으면 자손 클래스도 추상클래스가 된다.

이때 자손클래스에서는 추상 메서드를 구현해도 되고 안해도 된다.

 

 

인터페이스

package interface_;

public interface InterA {
	public static final String NAME="홍길동"; //상수만 넣는다. (인터페이스!! 대문자!!)
	public int AGE=25; //상수 (static final 생략가능!)
	
	public abstract void aa(); //추상메소드 /  키워드 엡스트릭트, 바디 없이 ;로 끝남
	public void bb(); //키워드 안써도 추상메소드 가능
	
}

public interface InterB {//인터페이스는 추상이라는 키워드 작성 안해도돼
	public void cc(); //추상 키워드 안씀
	public void dd(); //키워드 안씀

}

클래스가 사용되는 방식, 접점만을 선언하는 틀.

class가 아닌 interface로 생성한다.

아무런 구현이 되어있지 않고, 인터페이스에 적는 모든 메서드들은 추상 메서드로 간주되기 때문에 abstract를 적지 않아도 된다.

 

 

 

package interface_;

public interface InterC extends InterA, InterB{ // 다중상속.. 부모가 2개
	//추상메소드 4개 가지고 있다. (A에게 두개, B에게 두개)

}

 

클래스는 하나만 상속할 수 있으나, 인터페이스는 다중상속이 가능하다.

인터페이스에서 인터페이스를 상속 할 경우, extends를 사용한다.

 

package interface_;

//public class InterMain implements InterA, InterB{ //얘는 틀제공이니까 틀은 여러개 가져올수잇다,
	public class InterMain implements InterC{	//이렇게 써도됨 C가 AB를 다 가지고 잇으니까
	
	public void aa() {}
	public void bb() {}
	
	@Override
	public void cc() {}
	@Override
	public void dd() {	}

	

	public static void main(String[] args) {
		// TODO Auto-generated method stub

	}

}

implements 키워드를 사용하여 구현한다.

이때 구현한 인터페이스들의 메서드들은 구현 받은 클래스에서 모두 구현하여야 한다.

 

 

추상클래스와 인터페이스의 공통점

  • 추상클래스와 인터페이스는 선언만 있고 구현내용은 없는 클래스이다.
  • 인스턴스화(객체생성)을 할 수 없다.
  • 자식클래스들만 객체를 생성할 수 있다.

 

추상클래스와 인터페이스의 차이점

  • 추상클래스는 추상메서드와 일반메서드로 구성된 것에 비해 
    인터페이스는 모두 추상메서드로만 구성되어있다.
  • 추상클래스는 단일 상속이고 인터페이스는 다중상속이 가능하다.
  • 추상클래스의 목적은 상속을 받아서 기능을 확장하는 것이고 (부모의 유전자를 물려받음)
    인터페이스의 목적은 전체적인 틀을 잡거나 이렇게 만들라고 규칙을 정하는 데에 중점을 둔다.
    (특정한 메서드가 반드시 존재하도록 강제하는 역할, 부모로 부터 유전자를 물려받는 것이 아니라 필요에 따라 결합하는 관계)