본문 바로가기
Hello World/JAVA

JAVA - Interface [ 개발스터디 기몬]

by 기몬 2023. 4. 13.
728x90
반응형

java interface

인터페이스 역할 
인터페이스 
- 두 객체를 연결하는 역할
- 다형성 구현에 주된 기술

인터페이스와 구현 클래스 선언
인터페이스 선언 
- 인터페이스 선언은 class 키워드 대신  interface 키워드를 사용
- 접근 제한자로는 클래스와 마찬가지로 
같은 패키지 내에서만 사용 가능한 default 패키지와 
상관없이 사용하는 public 을 붙일 수 있음. 
- 인터페이스에 정의된 추상 메소드에 대한 실행 내용이 구현
implements 키워드는 해당 크래스가 인터페이스를 통해 
사용할 수 있다는 표시이며, 인터페이스의 추상 메소드를 재정의한 메소드가 있드는 뜻.

변수 선언과 구현 객체 대입 
- 인터페이스는 참조 타입에 속하므로 인터페이스 변수에는 
객체를 참고하고 있지 않다는 뜻으로 null을 대입할 수 있음.
RemoteControl rc;
RemoteControl rc = null;
- 인터페이스를 통해 구현 객체를 사용하려면 , 
인터페이스 변수에 구현 객체의 번지를 대입해야 함
  rs = new Television();

 

package com.example;


public class InterfaceExample {
	// 일반 클래스 new OK
	static class A {
		
	}
	
	// 추상 클래스 new X
	static abstract class B {	// 일반 클래스에서 바디가 없는 추상 메소드라고 알려 주어야 함. 
		public B() {
			
		}
		void xxx() {
			
		}
		abstract void draw();	// abstract 추상ㅇ
	}
	
	static class C extends A {
		
	}
	
	static class D extends B {	// 추상 클래스에 implements add 

		@Override
		void draw() {
			// TODO Auto-generated method stub
			
		}
		
	}
	
	enum Gender {
		MALE, FEMALE
	}
	
	interface Drawable {

		void draw();
		void move();
	}
	
	// 구현 클래스 . ( 인터페이스를 준수 생성함 : E클래스는 Drawble 인터페이스의 구현 클래스이다. )
	//								    E클래스는 Runnable 인터페이스의 구현 클래스이다.)
	class E implements Drawable, Runnable { // implements를 통해서 인터페이스 규격을 준수해서 e클래스에 인터페이스를 구현한다. 

		@Override
		public void draw() {
			// TODO Auto-generated method stub
			
		}

		@Override
		public void move() {
			// TODO Auto-generated method stub
			
		}
		
		@Override
		public void run() {
			// TODO Auto-generated method stub
			
		}
		
	}
	
	public static void main(String[] args) {
		A a = new A();
//		B b = new B();		// new 생성 불가 
//		Gender g = new Gender();	// new 생성 불가 
//		Drawable d = new Drawable();	// 
		
		
		
	}

}


상수 필드 
- 인터페이스는 public static final 특성을 갖는 
불변의 상수 필드를 멤버로 가질 수 있음.
  [public static final] 타입 상수명 = 값;
- 인터페이스에 선언된 필드는 모두 public static final 특성을 갖기 때문에 
public static final을 생략해도 자동으로 컴파일 과정에서 붙음 
-  상수명은 대문자로 작성하되, 서로 다른 단어로 구성되어 있을 경우에는 언더바 (_)로 연결

추상 메소드 
- 리턴 타입, 메소드명, 매개변수만 기술되고 중괄호 {}를 붙이지 않는 메소드 
- public abstract를 생략하더라도 컴파일 과정에서 자동으로 붙음
- 추상 메소드는 객체 A가 인터페이스를 통해 어떻게 
메소드를 호출할 수 있는지 방법을 알려주는 역할

디폴트 메소드
- 인터페이스에는 완전한 실행코드를 가진 디폴트 메소드를 선언할 수 있음 
- 추상 메소드는 실행부 (중괄호{})가 없지만 디폴트 메소드는 실행부 있음. 
default 키워드가 리턴 타입 앞에 붙음 
[ public] default 리턴타입 메소드면(매개변수, ... ) { ... }
- 디폴트 메소드의 실행부에는 상수 필드를 읽거나 
추상 메소드를 호출하는 코드를 작성할 수 있음.

package com.example;

public class DefaultMethodExample {

	interface A {
		// 상수 (public static final)
		// 추상메소드 (public abstract xxx()) 
		
		default void xxx() {
			System.out.println("xxx....");
		}
	}
	
	static class B implements A {
		
	}
	
	public static void main(String[] args) {
		
		B b = new B();
		
		b.xxx();
		
		
	}

}

 


정적 메소드 
- 구현 객체가 없어도 인터페이스만으로 호출할 수 있음
- 선언 시 public을 생략하더라도 자동을 컴파일 과정에서 붙음. 
[public/private] static 리턴타입 메소드면 (매개변수,... ) {...}
- 정적 실행부를 작성할 때 상수 필드를 제외한 
추상 메소드, 디폴트 메소드, privat 메소드 등을 호출할 수 없음  

Private 메소드
- 인터페이스의 상수 필드, 추상 메소드, 디폴트 메소드, 정적 메소드는
모두 public 접근 제한을 가짐 public을 생략하더라도 항상 외부에서 접근이 가능 
- 인터페이스에 외부에서 접근할 수 없는  private 메소드 선언도 가능 
-private 메소드는 디폴트 메소드 안에서만 호출이 가능 
- private 정적 메소드는 정적 메소드 안에서도 호출이 가능 

다중 인터페이스 
- 구현 객체는 여러 개의 인터페이스를 통해 구현 객체를 사용할 수 있음
- 구현 클래스는 인터페이스 A와 인터페이스 B를 implements 뒤에 쉼표로 
구분해서 작성해, 모든 인터페이스가 가진 추상 메소드를 재정의 
public class 구현클래스명 implements 인터페이스A, 인터페이스B {
// 모든 추상 메소드 재정의 
}

인터페이스 상속
- 인터페이스도 다른 인터페이스를 상속할 수 있음. 다중 상속을 허용.
extends 키워드 뒤에 상속할 인터페이스들을 나열
public interface 자식인터페이스 extends 부모인터페이스1, 부모인터페이스2 {...}
- 자식 인터페이스의 구현 클래스는 자식 인터페이스의 메소드뿐만 아니라 
부모 인터페이스의 모든 추상 메소드를 재정의 
- 구현 객체는 다음과 같이 자식 및 부모 인터페이스 변수에 대입될 수 있음 
 자식인터페이스 변수 = new 구현클래스 (...);
   부모인터페이스1 변수 = new 구현클래스 (...);
 부모인터페이스2 변수 = new 구현클래스 (...);

package com.example;

import java.util.TimerTask;

// 인터페이스 상속. 
public class InheritanceExample {

	interface Moveable {
		void move();
	}
	
	interface Drawable extends Runnable, Moveable{ // 다중상속.. 
		void draw();
	}
	
	class A implements Drawable {

		@Override
		public void run() {
			// TODO Auto-generated method stub
			
		}

		@Override
		public void draw() {
			// TODO Auto-generated method stub
			
		}

		@Override
		public void move() {
			// TODO Auto-generated method stub
			
		}
		
	}
	
	// class C는 timertask를 상속 받고 동시에 moveable 인터페이스 규칙을 지켜서 만들어지는 클래스. 
	static class C extends TimerTask implements Moveable {

		@Override
		public void move() {
			// TODO Auto-generated method stub
			
		}

		@Override
		public void run() {
			// TODO Auto-generated method stub
			
		}
		
	}
	
	public static void main(String[] args) {

		C c1 = new C();
		TimerTask c2 = new C();
		Moveable c3 = new C();
	}

}



자동 타입 변환
- 자동으로 타입변환이 일어나는 것 
인터페이스 변수  =  구현 객체;
[자동 타입 변환]
- 부모 클래스가 인터페이스를 구현하고 있다면 
자식 클래스도 인터페이스 타입으로 자동 타입 변환될 수 있음



강제 타입 변환 
- 캐스팅 기호를 사용해서 이터페이스 타입을 
구현 클래스 타입으로 변환시키는 것
- 구현 객체가 인터페이스 타입으로 자동 변환되면, 
인터페이스에 선언된 메소드만 사용 가능



다형성
- 사용 방법은 동일하지만 다양한 결과가 나오는 성질
- 인터페이스 역시 다형성을 구현하기 위해 
재정의와 다종 타입 변환 기능을 이용

메소드 재정의 + 자동 타입 변환 ===> 다형성

package com.example;

public class PolymorphismExample {

	static class Alpha implements Runnable {

		@Override
		public void run() {
			for(int i=0; i<100; i++) {
				System.out.print('A');
				try {
					Thread.sleep(100);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			
		}
		
	}
	
	static class Num implements Runnable{

		@Override
		public void run() {
			for(int i=0; i<100; i++) {
				System.out.print('1');
				try {
					Thread.sleep(50);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
		
	}
	
	public static void main(String[] args) {
		
		
		Thread t1 = new Thread(new Alpha());
		Thread t2 = new Thread(new Num());
		
		t1.start();
		t2.start();
		
		System.out.println("End..");
	}

}



필드의 다형성

매개변수의 다형성
- 매개변수 타입을 인터페이스로 선언하면 
메소드 호출 시 다양한 구현 객체를 대입할 수 있음.

instanceof 연산자 
- 인터페이스에서도 객체 타입을 확인하기 위해 instanceof 연산자를 사용가능. 
if(wehicle instanceof Bus bus) {
// vehicle에 대입된 객체가 Bus일 경우 실행
}
- java12부터는 instanceof 연산의 결과가 true일 경우, 
우측 타입 변수를 사용할 수 있기 때문에 강제 타입 변환이 필요 없음.
if(wehicle instanceof Bus bus) {
// bus 변수 사용
}

sealed 인터페이스 
- java 15부터 무분별한 자식 인터페이스 생성을 방지하기 위해 
봉인된 인터페이스 사용. 
public sealed interface InterfaceA permits InterfaceB {... }

===================
java interface : 객체 규격을 지정하는 것. 

// 클래스 : 객체설계도(인스턴스 생성)
// 인터페이스 : 객체설계도의 설계 규격 ( 클래스 설계 규격)
 
// 인터페이스는 New 생성자를 만들수 없다.

// 클래스에서 new를 할수 없는 메소드 : 추상 클래스.. 
추상 클래스는 추상 메소드(시그니쳐만 포함)를 가지고 있는데 
클래스 종류 : 일반 클래스 ( new 가능 / 인스턴스 생성 )
추상 클래스 (추상메소드 정의 가능 - 바디 없기에 new 불가)

추상 메소드만 가지고 있는 추상 클래스 : 인터페이스.   

인터페이스는 자바에서 클래스들이 구현해야하는 동작을 
지정하는 용도로 사용되는 추상 자료형
class 대신 interface라는 키워드를 이용하여 선언할수 있으며 
메소드 시크니처와 상수선언만을 포함할 수 있음. 

추상 메소드를 가지고 있는게 추상 클래스 ->> 인터페이스


인터페이스 : 일반클래스가 가지고 있는 필드 , 생성자 , 메소드가 
아닌 바디가 없는 순수 추상 클래스 이다.

인터페이스 = 순수 추상 클래스 . 

별도의 문법 규제를 규정하는 인터페이스 
인터페이스는 추상 클래스가 extends를 통해 상속을 받고 
new 생성을 가능하게 이루어지는 것과 같이 
인터페이스(=순수추상 클래스)는 implements를 통해 상속을 
받고 new 생성이 가능...;;
 

추상 클래스 안에서 추상 메소드를 정의 할 때 다른 메소드와 
구분을 위해서 abstract를 주지만
인터페이스는 순수 추상 클래스이므로 오직 추상 메소드만을 
포함 하기 때문에 implements를 사용해서 인터페이스를 구현한다. 


implements 는 다중의 인터페이스 규격을 사용할 수 있다. 
implements inerface1, interface2,.... 
부모타입의 instance에 자식타입의 instance를 넣을 수 있고 
인터페이스를 생성하는 규격을 지킨다면  클래스생성 과 구현이 가능하다.

Interface / Runnable / Compare

// interface는 대부분 형용사 형태이다. 

interface는 무조건 public 

인터페이스 
추상 메소드 // : 메소드 선언부 (호출 방법만 기술 ) 

interface 인터페이스 상속은 extends 키워드 뒤에 상속할 인터페이스 나열. + 
인터페이스는 다중 상속이 가능하다. 

--------------------------------------------------------------------
at eclipse
>>  ctrl + shift + X : 대문자 
>>  ctrl + shift + Y : 소문자 

728x90
반응형

댓글