티스토리 뷰
자바를 사용하다보면 abstract 와 interface 의 기능과 차이가 헷갈릴 때가 많다.
그래서 정리를 해보고자 글을 쓰게 되었다.
abstract (추상클래스)
추상클래스는 0개/하나 이상의 추상메소드를 가지고 있다.
추상메소드는 추상메소드는 함수의 바디가 아직 구현되어 있지 않은 abstract로 정의된 메소드를 말한다.
public abstract class Car {
/* 추상 메소드 */
public abstract void drive();
public abstract void stop();
/* 일반 메소드 */
public void startCar() {
System.out.println("시동을 켭니다");
}
}
public class AICar extends Car{
@Override
public void drive() {
System.out.println("자율주행합니다");
System.out.println("스스로 방향 전환합니다.");
}
@Override
public void stop() {
System.out.println("자동차가 스스로 멈춥니다");
}
/* 일반 메소드 */
public void showInform() {
System.out.println("나는 AI Car!");
}
}
-
클래스안의 메소드가 단 한개라도 추상메소드가 있다면 그 클래스 앞에는 반드시 abstract 클래스명으로 표기되어야 하며 abstract와 final 키워드를 동시에 표기할수 없다.
-
추상클래스는 일반적인 메소드와 추상메소드 둘 다 있을수도 있다. 추상클래스는 일반변수들을 가질수 있다. 추상클래스도 인터페이스처럼 추상클래스가 아닌 클래스에서 상속을 받는다면 추상메소드가 있을경우 모두 구현해주어야 한다. 물론 추상클래스에서 추상클래스를 상속받는다면 모두 구현하지 않아도 된다. 추상클래스에서도 인터페이스를 구현할수 있는데 이때는 구현하지 않고 그냥 놔둘수 있다.
-
추상클래스는 생성자를 가질수 있다. 추상클래스는 인스턴스를 만들수 없지만 추상클래스를 상속받은 클래스를 통하면 인스턴스화가 가능하다. 예를 들자면 "Car myCar = new AICar();" 이런 형태가 될것이다.
-
추상클래스의 접근지정자는 어떤 것이나 가능하다.
-
추상클래스의 궁극적인 목적은 상속하기 위함이고, 어떤 클래스가 추상클래스를 상속받을때는 extends를 쓴다.
interface (인터페이스)
인터페이스는 함수의 바디가 비어있는 메소드들의 형태들만 써놓은 것이며 상속하는 클래스들에서 해당 메소드들의 내용을 구현해서 사용해야하는 메소드들의 집합이라 할수있다.
public interface Animal {
/* 인터페이스 (추상 메소드) */
void run();
}
public class Dog implements Animal {
private String name;
private float weight;
@Override
public void run() {
System.out.println("강아지가 뛰어간다.");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public float getWeight() {
return weight;
}
public void setWeight(float weight) {
this.weight = weight;
}
}
-
인터페이스에 새로운 메소드를 추가하고 그 아래에 인터페이스로부터 상속되는 클래스가 있다면 새로운 메소드에 대한 내용을 반드시 구현해야한다. 인터페이스안의 모든 메소드들은 추상메소드이다.
-
인터페이스는 final을 붙일수 없고 인터페이스 변수들은 static이어야만 한다. 한마디로 인터페이스는 일반변수들을 가질수 없다.
-
인터페이스는 생성자를 가질수 없다. 인터페이스는 인스턴스를 만들수 없지만 인터페이스를 구현한 클래스를 통하면 인스턴스화가 가능하다. 예를 들면 "Animal dog = new Dog( );"
-
인터페이스의 접근지정자는 아예 없거나 public이거나 아님 abstract만 가능
-
어떤 클래스가 인터페이스를 상속받을때는 implements 를 쓴다. 물론 클래스가 다른 클래스를 상속하면서 인터페이스를 구현하는 것도 가능하다. 그럴때는 extends 쓰고 implements를 순서대로 쓰면 된다.
-
인터페이스는 하나 이상의 인터페이스들을 상속할수 있는데 여러개일때는 콤마(,)를 사용하며 이때는 클래스에서 상속받는게 아니라 인터페이스에서 상속받으니 즉 내용이 없는 메소드들을 그대로 두는것이니 구현이 아니라 인터페이스간의 상속이므로 일반 클래스끼리 상속할때처럼 extends를 쓴다.
abstract와 interface가 어떻게 쓰일까?
public abstract class Animal {
private String name;
private float weight;
/* 추상 메소드 */
public abstract void run();
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public float getWeight() {
return weight;
}
public void setWeight(float weight) {
this.weight = weight;
}
}
public interface RideInterface {
/* 인터페이스 (추상 메소드) */
void ride(String riderName);
}
public class Horse extends Animal implements RideInterface {
@Override
public void run() {
System.out.println(this.getName()+"은(는) 네 발로 뛴다.");
}
@Override
public void ride(String riderName) {
System.out.println(this.getName()+"은(는) "+riderName+"을(를) 태울 수 있다.");
}
}
public class Main {
public static void main(String[] args) {
Horse horse=new Horse();
horse.setName("조랑말");
horse.setColor("갈색");
hosre.run();
horse.ride("simon");
}
}
-
추상클래스는 객체의 추상적인 상위 개념으로 공통된 개념을 표현할 때 쓴다. 위에 예를 들어, 동물에는 공통적으로 이름과 무게가 있고, 달린다는 공통된 행동이 있다. 하지만, 각기 요구하는 객체구현 방식마다 객체가 달라지겠지만, 공통된 속성을 동물이라는 추상클래스에 추상메소드로 구현하여 하위 개념인 말이라는 객체에 상속시켜 구현하면 객체의 재사용성과 객체를 표현하는 것이 더 명확해진다. 그리고 동물마다 차이가 생기는 부분을 나누기 위해 RideInterface를 구분하여 동물 중에서 태울 수 있는 동물들에게 Implements 시켜 객체를 잘 표현할 수 있다.
-
인터페이스는 구성하는 요소들이 자주 바뀔때 쓰면 유용하다. 그리고, 메소드 형태만 서로 공유해서 구현(재정의)되는 상황일 때 사용하는 것이 적합하다. 즉, 공통된 메소드로 만들어 사용하고 싶을때 인터페이스를 이용하면 효과적
-
또, 동시개발이 가능하므로 시간을 많이 단축시킬수 있다. 인터페이스안의 메소드들은 내용이 없는 상태이나 메소드에 대한 결과값은 내용을 만들지 않아도 미리 알수 있으므로 인터페이스의 내용을 누군가가 구현하고 있는 동안에 다른 한사람은 그 메소드가 구현되고 나면 작동할 결과값으로 같은 시간에 다른 일을 할 수 있어 빠른 개발이 가능하다.
'Java > 개념정리' 카테고리의 다른 글
[ Spring ] Java 설정 파일 사용 및 설명 (@Configuration, @Bean, @EnableWebMvc) (0) | 2021.02.19 |
---|---|
[ Java ] JDBC - PreparedStatement (0) | 2020.12.08 |
[ Java ] JDBC 사용하는 방법 (0) | 2020.12.08 |
[ Java ] 자바 Stream (스트림) 사용 방법 정리 (0) | 2020.11.28 |
[ Java ] Java Collection ( 컬렉션 ) 정리 (0) | 2020.11.28 |