달나라 노트

Java - interface 본문

Java

Java - interface

CosmosProject 2021. 3. 14. 03:52
728x90
반응형

 

 

 

Java에는 interface라는 것을 지원합니다.

 

일단 먼저 interface를 어떻게 사용할 수 있는지 알아봅시다.

 

 

 

interface MemberInfo {
	public void name();
	public void team();
}

class Member implements MemberInfo{
	public void name() {
		System.out.println("Bella");
	}
	
	public void team() {
		System.out.println("Team 1");
	}
}

public class MemberList {
	public static void main(String args[]) {
		Member member = new Member();
		
		member.name();
		member.team();
	}
}


-- Result
Bella
Team 1

 

위 코드를 전체적으로 훑어봅시다.

가장 위에 interface라는 키워드가 나왔습니다.

interface 키워드는 interface를 만들어주는 기능을 합니다.

interface 키워드를 통해 MemberInfo라는 interface를 만들었습니다.

 

그리고 Member라는 class를 만들었는데 여기에 MemberInfo interface를 implements 하고있습니다.

 

그리고 MemberList class의 main method 부분에서 Member class를 통해 member 객체를 만들고 member 객체의 name, team method를 실행시키고 있습니다.

 

 

 

이제 좀 더 자세히 봐봅시다.

 

interface MemberInfo {
	public void name();
	public void team();
}

interface를 만드는 부분입니다.

MemberInfo라는 interface를 만드는데 그 내용에는 name, team이라는 method가 존재합니다.

근데 뭔가 특이하죠 원래 method를 정의하면 그 method가 무슨 기능을 할지 무슨 return값을 반환할지를 다 적어주는데 그런 내용이 없고 method 이름만 존재합니다.

그 이유는 interface에서 method를 적어줄 경우 method 이름만 적어주는게 규칙이기 때문입니다.

 

이에 대한 자세한 얘기는 다음 코드블록에서 얘기해봅시다.

 

 

class Member implements MemberInfo{
	public void name() {
		System.out.println("Bella");
	}
	
	public void team() {
		System.out.println("Team 1");
	}
}

위 코드는 MemberInfo interface를 받아 Member class를 만들고 있는 부분입니다.

Member class에서 name과 team이라는 2개의 method 내용을 정의하고 있는데 이것은 바로 MemberInfo interface의 method입니다.

 

즉, interface를 implements하는 경우엔 다음 두 가지의 조건을 지켜야 합니다.

첫 번째. interface에 명시된 method는 method 이름만 있고 method의 동작에 관해선 interface를 받는 class에서 정의해야 합니다.

두 번째. interface를 받는 class는 interface에 명시된 모든 method에 대한 내용을 정의해야 합니다. (예를 들어 Member class에서 name method의 내용만 적어주고 team method는 누락하면 에러가 발생합니다.)

 

 

 

 

public class MemberList {
	public static void main(String args[]) {
		Member member = new Member();
		
		member.name();
		member.team();
	}
}

메인이 되는 class입니다.

member 객체를 생성하는데 Member class를 이용하고 있습니다.

Member class에는 name, team method가 있으므로 name, team method를 사용하고 있습니다.

 

 

 

 

 

 

 

 

여기까지만 하면 interface를 쓰는 방법은 알겠는데 왜 쓰는지에 대한 의문이 생길겁니다.

아래 코드를 봅시다.

 

 

interface MemberInfo {
	public void name();
	public void team();
}

interface MemberLocation {
	public void building_name();
	public void floor();
}

class Member implements MemberInfo, MemberLocation {
	public void name() {
		System.out.println("Bella");
	}
	
	public void team() {
		System.out.println("Team 1");
	}
	
	public void building_name() {
		System.out.println("Green building");
	}
	
	public void floor() {
		System.out.println("17 floor");
	}
}

public class MemberList {
	public static void main(String args[]) {
		Member member = new Member();
		
		member.name();
		member.team();
		member.building_name();
		member.floor();
	}
}


-- Result
Bella
Team 1
Green building
17 floor

.위 코드는 하나의 interface가 추가되어 총 2개의 interface(MemberInfo, MemberLocation)가 존재합니다.

그리고 Member class에 2개의 interface를 동시에 implemet하고 있습니다.

 

마찬가지로 Member class에선 2개의 interface에 있는 모든 method의 내용을 정의하고있구요.

 

interface를 이용하는 이유는 여러 가지가 있겠다만 그 중 하나는 다중 상속이 가능하다는 점입니다.

Java에선 기본적으로 class의 상속을 할 때 1개의 부모 class를 1개의 자식 class에 상속할 수 있습니다.

여러 개의 부모 class를 1개의 자식 class에 상속하는 것은 불가능합니다.

 

하지만 interface는 가능합니다.

하나의 class에 여러 개의 interface를 implement할 수 있습니다.

 

이렇게 다중 상속을 흉내낼 수 있다는 것이 interface를 사용하는 이유 중 하나입니다.

 

 

 

 

 

 

 

interface MemberInfo {
	public String name();
	public String team();
	public String building();
	public String floor();
}

class Bella implements MemberInfo {
	public String name() {
		return "Bella";
	}
	
	public String team() {
		return "Team 1";
	}
	
	public String building() {
		return "Green building";
	}
	
	public String floor() {
		return "17 floor";
	}
}

class Irene implements MemberInfo {
	public String name() {
		return "Irene";
	}
	
	public String team() {
		return "Team 2";
	}
	
	public String building() {
		return "Yellow building";
	}
	
	public String floor() {
		return "10 floor";
	}
}

public class MemberList {
	public void ShowMemberInfo(MemberInfo memberinfo) {
		System.out.println(memberinfo.name());
		System.out.println(memberinfo.team());
		System.out.println(memberinfo.building());
		System.out.println(memberinfo.floor());
	}
	
	public static void main(String args[]) {
		MemberList memberlist = new MemberList();
		
		Bella bella = new Bella();
		Irene irene = new Irene();
		
		memberlist.ShowMemberInfo(bella);
		memberlist.ShowMemberInfo(irene);
	}
}


-- Result
Bella
Team 1
Green building
17 floor
Irene
Team 2
Yellow building
10 floor

 

위 예시를 보면

interface를 생성하고,

interface를 class에 implement하여 interface method를 정의하는 것까진 처음 예시랑 동일합니다.

다만 다른 점은 처음에 봤던 예시에선 여러 개의 interface를 1개의 class에 할당하여 다중 상속을 하였지만,

위 예시는 1개의 interface를 여러 개의 class에 상속하고 있습니다.

그리고 각각의 class(Bella, Irene)는 서로 다른 내용으로 interface method(name, team, building, floor)를 정의하고있구요.

 

 

 

 

 

public class MemberList {
	public void ShowMemberInfo(MemberInfo memberinfo) {
		System.out.println(memberinfo.name());
		System.out.println(memberinfo.team());
		System.out.println(memberinfo.building());
		System.out.println(memberinfo.floor());
	}
	
	public static void main(String args[]) {
		MemberList memberlist = new MemberList();
		
		Bella bella = new Bella();
		Irene irene = new Irene();
		
		memberlist.ShowMemberInfo(bella);
		memberlist.ShowMemberInfo(irene);
	}
}

 

public void ShowMemberInfo(MemberInfo memberinfo)

이 부분에서 ShowMemberInfo method를 보면 parameter로서 interface(MemberInfo)를 받고 있습니다.

 

 

MemberList memberlist = new MemberList();

MemberList class를 이용하여 memberlist 객체를 만들고, 이 객체는 MemberList class의 method인 ShowMemberInfo method를 가지게 됩니다.

 

 

Bella bella = new Bella();

Irene irene = new Irene();

MemberInfo interface를 상속받아 만들어진 Bella, Irene class를 이용해 bella, irene 객체도 생성하였습니다.

 

 

memberlist.ShowMemberInfo(bella);

memberlist.ShowMemberInfo(irene);

memberlist.ShowMemberInfo method의 인자로서 bella, irene 객체를 전달하고 있습니다.

 

 

 

일단 bella, irene은 interface 그 자체는 아니지만 interface를 상속받아 만들어진 class를 사용하였으므로 ShowMemberInfo의 interface parameter로서 사용 가능합니다.

 

그리고 bella와 irene의 member info가 출력되는 ShowMemberInfo method가 실행되는 것이죠.

 

 

 

 

 

 

 

 

 

 

 

만약에 여기서 member가 한명 더 생겼다면 어떻게 코드를 수정하면 될까요?

interface MemberInfo {
	public String name();
	public String team();
	public String building();
	public String floor();
}

class Bella implements MemberInfo {
	public String name() {
		return "Bella";
	}
	
	public String team() {
		return "Team 1";
	}
	
	public String building() {
		return "Green building";
	}
	
	public String floor() {
		return "17 floor";
	}
}

class Irene implements MemberInfo {
	public String name() {
		return "Irene";
	}
	
	public String team() {
		return "Team 2";
	}
	
	public String building() {
		return "Yellow building";
	}
	
	public String floor() {
		return "10 floor";
	}
}

class Irina implements MemberInfo {
	public String name() {
		return "Irina";
	}
	
	public String team() {
		return "Team 3";
	}
	
	public String building() {
		return "White building";
	}
	
	public String floor() {
		return "20 floor";
	}
}

public class MemberList {
	public void ShowMemberInfo(MemberInfo memberinfo) {
		System.out.println(memberinfo.name());
		System.out.println(memberinfo.team());
		System.out.println(memberinfo.building());
		System.out.println(memberinfo.floor());
	}
	
	public static void main(String args[]) {
		MemberList memberlist = new MemberList();
		
		Bella bella = new Bella();
		Irene irene = new Irene();
		Irina irina = new Irina();
		
		memberlist.ShowMemberInfo(bella);
		memberlist.ShowMemberInfo(irene);
		memberlist.ShowMemberInfo(irina);
	}
}


-- Result
Bella
Team 1
Green building
17 floor
Irene
Team 2
Yellow building
10 floor
Irina
Team 3
White building
20 floor

.위 코드처럼 MemberInfo interface를 상속받는 class를 새로운 멤버에 대해 만들어주고

main method 부분에서 irina에 대한 class 생성과 irina에 대한 ShowMemberInfo method를 실행시키도록 해주면 됩니다.

 

만약 위처럼 interface를 사용하지 않고 새로 멤버가 추가될 때 마다 멤버들의 정보를 출력하는 프로그램을 수정하려면 많은 부분을 수정해야 했을 겁니다.

하지만 멤버들 모두 하나의 interface를 상속받게 하며, 이에 대한 정보 출력을 진행할 때 interface를 parameter로 받게 만들어 member들의 객체를 전달해주면 멤버의 변경이 있을 때 코드의 수정이 쉽습니다.

public void ShowMemberInfo(MemberInfo memberinfo)

 

 

위 내용을 보면 [여러 멤버들 -> interface -> 멤버 정보 출력] 처럼 interface를 하나의 hub로 사용하여 여러 멤버들의 정보를 손쉽게 다룰 수 있게 된 느낌입니다.

위 경우엔 MemberList class는 어떤 멤버별로 매번 작성해줘야 하는 유연성이 적은 class가 아니라 어떤 멤버가 와도 정보를 통합하여 출력해줄 수 있는 유연한 class가 됐다는게 핵심이죠.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90
반응형

'Java' 카테고리의 다른 글

Java - Polymorphism  (0) 2021.03.14
Java - 생성자 (Constructor)  (0) 2021.03.14
Java - class overloading  (0) 2021.03.14
Java - class의 상속  (0) 2021.03.14
Java - ArrayList  (0) 2021.03.13
Comments