인터페이스
클래스가 아니며, 클래스와 관련이 없다.
추상 메소드와 상수만을 멤버로 가진다.
한 개의 클래스가 여러 인터페이스를 구현할 수 있다. (다중 구현 가능.)
Java 8부터 default 메소드가 추가되었다.
Java 8부터 static 메소드가 추가되었다.
목적 : 구현 객체의 같은 동작을 보장하기 위해 사용한다.
public interface Animal {
public static final String name = "동물";
public abstract void move();
public abstract void eat();
public abstract void bark();
}
인터페이스에는 static, final 로 생성할 수 있는 상수와 abstract 로 생성할 수 있는 추상 메서드만 가질 수 있다.
public class Dog implements Animal {
@Override
public void move() {
System.out.println("슥슥~~");
}
@Override
public void bark() {
System.out.println("멍멍!");
}
}
Dog 클래스를 생성한다. Animal 인터페이스를 implements 키워드로 구현하고 인터페이스의 추상 메소드들을 모두 재정의 한다.
public class Cat implements Animal{
@Override
public void move() {
System.out.println("사뿐사뿐~~");
}
@Override
public void bark() {
System.out.println("야옹~~");
}
}
Cat 클래스를 생성한다. 마찬가지로 인터페이스의 추상 메서드들을 오버라이드 한다.
public class Main {
public static void main(String[] args) {
Dog dog = new Dog();
Cat cat = new Cat();
dog.move();
dog.bark();
cat.move();
cat.bark();
}
}
추상 클래스
클래스이며, 클래스와 관련이 있다. (주로 베이스 클래스로 사용)
추상 메소드 및 일반 메소드와 멤버도 포함할 수 있다.
한 개의 클래스가 여러 개의 클래스를 상속받을 수 없다. (다중 상속 불가능.)
상속을 받아 기능을 확장시키는 데 목적이 있다.
목적 : 기존의 클래스에서 공통된 부분을 추상화하여 상속하는 클래스에게 구현을 강제화한다. 메소드의 동작은 구현하는 자식 클래스로 위임한다.
공유의 목적.
package org.example.abstractexam;
public abstract class Animal {
String name;
int age;
public Animal(String name, int age) {
this.name = name;
this.age = age;
}
public void move(){
System.out.println("이동한다");
}
public void eat(){
System.out.println("먹는다");
}
public abstract void bark();
}
추상 클래스도 일반 클래스와 마찬가지로 필드, 생성자, 메소드를 선언할 수 있으며 자식 객체가 생성될 때 super 를 호출하므로 생성자는 반드시 있어야 한다. 그리고 추상 클래스를 작성하다보면 선언만 하고 상속받는 자식 클래스에서 메소드를 재정의하여 사용하여야 하는 경우들이 있다. 예를 들면 Animal 클래스의 bark() 메소드이다.
동물마다 짖는 소리는 모두 다르기때문에 이런 경우에는 추상 메소드로 생성을 하는 방법이 좋다. 추상 메소드는 자식 클래스에서 오버라이드를 강제할 수 있기 때문이다.
package org.example.abstractexam;
public class Dog extends Animal{
public Dog(String name, int age) {
super(name, age);
}
@Override
public void bark() { //메서드 오버라이딩
System.out.println("멍멍!!");
};
}
Dog 클래스를 생성한다. 여기서 bark 는 추상메소드로 생성이 되어 있기 때문에 이곳에서 재정의한다.
package org.example.abstractexam;
public class Cat extends Animal{
public Cat(String name, int age) {
super(name, age);
}
@Override
public void bark() { //메서드 오버라이딩
System.out.println("야옹~~");
};
}
Cat 클래스를 생성한다. 마찬가지로 추상메소드 bark 를 이곳에서 오버라이드 한다.
package org.example.abstractexam;
public class Main {
public static void main(String[] args) {
Dog dog = new Dog("강아지", 3);
Cat cat = new Cat("고양이",3);
dog.move();
dog.bark();
cat.move();
cat.bark();
}
}
추상 클래스(Abstract Class) | 인터페이스(Interface) |
---|---|
상속하여 공통된 기능을 만들고, 확장하기 위함 | 구현하는 객체들이 같은 동작을 보장하기 위함 |
다중상속 불가능 | 다중상속 가능 |
생성자와 일반변수 모두 가질 수 있다. | 생성자와 일반변수를 가질 수 없다. |
메서드를 부분적으로 구현할 수 있다. | 메서드 선언만 가능하다. |
extends 키워드를 사용한다. | implements 키워드를 사용한다. |