본문 바로가기
ETC/도서

[자바의 신] 13장. 인터페이스와 추상클래스, enum

by sorryisme 2024. 9. 27.

메소드 내용이 없는 interface

  • 인터페이스와 추상클래스를 사용하는 이유는
    • 설계시 선언해두면 개발 기능 구현하는데 집중할 수 있다
    • 개발자 역량에 따른 메소드 이름과 매개 변수 선언 격차를 줄일 수 있다
    • 공통적인 인터페이스와 추상클래스를 선언해 놓으면 선언과 구현을 구분할 수 있다

인터페이스를 직접 만들어보자

인터페이스

public interface MemberManager {
    public boolean addMember (MemberDto member);
    public boolean removeMember(String name, String phone);
    public boolean updateMember(MemberDto member);
}

인터페이스 구현체

package interfaceExample;

import object.MemberDto;

public class MemberManagerImpl implements MemberManager {

    @Override
    public boolean addMember(MemberDto member) {
        return false;
    }

    @Override
    public boolean removeMember(String name, String phone) {
        return false;
    }

    @Override
    public boolean updateMember(MemberDto member) {
        return false;
    }
}

  • 인터페이스는 여러개 implements 할 수 있다
  • 인터페이스에 정의된 메소드를 모두 구현 해야지 정상적인 컴파일이 수행된다

인터페이스 사용법

  • 설계단계로만 사용하는 것이 아니라 실제로 외부에 노출되는 것 또한 포함된다
MemberManager member = new MemberManagerImpl();
  • 인터페이스에 선언되어 있는 모든 메소드들이 구현되어 있으며, 실제로 메소드 실행 시 구현체들의 메소드들이 실행된다

일부 완성되어 있는 abstract 클래스

  • 추상 클래스는 마음대로 초기화하고 실행할 수 없도록 되어 있다
  • 추상 클래스는 구현해 놓은 클래스로 초기화 및 실행이 가능하다
public abstract class MemberManagerAbstract {
    public abstract boolean addMember (MemberDto member);
    public abstract boolean removeMember(String name, String phone);
    public abstract boolean updateMember(MemberDto member);
    public void printLog(String data) {
        System.out.println(data);
    }
}

  • 클래스와 몸통 없는 메소드 앞에는 abstract 라는 예약어를 명시
  • abstract 클래스는 abstract 선언 메소드가 0개 이상 있을 때 선언
  • abstract으로 선언된 메소드가 하나라도 있으면 그 클래스는 반드시 abstract으로 선언되어야 한다
  • static이나 final 메소드가 있어도 된다.

final

  • 클래스와 메소드, 변수에 선언 가능
  • 클래스 선언 시
    • 상속 불가능
      • 상속 받아 내용을 변경하는 것을 방지하기 위함
  • 메소드 선언 시
    • 오버라이딩이 불가하다
  • 변수
    • 더 이상 바꿀 수 없다 라는 뜻
    • 반드시 초기 값을 설정해야한다 ( 지역변수나, 매개 변수는 설정하지 않아도 된다)
  • 객체
    • 객체를 final로 지정했다고해서 내부에 있는 변수들까지 final이라는 뜻은 아니다

Enum

enum 기본 사용

public enum OverTimeValues {
    THREE_HOUR,
    FIVE_HOUR,
    WEEKEND_FOUR_HOUR,
    WEEKEND_EIGHT_HOUR
}

상수값 지정

public enum OverTimeValues2 {

    THREE_HOUR(18000),
    FIVE_HOUR(30000),
    WEEKEND_FOUR_HOUR(40000),
    WEEKEND_EIGHT_HOUR(60000);
    
    private final int amount;

    OverTimeValues2(int amount) {
        this.amount = amount;
    }

    public int getAmount() {
        return amount;
    }
}
  • 생성자 선언부에 package-private와 private 접근 제어자로 사용할 수 있다.
  • enum 클래스 또한 일반 클래스와 마찬가지로 컴파일할 때 생성자를 자동으로 만들어준다

사용

OverTimeValues2 values2 = OverTimeValues2.FIVE_HOUR;
System.out.println(values2);
System.out.println(values2.getAmount());
  • 위와 같이 사용할 수 있다

enum 부모 클래스는 Enum이어야한다

  • enum 클래스는 무조건 enum 클래스의 상속을 받는다
  • enum 선언하여 사용시 extends를 해서 사용하면 안된다.

Enum 클래스 메소드

compareTo(E e) 매개 변수로 enum 타입과의 순서 차이를 리턴

getDeclaringClass() 클래스 타입의 enum을 리턴한다.
name() 상수 이름을 리턴한다
ordinal() 상수의 순서를 리턴한다
valueOf(Class<T> enumType, String name) static 메소드이다.

enum.values

public class OverTimeManager3 {
    public static void main(String[] args) {

        OverTimeValues2[] valueList = OverTimeValues2.values();

        for (OverTimeValues2 value : valueList) {
            System.out.println(value);
            System.out.println(value.getAmount());
        }
    }
}
  • 반복문을 통해서 여러 개의 값을 가져올 수 있다.