본문 바로가기

수업 복습하기/Java

Day 15 - 인터페이스(Interface)

728x90
728x90

= 인터페이스(Interface)

 

인터페이스가 생긴 원인 부터 알아볼까요?고양이나 강아지, 늑대는 animal이라는 추상클래스를 가지고있습니다. + 고양이나, 강아지에 짓다. 라는 기능을 추가하고싶다면?그럴 때, 사용할 때 interface구조로 정의 후, 추상 메서드로 그 기능만 정의해놓는다면인터페이스를 구현(상속)하는 형태로 사용이 가능하다.

 

인터페이스 구현 방법 : 클래스 이름 뒤에 implements사용

ex) class Cat extends Animal implements bark

 

= 기본 interface 예제 =

public class Cat extends KindaCat implements Pet {
	@Override
	public void sit() {
		System.out.println("무시합니다.");
	}
}

--------------------------------------------------
public class Malamute extends KindaDog implements Pet{
	@Override
	public void sit() {
		System.out.println("자리에 앉습니다.");
	}
--------------------------------------------------
public interface Pet {
	
// 인터페이스의 메소드는 추상(abstract) 메소드, 그리고 public
//	public abstract void sit();
//	public void sit();
	void sit();
}
--------------------------------------------------
< MainClass >
public class Example2 {
	public static void main(String[] args) {
		Pet p1 = new Cat();
		Pet p2 = new Malamute();
		
		p1.sit();
		p2.sit();
	}
}

< 출력값 > 

무시합니다.
자리에 앉습니다.

 

class가 오는 자리에 interface가 위치했고, interface의 sit();은 오버라이딩이 무조건 필요해서,

Cat과 Dog클래스에서 오버라이딩 해서 진행했습니다.

 

 

= Interface기능 1 = 

인터페이스는 다중 상속이 가능하고, 여러 인터페이스를 동시 구현이 가능하다

단, 인터페이스에 있는 모든 추상메서드는 오버라이딩되야한다!

public interface Inter1 {
	public double PI = 3.14; //자동 상수
	public void method1();//추상메서드
}

--------------------------------------------------
package personal_trainning.Interface;

public interface Inter2 {
	int ABC = 1;
	void method2();
}

--------------------------------------------------
package personal_trainning.Interface;

public class Basic implements Inter1,Inter2{ //동시상속

	@Override
	public void method1(){
		System.out.println("오버라이딩 된 메서드1 실행");
		}
        
	@Override
	public void method2() {
		System.out.println("오버라이딩 된 메서드2 실행");
	}
}
< MainClass >
public class MainClass {
public static void main(String[] args) {
	
	Inter1 b1 = new Basic();
	
	b1.method1(); //오버라이딩 된 메서드
	// b.method2(); //불가능 why? 부모클래스가 인터1이라
	
	Inter2 b2 = new Basic();
	b2.method2(); //여기선 inter2에서 가져온 메서드라 가능

	Basic bb = new Basic();
	bb.method1();
	bb.method2();
	
	System.out.println("-------------------------");
	
	Basic bbb = (Basic) b1; //내자신으로 돌아왔으니까! -> 클래스 casting가능
	bbb.method1();
	bbb.method2();

	//상수
	System.out.println(Inter1.PI);
	System.out.println(Inter2.ABC);
	}
}

< 출력값 > 

오버라이딩 된 메서드1 실행
오버라이딩 된 메서드2 실행
오버라이딩 된 메서드1 실행
오버라이딩 된 메서드2 실행
-------------------------
오버라이딩 된 메서드1 실행
오버라이딩 된 메서드2 실행
3.14
1

 

상수명 작성할 때, 대문자로 작성하고, 다른 단어로 구성되면 _언더바로 연결한다.

+) 인터페이스 상수는 static{}블록 초기화 불가능하다.

따라서, 선언과 동시에 초기값 지정해야한다.

 

아직 익숙하게 외워지지 않는 부분!

interface내에 변수 사용 했을 때 : 상수화 (public static final이 변수 앞에 붙는다)

interface내에 메서드 사용 했을 때 : 추상화 (public abstract void 변수())

(자주사용하다보면 감이 익혀지겠지!)

 

 

= Interface기능 2 =

자바의 인터페이스는 객체의 사용 방법을 정의한 타입(메서드 명세서)으로 객체의 교환성을 높여주기 때문에,

다형성을 구현하는 매우 중요한 역할을 합니다.

 

인터페이스도 데이터 타입(부모타입) 가능하다.

public class Cat extends Animal implements IPet{

	@Override
	public void eat() {
		System.out.println("고양이는 생선을 먹어요");
	}

	@Override
	public void play() {
		System.out.println("고양이는 방에서 놀아요");
	}
}

-------------------------------------------------------
public class Dog extends Animal implements IPet{

	@Override
	public void eat() {
		System.out.println("강아지는 사료를 먹어요");
	}

	@Override
	public void play() {
			System.out.println("강아지는 밖에서 놀아요");
	}
}

-------------------------------------------------------
public class GoldFish extends Fish implements IPet{

	@Override
	public void swim() {
		System.out.println("금붕어는 강에서 헤엄쳐요");
	}

	@Override
	public void play() { 
		System.out.println("금붕어는 어항에서 놀아요");
	}
}
public interface IPet {
public void play();
}

-------------------------------------------------------
public abstract class Animal {
	public abstract void eat();
}

-------------------------------------------------------
< MainClass >
public class MainClass {
public static void main(String[] args) {
	Animal dog = new Dog();
	Animal cat = new Cat();
   
   Animal[] ani = {dog, cat};
	
	for(Animal a:ani) {
		a.eat();
        
System.out.println("-----------------------------");

	IPet dog2 = new Dog();
	IPet cat2 = new Cat();
	IPet fish2 = new GoldFish();

	IPet[] pets = {dog2, cat2, fish2};
	for(IPet p : pets) {
		p.play();
		}
	}
}

 

< 출력값 >

강아지는 사료를 먹어요
고양이는 생선을 먹어요

-----------------------------

강아지는 밖에서 놀아요
고양이는 방에서 놀아요
금붕어는 어항에서 놀아요

 

클래스는 바로 위 1개의 클래스만 상속받을 수 있지만, interface는 개념을 여러 클래스에서 상속과 같이 가져와서 사용 할 수 있으며,

관련이 없는 객체끼리도 사용이 가능해서 중요하게 공부해야하는 개념입니다!

 

= Default Interface =

public interface Pet {
	void sit();
	default void roll() { // 항상 public 
		System.out.println("구릅니다.");
	}

---------------------------------------------------
public class Dog implements Pet {
	@Override
	public void sit() {
		System.out.println("자리에 앉습니다.");
	}

--------------------------------------------------
public class Cat implements Pet {
	@Override
	public void sit() {
		System.out.println("무시합니다.");
	}
	
	@Override
	public void roll() {
		System.out.println("또 무시합니다.");
	}
< MainClass >

public class MainClass {
	public static void main(String[] args) {
		Dog d1 = new Dog();
		d1.sit();
		d1.roll();
		
		Cat c1 = new Cat();
		c1.sit();
		c1.roll();
		
		Pet p1 = c1;
		p1.roll();
	}
	// 추상 클래스                vs     인터페이스
	// 4가지접근지정자 사용가능          public 메소드만가능
	// 인스턴스 필드 사용가능            스태틱 파이널 필드만 가능
	// 하나만 상속 가능                  여러 인터페이스 구현가능
}

< 출력값 > 

자리에 앉습니다.
구릅니다.
무시합니다.
또 무시합니다.
또 무시합니다.

 

Dog에 roll() 메소드가 있지 않지만, Pet 인터페이스에 default roll()메소드가 있기때문에,

d1.roll()을 불러와도 interface의 roll()메소드를 불러온다는 것!

 

= Interface 총정리 =

1. 인터페이스는 상수와 추상 메서드만 구성으로 가진다.

2. 인터페이스는 다중 상속이 가능하다

3. 인텊이스도 데이터 타입(부모 타입)이 가능하다

4. 사용방법이 동일한 클래스를 만들 수 있다.

 

인터페이스는 추상클래스의 확장된 형태!

+)  일반클래스 -> 오버라이딩강제(추상클래스) -> 오버라이딩강제 + 다중 상속(인터페이스)

728x90

'수업 복습하기 > Java' 카테고리의 다른 글

Day 16 - 예외(Exception) (2)  (0) 2021.09.10
Day 15 - 예외(Exception)  (0) 2021.09.10
Day 14 - 추상 (abstract)  (0) 2021.09.06
Day 13 - Final (변수, 클래스, 메소드)  (7) 2021.09.06
Day 13 - 정적 멤버 (Static)  (0) 2021.09.06