ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 자바 추상 클래스, 인터페이스
    언어/Java 2023. 7. 8. 22:34
    728x90
    반응형
    SMALL

    추상 클래스

    • 구현 코드 없이 메서드의 선언만 있는 추상 메서드를 포함한 클래스입니다.
    • 메서드의 선언은 반환타입, 메서드 이름, 매개변수로 구성되어 있습니다.
    • abstract 예약어를 사용합니다.
    • 추상 클래스의 경우 new를 통해 새로운 인스턴스를 만들 수 없습니다.

     

    추상 클래스 구현

    • 메서드에 구현 코드가 없을 경우 abstract로 선언합니다.
    • abstract 메서드를 가진 클래스의 경우 abstract로 선언합니다.
    • 추상 클래스의 추상 메서드는 하위 클래스에서 구현 코드를 작성합니다.
    • 추상 클래스 내의 추상 메서드는 하위 클래스에서 구현을 해야하는 메서드입니다.
    • 추상 클래스 내의 구현된 메서드는 하위 클래스에서도 공통으로 사용될 수 있는 메서드입니다. (필요에 따라 오버라이딩을 통해 재정의 가능)

     

    abstract class A {
        abstract void abstractMethod(int a);
        void method(int b,int c){
            System.out.println(Integer.toString(b+c));
        }
    }
    
    class B extends A {
        @Override
        void abstractMethod(int a){
            System.out.println(Integer.toString(a));
        }
    }
    
    abstract class C extends A {
        @Override
        void method(int b,int c){
            System.out.println(Integer.toString(b-c));
        }
    }
    
    class D extends C {
        @Override
        void abstractMethod(int a){
            System.out.println(Integer.toString(a*a));
        }
    }

    A클래스의 abstractMethod가 추상 메서드로 선언되어 구현 코드가 작성되지 않았습니다. 그러므로 A클래스를 상속 받을 경우 추상 메서드에 대한 구현을 해주어야 하고, A클래스 자체는 인스턴스화가 불가능합니다.

    B클래스의 경우 abstractMethod를 구현해주었으므로 abstract 키워드를 사용하지 않았습니다. B의 경우 모든 추상 메서드에 대한 구현을 해주었으므로 인스턴스화가 가능합니다.

    C클래스의 경우 추상 메서드인 abstractMethod를 구현해주지 않았습니다. 그러므로 class에 abstract 키워드를 선언해주었고 C클래스의 경우 인스턴스화가 불가능합니다.

    D클래스의 경우 C 클래스를 상속 받았고 추상 메서드인 abstractMethod에 대한 구현코드를 작성해주었으므로 abstract 키워드로 선언하지 않았습니다. D의 경우 모든 추상 메서드에 대한 구현을 해주었으므로 인스턴스화가 가능합니다.

     

     

     

    템플릿 메서드

    • 추상 메서드나 구현된 메서드를 활용하여 코드의 흐름을 정의하는 메서드입니다.
    • final로 선언하여 하위 클래스에서 재정의할 수 없습니다.
    • 프레임워크에서 많이 사용되는 설계 패턴입니다.
    • 추상 클래스로 선언된 상위 클래스에서 템플릿 메서드를 활용하여 전체적인 흐름을 정의해주고, 하위 클래스에서 다르게 구현해야하는 부분에 대해서 추상 메서드로 선언하여 하위 클래스에서 각기 다른 구현을 할 수 있도록 합니다.

     

    final 예약어

    • final 변수는 값이 변경될 수 없는 상수와 같습니다. (public static final double PI = 3.14)
    • final 메서드는 하위 클래스에서 재정의 할 수 없는 메서드입니다.
    • final 클래스는 상속할 수 없는 클래스입니다.

     

     

     

    인터페이스

    • 모든 메서드가 추상 메서드로 선언되어 있습니다. (abstract로 선언)
    • 모든 변수는 상수로 선언되어 있습니다. (final로 선언)
    • 자바 8부터 디폴트 메서드와 정적 메서드 기능의 제공으로 일부 구현코드가 존재 할 수 있습니다.
    • 클래스가 implements 키워드를 통해 인터페이스를 구현할 수 있습니다.
    • 실무에서는 클래스 상속과 인터페이스 구현을 같이 사용하는 경우가 많습니다.
    interface A {
    	void a();
    }
    
    class AA implements A{
    	@Override
        void a() {
        	System.out.println("AAA");
        }
    }

     

    인터페이스 구현 & 형 변환

    • 인터페이스를 구현한 클래스는 인터페이스 타입으로 선언한 변수로 형 변환할 수 있습니다.
    • 상속에서의 형 변환과 동일합니다.
    • 클래스 상속과 달리 구현 코드가 없으므로 한 클래스가 여러 인터페이스를 구현할 수 있습니다.
    • 형 변환이 된 경우 인터페이스에 선언된 메서드만 사용 가능합니다.

     

    인터페이스 용도

    • 클래스나 프로그램이 제공하는 기능을 명시적으로 선언해둘 수 있습니다. (여러 클래스가 해당 인터페이스를 구현하여 각기 다르게 구현하고 인터페이스로의 형 변환을 통해 쉽게 핸들링할 수 있도록 해줍니다.)
    • 일종의 클라이언트 코드와의 약속으로 클래스나 프로그램이 제공하는 명세와 같습니다. (명세에 맞게 구현하면, 클라이언트 프로그램은 인터페이스에 선언된 메서드 명세만 보고 이를 사용할 수 있습니다.)
    • 한 객체가 어떤 인터페이스 타입이라는 것은, 해당 인터페이스의 메서드를 모두 구현했다는 의미입니다.
    • 인터페이스를 구현한 다양한 객체를 활용하는 것 - 다형성

     

    인터페이스 요소

    • 모든 변수는 상수로 변환됩니다. (public static final)
    • 모든 선언된 메서드는 추상 메서드 입니다. (public abstract)
    • 자바 8 이후 디폴트 메서드와 정적 메서드가 제공됩니다. 자바 9 이후로는 private 메서드가 제공됩니다.
    • 디폴트 메서드는 구현 코드를 가지고 있는 메서드입니다. 인터페이스를 구현하는 클래스에서 공통적으로 사용할 수 있는 기본 메서드입니다. (구현하는 클래스에서 재정의 가능, 인스턴스가 생성되어야지만 사용가능합니다.).
    • 정적 메서드는 인스턴스 생성과 상관 없이 인터페이스 타입으로 사용할 수 있는 메서드입니다.
    • private 메서드는 인터페이스를 구현하는 클래스 내부에서 사용하거나 재정의할 수 없습니다. 인터페이스 내부(디폴트, 정적 메소드)에서만 사용 가능합니다.

     

    여러 인터페이스를 구현할 경우

    • 자바에서 클래스는 상속을 한 개만 받을 수 있지만, 여러 인터페이스를 구현할 수 있습니다.
    • 디폴트 메서드가 중복되는 경우, 구현하는 클래스는 재정의 해주어야 합니다.
    • 여러 인터페이스를 구현한 클래스의 경우 하나의 인터페이스로 형변환된다면 해당 인터페이스에서 선언된 메서드만 사용 가능합니다.
    • 인터페이스 사이에서도 상속을 할 수 있습니다. extends 키워드를 사용합니다. 다중 상속이 가능하고 구현 코드의 상속이 아니므로 타입 상속이라고 합니다.
    interface X {
        void x();
    }
    
    interface Y {
        void y();
    }
    
    interface Z extends X,Y {
        void z();
    }
    
    class A implements Z {
        @Override
        void x(){
            System.out.println("XXX");
        }
    
        @Override
        void y(){
            System.out.println("YYY");
        }
    
        @Override
        void z(){
            System.out.println("ZZZ");
        }
    }

    X와 Y 인터페이스가 선언되어 있고 Z가 X,Y 인터페이스를 상속하고 있습니다.

    A 클래스가 Z 인터페이스를 구현했습니다. Z가 상속 받은 x,y 메서드와 z를 모두 구현한 형태를 가지고 있습니다.

     

     

     

     

    오늘까지 추상 클래스와 인터페이스에 대한 학습을 마쳤습니다. 객체지향 프로그래밍에 필요한 여러 문법들을 확인할 수 있었고 한 번 더 복습을 통해 제대로된 개념을 이제는 까먹지 않도록 노력해야될 것 같습니다.

    이 후부터는 자바의 유용한 클래스와 자료구조에 대한 학습을 이어나가보도록 하겠습니다.

    반응형
    LIST

    댓글

Designed by Tistory.