본문 바로가기
CLASS/JAVA

#10-1 / Interface

by hingu 2024. 5. 14.

👀 전체 정리 : https://dev-eunse.tistory.com/97

 

Interface : class와 비슷한 성격을 가지고 있음. 즉,모든 메소드를 그룹화함(근데 다름)

- 기본 메소드가 {} 없음(public) - public 안에는 문법 작성 x,인자값은 작성해야함

- default란 interface에서 유일하게 기본메소드를 활용할 수 있는 선언문,default를 붙여야 {}사용 가능

- ⭐ default메소드는 사용해도되고 안해도 됨,public은 필수

- private,protected 사용불가(default,public 가능),static 메소드 또한 사용 가능함(메소드 안에 문법 작성 가능)

- 무조건 별도 파일

- interface를 직접 class파일에 사용하지 못함(로드를 활용해서 사용해야함)

- interface는 즉시실행은 없음

 

abstract와 interface의 차이
* abstract는 써도 되고 안써도 되고,활용가능 / interface는 쓰라는데로 써야함(찍어내듯이 뭔가를 만들어낼때)

* abstract는 한개만 / interface는 한개 이상 .java 파일을 로드 할 수 있다

->한개만 쓸거면 굳이 interface 쓸 필요 x

* 즉시실행 메소드가 없다

 

로드방식

class op7_box implements inter1 {

@Override

메소드{}

}

⚡ interface(inter1,inter2 연계)
package oop2;

public class oop_class7 {

	public static void main(String[] args) {
		op7_box op = new op7_box();
		op.point();
	}
}

//interface를 직접 class파일에 사용하지 못함(로드를 활용해서 사용해야함)
//public interface inter2{
//	
//}

// abstract와 interface의 차이 : 
// abstract는 써도 되고 안써도 되고,활용가능/interface는 쓰라는데로 써야함(찍어내듯이 뭔가를 만들어낼때) 

class op7_box implements inter1,inter2_2 { //interface에 extends를 적용해서 가져옴(inter2.java)
	
	//--inter2 메소드
	@Override
	public void money() { //필수(public, inter2 로드시)
		
	}

	//--inter2_2 메소드
	@Override
	public void point() { //필수(public)
		System.out.println(this.p); 
	}

	//-- inter1 메소드
	//default메소드는 사용해도되고 안해도 됨,public은 필수
	@Override //abstract와 동일하게 사용한다.
	public String names() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public void setbox(String id) {
		//super도 동일하게 사용된다.
		inter1.super.setbox(id);
	}

	@Override
	public Integer age() {
		// TODO Auto-generated method stub
		return null;
	}
	
};


🔽 inter1.java

package oop2;
//interface
public interface inter1 {
	public String names(); //기본 메소드가 {} 없음
	public Integer age(); //private,protected 사용불가
	
	//default란 interface에서 유일하게 기본메소드를 활용할 수 있는 선언문
	//setter
	default void setbox(String id) { //default를 붙여야 {}사용 가능!
		
	};
	
	//getter
	default String getbox() {
		return null;
	};
	
}


🔽 inter2.java

package oop2;

public interface inter2 {
	//public inter2(); interface는 즉시실행은 없음 
	public String data[] = {"유재석","강호동","신동엽","정상훈","아이유"};
	public void money();
}

//기존 내용 외에 추가적인 메소드 및 전역변수 자료형이 있을 경우
 //기존 interface를 로드 후 추가 옵션코드를 작성함
interface inter2_2 extends inter2{
	Integer p = 1000;
	public void point();
	
	@Override
	default void money() { //써도 되고 안써도 됨
	}
}

/*
	 [핵심]
	 1. extends로 interface를 로드시 기존에 있는 메소드를 default 변경 유/무 선택
	 2. 새로운 메소드를 생성시 implements를 한 class에 추가 메소드를 오버라이드 해야함
	 3. 즉시실행되는 메소드는 없음!
  
  */

 

⚡ inter3,inter4 연계작업(은행)
동일한 이름을 가진 변수가 두개 이상일 경우 : this는 사용불가 / 한개면 this 잘 먹힘
❗❗❗❗ [중요]  interface에서 만들어진 전역변수는 모두 final(상수) - 값을 가져올순 있지만 변경은 x
//중복된 코드가 너무 많음..이건 걍 예제일뿐.. 실무에서도 이렇게 하면 안됨..

package oop2;

import java.util.Scanner;

//inter3,inter4 연계작업(은행)
public class bank {
	public static void main(String[] args) {
		allbank ab = new allbank();
		
		Scanner sc = new Scanner(System.in);
		System.out.println("1.국민은행, 2.신한은행 / 은행을 선택해 주세요 : ");
		Integer bankno = sc.nextInt(); 
		switch(bankno) {
		case 1: //국민 inter3
			ab.KB_bank();
		break;
		case 2: //신한 inter4
			ab.SH_bank();
		break;
		default:
			System.out.println("해당 은행코드는 존재하지 않습니다.");
		break;
		}
		sc.close();
	}
}

class allbank implements inter3,inter4 {
	Scanner sc2 = new Scanner(System.in);
	String userpass = ""; //사용자가 입력한 비밀번호 받는 변수
	String part = ""; //입금,출금을 구분하기 위한 변수
	Integer usermoney = 0; //입금,출금 사용자가 입력한 금액 저장 변수
	Integer money = 0; //은행의 최종 잔여금액 변수
	
	
	public allbank() { //즉시실행메소드
		this.money = inter3.money;
		
		//동일한 이름을 가진 변수가 두개 이상일 경우 : this는 x / 한개면 this 잘 먹힘
		//System.out.println(this.money);
		//System.out.println(inter3.bankname); 
	}
	
	@Override
	public void SH_bank() { //inter4 신한, 수수료필요
		System.out.printf("%s은행 패스워드 입력 : %n",inter4.bankname);
		this.userpass = this.sc2.nextLine();
		
		if(this.userpass.equals(inter4.password)) {
			System.out.println("1.입금 , 2.출금 : ");
			this.part = sc2.nextLine();
			//출금만..ㅎ
			if(this.part.equals("2")) {
				System.out.println("출금 금액을 입력해주세요 : ");
				this.usermoney = sc2.nextInt();
				sc2.close();
				this.out_money(true); //출금시 수수료 적용
			}
		}else {
			System.out.println("계좌 비밀번호가 틀립니다");
		}
		
	}

	@Override
	public void KB_bank() { //inter3 국민, 수수료필요x
		System.out.printf("%s은행 패스워드 입력 : %n",inter3.bankname);
		this.userpass = this.sc2.nextLine();
		if(this.userpass.equals(inter3.password)) {
			System.out.println("1.입금 , 2.출금 : ");
			this.part = sc2.nextLine();
			//출금만..ㅎ
			if(this.part.equals("2")) {
				System.out.println("출금 금액을 입력해주세요 : ");
				this.usermoney = sc2.nextInt();
				sc2.close();
				this.out_money(false); //출금시 수수료 적용x
			}
		}else {
			System.out.println("계좌 비밀번호가 틀립니다");
		}
	}
	
	//입금,출금처리 메소드(return 메소드)
	public Integer in_money() { //입금
		//입금은 알아서..
		return 0;
	}
	
	public Integer out_money(boolean z) { //출금(수수료 발생)
		if(z == true) { //수수료 있음(신한)
			this.money = this.money - (this.usermoney + inter4.cg);
			System.out.println("최종 금액은 : " + this.money);
		}else { //수수료 없음(국민)
			this.money = this.money - this.usermoney;
			System.out.println("최종 금액은 : " + this.money);
		}
		
		return 0;
	}
	
}


🔽 inter3.java

package oop2;
//static 메소드 또한 사용 가능함(메소드 안에 문법 작성 가능)
/*
[중요]
interface에서 만들어진 전역변수는 모두 final(상수) - 값을 가져올순 있지만 변경은 x
*/

public interface inter3 {
	static Integer money = 100000; //입금 완료된 금액
	public void KB_bank(); //국민은행
	String password = "1234"; //국민계좌 비밀번호
	String bankname = "국민";
}


🔽 inter4.java

package oop2;

public interface inter4 {
	public void SH_bank(); //신한은행
	String password = "5678"; //신한 계좌 비밀번호
	String bankname = "신한";
	Integer cg = 1300; //수수료
}