[Java] 추상 클래스, 인터페이스

YTT.erica·2024년 5월 24일

추상 클래스

추상 클래스 의미

추상 클래스 는 클래스 간의 계층구조에서 상위에 존재하며 하위 클래스를 대표하는 클래스

  • 추상 클래스는 직접 혼자 객체화가 될 수 없음 (생성자를 사용하여 객체 생성 불가)
  • 추상 클래스는 다른 클래스에 의해 상속되어야 함

추상의 의미대로 “구체적”이지 않은 클래스로 보다 구체적인 하위 클래스를 대표하는 클래스

예시)

  • 클래스 Shape은 계층구조 상위에 있어 전체 클래스를 대표
  • 클래스 자체만이 객체로 생성될 필요 없는 클래스
  • 클래서 Shape는 아직 도형의 성질이 구제척이지 낳으며 다른 도형의 공통적인 성질만을 갖고 있음

⇒ Shape를 추상 클래스로 정의

추상 클래스 사용

  • Shape 추상 클래스
    public abstaract class Shape {
    	private double x, y;
    	
    	//추상 메소드
    	abstract void draw();
    }
  • Circle, Rectangle 클래스
    public class Circle extends Shape {
    	double radius;
    	
    	public void draw() {
    		System.out.println("원을 그립니다.");
    	}
    }
    
    public class Circle extends Shape {
    	double width;
    	double height;
    	
    	public void draw() {
    		System.out.println("사각형을 그립니다.");
    	}
    }

추상 클래스 주요 특징

  • 추상 메소드 추상 메소드는 메소드 몸체가 없는 메소드 적어도 하나 이상의 추상 메소드를 가진 클래스는 반드시 추상 클래스이어야 함 하위 클래스가 추상 메소드를 구현하지 않으면 문법 오류가 발생 → Override 예시) 추상 메소드
    abstract void draw();
    하위 클래스
    @Override
    void draw() {
    	System.out.print("그리다");
    }
  • 일반 메소드 인터페이스와 다르게 일반 메소드 정의 가능 추상 클래스에서 구현된 메소드로 서브 클래스에서 override 안해도 됨
    abstract class Animal {
        abstract void makeSound(); // 추상 메소드
    
        void sleep() { // 일반 메소드
            System.out.println("The animal is sleeping");
        }
    }
  • 추상 클래스는 인스턴스화할 수 없음
    Animal animal = new Animal() //불가

추상 클래스 사용 이유

  • 공통된 필드와 메소드를 통일활 목적 필드와 메소드 이름을 통일하여 유지보수성을 높이고 통일성 유지 가능
  • 실체 클래스 구현 시, 시간 절약 강제로 주어지는 필드와 메소드를 가지고 구현
  • 규격에 맞는 실체 클래스 구현 설계 규격에 맞게 클래스를 구현 가능하여 유지보수성을 높일 수 있음

⇒ 추상 클래스는 그 추상 클래스를 상속받아 기능을 이용하고 확장

추상 클래스 사용하는 상황

  • 공통 기능을 공유하는 클래스가 여러개 있을 때
  • 클래스 계층 구조 설계

인터페이스

인터페이스 의미

인터페이스 는 해야 할 작업의 구체적 구현 없이 기능만 선언한 클래스

하위 클래스가 수행해야 하는 메소드와 필요한 상수만을 미리 추상적으로 정의해 놓은 클래스

추상 클래스보다 더 추상적인 클래스

  • 클래스들이 공유하는 유사성 을 표현하는데 사용
  • 클래스 간의 의존성 을 줄이거나 없애는데 사용

인터페이스 사용

  • 인터페이스
    public interface Connectable {
    	public static fnal String name = "연결";
    	( public abstract ) void connect();
    }
  • 구현 클래스
    public class Printer implements Connectable{	
    	public void connect() {
    		System.out.println("프린터가 연결됨");
    	}
    }
    
    public class Mouse implements Connectable {
    	public void connect() {
    		System.out.println("마우스가 연결됨");
    	}
    }

인터페이스 주요 특징

  • 메소드 선언만 가능, 구현은 불가
  • 상수 선언 → static final
  • 일반 변수, 메소드 선언 X
  • 다중 상속 가능
    public class Keyboard implements Connectable, Typeable

인터페이스 사용 이유

  • 개발 기간을 단축 시킬 수 있음
  • 표준화 가능
  • 다형성
  • 독립적인 프로그램이 가능 의존성 주입을 통해 의존성을 줄여 결합도를 낮출 수 있음

인터페이스 사용하는 상황

  • 다중 상속이 필요할 때 추상 클래스는 extends를 통해 상속하기 때문에 다중 상속이 불가
  • API 설계할 때

추상 클래스 vs 인터페이스

차이점

추상 클래스인터페이스
키워드abstractinterface
변수제한 없음static final (상수)
접근 제어자public private, protected, defaultpublic
메소드제한 없음일반 메소드 불가 (default, static은 가능)
상속 키워드extendsimplements
다중 상속불가능가능
생성자질 수 있음가질 수 없음

공통점

  • 추상 메소드를 가짐
  • 인스턴스화 불가 (new 생성자 x)
  • 구현 상속한 클래스는 추상 메소드를 반드시 구현해야 함
profile
'◡'✿ 꿈을 찾아가보자고~ '◡'✿

0개의 댓글