JavaRush /Java Blog /Random-KO /추상 클래스와 인터페이스의 차이점

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

Random-KO 그룹에 게시되었습니다
안녕하세요! 이번 강의에서는 추상 클래스가 인터페이스와 어떻게 다른지에 대해 이야기하고 일반적인 추상 클래스의 예를 살펴보겠습니다. 추상 클래스와 인터페이스의 차이점 - 1주제가 매우 중요하기 때문에 추상 클래스와 인터페이스의 차이점에 대해 별도의 강의를 했습니다. 향후 인터뷰의 90%에서 이러한 개념의 차이점에 대한 질문을 받게 됩니다. 그러므로 읽은 내용을 반드시 이해하고, 완전히 이해되지 않는 부분이 있으면 추가 자료를 읽어보세요. 그래서 우리는 추상 클래스가 무엇인지, 인터페이스가 무엇인지 알고 있습니다. 이제 차이점을 살펴보겠습니다.
  1. 인터페이스는 동작만 설명합니다. 그는 재산이 없습니다. 그러나 추상 클래스에는 상태가 있습니다. 즉, 두 가지를 모두 설명합니다.

    Bird추상 클래스 와 인터페이스를 예로 들어보겠습니다 Flyable.

    
    public abstract class Bird {
       private String species;
       private int age;
    
       public abstract void fly();
    
       public String getSpecies() {
           return species;
       }
    
       public void setSpecies(String species) {
           this.species = species;
       }
    
       public int getAge() {
           return age;
       }
    
       public void setAge(int age) {
           this.age = age;
       }
    }

    새 클래스 Mockingjay(mockingjay)를 만들고 다음에서 상속해 보겠습니다 Bird.

    
    public class Mockingjay extends Bird {
      
       @Override
       public void fly() {
           System.out.println("Fly, birdie!");
       }
    
       public static void main(String[] args) {
    
           Mockingjay someBird = new Mockingjay();
           someBird.setAge(19);
           System.out.println(someBird.getAge());
       }
    }

    보시다시피 추상 클래스의 상태, 즉 변수 species(유형)와 age(나이)에 쉽게 액세스할 수 있습니다.

    하지만 인터페이스로 동일한 작업을 수행하려고 하면 그림이 달라집니다. 변수를 추가해 볼 수 있습니다:

    
    public interface Flyable {
    
       String species = new String();
       int age = 10;
    
       public void fly();
    }
    
    public interface Flyable {
    
       private String species = new String(); // error
       private int age = 10; // also an error
    
       public void fly();
    }

    인터페이스 내부에는 개인 변수를 생성할 수도 없습니다 . 왜? 사용자에게 구현을 숨기기 위해 private 수정자가 생성되었기 때문 입니다. 그러나 인터페이스 내부에는 구현이 없습니다. 거기에는 숨길 것이 없습니다.

    인터페이스는 동작만 설명합니다. 따라서 인터페이스 내부에 getter 및 setter를 구현할 수 없습니다. 이것이 인터페이스의 본질입니다. 상태가 아닌 동작을 처리하기 위한 것입니다.

    Java8에는 구현이 있는 기본 인터페이스 메소드가 도입되었습니다. 당신은 이미 그것에 대해 알고 있으므로 반복하지 않겠습니다.

  2. 추상 클래스는 매우 긴밀한 관계를 맺고 있는 클래스들을 연결하고 결합합니다. 동시에 공통점이 전혀 없는 클래스에서도 동일한 인터페이스를 구현할 수 있습니다.

    새의 예로 돌아가 보겠습니다.

    Bird이를 기반으로 새를 만들려면 추상 클래스가 필요합니다. 새들만 있고 다른 사람은 없습니다! 물론 그들은 다를 것입니다.

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

    인터페이스를 사용하면 Flyable모든 것이 다릅니다. "비행"이라는 이름에 해당하는 동작만 설명합니다. "비행", "비행 가능"의 정의에는 서로 관련되지 않은 많은 개체가 포함됩니다.

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

    이 4개 엔터티는 어떤 식으로든 서로 관련이 없습니다. 내가 말할 수 있는 것은 그들 모두가 심지어 살아 있는 것도 아니라는 것입니다. 그러나 그들은 모두 Flyable날 수 있습니다.

    추상 클래스를 사용하여 이를 설명할 수는 없습니다. 공통 상태나 동일한 필드가 없습니다. 항공기를 특성화하려면 "모델", "제조 연도" 및 "최대 승객 수" 필드가 필요할 것입니다. Carlson에게는 오늘 먹은 모든 과자를 위한 필드와 Kid와 함께 플레이할 게임 목록이 있습니다. 모기의 경우...어-어...우리도 모르겠어요... 아마도 "성가심 수준"일까요? :)

    가장 중요한 점은 추상 클래스를 사용하여 이를 설명할 수 없다는 것입니다. 그들은 너무 다릅니다. 하지만 공통적인 행동이 있습니다. 바로 날 수 있다는 것입니다. 이 인터페이스는 날고, 수영하고, 점프하거나 기타 동작을 할 수 있는 세상의 모든 것을 설명하는 데 이상적입니다.

  3. 클래스는 원하는 만큼 많은 인터페이스를 구현할 수 있지만 하나의 클래스에서만 상속할 수 있습니다.

    우리는 이미 이것에 대해 두 번 이상 이야기했습니다. Java에는 다중 상속이 없지만 다중 구현이 있습니다. 이 점은 이전 점에서 부분적으로 이어집니다. 인터페이스는 공통점이 없는 다양한 클래스를 연결하고, 서로 매우 가까운 클래스 그룹에 대해 추상 클래스가 생성됩니다. 따라서 그러한 클래스 중 하나만 상속할 수 있다는 것이 논리적입니다. 추상 클래스는 "is a" 관계를 설명합니다.

표준 입력스트림 및 출력스트림 인터페이스

우리는 이미 스트리밍 입력 및 출력을 담당하는 다양한 클래스를 살펴보았습니다. InputStream및 을 살펴보겠습니다 OutputStream. 일반적으로 이는 인터페이스가 아니라 실제 추상 클래스입니다. 이제 그것이 무엇인지 알았으므로 작업하는 것이 훨씬 쉬울 것입니다. :) - 이것은 바이트 입력을 담당하는 추상 클래스입니다. Java에는 . 각각은 서로 다른 소스로부터 데이터를 수신하도록 구성됩니다. 상위 항목 이므로 데이터 스트림을 편리하게 작업할 수 있는 여러 가지 방법을 제공합니다. 각 어린이에게는 다음과 같은 방법이 있습니다 . InputStreamInputStreamInputStreamInputStream
  • int available()읽기에 사용할 수 있는 바이트 수를 반환합니다.
  • close()입력 소스를 닫습니다.
  • int read()스트림에서 사용 가능한 다음 바이트의 정수 표현을 반환합니다. 스트림의 끝에 도달하면 숫자 -1이 반환됩니다.
  • int read(byte[] buffer)바이트를 버퍼로 읽으려고 시도하여 읽은 바이트 수를 반환합니다. 파일 끝에 도달하면 -1을 반환합니다.
  • int read(byte[] buffer, int byteOffset, int byteCount)바이트 블록의 일부를 읽습니다. 데이터 블록이 완전히 채워지지 않았을 가능성이 있을 때 사용됩니다. 파일 끝에 도달하면 -1을 반환합니다.
  • long skip(long byteCount)입력 바이트인 건너뛰기 byteCount, 무시된 바이트 수를 반환합니다.
전체 방법 목록을 연구하는 것이 좋습니다 . 실제로 12개 이상의 후속 클래스가 있습니다. 다음은 몇 가지 예입니다.
  1. FileInputStream: 가장 일반적인 유형입니다 InputStream. 파일에서 정보를 읽는 데 사용됩니다.
  2. StringBufferInputStream: 또 다른 유용한 유형 InputStream입니다. 문자열을 입력 데이터 스트림으로 변환합니다 InputStream.
  3. BufferedInputStream: 버퍼링된 입력 스트림. 효율성을 향상시키기 위해 가장 자주 사용됩니다.
BufferedReader우리가 지나가면서 그것을 사용할 필요가 없다고 말했던 것을 기억하십니까 ? 우리가 쓸 때 :

BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))
... BufferedReader사용할 필요가 없습니다. InputStreamReader작업이 완료됩니다. 그러나 BufferedReader이 작업을 더 효율적으로 수행하고 개별 문자가 아닌 전체 줄의 데이터를 읽을 수 있습니다. 모든 것이 BufferedInputStream동일합니다! 클래스는 입력 장치에 지속적으로 액세스하지 않고 특수 버퍼에 입력 데이터를 축적합니다. 예를 살펴보겠습니다:

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.InputStream;

public class BufferedInputExample {

   public static void main(String[] args) throws Exception {
       InputStream inputStream = null;
       BufferedInputStream buffer = null;

       try {
          
           inputStream = new FileInputStream("D:/Users/UserName/someFile.txt");
          
           buffer = new BufferedInputStream(inputStream);
          
           while(buffer.available()>0) {
              
               char c = (char)buffer.read();
              
               System.out.println("Character was read" + c);
           }
       } catch(Exception e) {
          
           e.printStackTrace();
          
       } finally {
          
           inputStream.close();
           buffer.close();
       }
   }
}
이 예에서는 컴퓨터의 "D:/Users/UserName/someFile.txt" 주소에 있는 파일에서 데이터를 읽습니다 . 우리는 2개의 객체를 생성 FileInputStream하고 BufferedInputStream그 "래퍼"로 사용합니다. 그런 다음 파일에서 바이트를 읽고 이를 문자로 변환합니다. 파일이 끝날 때까지 계속됩니다. 보시다시피 여기에는 복잡한 것이 없습니다. 이 코드를 복사하여 컴퓨터에 저장된 실제 파일에서 실행할 수 있습니다. 클래스는 바이트 스트림 출력을 정의하는 추상 클래스입니다. 이미 이해했듯이 이것은 'a'의 대척점입니다. 데이터를 읽을 위치가 아니라 보낼 위치 에 대한 책임이 있습니다 . 와 마찬가지로 이 추상 클래스는 편리한 작업을 위해 모든 하위 항목에 메서드 그룹을 제공합니다. OutputStreamInputStreamInputStream
  • int close()출력 스트림을 닫습니다.
  • void flush()모든 출력 버퍼를 지웁니다.
  • abstract void write (int oneByte)출력 스트림에 1바이트를 씁니다.
  • void write (byte[] buffer)출력 스트림에 바이트 배열을 씁니다.
  • void write (byte[] buffer, int offset, int count)위치 오프셋에서 시작하여 배열의 count 바이트 범위를 씁니다.
클래스의 자손 중 일부는 다음과 같습니다 OutputStream.
  1. DataOutputStream. 표준 Java 데이터 유형을 작성하기 위한 메소드를 포함하는 출력 스트림입니다.

    기본 Java 유형 및 문자열을 작성하기 위한 매우 간단한 클래스입니다. 설명이 없어도 작성된 코드를 확실히 이해할 수 있을 것입니다.

    
    import java.io.*;
    
    public class DataOutputStreamExample {
    
       public static void main(String[] args) throws IOException {
    
           DataOutputStream dos = new DataOutputStream(new FileOutputStream("testFile.txt"));
    
           dos.writeUTF("SomeString");
           dos.writeInt(22);
           dos.writeDouble(1.21323);
           dos.writeBoolean(true);
          
       }
    }

    writeDouble(), writeLong()등 각 유형에 대해 별도의 메서드가 있습니다 writeShort().

  2. 수업 . 디스크의 파일로 데이터를 보내는 메커니즘을 구현합니다. 그건 그렇고, 우리는 이전 예에서 이미 그것을 사용했습니다. 눈치채셨나요? 우리는 이를 "래퍼" 역할을 하는 DataOutputStream 내부에 전달했습니다.FileOutputStream

  3. BufferedOutputStream. 버퍼링된 출력 스트림. BufferedInputStream복잡한 것도 없으며 본질은 (또는 'a) 와 동일합니다 BufferedReader. 일반적인 순차적 데이터 기록 대신 특수 "저장" 버퍼를 통한 기록이 사용됩니다. 버퍼를 사용하면 데이터 대상까지의 왕복 횟수를 줄여 효율성을 높일 수 있습니다.

    
    import java.io.*;
    
    public class DataOutputStreamExample {
    
       public static void main(String[] args) throws IOException {
    
           FileOutputStream outputStream = new FileOutputStream("D:/Users/Username/someFile.txt");
           BufferedOutputStream bufferedStream = new BufferedOutputStream(outputStream);
          
           String text = "I love Java!"; // we will convert this string into an array of bytes and write it to a file
    
           byte[] buffer = text.getBytes();
          
           bufferedStream.write(buffer, 0, buffer.length);
           bufferedStream.close();
       }
    }

    다시 말하지만, 이 코드를 직접 "플레이"하여 컴퓨터의 실제 파일에서 어떻게 작동하는지 확인할 수 있습니다.

InputStream" 입력 /출력 시스템OutputStream " 자료에서 상속인에 대해 읽을 수도 있습니다 . 아 , 그리고 별도의 강의도 할 예정이라 처음 접하시는 분들에게도 충분한 정보가 될 것 같습니다. 그게 다야! 인터페이스와 추상 클래스의 차이점을 잘 이해하고 어떤 질문, 심지어 까다로운 질문에도 답변할 준비가 되기를 바랍니다. :) FileInputStreamFileOutputStreamBufferedInputStream
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION