1. 추상클래스
1. 추상 클래스 (abstract class)
- abstract 키워드를 붙여 정의
- 객체 생성 불가능 (new Shape() ❌)
- 공통 속성과 기능은 구현해두고, 일부는 미완성 상태(추상 메서드) 로 둠
- 자식 클래스가 이를 상속받아 완성해야 사용 가능
2. 추상 메서드 (abstract method)
- 선언만 있고, 구현부 {} 가 없음
- 자식 클래스가 반드시 오버라이딩(Override) 해서 구현해야 함
- 하나라도 구현하지 않으면 자식도 추상 클래스가 되어야 함
public abstract void draw(); // 몸체 없음
3. 접근 제어자 규칙
- 부모의 추상 메서드보다 좁은 범위로 재정의할 수 없음
- 예) 부모가 public이면 자식도 public 이상으로 작성해야 함
4. 사용 목적
- 여러 클래스에서 공통된 규격을 정의할 때 사용
- 다형성(polymorphism)과 함께 활용 → 부모 타입(Shape)으로 자식 객체를 관리 가능
// 추상 클래스
abstract class Shape {
public Shape() {
System.out.println("Shape 생성자");
}
// 추상 메서드 : 몸체(구현부)가 없는 메서드 → 반드시 자식 클래스에서 구현해야 함
public abstract void draw();
public abstract void delete();
}
// Circle 클래스 (Shape를 상속받아 추상 메서드 구현)
class Circle extends Shape {
public Circle() {
System.out.println("Circle 생성자");
}
@Override
public void draw() {
System.out.println("원을 그린다");
}
@Override
public void delete() {
System.out.println("원을 지운다");
}
}
// Triangle 클래스 (Shape를 상속받아 추상 메서드 구현)
class Triangle extends Shape {
public Triangle() {
System.out.println("Triangle 생성자");
}
@Override
public void draw() {
System.out.println("삼각형을 그린다");
}
@Override
public void delete() {
System.out.println("삼각형을 지운다");
}
}
public class Ex10_추상클래스 {
public static void main(String[] args) {
// Shape s = new Shape(); ❌ 오류 발생 → 추상 클래스는 객체 생성 불가
Circle c = new Circle();
Triangle t = new Triangle();
c.draw();
t.delete();
}
}
📌 결론
- 추상 클래스는 공통 설계도 역할을 한다.
- 추상 메서드는 자식 클래스가 반드시 구현해야 하는 규격을 강제한다.
- 실무에서는 여러 클래스들이 같은 규격(메서드 이름/형식)을 가지도록 보장할 때 많이 사용된다.
2. 인터페이스
인터페이스(interface) 는 클래스가 반드시 따라야 할 규격(틀, 설계도) 을 정의하는 역할을 합니다.
즉, "이 클래스는 이런 기능들을 반드시 구현해야 한다"라는 약속(계약, contract) 을 강제하는 것이라고 이해하면 됩니다.
interface Camera{ // 반드시 완성되어야 할때 interface
// 인터페이스를 사용함으로서 개발시간 단축
// 인터페이스는 하나의 기본틀이라고 할 수있다.
// 상속받은 인터페이스를 기능부여
// 상속받은 클래스에서 정확하게 완성시켜 사용
// 반드시 완성하면서, 상속받을때 사용
void takePhoto(); // public static 생략
}
interface Sports2{
void exercise();
}
class Shape2{
private int size;
private String color;
//setter
public void setSize(int size) {
this.size = size;
}
public void setColor(String color) {
this.color = color;
}
//getter
public int getSize() {
return size;
}
public String getColor() {
return color;
}
}
class Phone extends Shape2 implements Camera, Sports2{
// shape2를 상속받아 크기 및 색 정보 상속받음
// Camera, Sports2 상속받아 기능 상속 ==> 미완성클래스 상속받아 완성함
// 상속순서 바뀌면 에러
@Override
public void exercise() {
System.out.println("운동한다.");
}
@Override
public void takePhoto() {
System.out.println("사진찍기");
}
}
public class Ex13_인터페이스 {
public static void main(String[] args) {
Phone p = new Phone();
p.setSize(10);
p.setColor("blue");
System.out.println(p.getSize()); //10
System.out.println(p.getColor()); //blue
}
}
📌 인터페이스 선언 예시
interface Camera {
void takePhoto(); // public abstract void takePhoto(); 와 동일
}
interface Sports {
void exercise();
}
📌 인터페이스 구현 (implements)
class Phone implements Camera, Sports {
@Override
public void takePhoto() {
System.out.println("사진 찍기!");
}
@Override
public void exercise() {
System.out.println("운동하기!");
}
}
- implements 키워드를 사용해서 구현
- 반드시 인터페이스의 추상 메서드를 전부 완성해야 함
- 여러 개의 인터페이스를 동시에 구현 가능
🟢 추상 클래스 vs 인터페이스 정리
📌 추상 클래스 (abstract class)
- 일부 구현된 메서드와 **미완성 메서드(추상 메서드)**를 함께 가질 수 있다.
- 단일 상속만 가능하다.
- 자식 클래스에서 구현 시, 부모보다 더 좁은 접근제어자 사용 불가
(예: 부모 메서드가 public이면, 자식도 반드시 public 이상으로 구현해야 함) - 선언 방법: abstract class 클래스명 { ... }
📌 인터페이스 (interface)
- 완성된 일반 메서드를 가질 수 없다. (단, Java 8 이후 default, static 메서드는 가능)
- 다중 상속이 가능하다. (클래스 상속 후, 여러 인터페이스를 동시에 구현 가능)
- 인터페이스의 변수 → public static final 자동 적용 (상수)
- 인터페이스의 메서드 → public abstract 자동 적용 (추상 메서드)
- 구현 시 implements 키워드 사용
📌 비교 표
| 구분 | 추상 클래스 (abstract class) | 인터페이스 (interface) |
| 메서드 | 완성된 메서드 포함 가능 | 추상 메서드만 가능 (단, default/static 가능) |
| 다중 상속 | 불가능 | 가능 |
| 변수 제어자 | 제한 없음 | public static final 자동 |
| 메서드 제어자 | public/protected/... 가능 | public abstract 자동 |
| 선언 키워드 | abstract class | interface |
| 상속 키워드 | extends | implements |
'기초 및 언어 > ▶ Java&JSP' 카테고리의 다른 글
| 25. 예외 처리(try ~ catch ~ finally), throw, Exception (0) | 2025.08.20 |
|---|---|
| 24. 익명클래스 (3) | 2025.08.20 |
| 22. import (0) | 2025.08.20 |
| 21. 다형성, 업캐스팅, 다운캐스팅 (2) | 2025.08.20 |
| 20. 제어자, 접근제어지시자(Access Modifier)와 기타제어자 (0) | 2025.08.19 |