목차
1. 추상 클래스란?
2. 인터페이스란?
3.언제 추상 클래스를 사용하고, 언제 인터페이스를 사용해야 할까?
추상 클래스란?
추상 클래스(abstract class): 공통된 속성이나 메서드를 포함한 클래스. 일부 메서드는 구현할 수 있고, 다른 메서드는 추상 메서드로 선언하여 하위 클래스에서 반드시 구현하도록 강제한다.
- 단일 상속만 지원한다.
- 추상 클래스는 객체를 직접 생성할 수는 없으나, 생성자를 가질 수 있고 하위 클래스에서 생성자를 통해 상위 클래스의 필드를 초기화 할 수 있다.
예시
1.추상 클래스
public abstract class myAbstractClass { // abstract를 통해 추상 클래스임을 명시
public static int myField = 5; // 추상클래스는 초기화된 필드를 가질 수 있다.
public int myField2; // 추상클래스는 초기화되지 않은 필드도 가질 수 있다.(생성자에서 초기화)
public abstract void abstractMethod(); //abstact를 명시해 추상 클래스(구현되지 않은 클래스)를 가질 수 있다.
public void concreteMethod() { // 추상 클래스는 구현된 메서드를 가질 수 있다.
System.out.println("concreteMethod");
}
public myAbstractClass(int myField2) { // 생성자를 가질 수 있다.
this.myField2 = myField2;
}
}
추상 클래스 선언
public abstract class myAbstractClass {
abstract
키워드가 붙은 클래스는 추상 클래스이다. 추상 클래스는 객체를 직접 생성할 수 없으며, 반드시 상속을 통해 하위 클래스에서 사용되어야 한다.
정적 필드(static 필드)
public static int myField = 5;
- 추상 클래스도 정적 필드를 가질 수 있으며, 이는 객체를 생성하지 않고도 접근할 수 있다.
인스턴스 필드
public int myField2;
- 이 변수는 생성자에서 초기화되며, 클래스가 객체로 생성된 후에 각 객체마다 고유한 값을 가질 수 있다.
추상 메서드
public abstract void abstractMethod();
abstract
메서드는 구현되지 않은 메서드로, 추상 클래스 내에서 선언만 하고 구체적인 구현을 하지 않는다.
구현된 메서드
public void concreteMethod() {
System.out.println("concreteMethod");
}
- 추상 클래스는 구현된 메서드를 포함할 수 있다. 하위 클래스에서 재정의할 필요 없이 바로 사용할 수 있다.
생성자
public myAbstractClass(int myField2) {
this.myField2 = myField2;
}
- 추상 클래스도 생성자를 가질 수 있다. 추상 클래스의 생성자는 하위 클래스에서 호출되어야 하며, 주로 필드 초기화 등의 작업을 수행한다.
2. 자식 클래스
public class ChildClass extends myAbstractClass { // extends로 상속받을 수 있다.
public ChildClass(int myField2) { //부모 클래스의 생성자를 super를 통해 인스턴스화 한다.
super(myField2);
}
@Override //override를 통해 추상 메서드를 구현할 수 있다.
public void abstractMethod() {
System.out.println("abstractMethod");
}
}
추상 클래스 상속
public class ChildClass extends myAbstractClass {
extends
는 부모 클래스를 상속받는 다는 뜻이다.
생성자에서 super() 호출
super(myField2);
- 생성자에서
super(myField2)
는 부모 클래스의 생성자를 호출하는 역할을 한다.
추상 메서드 구현
@Override
public void abstractMethod() {
System.out.println("abstractMethod");
}
myAbstractClass
에서 선언된 추상 메서드abstractMethod()
는 구현되지 않았기 때문에, 이를 하위 클래스인ChildClass
에서 반드시 구현해야 한다.
3. 다중상속 불가
- 위처럼 2개 이상의 클래스를 상속받으려 하면 에러가 발생한다.
인터페이스란?
인터페이스(interface): 클래스가 구현해야 할 메서드 집합만을 선언한다. 메서드 선언부는 있으나, 구현부는 없다. 따라서 구현 클래스는 모든 메서드를 반드시 구현해야 한다.
- 다중 구현이 가능하다.
- 필드를 가질 수는 없으나, 상수(static final)는 사용할수 있다.
- 생성자를 가질 수 없다.
- 자바 8부터 디폴트 메서드가 추가되어, 인터페이스 내에 구현된 메서드를 가질 수 있게 되었다.
예시
1. 인터페이스
public interface MyInterface { // interface를 명시하여 인터페이스임을 알린다.
int method(); // 구현되지 않는 메서드만을 가진다. {}를 넣으면 구현된 것으로 간주하므로, 넣지 않는다.
default int method2() { // defalut 메서드로 구현된 메서드를 가질 수 있다.
return 0;
}
}
인터페이스 선언
public interface MyInterface {
interface
키워드는 인터페이스를 선언할 때 사용된다.- 인터페이스는 객체를 직접 생성할 수 없고, 여러 클래스를 설계할 때 공통된 동작을 강제하기 위해 사용된다.
구현되지 않은 메서드
int method();
- 인터페이스의 메서드는 구체적인 구현을 포함하지 않는다.
- {}이 없음을 통해 추상 메서드임을 알 수 있다.
디폴트 메서드
default int method2() {
return 0;
}
default
키워드를 사용하여 메서드의 기본 구현을 제공하며, 구현하는 클래스가 이 메서드를 재정의할 수도 있다.
2. 구현 클래스
public class MyClass implements MyInterface {
@Override
public int method() {
return method2();
}
}
인터페이스 상속
public class MyClass implements MyInterface {
- implements를 통해 인터페이스를 상속받을 수 있다.
메서드 구현
@Override
public int method() {
return method2();
}
@Override
를 통해, 인터페이스의 메서드를 구현할 수 있다.
3. 다중상속 가능
언제 추상 클래스를 사용하고, 언제 인터페이스를 사용해야 할까?
추상 클래스
- 공통된 동작과 상태를 정의 할 때
- 필드를 포함해야 하는 경우
- 기본 동작을 제공하고, 일부만 구현하도록 강제할 때
인터페이스
- 다중 상속이 필요할 경우
- 좀 더 강력한 추상화를 가져가고 싶을 때
- 다양한 클래스에 공통된 동작을 강제하고 싶을 떄
'java' 카테고리의 다른 글
[java] MVC 패턴이란? 좋은 MVC 패턴을 구현하려면? (1) | 2023.11.24 |
---|---|
public void static main(String args)의 의미 (0) | 2023.11.24 |
DAO, DTO, VA란? (2) | 2023.11.03 |
[Java] AssertThat (0) | 2023.10.26 |
[Java] public void static main(String args)의 의미 (0) | 2023.10.26 |