ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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

    댓글

Designed by Tistory.