본문 바로가기
기초 및 언어/▶ Java&JSP

23. 추상클래스, 인터페이스

by 류딩이 2025. 8. 20.

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