본문 바로가기
JAVA

[JAVA] 추상 클래스, 추상 메서드, 추상클래스와 인터페이스 차이점

by 정공자씨 2024. 4. 22.

 

 

 

abstract 지정자

[정의]
1. 기능은 없고
2. 선언만 되어 있음

[용도]
1. 클래스 : 추상 클래스로 사용
2. 메서드 : 추상 메서드로 사용

 

 

 

 

추상 메서드

정의

public abstract void run();  -- 메서드 선언부
  • 구현이 되지 않은 메서드
  • 즉, 선언부만 있고, 구현부 블록 { } 이 없는 메서드

 

[ 구현 메서드 ]

- 구현된 메서드
- 즉, 구현부 블록 { } 이 있는 메서드
public void run() { }  ---- { } 이 있는 메서드​

 

 

 

 

 

 

추상 클래스

정의

abstract class Student { 
	abstract void run();  // 추상메서드
}
  • 클래스 선언 시에 abstract로 지정된 클래스
  • 하나 이상의 추상 메서드를 포함하는 클래스
클래스 선언부에  abstract 키워드가 있다는 뜻
안에 추상 메서드(abstract method)가 있으니 상속을 통해서 구현해주라는 뜻

 

 

특징

1. 추상 클래스로 지정되면, new 연산자를 이용하여 인스턴스 생성이 불가

  • 추상 클래스는 상속 구조에서 부모 클래스를 나타내는 역할로만 사용됨
  • 따라서, 추상 클래스를 반드시 어느 자식 클래스에 상속 시키고, 하위 클래스를 인스턴스 생성해야 사용하여야 함
public Class StudentTest {
    public static void main(String [] args) {
         // Student s = new Student();  추상 클래스는 인스턴스 생성 불가
    }
}

 

2. 추상 클래스는 직접 인스턴스의 생성이 불가능하지만, 

    상속 받은 자식 클래스의 인스턴스를 생성하면 추상 클래스의 인스턴스가 메모리에 생성

 

3. 추상 클래스의 멤버는 멤버변수(필드), 생성자, 구현메서드, 추상 메서드가 될 수 있음

  • 일반적인 클래스와 동일하게 멤버변수와 메서드를 가질 수 있고
  • 일반적인 클래스와는 다르게 추상 메서드를 가짐

 

4. 추상 메서드가 없더라도, 추상 클래스로 선언할 수 있음

 

5. 클래스 내에 추상 메서드가 있으면, 그 클래스는 반드시 추상 클래스로 선언해야 함

[ 주의 ]
일반 클래스가 추상 메서드를 가지고 있을 때, 추상 클래스로 선언하지 않으면 에러가 발생 하므로 주의

 

6. 일반적으로 부모 클래스가 추상 클래스로 선언되므로, 추상 클래스의 타입은 업캐스팅에 자주 사용

 

 

추상클래스 선언하기

일반 크래스가 추상 메서드를 가지고 있을 때, 추상 클래스로 선언하지 않으면 에러가 발생하므로 주의
public abstract class Student {

    String name;  // 필드(멤버변수)
    int age;
    
    public Student() {  // 기본 생성자
    	System.out.println("Student 기본생성자 호출");
    }
    
    public void study() {   // 구현 메서드
    	System.out.println("시험 공부를 합니다");
    }
    
    public void score() {}  // { } 블록만 있어도 구현메서드
        
    //추상메서드
    public abstract void run();  // 추상메서드가 있으므로, 반드시 추상클래스 선언
}

 

 

상속 받은 자식 클래스의 인스턴스를 생성하면, 추상 클래스 인스턴스가 메모리에 생성

  • 추상 클래스는 직접 인스턴스 생성이 불가능하지만
  • 상속 받은 자식 클래스의 인스턴스를 생성하면, 추상 클래스의 인스턴스가 메모리에 생성됨
자식 클래스 인스턴스 생성 시에, 추상 클래스의 생성자가 호출되어 추상 클래스의 인스턴스가 생성

추상 클래스의 생성자를 직접 이용하지는 못하지만
자식 클래스의 인스턴스를 생성하는 과정에서
자식 클래스의 생성자에서 super() 메소드를 사용하여,  추상 클래스 생성자를 호출하여 초기화 함

 

 

추상 클래스의 용도

  • 추상클래스는 주로 부모 클래스나 조상 클래스에서 많이 사용
  • 자식 클래스에서 구현해야 할 기능을 부모 클래스의 추상메서드의 형식을 빌려와서 일관성있게 구현할 수 있도록 함

 

 

 

 

 

추상 클래스와 인터페이스의 차이점

추상 클래스 인터페이스
추상클래스를 상속, 확장하기 위해 사용 해당 인터페이스를 구현한 객체들에 대해
동일한 사용방법과 동작을 보장하기 위해 사용
  추상클래스의 특수 형태
필드(멤버변수), 생성자, 구현메서드, 추상메서드 상수, 추상메서드
new 키워드를 사용하여 인스턴스 생성할 수 없음
추상메서드를 오버라이딩하여, 자식 클래스에서 구현
추상 클래스는 상속을 통해서만 사용 가능
(자식 클래스를 인스턴스 생성하면,
추상클래스도 인스턴스 생성)
 
extends 키워드 사용 implements 키워드 사용
단일 상속 다중 상속

 

 

 

추상 클래스와 인터페이스의 관계

 

 

 

 

 

 

출처

 

https://wildeveloperetrain.tistory.com/112