본문 바로가기
JAVA

[JAVA] Chapter 12. Abstract & Interface (1)

by varcode 2023. 7. 16.

① Abstract class
추상 메서드를 하나 이상 포함하고 있는 클래스를 추상 클래스라고 하며, abstract 키워드를 사용하여 선언한다. 추상 메서드는 method를 이루는 4가지 요소 name, return type, parameter, body body가 빠진, 즉 선언만 있고 구현이 없는 메서드를 의미하며 <접근 제어 지시자> abstract <return_type> <name> <parameter> 형태로 선언한다.
추상 클래스는 불완전한 메서드를 포함하고 있기 때문에 인스턴스를 생성하지 못한다. 하지만 인스턴스 생성을 제외하면 클래스가 할 수 있는 모든 일을 할 수 있기 때문에 상속도 가능하고 reference type으로 사용할 수도 있다.
추상 클래스를 상속받을 경우, 추상 메서드도 함께 상속받게 된다. 그렇다면 Sub Class 역시 추상 클래스가 되므로 인스턴스 생성이 불가하다. 따라서 추상 클래스를 상속받은 Sub Class에서는 반드시 추상 클래스가 가지고 있는 모든 추상 메서드를 오버라이딩해야 한다.

 

그렇다면 굳이 추상 클래스를 사용하는 이유는 무엇일까? 추상 클래스는 협업에서 굉장히 유용하게 사용된다. 만일 A 개발자가 개발을 하다가 특정한 기능이 필요하여 B 개발자에게 메서드 구현을 맡긴다고 가정하자. 이때 A가 필요한 기능을 추상 클래스로 만들어서 주면, B는 해당 클래스를 상속받은 후 body만 채워주면 된다.

abstract class Afunction {
    public abstract void searchId(String name, int studentId);
    public abstract void serviceReq(int memberId, int request);
}

위와 같은 추상 클래스만 만들어주면 클래스 이름, 메서드 이름, 파라미터 등등 모두 A가 정한 것이기 때문에 아래와 같이 B가 구현할 기능이 속한 클래스의 이름만 비워두고 reference_variable.method()로 세부 내용과 관계없이 기능을 사용할 수 있다.

Afunction af = new <className>()
af.searchId("hanus", 1004);
af.serviceReq(925, 5)

 

 

② Interface
추상화 클래스를 사용하면 AA대로, BB대로 동시에 개발을 진행할 수 있지만, 현업에서는 추상화 클래스가 하는 모든 일을 interface로 대체한다.

abstract class Afunction {
    public abstract void searchId(String name, int studentId);
    public abstract void serviceReq(int memberId, int request);
}
interface Afunction {
    void searchId(String name, int phoneNum);
    void serviceReq(int memberId, int request);
}

abstract class 대신 interface keyword를 사용하고 내부 메서드의 public abstract을 지운다. Interfaceclass가 아니기 때문에, classinterface를 상속받으면 extends가 아니라 implements를 사용한다. (interfaceinterface를 상속받으면 extends를 사용한다.)

 

interface Sky {
    void skyMethod();
}

class Earth implements Sky {
    public void skyMethod() {...}
}

위의 코드에서 생각해 볼 점이 두 가지가 있다. 첫 번째로, interface의 메서드는 void인데 implements 받은 class의 메서드는 public void이다. Method Overriding이 맞을까? Method Overring의 정의를 다시 생각해 보면, Super class에서 선언된 메서드 이름, 리턴 타입, 파라미터 선언까지 완전히 동일한 메서드를 Sub class에서 새롭게 재정의하는 것이다. 즉 접근제어 지시자가 동일해야 하는 것은 아니기 때문에 Method Overriding이 맞다. 그렇다면, 접근제어 지시자는 아무렇게나 적어도 될까? 접근제어는 오버라이딩을 걸면 접근 범위가 같거나 넓어지는 방향으로 가야 한다. public은 가장 넓은 범위이기 때문에 가능한 것이다.

그런데, Earth ClassskyMethod에서 public을 지우면 compile error가 뜬다. 접근제어 지시자가 붙어있지 않으면 default인데 왜 에러가 발생할까? 그 이유는 바로 interface 내부에 선언된 메서드는 생략되면 public이기 때문이다. , interface의 메서드를 오버라이딩한 메서드는 무조건 public으로 선언해야 한다.

 

'JAVA' 카테고리의 다른 글

[JAVA] Chapter 13. Exception Handling  (0) 2023.07.18
[JAVA] Chapter 12. Abstract & Interface (2)  (0) 2023.07.17
[JAVA] Chapter 11. Inheritance (3)  (0) 2023.07.15
[JAVA] Chapter 11. Inheritance (2)  (0) 2023.07.14
[JAVA] Chapter 11. Inheritance (1)  (0) 2023.07.13

댓글