Backend Web/Java

인터페이스

sofiaaa 2020. 12. 28. 07:45
반응형

인터페이스

 

추상클래스는 메소드 구현하기 애매할 때 사용했었는데, 인터페이스와 비슷하다.

인터페이스는 인터페이스 자체가 구현은 없고 어떤 것을 가지고 있을까만 선언하는 것이다. 

 

추상클래스 vs  인터페이스

추상클래스는 하나 이상의 추상 메소드를 가지고 있는 것이다.

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

 

추상클래스를 상속 받아서 기능을 이용하고 확장 시키는 것이 목적이다.

인터페이스는 메소드가 선언만되어 있기 때문에 구현을 강제하는 것이다. 

 

자바에서 다중 상속이 불가능하다.

class vehicle extends car, plane {} x

class car implements vehicle, engine{} o

따라서 인터페이스로 구현한다

//보충 필요

 

package practice4;

public interface TV {
	public int MIN_VOLUME = 0;
	public int MAX_VOLUME = 100;
	
	public void turnOn();
	public void turnOff();
	public void changeVolume(int volume);
	public void changeChannel(int channel);
}
package practice4;

public class LedTV implements TV {
	@Override
	public void turnOn() {
		System.out.println("켜다");
	}

	@Override
	public void turnOff() {
		System.out.println("끄");		
	}

	@Override
	public void changeVolume(int volume) {
		System.out.println("볼륨을 조절하다.");	
	}

	@Override
	public void changeChannel(int channel) {
		System.out.println("channel을 조정하다.");
	}

}
package practice4;

public class LedExam {
	public static void main(String[] args) {
		TV tv = new LedTV();
		
		tv.turnOn();
		tv.changeChannel(8);
		tv.changeVolume(39);
		tv.turnOff();
	}
}

 


인터페이스의 default method

 

인터페이스는 추상메소드, default, static  다 사용 가능하다. 

 

Default method

인터페이스가 변경이 되면, 그 인터페이스를 구현하고 있는 모든 클래스들이 해당 메소드를 구현해야 하는 문제가 있다. 이를 해결하기 위해서 인터페이스에 메소드를 구현해 놓을 수 있도록 추가한 것이다. 

  •  default는 몸체가 있는 메소드
  •  default는 자식 자식 클래스에서 사용 가능

Static method

구현하고 있는 메소드이다.

  •  static 메소드는 몸체를 가진다
  •  interface의 static 메소드는 자식에게도 공유되지 않는다.

 

Default method 코드

package ch06.ex05.case08;

public interface Animal {

	public default void eat() { //추상메소드 xx
		System.out.println("입으로 먹다");
	}
	
	void move(); //추상 메소드 ㅇㅇ
}
 
package ch06.ex05.case08;

public class Elephant implements Animal { 
	@Override 
	public void move() {
		System.out.println("걸어가다");
	}
}
package ch06.ex05.case08;

public class Goose implements Animal{
	@Override 
	public void move() {
		System.out.println("날아가다");
	}
}
package ch06.ex05.case08;

public class Main {
	public static void main(String[] args) {
		Elephant elephant = new Elephant();
		Goose goose = new Goose();
		
		//Animal이 eat이라는 default 메소드를 가지고 있다.
		elephant.eat(); //default 메소드를 사용하고 있는 것
		goose.eat(); //default 메소드

		elephant.move(); //추상 메소드 사용
		goose.move(); //추상 메소드 사용
	}
}

 

static method 코드

package ch06.ex05.case09;

public class Browser implements UI {
	
	@Override 
	public void out() {
		System.out.println("HTML 로 출력하다.");
	}
	
	public static void play() {
		System.out.println("음악을 재생하다.");
	}
}
package ch06.ex05.case09;

public class Chrome extends Browser{
	
}
package ch06.ex05.case09;

public class Console implements UI{
	@Override 
	public void out() {
		System.out.println("println()으로 출력해라 ");
	}
}
package ch06.ex05.case09;
//UI - browser - chrome
//UI - Console
public class Main {
	public static void main(String[] args) {
		Console console = new Console();
		Browser browser = new Browser();
		
		console.out(); 
		browser.out(); 
		
		UI.in();  //static 메소드는 본인 인터페이스만 사용 가능
		//console.in(); //static 메소드이고 인터페이스이기 때문에 공유 불가능
		//browser.in();
		
		Chrome chrome = new Chrome();
		chrome.out();

		chrome.play();  //static 메소드지만 일반 클래스이기 때문에 공유 가능
		Browser.play();

	}
}


//그냥 class에서 static은 자식클래스에게 공유 가능 
//interface내 static은 자식클래스에게 공유 불가능 
package ch06.ex05.case09;

public interface UI {

	public static void in() {  //static 메서드도 몸체를 가짐 
		System.out.println("키보드로 입력하다.");
	}
	void out();
}

내부 클래스

클래스 안에 선언된 클래스이다.

 

내부 클래스1

중첩 클래스 또는 인스턴스 클래스(instance class)라고 한다.

package defaults;

public class InnerExam1 {
	class Cal{
		int value = 0;
		public void plus() {
			value++;
		}
	}
	
	public static void main(String[] args) {
		InnerExam1 t = new InnerExam1(); //innerexam1을 먼저 생성하고 접근해야 한다. 
		InnerExam1.Cal cal = t.new Cal();
		cal.plus();
		System.out.println(cal.value);
	}

}

 

내부 클래스2

정적 중첩 클래스 또는 스태틱 클래스(static class)라고 한다. 

 

package defaults;

public class InnerExam2 {
	static class Cal{
		int value = 0;
		public void plus() {
			value++;
		}
	}
	
	public static void main(String[] args) {
		InnerExam2.Cal cal = new InnerExam2.Cal(); //InnerExam2를 생성하지 않고 바로 사용 가능하다.
		cal.plus();
		System.out.println(cal.value);
	}

}

내부 클래스3

지역 중첩 클래스 또는 지역 클래스(local class)라고 한다.

package defaults;

public class InnerExam3 {
	public void exec() { //메소드 안에 클래스 생성
		class Cal{
			int value = 0;
			public void plus() {
				value++;
			}
		}
		
		Cal cal  = new Cal();
		cal.plus();
		System.out.println(cal.value);
	}
	public static void main(String[] args) {
			InnerExam3 t = new InnerExam3();
			t.exec();
	}
}

 

익명클래스

내부 클래스4

익명 중첩 클래스이면서 내부클래스이기도 하다. 

네가지 종류가 있고, 그 중에서 마지막 형태의 익명중첩 클래스이다.

 

package defaults;

public abstract class Action {
	public abstract void exec();
}
package defaults;

public class MyAction extends Action{
	@Override
	public void exec() {
		System.out.println("exec");
	}
}
package defaults;

public class ActionExam {
	public static void main(String[] args) {
		//Action action = new MyAction(); //일반적인 형태이다.
		//action.exec();
		
		//익명 메소드
		//한 번만 쓰고 말 때 사용하는 것이다.
		Action action = new Action() {
			@Override
			public void exec() {
				System.out.println("exec");
			}
		};
		action.exec();
	}
}
반응형

'Backend Web > Java' 카테고리의 다른 글

[JAVA] 변수  (0) 2021.11.21
[Java] 상속(Inheritance)  (0) 2021.11.12
상속  (0) 2020.12.27
클래스 다듬기  (0) 2020.12.27
클래스와 객체  (0) 2020.11.24