본문 바로가기
Web

[Java] 인터페이스의 다형성

by DuncanKim 2022. 6. 28.
728x90

[Java] 인터페이스의 다형성

 

인터페이스를 만들어놓고 클래스를 만들 때, 원래 설정해놓은 함수와는 다른 매개변수를 주고 싶다면...?

원래 2개를 설정할 수 있게 인터페이스에 써놓았는데, 매개변수를 3개 설정하고 싶다면 어떻게 해야할까?

 

메소드를 그대로 물려받았기 때문에, 원래 함수를 구현하지 않고도 오버로딩이 가능할까? 라는 생각에 이번 포스팅을 진행하게 되었다.

 

긴 이야기 필요없이 바로 인터페이스를 만들어보고 인터페이스를 implements한 클래스를 만들어보겠다.

 

 

1) 인터페이스

package exercise;

public interface Calculate {
	int sum(int v1, int v2);
}

 

Calcutate라는 인터페이스를 만들었고, 그 안에는 sum()이라는 함수가 들어있다.

구현은 절대 하지 못하고, 선언만 해두었다.

 

구현을 하지 않는 이유가 궁금하다면?

2022.06.13 - [프로그래밍 언어/Java] - [Java] 추상, 인터페이스

 

[Java] 추상, 인터페이스

[Java] 추상(abstract), 인터페이스(interface) 추상(abstract) 그리고 인터페이스(interface)는 "~을 하겠다"라는 계획서와 같다. '하겠다'라고 하면 너무 추상적이지 않은 계획서이지 않나? 그렇다. 그 부분

masterpiece-programming.tistory.com

 

 

2) Interface2 클래스 만들기(Calculate implements)

package exercise;

public class Interface2 implements Calculate{
	
	//오버로딩
	public int sum(int v1, int v2, int v3) {
		// TODO Auto-generated method stub
		return v1 + v2 + v3;
	}
	
	public int sum(int v1, int v2) {
		// TODO Auto-generated method stub
		return v1 + v2;
	}
}

 

Interface2 클래스에서는 sum 함수를 구현하지 않으면 오류가 생긴다. 그래서 함수 자동 생성을 하게 되면, 아래의 매개변수 2개인 함수만 만들어진다.

 

 

 

만약 매개변수 3개인 함수만 존재한다면 어떻게 될까?

함수가 아무것도 없는 것과 같은 오류를 맞이하게 된다.

 

결론은 처음부터 오버로딩을 할 수는 없다. 먼저 인터페이스에 구현된 함수를 정의해주고 나서 오버로딩을 하던가 해야 한다.

 

 

 

3) 인터페이스의 다형성 실험하기

 

우리는 클래스의 다형성에 대해 알아본 적이 있다.

처음이시라면 아래의 포스팅을....

2022.06.13 - [프로그래밍 언어/Java] - [Java] 다형성(Polymorphism) 알아보기

 

[Java] 다형성(Polymorphism) 알아보기

[Java] 다형성(polymorphism) 알아보기 칼은 참 다양한 종류가 있다. 요리할 때만 해도, 과일칼, 채소자르는 칼, 고기 다지는 칼, 빵칼 등등등.. 요리 용도가 아니라 도축, 수술 등등 많은 곳에서 쓰는

masterpiece-programming.tistory.com

 

인터페이스는 다형성의 특징을 가진다. 변수의 타입으로 인터페이스를 활용할 수 있다.

package exercise;

public class InterfaceMain {

	public static void main(String[] args) {
		Interface2 inter = new Interface2();
		System.out.println(inter.sum(2, 4));
		System.out.println(inter.sum(0, 2, 3));
		
		Interface2 inter2 = new Calculate(); //오류
		Calculate inter3 = new Interface2();
		inter3.sum(1, 2 ,3); //오류
        	inter3.sum(1, 2) // 정상 동작
	}

}

 

위의 세 줄의 경우, Interface2 클래스를 구현해본 것이다. 매개변수 3개가 있는 함수도 오버로딩 했기 때문에, 출력이 잘 된다.

그렇지만, 아래의 경우, 문제가 있다.

interface2 타입의 inter2라는 변수 안에 Calculate 객체는 담길 수 없다. 언터페이스는 객체를 생성할 수 없는 수업는 씨박이라고나 할까. '생성'의 개념이 없기 때문에, 4번 라인처럼 생성을 할 수가 없다.

 

다만, 타입형으로는 기능을 할 수 있다. inter3 처럼 선언을 하면, sum() 함수에 매개변수 2개를 넣었을 때는 동작을 한다.

그렇지만, 매개변수가 3개 있는 것은 오류가 난다. 왜냐하면, 인터페이스에는 매개변수 3개인 함수가 존재하지 않기 때문이다.

 

인터페이스 또한 변수의 타입형으로 선언할 수 있다는 것을 알았다.

다만, 인터페이스에서 만들어 놓은 것이 아니라, 클래스에서 함수의 매개변수를 오버로딩 했을 경우, 인터페이스가 변수 타입인 때에는 오버로딩한 함수는 불러올 수 없다. 

 

 

728x90

'Web' 카테고리의 다른 글

[Web] HTTPS와 HTTP의 차이  (0) 2022.07.01
[Java] Error와 Exception, 예외 처리  (0) 2022.06.29
[Java] 자바의 메모리 사용 구조  (0) 2022.06.27
[Java] 클래스 제대로 알아보기  (0) 2022.06.27
[HTML/CSS] Flex 활용방법  (0) 2022.06.26

댓글