Abstract Class & Interface & Generic

bosun0214·2일 전
0

목차는 다음과 같다.
1. abstract class
2. interface
3. generic

1. Abstract Class

추상 클래스의 특징

  • abstract 클래스는 상속 전용의 클래스
    • 클래스에 구현부가 없는 메서드가 있으므로 객체를 생성할 수 없음.

    • 하지만 상위 클래스 타입으로써 자식을 참조할 수는 있다.

      // Vehicle v = new Vehicle(); // abstract 클래스는 객체 생성 X
      Vehicle v = new DiselSUV(); // 자식을 참조하는 것은 문제 X
  • 조상 클래스에서 상속받은 abstract 메서드를 재정의 하지 않은 경우
    • 클래스 내부에 abstract 메서드가 있는 상황이므로 자식 클래스는 abstract 클래스로 선언되어야 함.

추상 클래스를 사용하는 이유

  • abstract 클래스는 구현의 강제를 통해 프로그램의 안정성 향상 → 실수를 방지
  • interface에 있는 메서드 중 구현할 수 있는 메서드를 구현 해 개발의 편의 지원

2. 인터페이스

인터페이스 작성

  • 일반 메서드는 모두 abstract 형태

형태

  • 클래스와 유사
  • 멤버 구성
    • 모든 멤버변수는 public static final , 생략가능

    • 모든 메서드는 public abstract , 생략 가능

      public interface Fly {
      	void howToFly();	//어떻게 나는지
      	void howFastFly();	// 얼마나 빨리 나는지 	
      }

인터페이스 상속

  • 인터페이스도 extends를 이용해 상속이 가능
  • 클래스와 다른 점은 인터페이스는 다중 상속이 가능!
    public class Airplane extends Transportation implements Fly{
    	@Override
    	public void howToFly() {
    		System.out.println("By Engine!");
    		
    	}
    
    	@Override
    	public void howFastFly() {
    		System.out.println("500km/h");
    		
    	}
    }

인터페이스 구현과 객체 참조

  • 클래스에서 implements 키워드를 사용해서 interface 구현
  • implements 한 클래스는
    • 모든 abstract 메서드를 override해서 구현하거나
    • 구현하지 않을 경우 abstract 클래스로 표시해야함
  • 여러 개의 interface implements 가능
  • 다형성은 조상 클래스 뿐 아니라 조상 인터페이스에도 적용

인터페이스 필요성

  • 구현의 강제로 표준화 처리 → 손쉬운 모듈 교체 지원 abstract 메서드 사용
  • 인터페이스를 통한 간접적인 클래스 사용으로 손쉬운 모듈 교체 지원
  • 서로 상속관계가 없는 클래스들에게 인터페이스를 통한 관계 부여로 다형성 확장
  • 모듈 간 독립적 프로그래밍 가능 → 개발 기간 단축

default method

인터페이스에 선언 된 구현부가 있는 일반 메서드

  • 메서드 선언부에 default modifier 추가 후 메서드 구현부 작성
    • 접근 제한자는 public으로 한정됨 (생략가능)
      interface DefautMethodInterface{
      	void abstractMethod();
      	default void defaultMethod(){
      			sysout(" 기본 메서드");
      	}
      }

필요성

  • 기존에 interface 기반으로 동작하는 라이브러리의 interface에 추가해야 하는 기능이 발생
  • 기존 방식으로라면 모든 구현체들이 추가되는 메서드를 override 해야 함
  • default 메서드는 abstract가 아니므로 반드시 구현 해야 할 필요는 없어짐.

default method의 충돌

  • method 우선 순위
    • super class의 method 우선! : super class가 구체적인 메서드를 갖는 경우 default method는 무시됨.
    • interface간의 충돌 : 하나의 interface에서 default method를 제공하고 다른 interface에서도 같은 이름의 메서드(default 유무와 무관)가 있을 때 sub class는 반드시 override 해서 충돌 해결!

static method

  • interface에 선언된 static method
    • 일반 static 메서드와 마찬가지로 별도의 객체가 필요없음
    • 구현체 클래스 없이 바로 인터페이스 이름으로 메서드에 접근해서 사용 가능

3. 제네릭(Generic)

클래스와 인터페이스, 메소드를 정의할 때 type을 파라미터로 사용할 수 있도록 함

  • 타입 파라미터는 코드 작성 시 구체적인 타입으로 대체 → 다양한 코드 생성

장점

  1. 컴파일 시 강한 타입 체크 가능
    • 실행 시 타입 에러 < 컴파일 시 미리 타입을 강하게 check (에러 사전 방지)
  2. 타입 변환(casting) 제거
    • 비제네릭 코드
      List list = new ArrayList();
      list.add("hello");
      String str = (String) list.get(0); // type 변환 필요
    • 제네릭 코드로 수정
      List<String> list = new ArrayList<String>();
      list.add("hello");
      String str = list.get(0); //type 변환하지 않음

제네릭 타입( class, interface )

예시

public class Box<T>{
	private T t;
	public T get() {return t;}
	public void set(T t) { this.x = t;}
}
  • 이용방법
    public class BoxTest{
    	public static void main(String[] args){
    			Box<String> box1 = new Box<String>();
    			box1.set("Hello");
    			String str = box1.get();
    
    			Box<Integer> box2 = new Box<Integer>();
    			box2.set(6);
    			String str = box2.get();
    	}
    }

0개의 댓글