본문 바로가기
Programming/Java

[자바/Java] 추상클래스 && 인터페이스

by 코딩하는 랄로 2023. 10. 6.
728x90

추상 클래스란

추상 클래스는 일반 클래스와 별 차이가 없는 클래스이다. 차이점은 추상클래스도 일반 클래스처럼 멤버 변수, 생성자, 메소드들로 구성되어 있지만 바로 추상 메서드를 선언해 줄 수 있는 메소드인 것이다.

 

추상 메소드를 선언하여 상속을 통해서 자손 클래스에서 완성하도록 유도하는 클래스이기 때문에 미완성 설계도라고도 표현하는 클래스이다.

 

추상 클래스와 일반 클래스의 큰 차이점 중 하나는 추상 클래스는 상속을 위한 (상속을 통해 완성되는) 클래스이기 때문에 new 키워드를 통한 객체를 생성할 수 없다.

 

추상 클래스는 다음과 같이 abstract 키워드를 통해 선언할 수 있다.

abstract class 클래스명 {

	...
    
}

 

 

추상 메소드

추상 메소드는 추상 클래스 내에서 선언할 수 있는 특별한 메소드이다. 왜냐하면 추상 메소드의 경우, 원형만 선언돼 있고, 메소드 본체(구현부분)가 정의되지 않은 메소드이기 때문이다.

 

선언 방법으로는 메소드 이름 앞에 abstract 키워드가 들어가고 메소드 본체가 없기 때문에 중괄호({}) 부분이 없고 메소드 원형 끝에 세미콜론(;)을 통해 끝내주면 된다. 상속은 extends 키워드를 통해 자식 클래스에 상속을 할 수 있다.

abstract class 클래스명 {
    //멤버변수
    ...
    
    
    //생성자
    ...
    
    
    //메소드
    ...
    
    
    //추상메소드
    public abstract void 메서드이름();
    
}

 

 

추상 클래스를 사용하는 목적은 추상 클래스를 상속 받는 자식 클래스에 반드시 구현해야 할 메소드가 있을 경우 그 메소드를 추상 메소드로 만들어서 반드시 override하도록 하는데 목적이 있다.

 

 

 

인터페이스란

추상 클래스가 미완성 설계도라면 인터페이스는 기본 설계도라고 할 수 있다. 즉, 추상 클래스는 어느정도 구현이 되어 있기 때문에 미완성이지만 인터페이스는 하나도 구현이 안 되어 있는 구조만 제공하기 때문에 기본 설계도인 것이다.

 

그렇기 때문에 인터페이스는 다음과 같은 구조를 가진다.

  • 모든 메소드가 public abstract로 선언
  • 모든 멤버 변수가 public static final로 선언

모든 메소드와 멤버 변수가 통일된 형태이기 때문에 해당 부분(public abstract, public static final)은 생략이 가능하다.

 

선언 방법은 interface 키워드를 통해서 선언을 해주게 된다. 상속은 implements 키워드를 자식 클래스에 상속이 가능하다.

interface class 클래스명 {

    //멤버변수
    public static final int n = 0;
    int m = 10; //생략가능
    
    //메소드
    public abstract void 메소드명();
    int 메소드명(); //생략가능
    
}

 

인터페이스 또한 추상 클래스처럼 다른 클래스를 작성하는데 도움을 주는 목적으로 작성하지만, 추상클래스와 다른 점은 인터페이스는 다중 상속이 가능하다. 

 

 

차이점

추상클래스와 인터페이스의 공통점은 추상메소드를 사용할 수 있다는 것이다. 또한, 두 가지 클래스의 특징을 살펴보면 추상클래스가 인터페이스의 역할을 다 할 수 있음을 눈치 챌 수 있을 것이다.

 

그렇다면 왜 추상클래스와 인터페이스를 나누었을까?

 

먼저 사용용도이다.

  • 추상클래스는 IS - A : ~이다
  • 인터페이스는 HAS ~A : ~을 할 수 있는

추상 클래스는 한개의 클래스만 상속이 가능하기 때문에 추상 클래스를 통해 해당 클래스가 무엇인지 구분을 하려는 것이고 그와는 별개로 어떤 것들을 할 수 있는지는 인터페이스를 통해 구현하는 것이다.

 

예를 들어, 사람과 동물이 있다고 가정해보자.

//사람
abstract class Human {

    ...
    
    public abstract void makeTools();
    
    ...
    
}

//동물
abstract class Animal {

    ...
    
    public abstract void hunting();
    
    ...
    
}

 

Human 추상 클래스에는 사람만이 할 수 있는 기능들이 있을 것이고, Animal 추상 클래스에는 동물만이 할 수 있는 기능들이 있다.

 

이 때에 서울시에 살고 있는 '홍길동'은 사람'이다.' 즉, 홍길동 IS HUMAN인 것이다. 그렇기 때문에 홍길동은 Human을 상속 받는다. 반면에 남극에 살고 있는 펭귄은 동물'이기' 때문에 Animal을 상속 받는 것이다.

 

하지만 사람과 동물의 모든 기능이 불일치 하지는 않는다. 또한 어떤 사람은 할 수 있는 것을 누군가는 못하지만 또 다른 동물을 가능할 수 있다.

 

예를 들어, 홍길동은 수영을 못하고, 이순신은 수영을 할 수 있다. 또 펭귄도 수영을 할 수 있다. 이러한 할 수 있다와 없다로 나뉠 수 있는 기능들을 바로 interface를 통해 구현할 수 있는 것이다.

 

interface class Swimable { // 수영 가능하면 상속

    ....
    
}


interface class Runnable { //달리기 가능하면 상속

    ....
    
}

 

이를 통해 같은 사람이라도, 수영은 가능하지만 달리기는 못하는 홍길동은 다음과 같이 선언할 수 있고,

public class Honggildong extends Human implements Swimable {

    ....

}

 

수영은 못하지만 달리기는 잘하는 고양이는 다음과 같이 선언할 수 있다. <- 단순 예시!!

class Cat extends Animal implements Runnable {

    ....
    
}

 

728x90

'Programming > Java' 카테고리의 다른 글

[자바/Java] 문자열1 - String  (0) 2023.10.08
[자바/Java] 예외(Exception)  (1) 2023.10.08
[자바/Java] 다형성(Polymorphism)  (0) 2023.10.06
[자바/Java] 상속(inheritance)  (0) 2023.09.29
[자바/Java] 클래스  (0) 2023.09.29