밑의 인터페이스 선언 부분에 더 자세히 정리해보겠습니다!
개발 코드 > 인터페이스의 메소드 호출 > 인터페이스가 객체의 메소드를 호출
[public] interface 인터페이스이름 {
// 상수
타입 상수이름 = 값;
// 추상 메소드
타입 메소드이름(매개변수, ...);
}
상수 필드 선언
public static final
의 특성을 가짐(없으면 자동 추가)_
로 연결함 public int MAX_VOLUME = 10;
public int MIN_VOLUME = 0;
추상 메소드 선언
public abstract
의 특성을 가짐(없으면 자동 추가) public void turnOn();
public void turnOff();
public void setVolume(int volume);
public
으로 명시하기)구현 클래스
implements
키워드 추가public class 구현클래스이름 implements 인터페이스이름 {
// 실체 메소드 선언
}
다중 인터페이스 구현 클래스
public class 구현클래스이름 implements 인터페이스A, 인터페이스B {
// 인터페이스A에 선언된 추상 메소드의 실체 메소드 선언
// 인터페이스B에 선언된 추상 메소드의 실체 메소드 선언
}
public class MyClass {
// 필드
RemoteControl rc = new Television();
// 생성자
MyClass() { }
MyClass(RemoteControl rc) {
this.rc = rc;
rc.turnOn();
rc.setVolume(5);
}
// 메소드
void methodA() {
RemoteControl rc = new Audio();
rc.turnOn();
rc.setVolume(5);
}
void methodB(RemoteControl rc) {
rc.turnOn();
rc.setVolume(5);
}
}
인터페이스 변수 = 구현 객체;
Car myCar = new Car();
myCar.run(); // 다 HankookTire
myCar.frontLeftTire = new KumhoTire();
myCar.frontRightTire = new KumhoTire();
myCar.run(); // 앞쪽 Tire가 KumhoTire로 교체
public class Driver {
public void drive(Vehicle vehicle) {
vehicle.run();
}
}
// (생략) 실체 메소드를 오버라이딩함
// 실행 코드
public class DriverExample {
public static void main(String[] args) {
Driver dri = new Driver();
Bus bus = new Bus();
Taxi taxi = new Taxi();
dri.drive(bus); // 매개변수의 다형성
dri.drive(taxi);
}
}
instanceof
연산자를 사용 if(vehi instanceof Bus) {
Bus bus = (Bus) vehi;
}
public interface 하위인터페이스 extends 상위인터페이스1, 상위인터페이스2 {. . .}
class ClassName {
class NestedClassName {
}
}
class ClassName {
interface NestedInterfaceName {
}
}
인스턴스 멤버 클래스
static
키워드 없이 중첩 선언된 클래스(정적 필드와 메소드는 선언 불가)정적 멤버 클래스
static
키워드로 선언된 클래스(모든 종류의 필드와 메소드 선언 가능)로컬 클래스
멤버 클래스 내부에서 바깥 클래스의 필드와 메소드에 접근할 때
메소드의 매개변수나 로컬변수를 로컬 클래스에서 사용할 때
예제 비교 하면서 보기!
바깥 필드와 메소드에서 사용 제한
// 예제
public class B {
// 인스턴스 필드
C field1 = new C();
D field2 = new D();
// 인스턴스 메소드 - 둘 다 가능
void method1() {
C var1 = new C();
D var2 = new D();
}
// 정적 필드 초기화
// static C field3 = new C(); 정적 멤버 클래스가 아님
static D field4 = new D();
// 정적 메소드
static void method2() {
// C var1 = new C(); 정적 멤버 클래스가 아님
D var2 = new D();
}
// 인스턴스 멤버 클래스
class C {}
// 정적 멤버 클래스
static class D {}
}
멤버 클래스에서 사용 제한
// 예제
public class C {
int field1;
void method1() {}
static int field2;
static void method2() {}
class D { // 모든 필드와 메소드에 접근 가능
void method() {
field1 = 10;
method1();
field2 = 10;
method2();
}
}
static class E {
void method() {
// field1 = 10; 인스턴스 필드와 메소드는 접근 불가
// method1();
field2 = 10;
method2();
}
}
}
로컬 클래스에서 사용 제한
final
특성을 갖고 있음중첩 클래스에서 바깥 클래스 참조 얻기
this
는 객체 자신, 따라서 중첩 클래스에서 this
는 바깥 클래스의 객체 참조가 아니라 중첩 클래스의 객체 참조임// 예시
바깥클래스.this.필드;
바깥클래스.this.메소드();
class A {
[static] interface I {
void method();
}
}
[상속 - 일반적인 경우]
class 클래스이름 extends 부모클래스 { . . . }
부모클래스 변수 = new 클래스 이름();
=>
[상속 - 익명 객체를 선언하는 경우]
부모클래스 변수 = new 부모 클래스() { . . . };
[구현 - 일반적인 경우]
class 클래스 이름 implements 인터페이스 { . . . }
인터페이스 변수 = new 클래스이름();
=>
[구현 - 익명 객체를 선언하는 경우]
인터페이스 변수 = new 인터페이스() { . . . ];
부모클래스 [필드|변수] = new 부모클래스(매개값, ...) {
// 필드, 메소드
};
부모 클래스(매개값, ..) {..}
은 부모 클래스를 상속하여 자식 클래스를 선언하라는 뜻new
연산자가 선언된 자식 클래스를 객체로 생성함부모클래스(매개값, ..)
은 부모 생성자를 호출하는 것;
붙이기