Java,Spring

[자바 기초 문법] 인터페이스와 특수 클래스

뀨린 2021. 5. 26. 19:24

추상 클래스

 

  • 하나 이상의 추상 메서드를 포함하지만 없을 수도 있다. 
  • 주로 상속 계층에서 자식 멤버의 이름을 통일하기 위해서 사용한다. 

 

추상 클래스는 인스턴스를 생성하지 못한다. 

추상 클래스 s = new 추상클래스(); // (XX)

추상 클래스 선언 

abstract class 클래스이름{
//필드
//생성자
//메서드 --> 일반적으로 하나 이상의 추상 메서드 포함함.
}

추상 메서드 선언

 

abstract 반환타입 메서드 이름(); //메서드 본체가 없다. 

 

인터페이스

 

장점

  • 통합에 신경쓰지 않고 다양한 형태로 새로운 클래스 개발 가능하다. 
  • 인터페이스로 다중 상속 효과를 간접적으로 얻을 수 있다. 

 

대표적 인터페이스에는 java.lang 패키지의 ClearSequence, Comparable, Runnable 등이 있다. java.util 패키지의 Collection, Comparator, List 등이 있다. 

 

객체의 크기를 비교하는 Comparable 인터페이스

public interface Comparable{
	int compareTo(Object other);  //객체 other보다 크면 양수, 같으면 0, 작으면 음수 반환
    
}

구조

interface 인터페이스 이름{
	//상수 필드
    //abstract 메서드
    
    
    //default 메서드
    //static 메서드
    //private 메서드
}

👉 컴파일을 하면 확장자가 class인 파일을 생성한다.

 

인터페이스의 수정과 기존 구현 클래스: 디폴트 메서드

 

default 반환타입 디폴트메서드이름() {

//본체를 구성하는 코드

}

인터페이스 상속

interface 자식인터페이스 extends 부모 인터페이스{
//인터페이스 상속하려면 extends 키워드 사용
}

class 자식클래스 implements 부모인터페이스{
//인터페이스 구현하려면 implements 키워드 사용
}

인터페이스는 다중 상속할 수 있지만, 클래스는 다중 상속이 불가능하다!

 

인터페이스를 이용한 다중 상속 효과

인터페이스 타입

 

  • 인터페이스의 구현 클래스는 그 인터페이스의 자식 타입이다. 

 

         인터페이스 변수 = 구현객체 

 

  • 구현 객체는 인터페이스 타입이므로 자동 변환된다. 
  • 인터페이스 타입 변수가 구현 객체를 참조한다면 강제 타입 변환이 가능하다. 

 

        구현클래스타입 변수 = (구현클래스타입) 인터페이스타입변수

 

인터페이스와 다형성

 

중첩 클래스와 중첩 인터페이스

 

중첩클래스는 외부 클래스를 상속할 필요 없이 외부 클래스의 private 멤버까지 사용할 수 있다. 

 

종류

 

중첩 클래스 구조 

class 외부클래스{
    class 멤버클래스{ //외부 클래스의 멤버로 선언된 클래스
    }
    
    interface 중첩인터페이스{
    }

}

class 외부클래스{
    void 메서드() {         
    class 지역 클래스{ //외부클래스의 메서드 내부에 선언됨.
    }
  }
}

컴파일 후 생성 파일

 

외부클래스$멤버클래스.class

외부클래스$중첩인터페이스.class

외부클래스$1지역클래스.class

 

외부클래스 접근

외부클래스.this

중첩클래스의 객체생성

 

외부클래스.내부클래스 변수 = 외부클래스의 객체변수.new 내부클래스생성자();
외부클래스.정적멤버클래스 변수 = new 외부클래스.정적멤버클래스생성자();

익명 클래스

class OnlyOnce extends Parent {

//Parent가 클래스면 오버라이딩한 메서드
//Parent가 인터페이스라면 구현한 메서드

}

Parent p = new OnlyOnce();   //객체 생성

중첩 클래스의 특수한 형태, 코드가 단순해지기 때문에 이벤트 처리나 스레드 등에서 자주 사용한다. 

🔻

Parent p = new Parent(){

//Parent가 클래스면 오버라이딩한 메서드
//Parent가 인터페이스라면 구현한 메서드  //무명 클래스 본체로서 OnlyOnce 클래스의 본체와 동일하다. 

};

 

참조: 쉽게 배우는 자바프로그래밍 2판, 한빛아카데미, 우종정, 2020.