추상화를 돕는 도구인 추상 클래스와 인터페이스에 대해서 배우는 시간입니다. 인터페이스 같은 경우는 앞으로도 굉장히 많이 보고 사용하기 때문에 인터페이스의 특징에 대해서는 잘 알아두어야 합니다.
ㅤ
abstract 클래스는 추상 클래스라고도 불리며, 추상화를 좀 더 구조적으로 도와주는 도구입니다.
public abstract class Dog {
protected String name;
public Dog(String name) {
this.name = name;
}
public abstract void bite();
public abstract void bark();
protected void eat() {
System.out.println("먹는다");
}
}
추상 클래스를 만들기 위해서는 class
앞에 abstract
키워드를 사용하여 추상 클래스라는 것을 명시합니다.
추상 클래스
abstract class 클래스명
이러한 추상 클래스는 추상화 할 수 있는 몇 가지 도구를 제공합니다.
추상 메서드
abstract void bite();
abstract void bark();
abstract
메서드는 메서드의 이름과 반환형, 매개 변수만 선언하고 내용에 대해서는 정의하지 않습니다. 내용에 대한 정의는 확장(extends
)하는 클래스에 위임하고 있습니다.
public class Retriever extends Dog {
public Retriever(String name) {
super(name);
}
// 반드시 추상 메서드는 Override 해야 한다.
public void bite() {
…
}
// 반드시 추상 메서드는 Override 해야 한다.
public void bark() {
…
}
}
abstract
메서드는 내용이 정의되어 있지 않기 때문에 확장하는 클래스에서 abstract
메서드를 반드시 Override 해야 합니다.
ㅤ
abstract 클래스의 특징을 정리하면 다음과 같습니다.
생성자를 정의할 수 있습니다.
단독으로 인스턴스를 생성할 수 없습니다.(확장해야지 사용 가능하다)
추상 메서드를 사용 시 abstract 키워드가 선언되어 있어야 합니다.
abstract 메서드는 확장하는 클래스에서 내용을 정의해야 하므로 private 지시자를 선언할 수 없습니다.
확장하는 클래스는 abstract 메서드를 반드시 override 해야 하며 구현체가 존재해야 합니다.
ㅤ
interface
도 abstract
클래스와 동일하게, 추상화를 좀 더 구조적으로 도와주는 도구입니다. 그리고 현업에서 abstract
클래스보다 훨씬 많이 사용됩니다. 그러므로 interface
에 대해서 잘 알아야 합니다.
public interface Dog {
public static final String color = "검정";
public abstract void bite();
public abstract void bark();
public default void eat() {
System.out.println("먹는다");
}
public static String getColor() {
return color;
}
}
인터페이스를 만들기 위해서는 interface
키워드를 사용하여 인터페이스라는 것을 명시합니다.
인터페이스
interface 인터페이스명
인터페이스 또한 추상 클래스와 같이 abstract
메서드를 제공합니다.
추상 메서드
public abstract void bite();
public abstract void bark();
abstract
메서드는 메서드의 이름과 반환형, 매개 변수만 선언하고 내용에 대해서는 정의하지 않습니다. 내용에 대한 정의는 구현(implements
)하는 클래스에 위임하고 있습니다.
다만 인터페이스 내의 추상 메서드는 모두 public abstract
의미를 내포하기 때문에 생략해도 상관없습니다.
public static final String color = "검정";
인터페이스 내에 선언하는 변수는 모두 public static final
이어야 합니다.
또한 public static final
을 생략하더라도 모든 변수는 public static final
변수가 됩니다.
public class Retriever implements Dog {
public Retriever(String name) {
super(name);
}
// 반드시 추상 메서드는 Override 해야 한다.
public void bite() {
…
}
// 반드시 추상 메서드는 Override 해야 한다.
public void bark() {
…
}
}
추상 클래스의 abstract
메서드와 동일하게 abstract
메서드는 내용이 정의되어 있지 않기 때문에 인터페이스의 내용에 대한 정의는 구현(implements
)하는 클래스에 위임하므로 추상 메서드를 반드시 override
해야 합니다.
public interface Dog {
// 인터페이스는 생성자를 선언 및 정의를 할 수 없다.
public Dog(String name) {
this.name = name;
}
}
인터페이스는 생성자를 선언 및 정의할 수 없습니다. 인터페이스는 확장(extends)을 위해 사용하기보다는 메서드 규약(Protocol)을 위해 사용하는 경우가 많기 때문에 생성자를 선언할 수 없습니다.
ㅤ
생성자를 선언 및 정의할 수 없습니다.
인터페이스 내에서 선언하는 변수는 모두 public static final이 선언된 변수입니다.
default 메서드도 아니고 static 메서드도 아닌 메서드는 모두 public abstract가 선언된 메서드입니다.(Java8 기준)
default 메서드나 static 메서드는 모두 public이 선언된 메서드입니다.
상속받는 클래스는 abstract 메서드를 반드시 override 해야 하며 구현체가 반드시 존재해야 합니다.
인터페이스의 내용을 실제로 구현하는 클래스는 인터페이스를 implements해야 합니다.
ㅤ
추상 클래스와 인터페이스의 차이를 헷갈려 하실 수 있습니다. 사실 추상 클래스는 현업에서 생각보다 많이 쓰이지 않습니다. 그래도 정확히 이해하고 넘어가는 것이 가장 좋습니다.
추상 클래스와 인터페이스의 차이는 이렇게 볼 수 있습니다.
생성자 정의 가능 여부
변수 접근 제어 지시자 다양성 여부
abstract 메서드 접근제어 지시자 다양성 여부
default 메서드, static 메서드 접근제어 지시자 다양성 여부
사실 좀 더 자유도가 높은 것은 추상 클래스이나, 추상 클래스는 확장에 의미가 더 가깝고 인터페이스는 규약에 가깝기 때문에 인터페이스를 더 많이 사용합니다.
궁금한게 있습니다 ! abstract or interface 를 사용하는 경우에 메서드는 abstract로 선언만 하는것이고 이것을 이용하는 클래스에서 오버라이딩을 한다고 되어있는데 아래 실습 도구와 같이 abstract 키워드로 선언되지 않은 메서드는 어떤 식으로 사용하나요? package com.codelatte.abstraction.interfacedog; public interface Dog { // public static final 생략 가능 public static final String color = "검정"; // public abstract 생략 가능 public abstract void bite(); public abstract void bark(); // public 생략 가능 public default void eat() { System.out.println("먹는다"); } // public 생략 가능 public static String getColor() { return color; } }
안녕하세요. 코드라떼입니다. interface 내의 'default' 키워드가 선언된 메서드나 'static' 메서드는 사실 현업에서 잘 사용되지 않습니다. 첫 번째로 'default' 메서드 같은 경우는 생성된 목적이 자바라는 언어가 버전업이 되면서 새로운 문법이 추가됨에 따라 호환성을 위해서 생성되었습니다. 두 번째로 abstract 클래스나 interface를 사용하다 보면 interface 내에 추상 메서드를 추가해야 하는 상황이 발생합니다. 만약에 추가하면 abstract 클래스나 interface를 상속 또는 확장하는 모든 클래스가 영향을 받는 문제가 발생합니다. (모든 클래스가 추상 메서드를 구현해야 합니다) 그럴땐 default 메서드를 이용하여 모든 클래스가 구현해야 하는 것이 아니라 특정 클래스만 해당 메서드를 오버라이드 하는 것으로 해결합니다. 세 번째로 interface 내에서 'static'을 저도 현업에서 사용한 적은 없습니다. 그래서 이 부분은 답변드리기 어려울 것 같습니다. 만약에 사용해야 한다면 일단 설계 문제가 아닌가 다시 한번 생각하고 그래도 굳이 사용해야 한다면 'default' 메서드 내에서 사용할 상속 또는 확장할 수 없는 메서드로 정의하던가 할 듯싶습니다. 감사합니다 :)
코드의 실행에 집중하기보다 작성되어 있는 코드를 확인해보세요. 눈에 익숙해져야 합니다.
추상화를 돕는 도구인 추상 클래스와 인터페이스에 대해서 배우는 시간입니다. 인터페이스 같은 경우는 앞으로도 굉장히 많이 보고 사용하기 때문에 인터페이스의 특징에 대해서는 잘 알아두어야 합니다.
ㅤ
abstract 클래스는 추상 클래스라고도 불리며, 추상화를 좀 더 구조적으로 도와주는 도구입니다.
public abstract class Dog {
protected String name;
public Dog(String name) {
this.name = name;
}
public abstract void bite();
public abstract void bark();
protected void eat() {
System.out.println("먹는다");
}
}
추상 클래스를 만들기 위해서는 class
앞에 abstract
키워드를 사용하여 추상 클래스라는 것을 명시합니다.
추상 클래스
abstract class 클래스명
이러한 추상 클래스는 추상화 할 수 있는 몇 가지 도구를 제공합니다.
추상 메서드
abstract void bite();
abstract void bark();
abstract
메서드는 메서드의 이름과 반환형, 매개 변수만 선언하고 내용에 대해서는 정의하지 않습니다. 내용에 대한 정의는 확장(extends
)하는 클래스에 위임하고 있습니다.
public class Retriever extends Dog {
public Retriever(String name) {
super(name);
}
// 반드시 추상 메서드는 Override 해야 한다.
public void bite() {
…
}
// 반드시 추상 메서드는 Override 해야 한다.
public void bark() {
…
}
}
abstract
메서드는 내용이 정의되어 있지 않기 때문에 확장하는 클래스에서 abstract
메서드를 반드시 Override 해야 합니다.
ㅤ
abstract 클래스의 특징을 정리하면 다음과 같습니다.
생성자를 정의할 수 있습니다.
단독으로 인스턴스를 생성할 수 없습니다.(확장해야지 사용 가능하다)
추상 메서드를 사용 시 abstract 키워드가 선언되어 있어야 합니다.
abstract 메서드는 확장하는 클래스에서 내용을 정의해야 하므로 private 지시자를 선언할 수 없습니다.
확장하는 클래스는 abstract 메서드를 반드시 override 해야 하며 구현체가 존재해야 합니다.
ㅤ
interface
도 abstract
클래스와 동일하게, 추상화를 좀 더 구조적으로 도와주는 도구입니다. 그리고 현업에서 abstract
클래스보다 훨씬 많이 사용됩니다. 그러므로 interface
에 대해서 잘 알아야 합니다.
public interface Dog {
public static final String color = "검정";
public abstract void bite();
public abstract void bark();
public default void eat() {
System.out.println("먹는다");
}
public static String getColor() {
return color;
}
}
인터페이스를 만들기 위해서는 interface
키워드를 사용하여 인터페이스라는 것을 명시합니다.
인터페이스
interface 인터페이스명
인터페이스 또한 추상 클래스와 같이 abstract
메서드를 제공합니다.
추상 메서드
public abstract void bite();
public abstract void bark();
abstract
메서드는 메서드의 이름과 반환형, 매개 변수만 선언하고 내용에 대해서는 정의하지 않습니다. 내용에 대한 정의는 구현(implements
)하는 클래스에 위임하고 있습니다.
다만 인터페이스 내의 추상 메서드는 모두 public abstract
의미를 내포하기 때문에 생략해도 상관없습니다.
public static final String color = "검정";
인터페이스 내에 선언하는 변수는 모두 public static final
이어야 합니다.
또한 public static final
을 생략하더라도 모든 변수는 public static final
변수가 됩니다.
public class Retriever implements Dog {
public Retriever(String name) {
super(name);
}
// 반드시 추상 메서드는 Override 해야 한다.
public void bite() {
…
}
// 반드시 추상 메서드는 Override 해야 한다.
public void bark() {
…
}
}
추상 클래스의 abstract
메서드와 동일하게 abstract
메서드는 내용이 정의되어 있지 않기 때문에 인터페이스의 내용에 대한 정의는 구현(implements
)하는 클래스에 위임하므로 추상 메서드를 반드시 override
해야 합니다.
public interface Dog {
// 인터페이스는 생성자를 선언 및 정의를 할 수 없다.
public Dog(String name) {
this.name = name;
}
}
인터페이스는 생성자를 선언 및 정의할 수 없습니다. 인터페이스는 확장(extends)을 위해 사용하기보다는 메서드 규약(Protocol)을 위해 사용하는 경우가 많기 때문에 생성자를 선언할 수 없습니다.
ㅤ
생성자를 선언 및 정의할 수 없습니다.
인터페이스 내에서 선언하는 변수는 모두 public static final이 선언된 변수입니다.
default 메서드도 아니고 static 메서드도 아닌 메서드는 모두 public abstract가 선언된 메서드입니다.(Java8 기준)
default 메서드나 static 메서드는 모두 public이 선언된 메서드입니다.
상속받는 클래스는 abstract 메서드를 반드시 override 해야 하며 구현체가 반드시 존재해야 합니다.
인터페이스의 내용을 실제로 구현하는 클래스는 인터페이스를 implements해야 합니다.
ㅤ
추상 클래스와 인터페이스의 차이를 헷갈려 하실 수 있습니다. 사실 추상 클래스는 현업에서 생각보다 많이 쓰이지 않습니다. 그래도 정확히 이해하고 넘어가는 것이 가장 좋습니다.
추상 클래스와 인터페이스의 차이는 이렇게 볼 수 있습니다.
생성자 정의 가능 여부
변수 접근 제어 지시자 다양성 여부
abstract 메서드 접근제어 지시자 다양성 여부
default 메서드, static 메서드 접근제어 지시자 다양성 여부
사실 좀 더 자유도가 높은 것은 추상 클래스이나, 추상 클래스는 확장에 의미가 더 가깝고 인터페이스는 규약에 가깝기 때문에 인터페이스를 더 많이 사용합니다.
궁금한게 있습니다 ! abstract or interface 를 사용하는 경우에 메서드는 abstract로 선언만 하는것이고 이것을 이용하는 클래스에서 오버라이딩을 한다고 되어있는데 아래 실습 도구와 같이 abstract 키워드로 선언되지 않은 메서드는 어떤 식으로 사용하나요? package com.codelatte.abstraction.interfacedog; public interface Dog { // public static final 생략 가능 public static final String color = "검정"; // public abstract 생략 가능 public abstract void bite(); public abstract void bark(); // public 생략 가능 public default void eat() { System.out.println("먹는다"); } // public 생략 가능 public static String getColor() { return color; } }
안녕하세요. 코드라떼입니다. interface 내의 'default' 키워드가 선언된 메서드나 'static' 메서드는 사실 현업에서 잘 사용되지 않습니다. 첫 번째로 'default' 메서드 같은 경우는 생성된 목적이 자바라는 언어가 버전업이 되면서 새로운 문법이 추가됨에 따라 호환성을 위해서 생성되었습니다. 두 번째로 abstract 클래스나 interface를 사용하다 보면 interface 내에 추상 메서드를 추가해야 하는 상황이 발생합니다. 만약에 추가하면 abstract 클래스나 interface를 상속 또는 확장하는 모든 클래스가 영향을 받는 문제가 발생합니다. (모든 클래스가 추상 메서드를 구현해야 합니다) 그럴땐 default 메서드를 이용하여 모든 클래스가 구현해야 하는 것이 아니라 특정 클래스만 해당 메서드를 오버라이드 하는 것으로 해결합니다. 세 번째로 interface 내에서 'static'을 저도 현업에서 사용한 적은 없습니다. 그래서 이 부분은 답변드리기 어려울 것 같습니다. 만약에 사용해야 한다면 일단 설계 문제가 아닌가 다시 한번 생각하고 그래도 굳이 사용해야 한다면 'default' 메서드 내에서 사용할 상속 또는 확장할 수 없는 메서드로 정의하던가 할 듯싶습니다. 감사합니다 :)
코드의 실행에 집중하기보다 작성되어 있는 코드를 확인해보세요. 눈에 익숙해져야 합니다.