archive
[이것이 자바다] 08 인터페이스 -1 본문
1. 인터페이스 역할 (시험 서술형 예상)
- ***** 수업시간에 교수님 설명 듣고 정리하기
2. 인터페이스 구현
-인터페이스는 .java 형태의 소스파일로 작성이 되고 .class 형태로 컴파일이 되기 때문에 물리적인 형태는 클래스와 동일, 소스 작성 시 선언하는 방법과 구성 멤버가 클래스와 다름
-인터페이스 선언 시 접근제한자는 클래스와 마찬가지로 같은 패키지 내에서만 사용이 가능한 default, 패키지와 상관없이 사용하는 public을 붙일 수 있음
-인터페이스가 가질 수 있는 멤버의 종류
1) public 상수 필드
2) public 추상 메소드 -> 추상 메소드란, 선언부만 있고 실행부인 중괄호가 없는 메소드를 말한다.
3) public 디폴트 메소드
4) public 정적 메소드
5) private 메소드
6) private 정적 메소드
- 객체 A ( 아마 실행 main함수 부를 가지고 있는 객체일 것) 가 인터페이스의 추상 메소드를 호출하면 인터페이스는 객체 B의 메소드를 실행한다.
-그렇다면 객체 B는 인터페이스에 선언된 추상 메소드와 동일한 선언부를 가진 (재정의된, 오버라이딩 된) 메소드를 가지고 있어야 한다.
- 여기서 객체 B를 인터페이스를 구현한 (implement) 객체라고 함, 인터페이스에 정의된 추상 메소드에 대한 실행 내용이 구현되어 있기 때문이다.
public class B implements 인터페이스명{...}
- implements 키워드는 해당 클래스가 인터페이스를 통해 사용할 수 있다는 표시이며, 인터페이스의 추상메소드를 재정의한 메소드가 있다는 뜻이다.
3. 변수 선언과 구현 객체 대입
-인터페이스도 하나의 타입이므로 변수의 타입으로 사용이 가능, 인터페이스는 참조 타입에 속하므로 인터페이스 변수에는 객체를 참조하지 않고 있다는 뜻으로 null을 대입할 수 있음
** 이거 약간 틀린 것 찾기에서 헷갈리게 나올 수 있을 거 같음
-인터페이스를 통해 구현 객체를 사용하려면, 인터페이스 변수에 구현 객체를 대입해야함, 정확히 말하면 구현 객체의 번지를 대입해야 함
-즉, classname implements interface라고 정의되지 않은 타입의 변수는 대입할 수 없음
4. 상수 필드
- 인터페이스는 public static final 특성을 가지는 불변의 상수 필드를 멤버로 가질 수 있다
- 인터페이스에 선언된 필드는 모두 public static final의 특성을 가지기 때문에 public static final을 생략하더라도 자동적으로 컴파일 과정에 붙게 된다.
-상수명은 대문자로 작성하되, 서로 다른 언어로 구성이 되어있을 경우 언더바로 연결하는 것이 관례임
public interface RemoteControl{
int MAX_VOLUME = 10; //상수 선언
}
-상수는 구현 객체와 관련이 없는 인터페이스 소속 멤버이기 떄문에 다음과 같이 인터페이스로 바로 접근하여 상수값을 읽을 수 있다.
System.out.println("Maximum volume: "+RemoteControl.MAX_VOLUME);
5. 추상메소드
-인터페이스는 구현 클래스가 재정의를 필수적으로 해야하는 public 추상메소드를 멤버로 가질 수 있다
-추상메소드는 리턴타입, 메소드명, 매개변수만 기술되고 중괄호를 붙이지 않는 메소드를 이야기한다.
-public abstract를 생략하더라도 컴파일 과정에서 자동으로 붙게 된다.
-구현클래스에서 추상메소드를 재정의할 때 주의할 점은 인터페이스의 추상 메소드는 기본적으로 public 접근 제한을 가지기 때문에 public보다 더 낮은 접근 제한으로 재정의할 수 없다, 따라서 재정의되는 메소드에는 모두 public이 추가가 되어있다. (** 얘도 틀린 거 찾기로 나올 가능성이 높아 보임)
6. 디폴트 메소드
-인터페이스에는 완전한 실행 코드를 가진 디폴트 메소드를 선언할 수 있다. 추상 메소드는 실행부(중괄호)가 없지만, 디폴트 메소드는 실행부가 존재한다.
-선언 방법은 클래스 메소드와 동일한데, 타이점은 default 키워드가 리턴 타입 앞에 붙는다.
default void setMute(boolean mute) { //매개변수 있어도 가능
if(mute) {
System.out.println("Mute.");
}
else {
System.out.println("Not Mute");
}
}
-디폴트 메소드는 구현 객체가 필요한 메소드이기 때문에 객체 구현을 한 뒤 변수를 통해 호출해야한다.
** 인터페이스를 통해 바로 접근할 수 있는 애를 객체 변수로 접근하거나, 객체 변수로 호출해야되는 애를 인터페이스로 바로 접근하고 틀린 부분 찾으라고 할 수도 있을 거 같음
-구현 클래스는 디폴트 메소드를 재정의해서 자신에게 맞게 수정할 수도 있음
-재정의 시 주의할 점은 public 접근 제한자를 반드시 붙여야 하고 default 키워드를 생략해야한다.
7. 정적 메소드
-선언 방법은 클래스 정적 메소드와 완전히 동일, 단 public을 생략하더라도 자동으로 컴파일 과정에서 붙는 것이 차이점
-인터페이스에는 정적 메소드도 선언이 가능, 추상 메소드와 디폴트 메소드는 구현객체가 필요하지만, 정적 메소드는 구현 객체가 없어도 인터페이스 만으로도 호출이 가능함.
static void changeBattery() { //public이 컴파일 시 자동으로 붙음
System.out.println("Change Battery.");
}
// 실행블록 내부에서 호출
RemoteControl.changeBattery();
-정적메소드의 실행부(중괄호)를 작성할 때 주의할 점은 상수 필드를 제외한 추상메소드, 디폴트 메소드, private 메소드 등을 호출할 수 없다는 것이다.
-즉, 메소드 중에서 구현 객체가 필요한 인스턴스 메소드는 정적 메소드 내부에 호출이 불가능하다.
-상수 필드는 구현 객체가 필요 없고, 정적 메소드와 똑같이 인터페이스로 바로 접근이 가능하기 때문에 얘는 정적 메소드 내부에서 사용할 수 있는 것임
8. private 메소드
- 인터페이스의 상수필드, 추상 메소드, 디폴트 메소드, 정적 메소드는 모두 public 접근 제한을 가짐, 이 멤버드를 선언할 때는 public을 생략하더라도 컴파일 과정에서 public 접근 제한자가 붙어 항상 외부에서 접근이 가능
-이와 다르게 외부에서 접근할 수 없는 private 메소드 선언도 가능하다
구분 | 설명 |
private 메소드 | 구현 객체가 필요한 메소드 |
private 정적 메소드 | 구현 객체가 필요 없는 메소드 |
-private 메소드는 디폴트 메소드 안에서만 호출이 가능한 반면, private 정적 메소드는 디폴트 메소드 뿐만 아니라 정적 메소드 안에서도 호출이 가능하다.
-private 메소드의 용도는 디폴트와 정적 메소드들의 중복 코드를 줄이기 위함이다
-
'Java > Java 개념 정리' 카테고리의 다른 글
[이것이 자바다] 08 인터페이스 -2 (0) | 2023.05.30 |
---|---|
[이것이 자바다] 07 상속 - 2 (0) | 2023.05.08 |
[이것이 자바다] 07 상속 - 1 (0) | 2023.04.28 |
[이것이 자바다] 06 클래스 - 2 (0) | 2023.04.13 |
[이것이 자바다] 06 클래스 - 1 (0) | 2023.04.07 |