본문 바로가기
study/Java

[Java] 24. Interface1 (인터페이스 예제)

by 금이패런츠 2022. 3. 22.
728x90
반응형
package chap8;
/*
 * 인터페이스 예제
 * 
 * 인터페이스
 * 1. 인터페이스의 멤버는 상수, 추상메서드, default메서드, static 메서드만 가능함.
 * 2. 인터페이스의 모든 멤버의 접근제한자는 public임
 * 3. 객체화 불가 => 구현클래스의 객체화를 통해서 객체화됨.
 * 4. 클래스간의 상속은 단일상속임.
 *    인터페이스간의 상속은 다중상속이 가능함.
 * 5. 클래스와 인터페이스의 관계는 구현(implements)으로 표현한다.
 *   => 다중구현이 가능함.
 */
interface Printerable {
//	(public static final) int INK = 100; //클래스 멤버인 상수
//	public static final 생략이 가능함
//	public 어디서든 접근 가능, static 클래스멤버, final 상수
	int INK = 100; //클래스 멤버인 상수. Printerable.INK로 호출이 가능
	
//	(public abstract) void print(); //추상메서드 
//	public abstract 생략이 가능함
//	public 어디서든 접근 가능, abstract 추상메서드
	void print(); //추상메서드 
}
interface Scannerable {
	void scan();
}
interface Faxable {
	String FAX_NO = "02-1234-5678"; //상수값
	void send(String no);
	void receive(String no);
}
// 다중상속 (Printerable,Scannerable,Faxable)
interface Complexerable extends Printerable,Scannerable,Faxable{}

// Complexerable 인터페이스를 구현한 구현 클래스
class Complexer implements Complexerable{
	int ink; //일반적인 인스턴스변수 
	Complexer() {
		this.ink = INK; //Printerable.INK 가 맞지만 Printerable를 상속받았기때문에 생략가능
	}
	@Override
	public void print() {
		System.out.println("종이에 출력합니다. 남은 잉크량:" + --ink);
	}
	@Override
	public void scan() {
		System.out.println("이미지를 스캔하여 파일에 저장합니다.");
	}
	@Override
	public void send(String no) {
		System.out.println(FAX_NO + "에서" + no + "번호로 FAX를 전송합니다.");
	}
	@Override
	public void receive(String no) {
		System.out.println(no + "에서" + FAX_NO + "로 FAX를 받았습니다.");
	}
}
public class InterfaceEx1 {
	public static void main(String[] args) {
		//인터페이스의 객체는 구현클래스의 객체로 생성함
		Complexer com = new Complexer();
//		Complexerable c = new Complexerable(); //인터페이스이기때문에 객체생성 불가능
//		Printerable.INK = 200; //상수값은 변경 불가
		System.out.println("기본잉크량 :" + Printerable.INK);
		System.out.println("기본잉크량 :" + Complexerable.INK);
		System.out.println("기본잉크량 :" + Complexer.INK);
		System.out.println("FAX 번호 :" + Faxable.FAX_NO);
		System.out.println("FAX 번호 :" + Complexerable.FAX_NO);
		System.out.println("FAX 번호 :" + Complexer.FAX_NO);
		com.print();
		com.scan();
		com.receive("02-5678-1234");
		com.send("02-5678-1234");
		
		if(com instanceof Complexerable) {
			System.out.println("===com 객체는 Complexerable 객체임.");
			Complexerable c = com; //자동 형변환. 
			c.print();
			c.scan();
			c.receive("02-5678-1234");
			c.send("02-5678-1234");
			
			//ink는 Complexer의 멤버이므로, Complexerable에서 사용 할 수 없다.
			//Complexerable 형의 참조변수
//			System.out.println("남은 잉크 :" + c.ink); 
		}
		
		if(com instanceof Printerable) {
			System.out.println("===com 객체는 Printerable 객체임.");
			Printerable p = com; //자동 형변환.
			//p참조변수로 참조가 가능한 멤버의 갯수 : 2개
			p.print();
//			p.scan();
//			p.receive("02-5678-1234");
//			p.send("02-5678-1234");
			System.out.println("전체 잉크량 :" + p.INK); 
//			System.out.println("남은 잉크량 :" + p.ink); 
		}
		
		if(com instanceof Scannerable) {
			System.out.println("===com 객체는 Scannerable 객체임.");
			Scannerable s = com; //자동 형변환.
			//p참조변수로 참조가 가능한 멤버메서드의 갯수 : 1개
//			s.print();
			s.scan();
//			s.receive("02-5678-1234");
//			s.send("02-5678-1234");
//			System.out.println("전체 잉크량 :" + s.INK); 
//			System.out.println("남은 잉크량 :" + s.ink); 
		}
		
		if(com instanceof Faxable) {
			System.out.println("===com 객체는 Faxable 객체임.");
			Faxable f = com; //자동 형변환.
			//f참조변수로 참조가 가능한 멤버메서드의 갯수 : 2개
//			f.print();
//			f.scan();
			f.receive("02-5678-1234");
			f.send("02-5678-1234");
//			System.out.println("전체 잉크량 :" + f.INK); 
//			System.out.println("남은 잉크량 :" + f.ink); 
		}
		
		if(com instanceof Object) {
			System.out.println("===com 객체는 Object 객체임.");
			Object o = com; //자동 형변환. 참조할수는 있지만 형변환은 안됨.
			//o참조변수로 참조가 가능한 멤버메서드의 갯수 : 0개
//			o.print();
//			o.scan();
//			o.receive("02-5678-1234");
//			o.send("02-5678-1234");
//			System.out.println("전체 잉크량 :" + o.INK); 
//			System.out.println("남은 잉크량 :" + o.ink);
			System.out.println(o.toString());
		}
	}
}

8장-인터페이스.pdf
0.19MB

728x90
반응형