✅ 1. 추상클래스
public abstract class Animal {
public abstract void run(); // 추상 메서드
public void eat() { // 일반 메서드
System.out.println("This animal eats food.");
}
}
- 추상 클래스는 class 앞에 abstract 키워드를 붙힌 클래스를 의미한다.
- abstract 키워드를 명시하면 해당 클래스는 객체 생성이 불가능한 클래스가 되며, 상속으로만 이용이 가능해진다.
- 추상클래스 내부에는 멤버 변수를 가질 수 있다.
- 추상클래스에는 추상메서드, 일반메서드 둘 다 만들 수 있다.
- 구현 클래스가 상속을 받게되면, 추상 메서드는 반드시 구현을 해야하고, 일반 메서드는 상속과 동일한 구조를 갖는다.
- 마지막으로, 추상클래스는 extends를 활용한 상속 구조이기 때문에, 단일 상속만 가능하다
참고사항
- 추상클래스는 기본적으로 상속만 가능하고 new 객체 생성이 불가능하지만, 생성자는 가질 수 있음.
- 이유는, 추상클래스는 필드에 멤버변수를 가질 수 있으므로, 생성자를 통해 필드를 초기화 할 수 있기 때문이다.
- 즉, 상위클래스의 필드에 값을 넣기 위해서 생성자를 이용해 값을 초기화 할 때 사용이 된다.
추상 클래스 사용 이유
- 여러 관련 클래스들이 공통으로 가져야 할 메서드와 필드를 정의할 때 사용이 된다.
- 추상 클래스는 객체 생성이 불가능하기에 무조건 상속을 받아야하는 구조가 형성이 된다.
- 이말은즉슨, 상속을 무조건 받게 하여, 설계를 명확히 하고, 일관된 구조를 강제하게 하기 위해서 사용이 된다는 말이다.
✅ 2. 추상메서드
public abstract class Animal {
public abstract void run(); // 추상 메서드
public void eat() { // 일반 메서드
System.out.println("This animal eats food.");
}
}
- abstract 키워드가 붙은 메서드를 의미한다.
- 추상클래스 내부에서만 추상메서드를 만들 수 있으며, 일반 클래스에서 만들려고 하면 컴파일 오류가 뜬다.
- 구현하는 하위 클래스가 추상메서드를 반드시 구현을 해줘야하며, 구현을 안하면 컴파일 오류가 뜬다.
- 하위클래스가 추상클래스일 경우 추상메서드를 구현을 해도 되고 안해도 된다.
- 만약 안하게 된다면 구현 클래스 즉, 상속을 받는 하위 클래스가 존재하는 경우에는 반드시 해줘야 한다.
참고사항
- private 접근 제어자는 사용이 불가능하다.
- 디폴트 접근 제어자는 사용이 가능하지만, 해당 패키지 내부에 없으면 상속 받는 클래스에서 컴파일 오류가 뜸.
- protected 접근 제어자는 상속을 반드시 받기 때문에 오류 없이 이용이 가능하다.
✅ 3. 인터페이스
public interface A {
void hello();
default void defaultMethod() {
System.out.println("default method");
}
static void staticMethod() {
System.out.println("static method");
}
}
- 클래스가 구현해야 할 기능의 명세 즉, 메서드를 정의하는 추상적인 타입을 의미한다.
- 인터페이스는 이 메서드들을 반드시 구현해야 한다 라는 규칙을 정해 구현을 강제화 하기 위한 도구이다.
- 인터페이스에는 생성자가 없으며, 다중 상속이 가능하다.
특징
- 구현하는 클래스에선 implements 키워드를 이용해 구현을 할 수 있다.
- 기본적으로 class 대신 interface 키워드를 이용해 클래스를 명시해서 만들 수 있다.
- 인터페이스에는 생성자가 없으며, 다중 상속 즉, 다중 구현이 가능하다.
- 메서드는 총 3개 추상메서드, default 인스턴스 메서드, static 클래스 메서드를 만들 수 있다.
- 인터페이스에서는 멤버 변수 즉, 필드에 변수를 선언 할 수 없다.
참고사항
- 사실 interface 키워드 앞에 abstract 키워드가 존재하며, 해당 부분은 생략 할 수 있으며, 컴파일 때 자동으로 들어간다.
- 모든 메서드에는 public 접근 제어자만이 들어가게 된다. 이 부분은 생략이 가능하며, 자동으로 들어간다.
- 추상 메서드에는 자동으로 abstract 키워드가 붙게 된다. 붙혀도 되고 안붙혀도 된다.
- 인터페이스의 이름은 보통 형용사로 쓴다. 즉, 형용사의 형태로써 이용을 하는게 일반적이다.
✅ 4. default 키워드 ( 메서드 )
- 현재 자바에선 default 키워드는 인터페이스에서만 사용을 할 수 있는 키워드이다.
- default키워드는 인터페이스 내부의 인스턴스 메서드 즉, 구현 메서드를 만들 때 사용이 된다.
public interface A {
public default void defaultMethod() {
System.out.println("default A");
}
}
// case 1
public class B implements A {
// 메서드를 재정의 하지 않아도 내부에서 호출이 가능
public void test() {
defaultMethode(); // 오류x
}
}
// case 2
public class B implements A {
// 재정의 또한 가능함.
@Override
public void defaultMethod() {
System.out.println("overring defaultMethod");
}
}
- default 메서드는 구현 과정에서 하나의 클래스만 상속을 받으면, 상속과 동일하게 메서드를 하위클래스에 포함시켜준다.
(1) interface 다중 상속 케이스일 경우 default 메서드
public interface A {
public default void defaultMethod() {
System.out.println("default A");
}
}
public interface B {
public default void test() {
System.out.println("default B");
}
}
// case 1 : 직접 재정의해서 구현을 하는 방식
public class C implements A, B {
@Override
public void defaultMethod() {
System.out.println("overring defaultMethod");
}
}
// case 2 : 상위 클래스 어떤 메서드를 호출할지 직접 명시하는 방식
public class C implements A, B {
@Override
public void defaultMethod() {
A.super.defaultMethod(); // A 클래스의 메서드 호출
B.super.defaultMethod(); // B 클래스의 메서드 호출
// 하나 또는 둘 다 호출이 가능하다는 특징이 있음.
}
}
- 다중 상속을 받는 과정에서 동일한 디폴트 메서드를 상속 받을 때는 반드시 재정의(Overriding)을 해야한다.
- 이유는, 컴파일러가 다중 상속과정에서 어떤 메서드를 자동 포함시켜줄지 모르기 때문에 직접 재정의해서 명시해야 한다.
- 재정의한 메서드 내부에 예시 코드와 같이 메서드를 호출 할 수 있고, 또는 재정의로 덮어버릴 수 있다.
(2) default 메서드 사용이유
- 인터페이스는 구현을 강제한다. 즉, 구현을 하지 않으면 컴파일 과정에서 에러를 내뱉는다는 의미이다.
- 이러한 과정 때문에 개발자가 인터페이스에 코드를 추가한 경우 기존의 구현하고 있던 클래스에는 오류를 내뱉는다.
- 이렇기 때문에 default 메서드를 활용해서 반드시 구현을 하지 않아도 포함이 될 수 있도록 하면 오류가 나지 않는다.
- 예외 케이스로는 다중 상속을 받는데, 동일한 메서드가 있는 경우로 이때는 직접 구현 클래스 수정을 해야한다.
'공부 > ☕Java' 카테고리의 다른 글
| [Java] 익명 클래스(Anonymous Class) (1) | 2025.05.22 |
|---|---|
| [Java] 다형성(polymorphism) (1) | 2025.05.22 |
| [Java] Enum 쉽게 이해하기 (1) | 2025.05.05 |
| [Java] JVM과 자바 실행 원리 (1) | 2025.04.14 |
| [Java] Java와 객체지향 프로그래밍이란? (0) | 2025.03.06 |