👩🏻‍💻 TIL

[Java] 추상 클래스와 인터페이스

ji-hyun 2022. 6. 12. 20:34

클래스는 일반적으로 추상 클래스와 일반 클래스로 나뉜다.

추상 클래스는 클래스 내 '추상 메서드' 가 하나 이상 포함되어 있거나 abstract 로 정의된 클래스이다.

반면 인터페이스는 모든 메소드가 추상 메소드 이다.

 

 

이처럼 하는 일은 비슷하지만 이 둘의 개념은 뿌리부터 전혀 다른 곳에서 나왔다.

 

추상 클래스는 그 추상 클래스를 상속 받아서 기능을 이용하고 확장하는데에 이용하고,

인터페이스는 극단적으로 동일한 목적 하에 동일한 기능을 수행하게끔 강제하는 것이 바로 인터페이스의 역할이자 개념이다.

 

 

 

인터페이스에 대해 더 자세히 알기 위해 아래 예시를 같이 살펴보자.

 

 

 

A학생은 PPT로 논문을 11일날 제출했다.

B학생은 EXCEL 2016 로 논문을 12일날 제출했다.

C학생은 EXCEL 2019 로 자기만의 색깔을 입혀 표 형식으로 12일날 제출했다.

D학생은 메모장에 '논문'을 쓰고 교수님이 말해준 당일 바로 제출했다.

 

응?? 논문을 쓰라고 지시했지만, 결과물이 너무 개성이 넘친다....이건 평가할 수 없을 것 같다. 왜 이런일이 일어날까?

가이드 라인 또는 어떠한 규격이 없기 때문에 발생하는 문제이다.

따라서 교수는 다시 명확한 가이드라인 있는 논문을 쓰라고 지시해야한다. 아래처럼...

 

학생들에게 2019.12.12일 18:00까지 홈페이지 본인 교수 홈페이지 제출란을 통해 논문을 제출해야하고

논문 파일 형식은 .PPT이며 10Page 안에 작성을 해야하고 논문 주제는 '블록체인을 활용한 공인인증서' 이다.

 

 

 

이처럼 인터페이스는 이런 현상을 막기 위해 모듈을 모두 공통적으로 규격에 맞는 모듈로 개발하고 유지보수의 불편함을 사전 방지하기 위해 개발되었다.

 

 

 

 

 

인터페이스의 문법과 다형성의 이해

인터페이스는 interface 키워드를 통해 선언할 수 있으며 implements 키워드를 통해 일반 클래스에서 인터페이스를 구현할 수 있다.

 

또한, JAVA8 이전까지는 상수, 추상메소드만 선언이 가능하지만,

(상수, 추상메소드만 가능케했다는 것을 통해 그만큼 강제성이 강했다는 것을 유추할 수 있다.)

JAVA8부터 디폴트메소드, 정적메소드가 추가되었다.

(디폴트메소드, 정적메소드를 통해, 구현 강제성 안에 유연함을 심었다고 우선 이해하자)

 

 

public interface 인터페이스명 {

 

//상수

타입 상수명 = 값;

 

//추상 메소드

타입 메소드명(매개변수, ... );

 

//디폴트 메소드

default 타입 메소드명(매개변수, ... ){

  //구현부

}

 

//정적 메소드

static 타입 메소드명(매개변수) {

  //구현부

}

 

}

 

상수 : 인터페이스에서 값을 정해줄테니 함부로 바꾸지 말고 제공해주는 값만 참조해라 (절대적)

추상메소드 : 가이드만 줄테니 추상메소드를 오버라이팅해서 재구현해라. (강제적)

디폴트메소드 : 인터페이스에서 기본적으로 제공해주지만, 맘에 안들면 각자 구현해서 써라. (선택적)

정적메소드 : 인터페이스에서 제공해주는 것으로 무조건 사용 (절대적)

 

 

 

 

아래 실제 코드를 보면서 자연스럽게 이해해보자.

 

 

대한민국에서 은행 사업을 하려면, 금융결제원에서 정의한 어떠한 가이드를 따라야한다고 치고, Bank 라는 이름으로 인터페이스를 만들었다.

이제 어느 은행이든 은행 시스템은 운영하려면 Bank라는 인터페이스 가이드에 맞게 구현해야한다.

인출메소드, 입금메소드는 각 은행에서 오버라이딩 해서 재구현을 해야하며 블록체인 인증 메소드는 무조건 금융결제원에서 제공해주는 메소드를 사용해야 한다. 따라서 정적메소드로 구현하여 오버라이딩을 할 수 없게 만들었다. (그냥 가져다가 쓰라는 소리)

 

 

public interface Bank {

	//상수 (최대 고객에게 인출해 줄 수 있는 금액 명시)
	public int MAX_INTEGER = 10000000;
	
	//추상메소드(인출하는 메소드)
	void withDraw(int price);
	
	//추상메소드(입금하는 메소드)
	void deposit(int price);
	
	//JAVA8에서 가능한 defualt 메소드(고객의 휴면계좌 찾아주는 메소드 : 필수구현은 선택사항)
	default String findDormancyAccount(String custId){
		System.out.println("**금융개정법안 00이후 고객의 휴면계좌 찾아주기 운동**");
		System.out.println("**금융결제원에서 제공하는 로직**");
		return "00은행 000-000-0000-00";
	}
	
	//JAVA8에서 가능한 정적 메소드(블록체인 인증을 요청하는 메소드)
	static void BCAuth(String bankName){
		System.out.println(bankName+" 에서 블록체인 인증을 요청합니다.");
		System.out.println("전 금융사 공통 블록체인 로직 수행");
	}
		
	
}

 

 

 

 

자 이제 KB은행, SH은행은 규격화 된 Bank 인터페이스를 통해 각자에 맞는 스타일대로 은행 인출/입금 서비스를 제공한다. 아래 코드를 보자.

 

public class KBBank implements Bank{

	@Override
	public void withDraw(int price) {
		System.out.print("KB은행만의 인출 로직...");
		if(price < Bank.MAX_INTEGER){
			System.out.println(price+" 원을 인출한다.");	
		}else{
			System.out.println(price+" 원을 인출실패.");	
		}
	}

	@Override
	public void deposit(int price) {
		System.out.println("KB은행만의 입금 로직..."+price+" 원을 입금한다.");
	
	}

}

 

 

public class SHBank implements Bank{

	@Override
	public void withDraw(int price) {
		System.out.println("SH은행만의 인출 로직...");
		if(price < Bank.MAX_INTEGER){
			System.out.println(price+" 원을 인출한다.");	
		}else{
			System.out.println(price+" 원을 인출실패.");
		}
	}

	@Override
	public void deposit(int price) {
		System.out.println("SH은행만의 입금 로직..."+price+" 원을 입금한다.");
		System.out.println("SH은행은 별도의 후행처리 작업을 따로 한다.");
	
	}
	
	//JAVA8에서 가능한 defualt 메소드(고객의 휴면계좌 찾아주는 메소드)
	@Override
	public String findDormancyAccount(String custId){
		System.out.println("**금융개정법안 00이후 고객의 휴면계좌 찾아주기 운동**");
		System.out.println("*SH은행만의 로직 적용*");
		return "00은행 000-000-0000-00";
	}

}

 

 

 

 

 

다시 말해, 인터페이스는 해당 인터페이스를 구현한 객체들에 대해서 동일한 동작을 약속하기 위해 존재하고,

추상 클래스는 추상 클래스를 바탕으로 기능을 확장하여 사용할 수 있도록 존재한다.

 

 

 

어디서 본 댓글 참고

 

인터페이스를 쓰는 것은 프로그램을 규격화 하기 위함인데, 추상클래스 같은 경우는 변수 필드를 선언할 수 있고 인터페이스보다는 강제성이 덜합니다. 인터페이스는 규격과 같은 개념이라 추상클래스와 비슷하지만 조금 다릅니다! 또한 추상 클래스는 다중 상속이 불가능하지만, 인터페이스는 다중 상속이 가능합니다.

 

 

 

 

 

https://limkydev.tistory.com/197

 

[JAVA] 자바 인터페이스란?(Interface)_이 글 하나로 박살내자

1. 인터페이스 개념과 역할 인터페이스....이 글하나로 박살내자. (회사에서 존댓말을 많이 쓰기때문에 여기서라도 반말로 글을 써보고 싶음 ㅎ) 인터페이스는 뭘까?? 결론부터 말하면, 극단적으

limkydev.tistory.com

 

 

'👩🏻‍💻 TIL' 카테고리의 다른 글

[iOS] [Flutter] module not found.  (1) 2022.10.18
only one auth mechanism allowed  (0) 2022.09.19
[Java] extends implements 차이  (0) 2022.06.12
nexus-graphql-mongoose-boilerplate 1일차  (0) 2022.05.15
npm 과 npx 차이  (0) 2022.05.14