인터페이스(구현을 위한 껍데기로 틀을 잡아주는 역할을 한다)와 추상 클래스(abstract 추상 메소드가 하나라도 있는 클래스)는 용도가 다르다.
인터페이스는 내부기능을 조작하는 접속장치, 지침서의 역할을 한다.
추상 클래스는 추상적으로 객체의 공통되는 특징을 가져와 새로운 클래스로 만드는 용으로 쓴다.
인터페이스는 선언된 추상메소드들로 구현을 하기 위해 쓰이고
추상클래스는 상속을 통해 확장하기 위해 쓴다.
(인터페이스에 정의한 몸통이 없는 메소드가 바로 구현되지 않은 추상 메소드이다.
인터페이스를 구현해 사용하고자 하는 클래스에서 인터페이스에 정의된 메소드들을 구현해줘야 한다. implements)
인터페이스 | abstract 클래스 | 클래스 | |
선언시 사용하는 예약어 | interface | abstract class | class |
구현 안 된 메소드 포함가능 여부 | 가능(필수) | 가능 | 불가 |
구현된 메소드 포함 가능 여부 | 불가 | 가능 | 가능(필수) |
static 메소드 선언 가능여부 | 불가 | 가능 | 가능 |
final 메소드 선언 가능 여부 | 불가 | 가능 | 가능 |
상속(extends) 가능 | 불가 | 가능 | 가능 |
구현(implements) 가능 | 가능 | 불가 | 불가 |
출처: 자바의 신
자바에서는 단일 상속만 가능하다. 다중상속과 같은 기능을 인터페이스를 통해 구현할 수 있다.
(상속이란 부모에 선언된 변수와 메소드에 대한 사용권을 갖는 것을 말한다. extends를 사용해 확장하거나 implements를 사용해 구현한 경우가 상속에 속한다. )
인터페이스는 다중 구현이 가능하다.
즉 class A에 implements 인터페이스 1, 인터페이스2,, 가 가능하다.
class A에서 인터페이스 여러 개의 추상메서드들을 사용가능한 것이다.
인터페이스 다중 구현 시 중복된 메서드가 있으면 반드시 하위 클래스에서 재정의 해야한다.
인터페이스의 목적
1. 설계
2. 은닉 ( 클래스를 통해 실제 구현한 객체를 인터페이스 뒤에 가리고 소통한다.)
인터페이스는 그 자체로는 구현되지 않아서 인터페이스로 생성자를 불러 객체를 생성하려고 하면 컴파일 에러가 난다.
인터페이스의 변수는 public static final로 자동선언된다.
인터페이스의 메소드도 마찬가지로 public abstract으로 자동선언된다.
? 왜 인터페이스의 변수는 static final로 선언될까 ?
Java 인터페이스는 자체적으로 인스턴스화할 수 없기 때문에 인터페이스 변수는 정적이다. 변수의 값은 인스턴스가 존재하지 않는 정적 컨텍스트에서 할당되어야 한다. 객체 생성 시점이 아닌 컴파일 될때 메모리할당하는 static을 사용한다. 한번만 초기화하는 final을 통해 이후에도 값이 새로 할당되지 않도록 한다.
static과 final 개념
static : 고정의, 정적인
-> 값이 고정되어있다.
->해당 데이터의 메모리 할당을 컴파일 시간에 하고 프로그램이 끝날 때까지 static 데이터는 메모리 수명이 유지된다.
-> non-static 변수는 새 객체를 생성할 때마다 초기화하고 메모리에 담는데 static변수는 계속 같은 값을 쓴다!
final : 최종의, 마지막의 -> 한 번만 초기화 가능하다
-> 변수로 final 선언하면 생성자나 연산자로 한번만 초기화되어 변하지 않는 상수값 할당됨
-> 클래스를 final로 선언하면 상속불가 extends X( 상속계층에서 마지막 클래스 됨)
-> 메소드를 final로 선언하면 오버라이딩 불가 @Override X
static final : 고정된 최종!!
-> 값을 바꿀 수 없는 상수가 된다.
-> 상수이므로 생성과 동시에 초기화가 된다. (초기화란 값을 할당)
참고문헌:
왜 자바에서 final 멤버 변수는 관례적으로 static을 붙일까?
자바 final, static 키워드와 코딩 best practice 되짚어보기
djkeh.github.io
https://stackoverflow.com/questions/2430756/why-are-interface-variables-static-and-final-by-default
Why are interface variables static and final by default?
Why are interface variables static and final by default in Java?
stackoverflow.com
https://byjus.com/gate/difference-between-abstract-class-and-interface-in-java/
Difference between Abstract Class and Interface in Java
Difference between Abstract Class and Interface in JAVA. The Abstract class and Interface both are used to have abstraction. An abstract class contains an abstract keyword on the declaration whereas an Interface is a sketch that is used to implement a clas
byjus.com
인터페이스 다중 구현과 상속
인터페이스의 다중 구현과 중복 상황, 인터페이스 상속, 인터페이스 구현과 상속
velog.io
'자바' 카테고리의 다른 글
컬렉션이란? 컬렉션 프레임워크 종류 (List, Set, Map) (0) | 2023.09.17 |
---|---|
String 클래스의 equals() ,== 연산자, compareTo() 메소드 (0) | 2023.09.14 |
static 남발하면 안되는 이유 (0) | 2023.09.13 |
자바 4장을 마치며 인스턴스 변수와 클래스 변수의 차이를 알자~ (0) | 2023.08.30 |
자바의 신 3장을 마치며 클래스, 객체, 인스턴스, this연산자, 생성자 (2) | 2023.08.30 |