반응형

추상클래스와 인터페이스의 차이점

  1. 추상 클래스는 접근제어자가 public, protected, private 인 메소드를 가질 수 있습니다.
    반면에 인터페이스는 public 메소드만 가질 수 있습니다.
  2. 추상 클래스에는 멤버변수 선언이 가능하지만 인터페이스는 public static 변수만 선언이 가능합니다.
  3. 추상클래스는 구현 클래스에서 extends 예약어를 사용합니다.
    인터페이스는 구현 클래스에서 implements 예약어를 사용합니다.

 

 

 

이상입니다.

오늘도 좋은 하루 보내세요.

감사합니다.

반응형

'JAVA > 호기심천국' 카테고리의 다른 글

#1 @Override 를 쓰는 이유  (0) 2022.08.23
반응형

우선 결론부터 말씀 드리겠습니다.

@Override 어노테이션은 쓰지 않아도 프로그램 동작에는 문제가 없지만,

안정적인 프로그램을 구현하기 위해서는 작성하는 것이 정석입니다.

 


백문이 불여일견,

한 번 코드로 확인해보겠습니다.

이 코드는 정상적으로 컴파일도 되고 실행도 잘 됩니다.

아래의 코드들의 동작 결과를 예상해보시고, 개발자의 실수를 찾아보세요.

public class ParentAdder {
    public int add(int a, int b) {
        return a + b;
    }
}

public class ChildAdder extends ParentAdder {
    public double add(double a, double b) {
        System.out.println("ChildAdder.add");
        return a + b;
    }
}

public class OverrideMistake {
    public static void main(String[] args) {
        ParentAdder parentAdder = new ChildAdder();
        System.out.println(parentAdder.add(3, 4));
    }
}

이 코드 작성자의 기대값은 이렇습니다.

ChildAdder.add
7

 

하지만 실제 결과값은 다음과 같습니다.

7

 

실수를 찾으셨나요?

개발자의 실수는 아래의 코드입니다.

public double add(double a, double b) {}

 

개발자의 의도는 상위 클래스의 add 메소드를 Override 하는 것이었습니다.

하지만 매개변수형과 반환형이 달랐기 때문에 Override 되지 않았고, 그 결과값이 달라지게 된 것입니다.

이런 유형의 실수는 매우 흔합니다.

그럼에도 불구하고 발견이 쉽지 않기 때문에 치명적인 실수가 될 수 있습니다.

개발자의 실수들은 컴파일 과정에서 확인되는 것이 가장 좋습니다.

그러나 위의 경우에는 정상적으로 컴파일도 되고 실행도 됩니다.

 

이러한 상황을 방지하기 위해서 @Override 어노테이션을 사용하는 것입니다.

쉽게 말해 자바 컴파일러에게 '나는 상위 클래스의 메소드를 오버라이딩(Overriding) 할거야!'

라는 메모를 남기는 것이라고 생각하면 됩니다.

 

 

이제 개발자의 실수가 들어간 코드에 @Override 어노테이션을 적용해보겠습니다.

public class ChildAdder extends ParentAdder {

    @Override
    public double add(double a, double b) {
        System.out.println("ChildAdder.add");
        return a + b;
    }
}

 

결과는 아래와 같습니다.

컴파일 과정에서 오류가 발생하여 프로그램이 실행되지 않고, 컴파일러가 친절하게 오류 원인을 제공합니다.

 

컴파일러 덕분에 실수를 인지할 수 있었고, 코드를 다음과 같이 수정할 수 있었습니다.

public class ChildAdder extends ParentAdder {
    public int add(int a, int b) {
        System.out.println("ChildAdder.add");
        return a + b;
    }
}

 

코드의 결과값은 다음과 같습니다.

드디어 개발자가 원하는 결과를 제공할 수 있게 되었습니다.

ChildAdder.add
7

 

코드를 잘 보시면 @Override 어노테이션이 없다는 것을 알 수 있습니다.

맞습니다. 해당 어노테이션이 존재하지 않아도 정상적으로 Override 를 할 수 있습니다.

하지만, 우리는 조금 더 안정적인 코드 작성 습관을 들여야할 필요가 있습니다.

따라서 다음과 같이 메소드를 수정합니다.

package inheritance;

public class ChildAdder extends ParentAdder {
    @Override
    public int add(int a, int b) {
        System.out.println("ChildAdder.add");
        return a + b;
    }
}

 

 

이상입니다.

오늘도 좋은 하루 보내세요.

감사합니다.

반응형

'JAVA > 호기심천국' 카테고리의 다른 글

#2 추상클래스 vs 인터페이스  (0) 2022.08.25

+ Recent posts