추상클래스와 비슷한 인터페이스란것과 자주 쓰이지는 않지만 클래스와 비슷한 구조를 가진 객체를 알아보자.


◆ Interface ( 인터페이스 )

일반 클래스와 다르게 static final field(변수)와 abstract method(메서드)만을 가질 수 있고, 객체 생성이 불가능한 형태의 추상클래스와 비슷한 구조. (일반 변수와, 메서드를 가질 수 없다)

// class 아닌 interface 이용하여 작성한다
public interface CPU{ 
    static final int MAX = 1;
    abstract void sum();  
    // 인터페이스에서는 abstract  붙여도 붙인 것으로 인식하고,
    추상메서드처럼 중괄호({}) 쓰지 않고 세미콜론으로 끝낸다.
}
  • 인터페이스를 사용하기 위해서 상속의 개념과 비슷한 implements(구현)을 해야 한다.
    클래스 뒤에 extends와 비슷하게 implements 인터페이스클래스로 구현한다.

인터페이스 또한 캐스팅이 가능하기 때문에 인터페이스 선언 변수 안에 구현클래스객체 생성으로 캐스팅이 가능하다.
( 인터페이스를 사용하는 가장 큰 이유 중 하나가 다양한 클래스타입을 가질 수 있기 때문이다. )

  • 인터페이스는 상속과 다르게 여러 개를 구현할 수 있다. (다형성)
  • implements한 인터페이스에 있는 모든 메서드는 반드시 오버라이드 해야한다.
  • 클래스 설계 시 인터페이스를 거치는 것이 좋다 (추후 수정 할 때 수정 범위가 줄어든다.)
    light-coupling: 상위 객체 변수에 하위 객체를 생성 하는 것.
    tight-coupling: 같은 객체 변수에 같은 객체를 생성 하는 것.
  • 인터페이스의 메서드는 public abstract 밖에 없기 때문에 이 키워드를 생략해도 자동으로 있는 것으로 인식한다.
  • JDK1.8버전부터는 default키워드를 이용하여 인터페이스에서도 메서드 구현이 가능하다.(defalut되어 있는 메서드는 자동 완성할 때 D표기가 돼있음)
public defalut boolean bol(int a){ return true; }
  • 인터페이스는 인터페이스를 extends 할 수 있다.
  • 일반 클래스는 여러 개의 인터페이스를 동시에 구현(implements)할 수 있다.



◆ Enum

미리 정해진 데이터를 설정해 두고 사용하는 열거형 객체로, 객체 생성은 불가능하다.

▶enum클래스 정의

    public enum Direction{
       UP(1,2), DOWN(2,3), RIGHT(3,3),LEFT(4,4);
       int a,b;
       Direction( int a, int b){  this.a=a;  this.b=b;  }  
       // 접근 제한자를 설정할  없음.
    }

▶main에서 사용 :

Direction d = Direction.UP;
System.out.println(Direction.DOWN);
System.out.println(d.LEFT.a);

▶ switch 문에서 처리 가능한 데이터 타입

: 정수, String, enum데이터

switch(d){
case RIGHT :
case LEFT :
}
//if문에서 사용
if( d == Direction.LEFT){}

클래스 선언과 동시에 미리 객체를 생성시켜 놓는 것과 비슷하게 생각하면 됨

◆ Enum객체 예시

public enum Planet {
    VENUS(6.052e3,4867e24,1), EARTH(6.371e3,5.972e24,2), MARS(3.390e3, 6.4171e23,3);
    
    final double mass;
    final double radius;
    int a;
    int b=55;
    
    Planet(double radius, double mass, int a){
        this.mass = mass;
        this.radius = radius;
        this.a = a;
    }
    
    public void pt() {
        System.out.println
        ("enum_Print----" + mass + " : " + radius + " : " + a + " : " + b);
    }
}

▶ Enum데이터와 비슷한 구조를 가진 클래스 만들기

public class Car {
    public static final Car BENZ;
    public static final Car BMW;
    
    static {
        BENZ = new Car(300, "벤츠");
        BMW = new Car(290, "비엠더블유");
    }
    
    final int speed;
    final String name;
    
    private Car(int speed, String name) {
        this.speed = speed;
        this.name = name;
    }
}

차이점 : Enum이 아닌 클래스로 만든 Car객체의 경우 switch문 등에서 객체 값을 넣을 수 없음.



◆ annotation ( 원뜻은 주석 )

프로그램에 직접적인 영향은 없지만 컴파일러 혹은 타 시스템에 정보를 제공하는 역할을 함.
(기계가 인식하는 주석) @Override 등등…
=> 우 클릭 new -> annotation 을 하면 public @interface 형식이 만들어짐

 
public @interface Comment {
    String writer();
    String date();
    String about();
    int version() default 1;
}

@Comment(writer="yoon", date="2017-11-07", about="use annotation")
public class AA{}

=> version은 default값이 있기 때문에 설정하지 않아도 가능하나, 나머지 것들은 default값이 설정되어 있지 않기 때문에 꼭 써 줘야하는 부분이다.

◆ Annotation활용

▶ @Override

오버라이드를 구현 할 때 위에 적어두면 오버라이드 메서드를 구분할 수 있고 오버라이드가 된 건지 확인이 가능하다.

▶ @Deprecated

구현한 클래스에서 더 이상 필요가 없을 것 같을 때 언젠가 지워질 메서드라고 메서드를 사용하는 이용자에게 줄을 그어 알려줌.

▶ /** 로 시작하는 주석을 달면 javadoc의 정보에서 자신이 작성한 정보를 볼 수 있음.

우클릭 -> Export -> javadoc => (jdk->bin->javadoc)추가
=> doc파일이 만들어지고 해당 클래스의 정보를 볼 수 있다.

▶ @SuppressWarnings({“deprecation”, “null”, unused})

deprecation, null, unused( 적어놓은 어노테이션 )에 대한 경고 메시지를 제거.