추상 클래스는 미완성의 설계도에 비유할 수 있다.
추상클래스
미완성 설계도. 인스턴스 생성불가.
미완성 매서드(추상 매서드)를 포함하고 있는 클래스
=> 새로운 클래스를 작성한느데 있어서 바탕이 되는 조상 클래스로서 중요한 의미를 갖는다.
abstract class 클래스이름{
...
}
선언부만 작성하고 구현부는 작성하지 않은 채로 남겨 둔 것이 추상메서드.
=>즉, 설계만 해 놓고 실제 수행될 내용은 작성하지 않았기 때문에 미완성 메서드인 것
/*주석을 통해 어떤 기능을 수행할 목적으로 작성하였는지 설명한다. */
abstract 리턴타입 메서드이름();
추상클래스로부터 상속받는 자손클래스는 오버라이딩을 통해 조상인 추상클래스의 추상메서드를 모두 구현해주어야 한다. 만일 조상으로부터 상속받은 추상메서드 중 하나라도 구현하지 않는다면, 자손클래스 역시 추상 클래스로 지정해 주어야 한다.
abstract class Player{//추상클래스
abstract void play(int pos); //추상메서드
abstract void stop(); //추상메서드
}
class AudioPlayer extens Player{
void play(int pos){/*내용생략*/} // 추상메서드를 구현
void stop(){/*내용 생략*/} // 추상메서드를 구현
}
abstract class AbstractPlayer extends Player{
void play(int pos){/*내용생략*/}
}
인터페이스는 추상클래스처럼 추상 메서드를 갖지만 추상 클래스보다 추상화 정보가 높아서 추상클래스와 달리 몸통을 갖춘 일반 메서드 또는 멤버변수를 구성원으로 가질 수 없다.
interface 인터페이스이름{
public static final 타입 상수이름 = 값;
public abstract 메서드이름(매개변수목록);
}
- 모든 멤버변수 public, static, final 이어야 하며, 이를 생략할 수 있다.
- 모든 메서드는 public abstract 이어야 하며, 이를 생략할 수 있다.
-> 단, static메서드와 디폴트 메서드는 예외
인터페이스는 인터페이스로부터만 상속받을 수 있으며, 클래스와는 달리 다중 상속, 즉 여러개의 인터페이스로 부터 상속을 받는 것이 가능하다.
interface Movable{
/**지정된 위치 (x,y)로 이동하는 기능의 메서드*/
void move(int x, int y);
}
interface Attackable{
/**지정된 대상(u)을 공격하는 기능의 메서드 */
void attack(Unit u);
}
interface Fightable extends Movable, Attackable{ }
인터페이스도 자신에 정의도니 추상메서드의 몸통을 만들어주는 클래스를 작성해야한다.
인터페이스는 구현한다는 의미의 키워드 'implements'를 사용한다.
class 클래스이름 implements 인터페이스 이름{
//인터페이스에 정의된 추상메서드를 모두 구현해야 한다.
}
class Fighter implements Fightable{
public void move(int x, int y){/*내용생략*/}
public void attack(Unit u){/*내용생략*/}
}
Fightable f = (Fightable)new Fighter();
//또는
Fightable f = new Fighter();
리턴타입이 인터페이스라는 것은 메서드가 해당 인터페이스를 구현한 클래스의 인스턴스를 반환한다는 것을 의미한다.
- 개발시간을 단축시킬 수 있다.
- 표준화가 가능하다.
- 서로 관계없는 클래스들에게 관계를 맺어 줄 수 있다.
- 독립적인 프로그래밍이 가능하다.
내부 클래스는 클래스 내에 선언된 클래스이다. 클래스에 다른 클래스를 선언하는 이유는 두 클래스가 서로 긴밀한 관계에 있기 때문이다.
내부클래스의 장점
- 내부 클래스에서 외부 클래스의 멤버들을 쉽게 접근할 수 있다.
- 코드의 복잡성을 줄일 수 있다. (캡슐화)
class Outer{
class InstanceInner{}
static class StaticInner{}
void myMethod(){
class localInner{}
}
}
익명클레스는 다른 클레스들과 달리 이름이 없다.
클래스의 선언과 객체의 생성을 동시에 하기 때문에 단 한번만 사용될 수 있고 오직 하나의 객체만을 생성할 수 있는 일회용 클래스이다.
new 조상클래스이름(){
//멤버 선언
}
//또는
new 구현인터페이스이름(){
//멤버 선언
}