반응형
1️⃣ 추상 클래스 (Abstract Class)
객체를 생성할 수 없는 불완전한 클래스,
상속을 통해서만 접근할 수 있음.
“Is-A” 관계가 유지되는 클래스 간 코드 공유에 적합함.
✅ 특징
- 추상 메서드를 포함할 수 있음 (abstract 키워드)
- 비추상 메서드도 포함 가능
- 필드, 생성자, 접근제한자(public/protected/private) 사용 가능
- extends 키워드를 통해 상속
- 상속은 단일 상속만 가능
✅ 사용 목적
- 밀접하게 관련된 클래스들 간의 코드 공유
- 기본 동작을 정의하고, 자식 클래스에서 세부 구현을 위임할 때
🧱 예제
abstract class Shape {
String color;
abstract double area();
void showColor() {
System.out.println("Color: " + color);
}
}
class Circle extends Shape {
double radius;
Circle(String color, double radius) {
this.color = color;
this.radius = radius;
}
@Override
double area() {
return Math.PI * radius * radius;
}
}
2️⃣ 인터페이스 (Interface)
서로 관련 없는 클래스들 간의 공통된 동작(계약) 을 정의.
“~할 수 있다(Can-Do)” 관계를 표현.
✅ 특징
- 모든 메서드는 기본적으로 public abstract
- 모든 필드는 public static final (상수)
→ 생략 가능하지만 명시적으로 쓰는 게 가독성 좋음 - implements 키워드로 구현
- 다중 상속 가능
- Java 8 이상: default / static 메서드 사용 가능
✅ 사용 목적
- 서로 다른 클래스 간의 공통 동작 정의
- 추상 클래스보다 느슨한 결합 구조 제공
- 디자인 패턴(Strategy, Observer 등) 의 핵심 구성 요소
🧱 예제
interface Printable {
void print();
}
class Report implements Printable {
@Override
public void print() {
System.out.println("Printing Report...");
}
}
3️⃣ 추상 클래스 vs 인터페이스 비교표
| 구분 | 추상 클래스 (Abstract Class) | 인터페이스 (Interface) |
| 관계 | Is-A (상속 관계) | Can-Do (행동 계약 관계) |
| 키워드 | extends | implements |
| 상속 개수 | 단일 상속 | 다중 상속 가능 |
| 접근제한자 | public, protected, private 가능 | public만 가능 |
| 필드 | 가질 수 있음 | public static final 상수만 |
| 메서드 | abstract / 일반 메서드 둘 다 가능 | abstract / default / static |
| 생성자 | 가질 수 있음 | 없음 |
| 용도 | 코드 공유, 기본 동작 정의 | 공통 기능 강제, 다형성 중심 |
4️⃣ 왜 인터페이스를 사용하나?
필드가 아닌 공통된 행동(메서드) 만을 정의하고 싶을 때
예를 들어, 자갈, 페인트, 위젯은 서로 공통된 필드가 없음.
하지만 판매가격(), 원가(), 무게() 같은 공통 메서드는 존재.
→ 따라서 인터페이스가 적합.
5️⃣ 인터페이스 문법 규칙
- 접근 제한자 → public만 사용 가능
- 추상화 한정자(abstract) 자동 적용
- 여러 인터페이스 동시 구현 가능
- 별도 파일에서 구현해야 함
6️⃣ Interface의 확장 기능 (Java 8 이상)
✅ default 메서드
- 기본 구현을 제공 → 하위 클래스에서 재정의 가능
interface Printer {
default void start() {
System.out.println("Printer Starting...");
}
}
✅ static 메서드
- 인터페이스 자체에서 호출 가능 (Printer.utilMethod() 형태)
interface Printer {
static void info() {
System.out.println("This is a printer interface");
}
}
7️⃣ 인터페이스 상속 (Extending Interface)
인터페이스는 다른 인터페이스를 extends 로 다중 상속 가능
interface A {
void methodA();
}
interface B extends A {
void methodB();
}
class C implements B {
public void methodA() {}
public void methodB() {}
}
8️⃣ 람다식 (Lambda Expression)
익명 내부 클래스(Anonymous Inner Class) 를 단순화한 표현식
Java 8 이상에서 사용 가능
함수형 인터페이스(메서드 1개만 가진 인터페이스)에서 주로 사용됨
✅ 기본 형식
(매개변수) -> { 실행문; }
✅ 예제
// 기존 익명 클래스 방식
Runnable r1 = new Runnable() {
public void run() {
System.out.println("Hello");
}
};
// 람다식
Runnable r2 = () -> System.out.println("Hello");
✅ 매개변수가 하나일 경우
x -> x * x
✅ 여러 문장이면 블록 사용
(x, y) -> {
int sum = x + y;
return sum;
}
9️⃣ 람다와 익명 내부 클래스 차이
| 구분 | 익명 내부 클래스 | 람다식 |
| 문법 | 복잡 | 간결 |
| 버전 | Java 7 이하 | Java 8 이상 |
| 목적 | 일회성 클래스 생성 | 함수형 표현 |
| this 참조 | 내부 클래스 자신 | 외부 객체 참조 |
🔟 정리 키워드
- Java Interface
- default Method
- static Method
- Extending Interface
- Anonymous Inner Class
- Lambda Expression
- Lambda Expression Shorthand
- Lambda Expression as Variable
반응형
'💻 KOSA_MSA풀스택 > 1️⃣ Java' 카테고리의 다른 글
| [KOSA_Java] 20250624 (0) | 2025.06.24 |
|---|---|
| [KOSA_Java] 20250623 (0) | 2025.06.23 |
| [KOSA_Java] 📝3차 과제-(참고)샘플 예시🔒 (0) | 2025.06.19 |
| [KOSA_Java] 📝3차 과제-디자인 패턴 Java Class로 구현 및 발표 (0) | 2025.06.19 |
| [KOSA_Java] 20250619 - 객제지향 (추상화) (0) | 2025.06.19 |