예 )
4 void paint(Graphics g);
Chap.3
4.3.1
684.3.1 인터페이스 인터페이스 (interface) (interface)
예제 : Drawable.java
1 import java.awt.Graphics;
2
Chap.3
4.3.1
694.3.1 인터페이스 인터페이스 (interface) (interface)
z 예제 : DrawApplet.java
1 import java.awt.*;
2 import java.applet.*;
3
4 public class DrawApplet extends Applet { 5 Drawable drawable[];
6
7 public void init() {
8 drawable = new Drawable[3];
9 drawable[0] = new DrawableCircle(45, 45, 30);
10 drawable[1] = new DrawableRectangle(25, 25, 40, 65);
11 drawable[2] = new DrawableCircle(90, 70, 60);
12 } 13
14 public void paint(Graphics g) { 15 int n = drawable.length;
16 for(int i=0; i< n; i++) { 17 drawable[i].paint(g);
18 }
………..
Chap.3
4.3.2
704.3.2 인터페이스 인터페이스 특성 특성
z 인터페이스 특성
인터페이스의 멤버필드는 디폴드로 static, final로 선언
따라서 인터페이스의 멤버필드의 값을 변경하려는 시도는 컴파일 시에
에러를 발생
인터페이스 구현 – 서브타입
여러 개의 인터페이스를 구현하는 경우
콤마를 이용해서 기술
인터페이스의 임플리멘츠도 상속과 같은 개념
인터페이스를 임플리멘츠한 서브클래스는
인터페이스의 멤버필드를 상속 받아서 사용할 수 있다.
인터페이스의 상속
extends 키워드 사용
interface ScaledDrawable extends Drawable{…..}
Chap.3
4.4 static
714.4 static 과 과 final final 의 의 의미 의미
z final 클래스
그 클래스는 더 이상 상속을 통해서 재사용할 수 없음
final 클래스를 상속받으려는 클래스는 컴파일 시에 에러가 발생
클래스 앞에 final 키워드 사용
public final class FinalClass{ …. }final
z final 메소드
final이 메소드에 선언된 경우, 오버라이딩이 불가능
메소드 앞에 final 키워드 사용 public final void print(){ …. }final
z final 멤버필드
값을 변경할 수 없는 상수의 의미
final 멤버필드는 값을 초기화만 할 수 있고, 새로이 값을 할당할 수는 없음
멤버필드 앞에 final 키워드 사용 public final int a = 10;final
Chap.3
4.4 static
724.4 static 과 과 final final 의 의 의미 의미
z static 멤버필드
객체들간의 전역변수처럼 사용됨
클래스 이름으로 접근한다. (ex : Color.red)
멤버필드 앞에 static 키워드 사용 static
static int a = 3;
z static 메소드
혹은 클래스 메소드라고도 함
인스턴스가 아닌 클래스 이름으로 메소드 호출
ex : Math.abs(-10);
메소드 앞에 static 키워드 사용
public final staticstatic void sayHello(String arg){ .… }
주의
this, super를 사용할 수 없음
static이 아닌 멤버필드는 접근할 수 없음
Chap.3
4.4 static
734.4 static 과 과 final final 의 의 의미 의미
z static 초기화
클래스내에서 static 키워드를 이용해서 초기화 루틴을 사용할 수 있음
static 초기화는 클래스가 초기화될 때 수행
대표적인 static 초기화의 예는 네이티브 메소드에서 라이브러리를 로드 static {
System.loadLibrary("hello");
}
자바 클래스에서 멤버필드나 메소드의 위치는 크게 중요하지 않았음
그러나 static 초기화에서는 변수의 위치는 중요
뒤에 선언된 변수나 함수를 앞에서 레퍼런스해서 사용할 수 없음
예제 : BadStaticInitial.java
1 class BadStaticInitial { 2 static int i = j + 2;
3 static int j = 4;
4 }
Chap.3
5.1
745.1 내부 내부 클래스 클래스 (Inner Class) (Inner Class)
z
내부 클래스
클래스내부에 정의된 클래스
외부 클래스의 멤버 필드와 메소드에 자유롭게 접근 가능
z
종류
내재된 (Nested) 톱레벨 클래스 / 인터페이스
클래스나 인터페이스가 static으로 선언된 경우
패키지의 멤버 – 다른 클래스에서 사용될 수 있음
멤버 클래스
클래스의 멤버로 정의됨
지역 클래스
메소드 내부에서 정의됨
무명 클래스
메소드 내부에서 정의됨
Chap.3
5.1.1
755.1.1 내재된 내재된 톱레벨클래스 톱레벨클래스 / / 인터페이스 인터페이스
z 내재된 (Nested) 톱레벨 클래스 / 인테페이스
다른 클래스에 포함되면서 클래스나 인테페이스가 static으로 선언된 경우
다른 톱레벨 클래스와 같이 패키지의 멤버이다.
LinkedList 클래스에 내재된 인터페이스 Linkable이 있다면,
Linkable 인터페이스는 LinkedList.Linkable로 접근할 수 있다.
예제 : LinkedList.java
1 public class LinkedList {
2 protected Linkable head;
3
4 public LinkedList() { 5 head = null;
6 }
…………...
12 public interface Linkable {