추상메소드를 포함하는 클래스이다.
객체를 생성할수는 없고 오로지 상속의 목적으로 만든다.
클래스명에 abstract
를 붙여서 만든다.
body(몸체)
를 갖지 않는 메소드이다.
추상메소드는 자식클래스에서 반드시 오버라이딩 해야 한다.
메소드 앞에 abstract
를 붙이고 body
를 만들지 않는다.
abstract class Myclass{ //추상클래스
public abstract void print(); //추상메소드
}
만드는 이유
자식클래스에서 공통으로 반드시 구현해야 할 기능의 메소드를 가져야 할 경우 추상메소드 만듬
예)
abstract class Shape{
private int x;
private int y;
public Shape(int x, int y) {
this.x=x;
this.y=y;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
public abstract void draw();
}
class Rect extends Shape{
public Rect(int x, int y) {
super(x, y);
}
public void draw() {
System.out.println("x"+getX()+"y"+getY()+"위치에 사각형을 그려요");
}
}
public abstract void draw();
는 부모 클래스와 자식클래스에서 공통으로 사용되기 때문에 추상클래스와 추상메소드로 만들어준다. 추상 클래스를 만들기 위해서는 absrtact
를 메소드 앞에 붙이고 자식클래스에서는 absrtact
를 붙이지 않는다.
변수앞에 final
을 붙이는 경우-> 변수를 상수로 만든다.
예) final double PI = 3.14
메소드명 앞에 final
을 붙이는 경우 -> 자식에서 오버라이딩 안된다.
클래스명 앞에 final
을 붙이는 경우 -> 상속을 할 수 없다.
메소드 앞에 final
을 붙이면 오버라이딩을 할 수 없으므로 에러가 난다.
자식클래스들이 가져야 할 기능들의 목록을 제시(뼈대, 기본틀)
상수와 추상메소드로 이루어진다.
형식)
interface 인터페이스명{
상수
추상메소드();
}
인터페이스는 객체를 생성할 수 없다.(자식객체는 참조 가능하다.)
1. 텍스트자식클래스가 가져야 할 기능들의 뼈대를 제공
2. 클래스는 다중상속이 지원되지 않지만 인터페이스를 활용하여 다중상속을 지원한다.
3. 인터페이스를 적절히 사용함으로써 유지보수가 수월해진다.
interface Shape1 {
double PI = 3.14; // 상수 => public Static final이 생략됨
public abstract void draw();
void paint(); // public abstract 생략해도됨
}
class Box1 implements Shape1 { // 인터페이스를 상속 받을때는 implements 사용
public void draw() {
System.out.println("사각형 그리기");
}
public void paint() {
System.out.println("사각형 칠하기");
}
}
class Circle implements Shape1 {
public void draw() {
System.out.println("타원그리기");
}
public void paint() {
System.out.println("타원칠하기");
}
}
첫줄 double PI
는 PI
가 대문자이므로 자바코드에 의해 상수가된다.
인터페이스는 다중상속을 지원 한다public abstract void draw();
와 void paint();
를 오버라이딩 한다. 다른클래스에서 인터페이스를 상속 받을때에는 implements
를 사용해야한다.
interface Shape2{
void draw();
void paint();
}
interface Point{
void setPoint (int x, int y);
}
interface Rect3 extends Shape2, Point{
void resize();
}
또한 interface
끼리 상속할때는 extends
를 사용한다.