일단 추상클래스와 인터페이스는 추상메서드 없이는 설명이 불가능하기 때문에 추상메서드 먼저 살펴보자.
추상메서드란?
- 메서드는 선언부와 구현부로 나뉘는데 , 메서드들 중에서 선언부까지만 작성하고 구현부는 작성하지 않은 메소드를 추상메서드라고 한다.
- abstract를 메서드 앞에 붙여서 (정확히는 접근 제어자 앞이나 뒤에 붙여서) 추상메서드임을 명시한다.
- 추상메서드를 가진 클래스는 반드시 추상클래스여야 한다.
- 추상메서드는 구현부 즉 실행 코드가 없어서 추상메서드를 가진 클래스(추상클래스)는 인스턴스를 만들 수 없다.
추상클래스란?
- 구조적으로는 일반 클래스와 큰 차이는 없다. 똑같이 일반 필드 , 일반 메서드를 가질 수 있다. 차이점은 추상메서드를 가지고 있다는 것이다.
- abstract를 class 앞에 붙여서 선언한다.
- 추상메서드를 가지고 있기 때문에 인스턴스를 만들 수는 없다.
- 추상 클래스 안에 있는 모든 추상 메서드는 자식클래스가 반드시 구현해야 한다
- 추상클래스에 생성자가 있다면 , 자식클래스에서 추상 클래스의 생성자를 호출 , 초기화할 수 있다. (아래 예시)
public abstract class Shape{
protected String type;
//추상클래스 생성자
public Shape(String type){
this.type = type;
}
public abstract void draw();
}
public class Line extends Shape{
//자식클래스 생성자에서
public Line(){
//부모(추상)클래스 생성자 호출
super("Line")
}
public void draw(){
System.out.println(super.type);
}
}
인터페이스란?
- 상수(static final)와 추상 메서드(abstract method)의 집합이다.
- 일반 메서드 , 일반 필드는 사용할 수 없다.
- interface 키워드로 선언한다.
- 클래스와 다르게 다중상속이 가능하다.
- 추상클래스와 비슷한 느낌이 있어 추상클래스의 일종으로 오해할 수 있지만 , 인터페이스는 클래스가 아니기 때문에 추상클래스의 일종이 아니다.
- 인터페이스 내의 추상메서드의 앞부분인 public abstract는 생략이 가능하다.
또한 상수의 앞부분인 public static final도 생략 가능하다. - 자바8에서부터 default메소드 정의가 가능해졌다.
default메소드는 추상메서드처럼 구현부는 없지만 자식클래스에서 선택적으로 재정의할 수 있는 메소드다.
이게 왜 추가됐냐? 그 이유는 인터페이스 변화시 문제점 때문이다.
만약 이미 많은 클래스들이 상속하고있는 인터페이스에 메소드를 추가해야하는 경우 , 클래스 하나하나 다 재정의 해줘야한다.(추상메서드는 일반클래스에서 반드시 재정의해줘야 하기 때문에) 이런 경우 추상메소드 대신 default 메소드를 사용하면 일일히 재정의 하지 않아도 되고 사용하는 클래스에서만 재정의 할 수 있게 된다.
추상클래스와 인터페이스의 기능이 비슷하고 구별이 잘 가지 않는다고 느꼈을 수도 있다. 그러나 둘은 목적이 다르다.만약 목적까지 같아 구별이 안된다면 , 둘 중에 하나만 살아남지 않았을까?
추상클래스와 인터페이스의 사용목적
- 추상클래스의 목적
- 상속을 받아서 기능을 확장하고 클래스들을 큰 줄기로 구분하기 위해
- 인터페이스의 목적
- 클래스간 공통된 기능을 추가,구현하기 위해

- 주의 : Creature에서 추상메서드로 만든 함수를 꼭 Animal이나 Human에서 구현할 필요 없다. 왜냐하면 둘 모두 추상클래스이기 때문이다.
공부 후기
이전에 내가 알고 있었던 인터페이스의 개념은 "서로 다른 것들 사이를 연결해주는 것"이었다.
그리고 자바에서 interface , implements등 코드를 사용하면서 느꼈던 인터페이스는 그냥 공통적인 특징을 가진 클래스들의 구현을 편하게 하는 문법 정도로 생각하고 있었다.
이런 개념적인 부분과 사용하면서 느낀 경험적인 부분에서의 간극을 이번에 공부하면서 매울 수 있었다.
간단한 설명하면 , 나(사용자)는 "Swimable"이라는 인터페이스 뒤에 뭐가 있는지 몰라도(Kevin,Turtle) “Swimable”만 붙어있다면 "수영해"라고 명령을 할 수 있다. 즉 나(사용자)는 인터페이스를 통해 (Kevin,Turtle)에게 명령할 수 있다.
이렇게 생각하니 확실히 지금까지는 사용하면서는 잘 느끼지 못했던 인터페이스의 "연결해주는 것"이라는 개념이 어느 정도 이해가 됐다.
참고자료
나무소리 유튜브 : 자바 기초 강의 - 3-13강 추상 클래스와 인터페이스
( 부족한 부분이나 수정해야 할 부분을 알려주시면 매우 압도적으로 감사하겠습니다! )
'CS' 카테고리의 다른 글
자바 인코딩의 원리 (2) | 2023.11.08 |
---|---|
API (Application Programming Interface ) 개념 설명 (0) | 2023.06.21 |
[프로그래밍 패러다임] - 함수형 프로그래밍 (2) | 2023.05.15 |
Spring DI 방법들 (0) | 2023.04.20 |
DTO , VO , Entity의 간단한 정리 및 비교 (0) | 2023.04.16 |
일단 추상클래스와 인터페이스는 추상메서드 없이는 설명이 불가능하기 때문에 추상메서드 먼저 살펴보자.
추상메서드란?
- 메서드는 선언부와 구현부로 나뉘는데 , 메서드들 중에서 선언부까지만 작성하고 구현부는 작성하지 않은 메소드를 추상메서드라고 한다.
- abstract를 메서드 앞에 붙여서 (정확히는 접근 제어자 앞이나 뒤에 붙여서) 추상메서드임을 명시한다.
- 추상메서드를 가진 클래스는 반드시 추상클래스여야 한다.
- 추상메서드는 구현부 즉 실행 코드가 없어서 추상메서드를 가진 클래스(추상클래스)는 인스턴스를 만들 수 없다.
추상클래스란?
- 구조적으로는 일반 클래스와 큰 차이는 없다. 똑같이 일반 필드 , 일반 메서드를 가질 수 있다. 차이점은 추상메서드를 가지고 있다는 것이다.
- abstract를 class 앞에 붙여서 선언한다.
- 추상메서드를 가지고 있기 때문에 인스턴스를 만들 수는 없다.
- 추상 클래스 안에 있는 모든 추상 메서드는 자식클래스가 반드시 구현해야 한다
- 추상클래스에 생성자가 있다면 , 자식클래스에서 추상 클래스의 생성자를 호출 , 초기화할 수 있다. (아래 예시)
public abstract class Shape{
protected String type;
//추상클래스 생성자
public Shape(String type){
this.type = type;
}
public abstract void draw();
}
public class Line extends Shape{
//자식클래스 생성자에서
public Line(){
//부모(추상)클래스 생성자 호출
super("Line")
}
public void draw(){
System.out.println(super.type);
}
}
인터페이스란?
- 상수(static final)와 추상 메서드(abstract method)의 집합이다.
- 일반 메서드 , 일반 필드는 사용할 수 없다.
- interface 키워드로 선언한다.
- 클래스와 다르게 다중상속이 가능하다.
- 추상클래스와 비슷한 느낌이 있어 추상클래스의 일종으로 오해할 수 있지만 , 인터페이스는 클래스가 아니기 때문에 추상클래스의 일종이 아니다.
- 인터페이스 내의 추상메서드의 앞부분인 public abstract는 생략이 가능하다.
또한 상수의 앞부분인 public static final도 생략 가능하다. - 자바8에서부터 default메소드 정의가 가능해졌다.
default메소드는 추상메서드처럼 구현부는 없지만 자식클래스에서 선택적으로 재정의할 수 있는 메소드다.
이게 왜 추가됐냐? 그 이유는 인터페이스 변화시 문제점 때문이다.
만약 이미 많은 클래스들이 상속하고있는 인터페이스에 메소드를 추가해야하는 경우 , 클래스 하나하나 다 재정의 해줘야한다.(추상메서드는 일반클래스에서 반드시 재정의해줘야 하기 때문에) 이런 경우 추상메소드 대신 default 메소드를 사용하면 일일히 재정의 하지 않아도 되고 사용하는 클래스에서만 재정의 할 수 있게 된다.
추상클래스와 인터페이스의 기능이 비슷하고 구별이 잘 가지 않는다고 느꼈을 수도 있다. 그러나 둘은 목적이 다르다.만약 목적까지 같아 구별이 안된다면 , 둘 중에 하나만 살아남지 않았을까?
추상클래스와 인터페이스의 사용목적
- 추상클래스의 목적
- 상속을 받아서 기능을 확장하고 클래스들을 큰 줄기로 구분하기 위해
- 인터페이스의 목적
- 클래스간 공통된 기능을 추가,구현하기 위해

- 주의 : Creature에서 추상메서드로 만든 함수를 꼭 Animal이나 Human에서 구현할 필요 없다. 왜냐하면 둘 모두 추상클래스이기 때문이다.
공부 후기
이전에 내가 알고 있었던 인터페이스의 개념은 "서로 다른 것들 사이를 연결해주는 것"이었다.
그리고 자바에서 interface , implements등 코드를 사용하면서 느꼈던 인터페이스는 그냥 공통적인 특징을 가진 클래스들의 구현을 편하게 하는 문법 정도로 생각하고 있었다.
이런 개념적인 부분과 사용하면서 느낀 경험적인 부분에서의 간극을 이번에 공부하면서 매울 수 있었다.
간단한 설명하면 , 나(사용자)는 "Swimable"이라는 인터페이스 뒤에 뭐가 있는지 몰라도(Kevin,Turtle) “Swimable”만 붙어있다면 "수영해"라고 명령을 할 수 있다. 즉 나(사용자)는 인터페이스를 통해 (Kevin,Turtle)에게 명령할 수 있다.
이렇게 생각하니 확실히 지금까지는 사용하면서는 잘 느끼지 못했던 인터페이스의 "연결해주는 것"이라는 개념이 어느 정도 이해가 됐다.
참고자료
나무소리 유튜브 : 자바 기초 강의 - 3-13강 추상 클래스와 인터페이스
( 부족한 부분이나 수정해야 할 부분을 알려주시면 매우 압도적으로 감사하겠습니다! )
'CS' 카테고리의 다른 글
자바 인코딩의 원리 (2) | 2023.11.08 |
---|---|
API (Application Programming Interface ) 개념 설명 (0) | 2023.06.21 |
[프로그래밍 패러다임] - 함수형 프로그래밍 (2) | 2023.05.15 |
Spring DI 방법들 (0) | 2023.04.20 |
DTO , VO , Entity의 간단한 정리 및 비교 (0) | 2023.04.16 |