-
[Java] OOP 추상클래스와 인터페이스Java 2023. 7. 21. 13:57728x90반응형
객체지향 프로그래밍(OOP) 추상클래스와 인터페이스
🍊 추상 클래스
추상클래스의 개념을 알아보기 전에 아래 클래스들의 공통 분모를 뽑아서 상속 구조를 만들어봅시다.
before : 상속 사용 전
public class DieselSUV { private int curX, curY; public void reportPosition() { System.out.printf("현재 위치: (%d, %d)%n", curX, curY); } public void addFuel() { System.out.printf("주유소에서 급유"); } } public class ElectricCar { private int curX, curY; public void reportPosition() { System.out.printf("현재 위치: (%d, %d)%n", curX, curY); } public void addFuel() { System.out.printf("급속 충전"); } }
after : 상속 사용 후
class Vihicle { int curX, curY; public void reportPosition() { System.out.printf("현재 위치: (%d, %d)%n", curX, curY); } public void addFuel() { System.out.printf("연료가 필요"); } } class DieselSUV extends Vihicle { public void addFuel() { System.out.printf("주유소에서 급유"); } } class ElectricCar extends Vihicle { public void addFuel() { System.out.printf("급속 충전"); } }
main 메소드
public class VehicleTest { public static void main(String[] args) { Vehicle[] vehicles = { new DieselSUV(), new ElectricCar() }; for(Vehicle v : vehicles) { v.addFuel(); v.reportPosition(); } } }
그런데 여기서 부모 클래스 Vehicle의 addFuel의 메소드는 쓰이지 않고 있지 않습니다. 이처럼 구현할 필요가 없는 부모 클래스의 메소드는 추상화를 시켜두는 방법이 있습니다. 추상화는 abstract 키워드로 이루어집니다.
abstract class Vehicle { private int curX, curY; public void reportPosition() { System.out.printf("현재 위치: (%d, %d)%n", curX, curY); } public abstract void addFuel(); }
- 메소드의 선언부만 남기고 구현부는 세미콜론으로 대체합니다.
- 구현부가 없다는 의미로 abstract 키워드를 메소드 선언부에 추가해줍니다.
- 객체를 생성할 수 없는 클래스라는 의미로 클래스 선언부에 abstract를 추가합니다.
- 이런 형태를 abstract method design pattern이라고 합니다.
🍊 추상 클래스의 특징
- abstract 클래스는 상속 전용의 클래스입니다.
- 클래스에 구현부가 없는 메소드가 있으므로 객체를 생성할 수 없습니다.
- 상위 클래스로서 자식을 참조하는 것은 가능합니다.
// Vehicle v = new Vehicle(); // abstract 클래스는 객체를 생성할 수 없음 Vehicle v = new DieselSUV(); // 자식을 참조하는 데는 문제 없음
조상 클래스에서 상속받은 abstract 메소드를 재정의하지 않은 경우 클래스 내부에 abstract 메소드가 있는 상황이므로 자식 클래스는 abstract 클래스로 선언되어야 합니다.
추상 클래스는 UML 상에서 이탤릭으로 표현합니다.
🍊 인터페이스 interface
인터페이스는 최고 수준의 추상화 단계입니다.
public interface MyInterface { public static final int MEMBER1 = 10; int MEMBER2 = 10; public abstract void method1 (int param); void method2 (int param); }
- 클래스와 유사하게 Interface 선언을 합니다.
- 모든 멤버 변수는 public static final이며 생략 가능합니다.
- 모든 메소드는 public abstract이며 생략 가능합니다.
📍 인터페이스 상속
클래스와 마찬가지로 인터페이스도 extends를 통해 상속이 가능하지만, 다른 점은 인터페이스는 다중 상속이 가능하다는 점입니다.
interface Fightable { int fire(); } interface Transformable { void changeShape (boolean isHeroMode); } public interface Heroable extends Fightable, Transformable { void upgrade(); }
📍 인터페이스 구현과 객체 참조
public class IronMan implements Heroable { int weaponDamage = 100; @Override public int fire() { System.out.printf("빔 발사: %d만큼의 데미지를 가함%n"); return this.weaponDamage; } @Override public void changeShape(boolean isHeroMode) { String status = isHeroMode ? "장착" : "제거"; System.out.printf("장갑 %s%n", status); } @Override public void upgrade() { System.out.printf("무기 성능 개선"); } }
📍 인터페이스의 목적
인터페이스는 객체의 기능을 모두 공개한 표준화 문서와 같은 것으로, 개발자에게 인터페이스를 상속받는 클래스의 목적에 따라 인터페이스의 모든 추상 메소드를 만들도록 하는 것에 목적이 있습니다.
📍 인터페이스의 static method
interface StaticMethodInterface { static void staticMethod() { System.out.println("Static 메소드"); } } public class StaticMethodTest { public static void main(String[] args) { StaticMethodInterface.staticMethod(); } }
인터페이스의 static 메소드도 일반 static 메소드와 마찬가지로 별도의 객체가 필요 없습니다. 위와 같이 구현체 클래스 없이 바로 인터페이스 이름으로 메소드에 접근해서 사용이 가능합니다.
LIST'Java' 카테고리의 다른 글
[Java] 자바의 접근 제한자, 싱글톤 패턴으로 객체 instance 생성하기 (1) 2023.07.22 [Java] 상속(Inheritance)과 메소드 오버라이딩 vs 오버로딩 (2) 2023.07.20 [Java] 자바의 정수와 실수의 계산, 부동 소수점 방식 (0) 2023.07.17 [Java] 자바의 조건문과 반복문의 이해와 활용 (for, while, if, swtich) (2) 2023.07.16 [Java] 자바의 연산자 (곱셈, 나눗셈, 덧셈, 비트연산자, 삼항연산자) (2) 2023.07.14