13장 - 인터페이스와 추상클래스, enum

방법론

시스템을 어떻게 만들 것인지 절차를 설명하고,
어떤 문서(산출물)를 작성해야 하는지를 정리해 놓은 공동 절차

  • 분석 : 시스템을 분석. 어떻게 개발하기를 원하는지 물어본다.
  • 설계 : 분석 단계에서 만든 대략적인 그림을 프로그램으로 만들 수 있도록 설계하는 작업. 세부적인 것들을 정리한다. 이 단계에서 인터페이스를 만들어 두면 개발할 때 메소드의 이름을 어떻게 할지, 매개 변수를 어떻게 할지 일일이 고민하지 않아도 된다.
  • 개발 및 테스트 : 설계에서 만들기로 한 것들을 개발하는 단계 . 필요한 기능들이 제대로 동작하는지 확인하는 테스트 작업을 수행한다,
  • 시스템 릴리즈 : 시스템을 사용자들에게 제공하는 단계. 시스템 오픈 시스템 오픈 이후 운영/유지보수 단계를 거치면서 문제가 있는 부분들을 수정한다.

인터페이스

 📃 MemberManager.java
public interface MemberManager {
	public boolean addMember(MemberDTO member);
	public boolean removeMember(String name, String phone);
    	public boolean updateMember(MemberDTO member);
}
 📃 MemberMangerImpl.java
public class MemberMangerImpl 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는 해당 클래스에서 구현해야 하는 인터페이스들을 정의한다.
    여러 개를 implements 할 수 있다.
  • 인터페이스를 구현할 경우(implements 뒤에 인터페이스 이름을 나열할 경우)에는
    반드시 인터페이스에 정의된 메소드들의 몸통을 만들어 줘야한다.
  • 외부에 노출되는 것을 정의해 놓는다

abstract 클래스

 📃 MemberManagerAbstract.java
 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 pringLog(String data){
    	System.out.println("Data="+data);
    }
 }
  • 추상적인. 메소드가 구현되지 않은, 몸통이 없이 선언한 것
  • abstract class
    • class 예약어 앞에 abstract 예약어를 사용한다.
    • abstract로 선언한 메소드가 1개 이상 있을 때 선언한다. 구현되어 있는 메소드가 있어도 상관없다.
    • static, final 메소드가 있어도 된다.
  • abstract method
    • 몸통이 없는 메소드
    • 메소드명 앞에 abstract 예약어를 명시한다.
  • extends라는 예약어를 사용해 abstract클래스를 상속받을 수 있다.
    이때 abstract 메소드들을 구현하지 않으면 컴파일 에러가 발생한다.
  • 인터페이스를 선언하다보니 어떤 메소드는 미리 만들어 놓아도 문제가 없는 경우가 발생하는데 그럴 때 사용한다. 특히 공통적인 기능을 미리 구현해 놓으면 좋을 때 사용한다.

인터페이스, abstract 클래스 사용 이유

  • 설계시 선언해 두면 개발할 때 기능을 구현하는 데에만 집중할 수 있다.
  • 개발자의 역량에 따른 메소드의 이름과 매개 변수 선언의 격차를 줄일 수 있다.
  • 공통적인 인터페이스와 abstract클래스를 선언해 놓으면, 선언과 구현을 구분할 수 있다.
  • 설계 단계에서 인터페이스만 만들어 놓고, 개발 단계에서 실제 작업을 수행하는 메소드를 만들면 설계 단계의 산출물과 개발 단계의 산출물이 효율적으로 관리된다.

final

  • 클래스, 메소드, 변수에 선언할 수 있다.
  • final class
    • 더 이상 확장해서는 안 되는 클래스, 누군가 상속 받아서 내용을 변경해서는 안 되는 클래스를 선언할 때 final로 선언한다.
    • 상속을 해 줄 수 없다
  • final method
    • 더 이상 Overriding할 수 없다.
  • final variable
    • 더 이상 바꿀 수 없다는 뜻이다.
      따라서 선언과 함께 값을 지정해야 한다. (변수 생성과 동시에 초기화)
    • 인스턴스 변수, 클래스 변수는 생성과 동시에 초기화 해야한다.
      매개 변수나 지역 변수는 반드시 선언할 때 초기화할 필요는 없다.
      매개변수는 이미 초기화가 되어서 넘어 오고,
      지역 변수는 메소드를 선언하는 중괄호 내에서만 참조되므로 다른 곳에서 변경할 일이 없다.
    • 값 할당 후 변경하면 안된다.
  • 해당 클래스가 final이고 그 안에 있는 인스턴스 변수나 클래스 변수가 final이 아닐 때 변수들은 수정할 수 있다.

enum클래스

 📃 OverTimeValues.java
 public enum OverTimeValues{
    THREE_HOUR(18000),
    FIVE_HOUR(30000),
    WEEKEND_FOUR_HOUR(400000),
    WEEKEND_EIGHT_HOUR(60000);
    private final int amount;
    OverTimeValues(int amount){
    	this.amount=amount;
    }
    public int getAmount(){
    	return amount;
    }
}
  • 상수의 집합으로 이루어진 클래스
  • 어떻게 보면 타입이지만, 클래스의 일종이다.
  • enum클래스에 있는 상수들은 타입, 값을 지정할 필요 없이 상수들의 이름만 콤마로 구분하여 나열해 준다.
  • 가장 효과적으로 enum 클래스를 사용하는 방법은 switch문에서 사용하는 것이다.
  • enum 클래스 이름.상수 이름 을 지정함으로써 클래스의 객체 생성이 완료된다.
  • enum클래스는 생성자를 만들 수 있지만, 생성자를 통하여 객체를 생성할 수는 없다.
  • 값 지정이 가능하지만 동적으로 할당하는 것은 불가능하다.
  • 생성자를 사용할 수 있지만
    아무것도 명시하지 않는 package-private과 private만 접근 제어자로 사용할 수 있다.
  • 메소드를 선언할 수 있다
  • enum클래스의 값이 변경되면 프로그램 수정 후 재컴파일 해야하는 단점이 있다.
  • java.lang.Enum 클래스의 상속을 받는다. enum클래스를 선언할 때 사용하지 않아도 컴파일러가 알아서 추가해 컴파일한다. 따라서 별도의 클래스를 extends하면 안 된다.
  • Enum클래스의 생성자
    • protected Enum(String name, int ordinal)
      name : enum 상수의 이름
      ordinal : enum의 순서 상수가 선언된 순서대로 0부터 증가한다.


  • 인터페이스와 abstract클래스는 클래스의 골격을 잡아주고, 메소드를 선언해 놓을 때 매우 유용하다.

  • 인터페이스, abstract 클래스, 클래스의 차이점은 반드시 기억하자 !!

좋은 웹페이지 즐겨찾기