메소드 재정의 (Method Overriding)
부모 클래스(인터페이스)를 상속받아 재정의 하는 것을 말한다.
추상 클래스와 추상 메서드
// 추상 클래스
public abstract class Shape { // 추상 메서드를 1개라도 포함하는 클래스
public abstract void draw(); // 추상 클래스. 구현부 X
public string name; // 일반 변수
public void move(){ ... } // 일반 함수. 구현부 O
}
- 구체적인 구현부가 없이 abstract 를 붙여 선언만 되어 있는 메서드를 추상 메서드라고 한다.
- 이러한 추상메서드를 1개라도 가지고 있을 경우 '추상 클래스' 라고 하며 abstract 를 붙여주어야 한다.
public class Triangle extends Shape {
public void draw() { // Shape에서 상속받은 메소드 구현 (Overriding)
System.out.println("Triangle Draw");
}
}
public class Rectangle extends Shape {
public void draw() { // Shape에서 상속받은 메소드 구현 (Overriding)
System.out.println("Rectangle Draw");
}
}
Shape s = new Shape(); (X)
Triangle t = new Triangle(); (O)
Triangle r = new Rectangle(); (O)
Shape t = new Triangle(); (O)
Shape r = new Rectangle(); (O)
Triangle t = new shape(); (X)
Rectangle r = new shape(); (X)
public static void call (Shape s) {
s.draw();
}
// 다형성의 특징 - Heterogeneous Collection
Shape []s = new Shape[2];
s[0] = new Triangle();
s[1] = new Rectangle();
- 추상클래스는 그 자체로 객체화될 수 없다. 따라서 Shape는 추상클래스이기 때문에 인스턴스를 생성할 수 없다.
- 다른 클래스가 추상클래스를 상속받을 경우 반드시 추상메서드를 오버라이딩(재정의)해야 한다.
Triangle 클래스는 Shape(추상클래스)를 상속받아 추상메서드(draw())를 재정의한다.
- 부모를 상속받은 객체들은 부모인 추상 클래스의 형을 사용할 수 있다.
덕분에 call함수를 Triangle, Rectangle 등의 매개변수를 갖도록 계속 재정의하지 않아도 된다.
- 추상화 덕분에 다형성의 특징을 이용할 수 있어서 추상 클래스 형 배열에 상속받은 클래스의 객체들을 담을 수 있다.
인터페이스
추상클래스는 단일상속만 가능하다. 이미 다른 클래스를 상속받아 추상 클래스를 상속시킬 방법이 없을 경우 해결하기 위한 것이 인터페이스이다.
public Interface DatabaseFactory {
public Database getDatabase();
}
public class DatabaseFactoryImpl implements DatabaseFactory {
public Database getDatabase(){
Database db = new DatabaseImpl();
return db;
}
}
- 인터페이스는 추상메서드만(!) 가지고 있는다.
- 추상메서드는 abstract 키워드를 가지고 있지 않다.
- 추상클래스와 마찬가지로 상속받아 추상메서드의 재정의를 꼭 해야한다.
- 인터페이스를 받아들이는 클래스의 입장
1) 인터페이스에 선언된 추상 메소드를 있는 그대로 상속받아 추상 클래스가 된다.
2) 인터페이스에 선언된 추상 메소드를 재정의하여 객체를 생성할 수 있는 구현 가능한 클래스로 만든다.
이러한 점에서 보면 인터페이스가 추상클래스와 비슷해보여도 좀 더 넓은 범위라고 생각할 수 있다.
추상 클래스와 인터페이스를 정리해보자면 다음과 같다.
|
추상 클래스 |
인터페이스 |
가질 수 있는 있는 속성 |
추상 메소드, 일반 함수, 일반 변수 .. |
추상 메소드 |
상속 받을 수 있는 개수 |
1개 |
여러 개 |
상속 시 재정의 필수 여부 | 필수 |
필수 |
키워드 |
abstract / extends |
interface / implements |
'Java & JSP' 카테고리의 다른 글
[Java] 날짜 더하기, String<->Date 변환, Calender->String 변환 (0) | 2018.09.06 |
---|---|
[MySQL] mac에서 mysql 접속 오류 해결 (user/local/mysql/data directory is not owned by the mysql or _mysql user) (0) | 2018.08.29 |
[DB-error] mybatis Mapped Statements collection does not 에러 해결 (0) | 2018.06.02 |
[Java] Eclipse에서 github commit, push 하는 방법 (수정중) (0) | 2018.05.27 |
[JAVA] 컨텍스트의 절대경로 알아오는 방법 (0) | 2018.04.30 |