새소식

Java

[JAVA] 추상

  • -

 

 

 

서론

이전 글에서 가볍게 정의한 추상에 대해 작성했다.

 

 

추상 클래스

추상 클래스는 부모가 상속은 하는데 막상 자식 클래스에서 재정의를 계속하다 보니 '이럴 거면 부모 클래스 쪽에 굳이 메서드를 작성할 필요가 있나..?' 해서 나오게 된 클래스이다.

 

키워드로는 abstract라는 키워드를 이용해 선언만 하고 구현부는 ;로 대체한다.

-> 상속 전용 메서드라는 뜻으로 자식은 해당 메서드를 무조건 재정의해야 한다.

 

특징으로는 구현부가 없는 메서드가 있는 만큼 객체를 생성할 수 없다(참조는 가능하다)

 

만약 상속 받은 abstract 메서드를 재정의를 안 했다면 자식 클래스도 abstract 클래스가 된다.

 

추상클래스의 목적은 구현을 강제하여 프로그램의 안정성이 향상되게끔 하는 것이다.

 

 

abstract class Vehicle { //얘가 추상 클래스다
    private int curX, curY;

    public void reportPosition() {
        System.out.printf("차종: %s: 현재 위치: (%d, %d)%n", this.getClass().getSimpleName(), curX, curY);
    }

    abstract void addFuel();
}



public class DieselSUV extends Vehicle{ //얘는 추상 클래스를 상속 받았기 때문에 오버라이딩은 필수!

    @Override
    public void addFuel() {
        System.out.printf("차종: %s: 연료 주입: %s%n", this.getClass().getSimpleName(), "경유");
    }
}

public class DieselSUV extends Vehicle{ //재정의 없어서 에러 발생
}

 

 

 

 

 

<<Interface>>

자바의 단일 상속 단점을 매꾸기 위해 나왔다. 이 친구는 다중 상속이 되면서 다른 클래스의 틀이 된다.

인터페이스의 맴버 변수는 모두 public static final이며 생략이 가능하다.

모든 메서드는 public abstract으로 되어있다.

다중 상속이 가능한 이유는 일종의 추상 클래스기 때문에 꼬일 일이 없기 때문이다.

인터페이스 역시 추상 클래스와 같이 자체적인 객체 생성이 안된다.

 

 

인터페이스는 is able to 느낌으로 생각하면 편하다. 이것도 가능하고.. 저것도 가능한.. 그런 거다..

어떤 기능을 인터페이스로 추상화하고, 그 기능을 사용할 수 있는 클래스에 인터페이스를 상속시키면 된다.

인터페이스를 제공하는 순간, 그 클래스는 인터페이스의 기능을 구현해야만 한다(구현이 강제된다)

상속 관계가 아닌 클래스들을 기능으로 묶을 수 있으며(다형성 확장), 인터페이스로 공통의 기능 구현을 효율적으로 분담할 수 있다.

 

Ex) 카메라와 휴대폰은 충전이 가능하다. => 카메라랑 휴대폰은 충전이라는 인터페이스로 묶을 수 있구나!

 

 

이었으나, 인터페이스도 Default method라는 게 나오기 시작하면서 구현부가 생겨버렸다...

 

 

Default method

- 얘는 인터페이스에 구현부를 만드는 메서드다.

- public이고, 재정의 하고 싶은 클래스만 재정의하면 되게끔 만들어준다.

- 동일 이름 메서드끼리 충돌하면 super class의 메서드를 따라간다.

- 인터페이스 간 충돌이 발생한다면 그냥 오버라이딩된다.

 

Static method: 구현체 클래스 없이 바로 인터페이스 이름으로 메서드 접근 가능하게 만들어준다.

Private method: 외부에 공개 안 되는 메서드로 지정하는 역할이다.

interface Aircon {
    void makeCool();
    default void dry() {
    	System.out.println("위이잉(건조중)");
    }
    
    static void howto() {
    	System.out.println("냉매가 있어서 시원");
    }
}

class OldisButGoodies1 implements Aircon {
    @Override
    public void makeCool() {
        System.out.println("전체 냉각해줘");
    }
}

class OldisButGoodies2 implements Aircon {
    @Override
    public void makeCool() {
        System.out.println("집중 냉각해줘");
    }
    
    @Override
    public void dry() {
    	System.out.println("두번쨰 에어컨 건조중");
    }
}

public class StaticDefaultMethod {
    public static void main(String[] args) {
    	Aircon.howto();
        Aircon[] aircons = { new OldisButGoodies1(), new OldisButGoodies2() };
        for (Aircon aircon : aircons) {
            aircon.makeCool();
            aircon.dry();
        }
    }
}

 

 

'Java' 카테고리의 다른 글

[JAVA] Comparable? Comparator?  (3) 2024.07.23
[JAVA] Generic  (3) 2024.07.22
[JAVA] 다형성  (2) 2024.07.18
[JAVA] 코드 외 작성할 것들  (0) 2024.07.17
[JAVA] 상속  (0) 2024.07.17
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.