JAVA/Basic

[스터디할래? Java 08]인터페이스

[스터디할래? Java] 목차

이글은 백기선님 스터디 할래? 스터디를 뒤늦게 따라간 기록입니다.

스터디할래 링크 >> https://github.com/whiteship/live-study

이필기를 시작으로 공부했습니다 >> https://www.notion.so/4b0cf3f6ff7549adb2951e27519fc0e6

여기 없는내용은 스터디 할래 강의 내용 혹은 제가 java Doc보고작성하거나 예제를 만들어 추가했습니다.

그외는 같이 출처가 써있습니다. 

 

인터페이스 규약. : 개발기간 단축, 결합도 낮주기, 표준화 

구성
-상수
-추상메소드     : 재정의 하여 사용
-디폴트 메소드  jdk8  : 재정의 가능
-스테틱 메소드  jdk8  : 변경불가

구현방법
- 상속
- 익명클래스 

다중상속
- 동일 이름 메서드 있을때. 재정의 필요. 
@Overide
public void sameMethod(){
  AInterface.super.sameMethod();
  BInterface.super.sameMethod();
}
-동일 이름 static 메서드
재정의가 안됨. 
-동일 이름 메서드 부모 static, 자식 default
 호출방법이 다름. 
- 동일이름 메서드 무보 default 자식 static
  불가. 
추상클래스
vs 인터페이스
public class LinkedList<E>
    extends AbstractSequentialList<E>
    implements List<E>, Deque<E>, Cloneable, java.io.Serializable

링크드 리스트는 "추상 순차 목록"이다. "List, Deque, Cloneable, Serializable" 을 할수 있다.
해당 클래스는 "추상~~~클래스"이다. "인터페이스" 을 할수 있다. 
클래스타입레퍼런스
vs 인스턴스 레퍼런스
클래스타입레퍼런스 : CalssA  classA = new CallsA();
인스턴스타입레퍼런스 : List<String> stringList = new ArrayLIst<>();
강한결합 vs 느슨한결합 강한결합: 코드 변경필요 :빠르지만 변경불리
기존 : A -> B
추가 : A -> C ->B or A->B->C
느슨한 결합 :코드변경 필요없음: 느리지만 유연하고 변경 유리
기존 : A--->I , I->B
추가: C --->I
default Method java8
등장이유 : 하위 호환성, 오픈소스코드에서 메소드가 추가되었을때 오류가 발생할수있다. 
from 자바의 신
이전에는 Handler 기능이 필요하면 추상클래스 adoptor를상속받아 일부만 구현할수 있게했음

public interface HandlerInterceptor {
    default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        return true;
    }
static method java8
File의
 public static File[] listRoots() {
        return fs.listRoots();
    }
private method java9

1. private 메소드는 구현부를 가져야한다. 
2. 오직인터페이스 내부에서만사용가능
3. private static 메소드는 다른 static, static아닌 메소드에서 사용가능 ??? 아직모르겠다. 
4. static이 아닌 private메소드는 private static  메소드에서 상용불가
private static method java9
File의 
  private static String slashify(String path, boolean isDirectory) {
        String p = path;
        if (File.separatorChar != '/')
            p = p.replace(File.separatorChar, '/');
        if (!p.startsWith("/"))
            p = "/" + p;
        if (!p.endsWith("/") && isDirectory)
            p = p + "/";
        return p;
    }
자바 8 이후 추상클래스 자바8 , 9 기준 인터페이스 에서 못하는부분이 남아있음. 

public abstract class AbstractJoinMember {
   private String message  =""
   public void setMessage(String message){
   }
}

인터페이스 구현불가 : private 상수.  자바8기준 private 안됨. 
Constant Interface 안티패턴임. 사용하지 마세요~
1. 상수포함하여 모두 가져오고 계속가지고있음
2. 컴파일때 사용 런타임때 용도없음
3. 이진호환성을 필요로할때  계속유지
4. IDE가 없으면 상수 implement한 클래스에서 상수 사용할 때 네임스페이스 사용하지 않음 
    네임스페이스도 인터페이스 상수들로 오염
5. 인터페이스 구현해 클래스를 만드는 것은 클라이언트에게 알리는 행위... 혼동
6. 의도치 않은 현상 발생
https://jessyt.tistory.com/78
안티패턴 소프트웨어 공학 분야 용어이며, 실제 많이 사용되는 패턴이지만 비효율적이거나 비생산적인 패턴을 의미한다. 

 

 

extract method : 리펙토링메뉴. ????

https://spark.adobe.com/sp/design/page/new?_branch_match_id=623005067329261293 

로고, 아이콘만들때. 

비폭력 대화 

 

  • 인터페이스 정의하는 방법
  • 인터페이스 구현하는 방법
  • 인터페이스 레퍼런스를 통해 구현체를 사용하는 방법
  • 인터페이스 상속
  • 인터페이스의 기본 메소드 (Default Method), 자바 8
  • 인터페이스의 static 메소드, 자바 8
  • 인터페이스의 private 메소드, 자바 9