Notice
Recent Posts
Recent Comments
Link
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Tags more
Archives
Today
Total
관리 메뉴

밤빵's 개발일지

[TIL]20240628 인터페이스 본문

개발Article

[TIL]20240628 인터페이스

최밤빵 2024. 6. 29. 04:30

오늘부터 주특기 주차가 시작!

Spring 강의를 듣고 과제를 해야해서 긴장 바짝한 상태에서 듣고있는중.. 

과제를 제출할 수 있을까란 걱정에 오늘 종일 한숨만 푹푹 쉰거같다. 

오늘은 인터페이스 정리! 

 

[인터페이스]

 

인터페이스는 일종의 추상클래스다. 추상클래스처럼 추상메서드를 갖지만 추상클래스보다 추상화 정도가 높아서 추상클래스와 달리 몸통을 갖춘 일반 메서드, 멤버변수를 구성원으로 가질 수 없다. 오직 추상메서드와 상수만을 멤버로 가질 수 있고, 그 외의 다른 어떠한 요소도 허용하지 않는다.

 

추상클래스는 일반클래스인데 추상메서드를 가지고있고 생성자와 멤버변수를 가질수있는 부분적으로만 완성된 '미완성 설계도' 이고, 인터페이스는 아무것도 없고 추상메서드만 가지고있는 구현이 전혀 없는 밑그림만 그려진 '기본 설계도'라고 할 수 있다. 또는 껍데기. 인터페이스도 추상클래스처럼 완성되지않아서 그 자체 만으로 사용되기 보다는 다를 클래스를 작성하는 데 도움 줄 목적으로 작성된다. 

 

인터페이스를 작성하는건 클래스를 작성하는 것과 같지만, 키워드로 'class' 대신 'interface'를 사용한다는 것만 다르다. 그리고 인터페이스에도 클래스처럼 접근제어자로 public 이나 default만 사용할 수 있다. 

interface 인터페이스이름 {
    public static final 타입 상수이름 = 값; // 변수는 가질수없다. only 상수
    public abstract 메서드이름(매개변수목록); // 추상메서드 
}

 

 

▶ 인터페이스 멤버들의 제약사항

- 모든 멤버 변수는 public static final. 생략가능

- 모든 메서드는 public abstract. 생략가능 ( static메서드와 default메서드는 예외!)

생략된 제어자는 컴파일 시 컴파일러가 자동으로 추가해준다. 

interface PlayingCard {
    // 상수 (public static final → 생략) 
    public static final int SPADE = 4;
    final int DIAMOND = 3;
    static int HEART = 2;
    int CLOVER = 1; 
    
    // 추상메서드 (publc abstract → 생략가능) 
    public abstract String getCardNumber();
    String getCardKind();
}

 

▶ 인터페이스의 상속

인터페이스는 인터페이스로부터만 상속받을 수 있고, 클래스와는 달리 다중상속이 가능하다. 

여러개의 인터페이스로부터 상속을 받는 것이 가능. ( 추상메서드는 충돌해도 문제가 없다.)

▷ 충돌?

선언부가 다르면 둘 다 상속받으면 그만인데, 선언부가 같고 내용 { } 이 다르면 어느쪽을 상속 받을지 

결정할 수 없다. 

 interface Movable {
        void move(int x, int y);
    }
    
    interface Attackable {
        void attack(Unit u);
    }
    
    interface Fightable extends Movable, Attackable {} 
}

클래스의 상속과 마찬가지로 자식 인터페이스는 부모 인터페이스에 정의 된 멤버들을 모두 상속받는다. 

 

" 인터페이스는 클래스와 달리 Object클래스와 같은 최고 조상이 없다." 

 

▶ 인터페이스의 구현

추상클래스 처럼 그 자체로는 인스턴스 생성이 불가능하고, 추상클래스가 상속을 통해 추상메서드를 완성하는 것 처럼, 인터페이스도 자신에 저의된 추상메서드의 구현부를 만들어주는 클래스를 작성해야한다. 추상클래스가 자신을 상속받는 클래스를 정의하는 것과 다르지않다. 클래스는 확장한다는 의미의 extends를 사용하지만 인터페이스는 구현한다는 의미의 implements를 사용한다. 

  class 클래스이름 implements 인터페이스이름 {
      // 인터페이스에 정의된 추상메서드를 모두 구현해야한다. (완성하는것!)
  }
  
  class Fighter implements Fightable {
      public void move(int x, int y) { 내용 생략 }
      public void attack(Unit u) { 내용 생략 }
}
 class Fighter extends Unit implements Fightable {
      public void move(int x, int y) { 내용 생략 }
      public void attack(Unit u) { 내용 생략 }
}

구현하는 인터페이스의 메서드 중 일부만 구현한다면, abstract를 붙여서 추상클래스로 선언해야하고, 위 처럼 상속과 구현을 동시에 할 수도 있다. 

 

▶ 추상클래스와 인터페이스 

▷ 공통점 - 추상클래스를 가지고있다(미완성 설계도)

▷ 차이점 - 인터페이스는 인스턴스 변수를 가질 수 없다. 

 

▶ 인터페이스를 이용한 다형성

인터페이스도 해당 인터페이스 타입의 참조변수로 이를 구현한 클래스의 인스턴스를 참조할 수 있고, 인터페이스 타입으로의 형변환도 가능하다 . 인터페이스는 메서드의 매개변수의 타입으로도 사용될 수 있다. 

메서드의 리턴타입으로 인터페이스를 저장하는 것도 가능한데, 리턴 타입이 인터페이스라는건 메서드가 해당 인터페이스를 구현한 클래스의 인스턴스를 반환한다는 것을 의미한다. 

 

▶ 인터페이스의 장점

→ 두 객체간의 연결을 돕는 중간역할을 한다. 

→ 선언(설계)과 구현을 분리시킬수 있게 한다. 

→ 변경에 유리한 (유연한) 설계가 가능.

→ 개발시간을 단축시킬 수 있다.

→ 표준화가 가능하다.

→ 독립적인 프로그래밍이 가능하다.

→ 서로 관계없는  클래스들에게 관계를 맺어줄 수 있다. 

class B {
    public void method () {
        System.out.println("methodIn B");
    }
}

선언이 껍데기고, 구현이 알맹이라면 위의 코드는 껍데기 + 알맹이 

같이 붙어있어서 변경이 힘들다. 유연하지 않고 변경이 불리.

 // 새로운 인터페이스선언 
interface I { // 껍데기 : 선언부만 떼어내기
    public void method();
}
 ↑ 구현하게 만든다 
         
class B implements I { // 알맹이 
    public void method() {
        System.out.println("methodIn B");
    }
}

밑에 코드가 변경에 유리하고 유연한 코드이다.

밑 코드 의 class B implements I { ... 와 제일 위 코드는 거의 같다.  

 

 

🫨오늘의 회고 

오늘은 Spring들은 첫 날인데... 아직까지는 재미있다! 진행하는 속도도 좋고 하나하나 가르쳐주는 느낌이라 친절하다. 그럼 잘 알아들어야 하는데, 어려운건 어려운거고 웹미니프로젝트 때 생각이 나는것 같기도하고 과제를 해야한다는 부담감에 열심히 강의를 듣고있다. 꼴등으로 제출해도 좋으니까 과제는꼭 할 수 있었으면 좋겠는데! api 랑 다이어그램? 이런 부분들이있어서 과제 요구사항보면서 머리가 아파오지만 주변분들이 너무 잘 알려주셔서 조금조금씩 힘을 얻고있다!! 내가 제일 잘하는걸 해야지....