JAVA - abstract class&inteface&generic

석재호·2022년 2월 2일
0

JAVA

목록 보기
10/12
post-thumbnail
  • 추상 클래스 (abstract class)

    • 상속 관계를 정의할 때 자손 클래스에서 반드시 재정의해서 사용하도록 만든 클래스
    • 반드시 재정의 되서 사용되 때문에 메서드 구현은 무의미
      • 메서드의 선언부만 남기고 구현부는 ; 으로 대체
      • 구현부가 없다는 의미로 abstract 키워드를 메서드 선언부에 추가
      • 객체를 생성할 수 없는 클래스라는 의미로 클래스 선언부에 abstract 추가
    • 추상 클래스의 특징

      • 클래스에 구현부가 없는 메서드가 있으므로 객체를 생성할 수 없음
      • 하지만 상위 클래스 타입으로써 자식을 참조할 수 는 있음
    • 사용 이유

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

    • 최고 수준의 추상화 단계 : 모든 메서드가 abstract 형태
    • 형태
      • 클래스와 유사하게 interface 선언
      • 멤버 구성
        • 모든 멤버 변수는 public static final 이며 생략 가능
        • 모든 메서드는 public abstract 이며 생략 가능
    • 상속
      • 클래스와 마찬가지로 extends를 이용해 상속 가능
      • 클래스와 다른점은 다중 상속이 가능
    • 인터페이스 구현과 객체 참조
      • 클래스에서 implements 키워드를 사용해서 interface 구현
      • implements 한 클래스는 모든 abstract를 override해서 구현하거나 구현하지 않을 경우 abstract 키워드 표시
      • 여러개의 interface implements 가능
      • 다형성은 조상 클래스 뿐 아니라 조상 인터페이스에도 적용
    • 인터페이스의 필요성
      • 구현의 강제로 표준화 처리 -> abstract 메서드 사용
      • 인터페이스를 통한 간접적인 클래스 사용으로 손쉬운 모듈 교체 지원
      • 서로 상속의 관계가 없는 클래스들에게 인터페이스를 통한 관계 부여로 다형성 확장
      • 모듈 간 독립적 프로그래밍 가능 -> 개발 기간 단축
    • default method
      • 인터페이스에 선언 된 구현부가 있는 일반 메서드
        • 메서드 선언부에 default modifier 추가 후 메서드 구현부 작성 -> 접근 제한자는 public 으로 한정됨
      • 필요성
        • 기존에 interface 기반으로 동작하는 라이브러리의 interface에 추가해야 하는 기능이 발생
        • 기존 방식으로라면 모든 구현체들이 추가되는 메서드를 override 해야 함
        • default 메서드는 abstract가 아니므로 반드시 구현 해야 할 필요는 없어짐
      • 충돌
        • 생긴 후로 동일한 이름을 갖는 구현부가 있는 메서드가 충돌
        • method 우선 순위
          • super class의 method 우선 : super class가 구체적인 메서드를 갖는 경우 default method는 무시
          • interface간의 충돌 : 하나의 interface에서 default method를 제공하고 다른 interface에서도 같은 이름의 메서드가 있을 때 sub class 는 반드시 override해서 충돌 해결
      • interface에 선언된 static method
        • 일반 static 메서드와 마찬가지로 별도의 객체가 필요 없음
        • 구현체 클래스 없이 바로 인터페이스 이름으로 메서드에 접근해서 사용 가능
  • Generic

    • 다양한 타입의 객체를 다루는 메서드, 컬렉션 클래스에서 컴파일 시에 파일 체크

    • 표현

      • 클래스 또는 인터페이스 선언 시 <>에 타입 파라미터 표시
        ex) Class_Name -> Raw Type , Class_Name<T> -> Generic Type
      • 타입 파라미터
        • 특별한 의미의 알파벳 보다는 단순히 임의의 참조형 타입을 말함
      • 객체 생성
        • 변수 쪽과 생성 쪽의 타입은 반드시 같아야 함
    • type parameter의 제한

      • 필요에 따라 구체적인 타입 제한 필요
        ex) 계산기의 경우 Number 이하의 타입으로만 제한
      	class cal<T extends Number>{
        	//구현
        }
      • 인터페이스로 제한할 경우도 extends 사용
      • 클래스와 함께 인터페이스 제약 조건을 이용할 경우 & 로 연결
      • Generic Type 객체를 할당 받을 때 와일드 카드(?) 이용
      표현설명
      Generic type<?>타입에 제한이 없음
      Generic type<? extends T>T또는 T를 상속받은 타입들만 사용 가능
      Generic type<? super T>T또는 T의 조상 타입만 사용 가능
      • 파라미터와 리턴타입으로 type parameter를 갖는 메서드
        • 메서드 리턴 타입 앞에 타입 파라미터 변수 선언
      	public class Test<T>{
        	T some;
            public Test(T some){
            	this.some = some;
            }
            public <P> void method1(P p){
            
            }
            public <P> P method2 (P p){
            
            }
            
            public static void main(String[] args){
            	Test<String> tmp = new Test<>("test");
                tmp.method1(10);
                tmp.<Long>method2(20L);
            }
        }
profile
개발자 준비 중

0개의 댓글