-
day20 - JAVA (자바 , 인터페이스, final, static)KIC/JAVA 2021. 7. 16. 21:21반응형
[인터페이스]
-> 인터페이스 내에는 상수 또는 추상 메서드들만 정의가 가능하다.
-> 사용하기 위해서는 일 반 클래스에서 구현(implements)력을 가져야 한다.
-> 일반 클래스에서 “implements"라는 예약어로 특정 인터페이스를 구현하겠다고 명시한다.
-> 명시한 인터페이스가 가지는 추상 메서드들은 구현 받은 클래스에서 하나도 빠짐없이 Overriding(재정의)해야 한다.
-> jdk 8.0 이후부터 인터페이스도 구현부를 가진 메서드를 멤버로 가질 수 있다.
-> 만약 다중 상속시에 중복되는 메서드가 있을 경우 꼭 상속받은 클래스에서 해당 메서드를 재정의 해줘야 한다.
-> 인터페이스는 implements 를 사용해서 일종의 상속을 구현한다. 인터페이스를 상속 받을 때에는 extends 대신에 implements 를 사용
-> 인터페이스는 여러개의 인터페이스를 implements 받을 수 있다. 나열되는 인터페이스 간에 같은 이름을 가진 메소드가 없어야 한다.
[final]
-> 이 키워드가 붙으면 정의 후에 수정이 불가능 하다.
[final 클래스]
-> final이 클래스명 앞에 붙으면 이 클래스는 상속을 해줄 수 없다.
-> 이 클래스를 상속을 해주는 클래스로 사용할 수 없다는 뜻. 그러나 final이 클래스를 작성할 때 상속을 받는 것은 가능하다.
-> final이 붙은 클래스를 상속 받으려는 클래스는 컴파일시 에러가 발생한다.
[final 메소드]
-> 메소드에 final이 선언된 경우에는 그 메소드는 오버라이딩이 되지 않는다. 오버라이딩을 시도할 경우 에러가 난다.[final 멤버변수]
-> final이 클래스의 멤버변수로 사용되면, 멤버변수는 값을 변경할 수 없는 상수로서 사용된다.
-> final 멤버변수는 초기화만할 수 있고, 새로이 값을 할당 할 수 없다.
-> 따라서 final이 붙은 멤버변수는 반드시 초기화를 해야 한다.-> 새로이 값을 할당하면 컴파일 에러가 발생한다.
-> 일반적으로 final이 붙은 멤버변수는 static을 같이 선언해서 쓴다.
[static]
static 메소드
-> static이 선언된 메소드는 오버라이딩이 되지 않고 메소드 숨김이 일어난다.-> 또한 static으로 선언한 메소드는 객 체의 레퍼런스가 아닌 클래스 이름으로 메소드를 호출 할 수 있다.
[static 멤버변수]
-> 멤버변수는 하나의 객체내에서만 전역변수로 사용된다. 그러나 static이 선언된 멤버 변수는 객체들 간의 전역변수 처럼 사용될 수 있다.-> 즉, 이 멤버 변수는 해당 클래스를 사용해서 생성되는 모든 객체가 공유한다. 그래서 이 것을 클래스변수라고도 부른다.
[ex]
package javaPro.java_interface; /* * 인터페이스 * 1. 인터페이스의 멤버는 상수,추상메서드,default 메서드, static 메서드만 가능 * [public static final] 자료형 상수 * [public abstract] 자료형 메서드명(); * [public] default 자료형 메서드명() {} => jdk 8.0 이후에서만 가능 * [public] static 자료형 메서드명() {} => jdk 8.0 이후에서만 가능 * 2. 인터페이스의 멤버의 접근 제어자는 public * 3. 객체화 불가. => 구현클래스로 객체화가 된다. * 4. 클래스와 인터페이스간은 구현으로 표현한다. * => 다중 구현이 가능함. * 5. 인터페이스간의 상속은 다중 상속이 가능하다. */ // class 명 ComplexerEx1 interface Printerable { //public static final 제어자 생략 //-> 인터페이스라서 이렇게 생략 가능 추상 클래스에서는 이렇게 생략 불가능 int INK = 100; // 따라서 이건 상수이다. //public abstract 제어자 생략 //-> 인터페이스라서 이렇게 생략 가능 추상 클래스에서는 이렇게 생략 불가능 void print(); } interface Scannerable { void scan(); } interface Faxable { String FAX_NO = "010-12345"; void send(String tel); void receive(String tel); } //인터페이스간의 상속은 다중 상속이 가능하다. interface Complexable extends Printerable, Scannerable, Faxable{ } class Complexer implements Complexable{ int ink; Complexer(){ ink = INK; } @Override public void print() { System.out.println("종이에 출력합니다. 남은 잉크량:" + --ink); } @Override public void scan() { System.out.println("이미지를 스캔합니다."); } @Override public void send(String tel) { System.out.println(FAX_NO + "에서 " + tel + "번호로 FAX를 전송"); } @Override public void receive(String tel) { System.out.println(tel + "에서 " + FAX_NO + "로 FAX를 수신"); } } public class ComplexerEx1 { public static void main(String[] args) { Complexer com = new Complexer(); // com.INK = 100; //상수 System.out.println("기본 잉크량" + Printerable.INK); System.out.println("FAX 번호: " + Complexable.FAX_NO); com.print(); com.scan(); com.receive("02-5678"); com.send("03-5678"); if(com instanceof Complexable){ System.out.println("====com 참조변수의 객체는 Complexable 입니다."); Complexable c = com; c.print(); c.scan(); c.receive("02-5678"); c.send("03-5678"); } if(com instanceof Printerable){ System.out.println("====com 참조변수의 객체는 Printerable 입니다."); Printerable c = com; c.print(); //c.scan(); -> 부모에 없는 메소드이기 때문에 오류가 난다. //c.receive("02-5678"); -> 부모에 없는 메소드이기 때문에 오류가 난다. //c.send("03-5678"); -> 부모에 없는 메소드이기 때문에 오류가 난다. } if(com instanceof Scannerable){ System.out.println("====com 참조변수의 객체는 Scannerable 입니다."); Scannerable c = com; //c.print(); -> 부모에 없는 메소드이기 때문에 오류가 난다. c.scan(); //c.receive("02-5678"); -> 부모에 없는 메소드이기 때문에 오류가 난다. //c.send("03-5678"); -> 부모에 없는 메소드이기 때문에 오류가 난다. } if(com instanceof Faxable){ System.out.println("====com 참조변수의 객체는 Faxable 입니다."); Faxable c = com; //c.print(); -> 부모에 없는 메소드이기 때문에 오류가 난다. //c.scan(); -> 부모에 없는 메소드이기 때문에 오류가 난다. c.receive("02-5678"); c.send("03-5678"); } } }
[ex]
package javaPro.java_interface; class LazerZet implements Printerable { @Override public void print(){ System.out.println("레이저 Printer에서 출력함"); } } class InkZet implements Printerable { @Override public void print() { System.out.println("잉크젯 Printer 에서 출력함"); } } class PrinterManager { // Printerable : Printerable 인터페이스의 구현객체를 리턴 -> 리턴타입이 Printerable인 것 public static Printerable getPrinter(String type){ //Printerable p = new InkZet(); if (type.equals("INK")) return new InkZet(); else return new LazerZet(); } } public class PrinterEx1 { public static void main(String[] args) { Printerable able = PrinterManager.getPrinter("INK"); able.print(); able = PrinterManager.getPrinter("LAZER"); able.print(); } }
300x250'KIC > JAVA' 카테고리의 다른 글
day22 - JAVA (자바 , 접근 제한자, 예외 처리(Exception Handle)) (0) 2021.07.17 day21 - JAVA (inner class, static 내부 클래스, non-static 내부 클래스, 지역 내부 클래스, 무명 클래스) (0) 2021.07.17 day19 - JAVA (자바 , 상속, super, Object 클래스, 오버라이딩, 다형성, 추상 클래스, pakage/import) (0) 2021.07.16 day18_2- JAVA (자바 , 변수의 초기화, toString) (0) 2021.07.15 day18_1- JAVA (자바 ,static 메서드, 인스턴스메서드, 메서드 오버로딩, 생성자, this) (0) 2021.07.15