Java
[Java] abstract(추상) && Interface
꽃달린감나무
2022. 2. 3. 14:25
728x90
- abstract class
- 완전하지 않은 클래스를 의미
- 인스턴스 생성이 불가능한 클래스
- 왜 필요할까?
- 코드를 작성하다 보면 상속의 관계를 형성하기 위해서만 존재하는 상위 클래스가 존재
- 인스턴스화 시키기 위해서 정의한 클래스가 아닌 클래스 존재
- 위 클래스를 개발자가 실수로 인스턴화 시켰다면, 코드 상에 오류 발생 가능성 증가
- abstract 클래스를 사용함으로써 코드의 안정성 상승
- 사용법
- abstract class BookStorage{ public abstract void addBookInfo(String name, int booknum); //몸체는 정의 x public abstract void searchBook(int booknum);// 매개변수 정의 가능 }
- 주의점 :
- 한 개이상의 메소드를 abstract로 정의되어 있다면, 클래스 또한 반드시 abstarct로 선언되어야 합니다.
- abstract 클래스를 상속받았다면 반드시, abstract method를 오버라이딩 해야합니다. 만약 오버라이딩 하지 않았다면 상속받은 클래스를 abstract 클래스로 선언해야하는데, 이 경우 상속받은 의미가 없다고 생각되어집니다.(필자의 개인적인 의견입니다.)
- full abstract == Interface(클래스와 클래스멤버가 다 abstract로 선언되었다면? 인터페이스로 대체 정의)
-
abstract class BookStorage{ public abstract void addBookInfo(String name, int booknum); public abstract void searchBook(int booknum); } interface BookStorage{ void addBookInfo(String name, int booknum); void searchBook(int booknum); } - abstract 클래스인 BookStorage 와 인터페이스인 BookStroage는 완전히 동일합니다. 그 이유는
- 인터페이스 내에 존재하는 변수는 무조건 public static final 선언
- 인터페이스 내에 존재하는 메소드는 무조건 public abstract로 선언
- 따라서 인터페이스 BookStroage의 addBookInfo 메소드 같은 경우도 사실은 public abstract void addBookInfo로 선언되어 있습니다.
- 인터페이스도 abstract 클래스와 같이 참조변수의 선언도 가능하고, 메소드의 오버라이딩 동일하게 적용됩니다.
-
- 그럼 인터페이스는 무엇일까?
- 회사 내에서 각 팀별로 프로젝트를 진행하게 되었을 때, A팀과 B팀이 각 코드를 작성하여 서로 결합해야하는 상황이라면, 서로의 클래스 정의, 클래스의 기능 등 많은 것들을 서로 분석해야할 것 입니다. 이런 상황은 되게 버거로울 뿐만 아니라, 많은 시간을 소비해야하 합니다. 이 때 필요한 것이 바로 인터페이스(각 팀을 이어주는 교량!) 입니다. 한 팀의 팀장이 "우리가 제공한 인터페이스를 구현하여 프로젝트를 완성해주세요!" 라는 부탁은 곧, 이 인터페이스의 참조변수 하나를 통해서 필요한 모든 기능의 활용할 수 있어야 한다고 하는 것을 의미합니다.
-
public static void main(String[] args) { // 참조변수 하나로 모든 기능을 활용할 수 있게되었습니다 BookStorage books = new (다른 팀의 클래스 명); books.addBookInfo( "정의란 무엇인가?", 1); books.addBookInfo( "고양이전사들", 2); books.searchBook(1); books.searchBook(2); } - 즉, 다른 팀의 코드르 분석하지 않아도, 클래스 명을 적는 것으로 해당 클래스의 기능을 모두 사용할 수 있게됩니다!!
728x90