1. 추상 클래스(abstract class)
추상 클래스는 클래스의 공통된 부분을 뽑아 별도의 클래스인 추상 클래스로 만들어놓고 이것을 상속해서 사용한다.
앞서 클래스를 설계도에 비유했는데, 추상 클래스는 미완성 설계도에 비유가 가능하다.
미완성 클래스로 완성된 제품을 만들 수 없듯이 추상 클래스로 인스턴스는 생성할 수 없다.
상속을 통해서 자손클래스에 의해서만 완성될 수 있다.
추상 클래스의 특징은 다음과 같다.
1. 멤버 변수를 가진다.
2. 추상클래스를 상속하기 위해선 상속 키워드인 extends를 이용한다
3. 추상 메서드를 가지며 상속한 클래스에서 반드시 구현해야 한다.
4. 일반 메서드를 가질 수 있다.
5. 일반 클래스와 마찬가지로 생성자도 있다.
추상 클래스 자체로는 클래스로서의 역할을 완벽히 수행하기 힘들다. 예를 들어 TV를 생각해보면 TV에는 정말 다양한 종류의 모델이 있는데, TV라는 공통적인 설계도는 비슷할 것이다. 그래서 이들의 공통부분만을 그린 미완성 설계도를 만들어 놓고, 이 미완성 설계도를 이용해 각각의 TV 종류에 맞춰 완성하는 것이 훨신 효율적일 것이다.
추상 클래스의 키워드는 다음과 같다 = 'abstract'
1) 추상클래스의 선언
abstract class 클래스 이름{
내용
}
2. 추상 메서드(abstract method)
추상 클래스와 마찬가지로 추상 메서드라는 개념이 있는데, 우리가 알고있는 메서드는 선언부 와 구현부로 구성되어 있다. 이때 추상 메서드는 선언부만 작성하고 구현부가 미완성인채 남겨둔 것이 추상 메서드이다.
추상 메서드를 사용하는 이유는 메서드의 내용이 상속받는 클래스에 따라 달라질 수 있어 조상 클래스에서는 선언부만 작성하고 상속받는 클래스에서 구현부를 구현하도록 하는 것이다.
앞서 추상 클래스를 선언하기 위해 abstract를 사용한 것 처럼, 클래스 앞에 abstract를 붙여 주고, 추상 메서드는 구현부가 없으므로 괄호인{}대신 문장의 끝을 알리는 ';'를 적어준다.
상속받는 자손 클래스는 오버라이딩을 통해 조상 클래스의 추상 메서드를 모두 구현해야 한다.
만약, 상속받은 추상 메서드 중 하나라도 구현하지 않으면, 자손 클래스 역시 추상 클래스로 지정해 주어야 한다.
일반적으로 굳이 이렇게 할 필요가 있을까? (오버라이딩이 있는데?)...
추상 메서드를 사용하면 통일성을 부여하는 한편 자유롭게 프로그램을 설계할 수 있다는 장점이 있다.
3. 인터페이스(interface)
자식 클래스가 여러 부모 클래스를 상속받을 수 있다면 다양한 동작을 수행할 수 있는 장점이 있을 것이다. 하지만 클래스를 이용해 다중 상속을 할 경우 메서드의 출처의 모호성 등 여러 문제가 발생할 수 있어 자바에서는 클래스를 통한 다중 상속을 지원하지 않는다.
하지만 자바에서는 인터페이스라는 것을 통해 다중 상속을 지원하고 있다.
인터페이스는 일종의 추상 클래스로, 추상 클래스처럼 추상 메서드를 갖지만 추상 클래스보다 추상화 정도가 높아 추상 클래스와 달리 몸통을 갖춘 일반 메서드 또는 멤버변수를 구성원으로 가질 수 없다.
쉽게 말해 다른 클래스를 작성할 때 기본이 되는 틀을 제공하면서, 다른 클래스 사이의 중간 매개 역할까지 담당하는 일종의 추상 클래스를 말한다.
추상 클래스를 '미완성 설계도'에 비유한다면, 인터페이스는 밑그림만 그려진 '기본 설계도'라 할 수 있다.
인터페이스도 추상 클래스처럼 미완성이기에 그 자체만으로 사용하는 것보단 다른 클래스를 작성하는데 도움 줄 목적으로 작성된다.
interface ( 인터페이스 ) | abstract class (추상 클래스) |
공통점 | |
- 추상 메서드를 가진다 - 객체 생성이 불가하며 자료형(타입)으로 사용된다. |
|
차이점 | |
- 상수, 추상 메서드만 가진다. - 추상 메서드를 구혀만 하도록 한다. - 다형성을 지원한다. (여러개 상속 받을 수 있음) |
- 클래스가 가지는 모든 속성과 기능을 가진다. - 추상 메서드 구현 및 상속의 기능을 가진다. - 단일 상속만 지원한다 |
1) 인터페이스의 작성(선언)
접근제어자 interface 인터페이스 이름{
public static final 타입 상수이름 = 값;
public abstract 메서드이름(매개변수);
}
제어자는 생략이 가능하며 자바 컴파일러가 자동으로 추가해준다.
2) 인터페이스의 구현
class 클래스 이름 implement 인터페이스이름{
// 인터페이스에 정의된 추상메서드를 구현해야 함.
}
인터페이스는 'interface' 키워드를 통해 선언하며
'implements'라는 키워드를 통해 일반 클래스에서 인터페이스를 구현할 수 있다.
일반 클래스의 멤버와 달리 인터페이스의 멤버들은 다음과 같은 제약사항들이 있다.
1. 모든 멤버변수는 public static final 이어야 하며, 이를 생략할 수 있다.
2. 모든 메서드는 public abstract 이어야 하며, 이를 생략할 수 있다. (static메서드와 default 메서드는 제외)
3. 인터페이스는 인터페이스로부터만 상속받을 수 있으며, 다중상속이 가능하다.
4. 인터페이스는 추상 클래스와 마찬가지로 자신이 직접 인스턴스를 생성할 수 없다. 따라서 인터페이스가 포함하고 있는 추상 메서드를 구현해 줄 클래스를 작성해야 한다.
만약 모든 추상 메서드를 구현하지 않는다면, abstract 키워드를 사용해 추상 클래스로 선언해야한다.
인터페이스를 사용함으로써 얻을 수 있는 장점
1. 개발시간을 단축시킬 수 있음.
2. 표준화가 가능해짐.
3. 서로 관계없는 클래스들에게 관계를 맺어 줄 수 있음.
4. 독립적인 프로그래밍이 가능함.
1) 예시를 통한 인터페이스 알아보기
public interface Animal {
public abstract void cry();
}
class Cat implements Animal{
@Override
public void cry() {
System.out.println("멍멍");
}
}
class Dog implements Animal{
@Override
public void cry() {
System.out.println("꿀꿀");
}
}
public class Main {
public static void main(String[]args){
Dog dog = new Dog();
Cat cat = new Cat();
dog.cry();
cat.cry();
}
}
'Language > Java' 카테고리의 다른 글
인터페이스와 추상클래스 그리고 Enum (0) | 2022.05.14 |
---|---|
람다식(Lambda)과 함수형 인터페이스(fuctional interface) (0) | 2022.01.23 |
내부 클래스(inner class) (0) | 2022.01.22 |
상속(Inheritance) (0) | 2022.01.21 |
생성자(Constructor) (0) | 2022.01.21 |