HiDevelop

[Java] abstract(추상) && Interface 본문

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

'Java' 카테고리의 다른 글

[Java] Inner && Outer Class  (0) 2022.02.06
[Java]Interface의 특성  (0) 2022.02.04
[Java] Object class와 final  (0) 2022.01.29
[Java] 상속의 이점  (0) 2022.01.24
InstanceOf  (0) 2022.01.17