정의
즉, 모델화 하는 것으로 데이터의 공통된 성질을 추출하는 것이다.
또 다른 말로는 인터페이스에 의존하고, 구체적인 구현에는 의존하지 않는 것이라고 할 수 있다.
ex) 토끼, 고양이, 강아지 가 있으면 동물이라고 묶어 추상화할 수 있다.
효과 / 장점
추상화를 사용하며 얻는 이점들은 아래와 같은 것들이 있다.
하지만 추상화를 했을 때 간단하게 사용할 수 있다는 점을 반대로 생각해 보면 내부가 얼마나 복잡한지 몰라서 쉽지 않다.
그리고 사용하려면 아래의 조건들이 선행돼야 한다.
정의
하나 이상의 추상 메서드를 포함하는 클래스를 가리켜 추상 클래스(abstract class)라고 한다.
추상 클래스를 상속받는 모든 클래스에서는 추상 메서드를 반드시 재정의 해야 한다.
일반 메서드로 구현한다면 사용자에 따라 구현할 수도 있고 안 할 수도 있지만, 추상메서드가 포함된 추상 클래스를 상속받은 모든 자식 클래스는 반드시 구현하게 되기 때문에 사용한다.
정의
자식 클래스가 여러 부모 클래스를 상속받을 수 있다면, 다양한 동작을 수행할 수 있는 장점을 가질 수 있게 되지만 자바에서는 클래스를 통한 다중상속은 지원하지 않는다.
하지만 해당 이점을 버릴 수 없기 때문에 인터페이스를 통해 다중 상속을 지원하고 있다.
자바에서 추상클래스는 추상메서드, 생성자, 필드, 일반메서드도 포함할 수 있지만, 인터페이스는 추상메서드와 상수만 포함할 수 있다.
또한 추상클래스는 abstract를 사용하지만 인터페이스는 implements를 사용한다.
정의
추상 클래스와 인터페이스는 상속받은 클래스 혹은 구현하는 인터페이스 안에 있는 추상메서드를 구현하도록 강제한다. 하지만 존재 목적이 다르다
하지만 추상클래스는 상속을 받아 기능을 이용하고 확장시키는 데 의미가 있다면 인터페이스는 상속을 받아 기능을 구현을 시키는 데 의미가 있다.
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(); // 동물마다 짖는 소리가 다르기 때문에 추상메서드로 생성
public class Cat extends Animal{
public Cat(String name, int age) {
super(name, age);
}
@Override
public void bark() { // 추상클래스를 상속받은 후 메서드 오버라이딩
System.out.println("야옹~");
}
}
public class Dog extends Animal{
public Dog(String name, int age) {
super(name, age);
}
@Override
public void bark() { // 추상클래스를 상속받은 후 메서드 오버라이딩
System.out.println("멍멍!");
}
}
public class Main {
public static void main(String[] args) {
Dog dog = new Dog("강아지", 3);
Cat cat = new Cat("고양이", 5);
cat.move();
cat.bark();
dog.move();
dog.bark();
}
}
결과
움직인다.
야옹~
움직인다.
멍멍!
종료 코드 0(으)로 완료된 프로세스
엄청 유익하게 봤습니다~ 앞으로 종종 놀러올게요