CodeGym /Java Blog /무작위의 /Java의 추상 클래스에 대한 구체적인 예
John Squirrels
레벨 41
San Francisco

Java의 추상 클래스에 대한 구체적인 예

무작위의 그룹에 게시되었습니다
안녕! 지난 수업에서 우리는 인터페이스를 만났고 그것들이 무엇을 위한 것인지 알아냈습니다. 오늘의 주제는 이전 주제와 동일합니다. Java의 추상 클래스 에 대해 이야기해 봅시다 .Java의 추상 클래스에 대한 구체적인 예 - 1

클래스를 '추상'이라고 부르는 이유

당신은 아마 '추상화'가 무엇인지 기억할 것입니다. 우리는 이미 그것에 대해 살펴보았습니다. :) 잊어버렸더라도 두려워하지 마세요. 기억하세요: 클래스를 설계하고 객체를 생성할 때 엔터티의 기본 속성만 식별하고 보조 속성은 버려야 한다는 것이 OOP의 원칙 입니다 . 예를 들어 클래스를 디자인하는 경우 ' 높이SchoolTeacher ' 속성이 거의 필요하지 않습니다 . 실제로 이 속성은 교사와 관련이 없습니다. 하지만 우리가 클래스를 만든다면 성장이 중요한 특징이 될 것입니다. 그러니 들어봐. 추상 클래스BasketballPlayer미래 수업 그룹을 위한 미완성 '공백'입니다. 공백은 그대로 사용할 수 없습니다. 너무 '날 것'입니다. 그러나 추상 클래스를 상속하는 미래의 클래스가 갖게 될 특정 상태 및 일반적인 동작을 설명합니다.

추상 Java 클래스의 예

자동차에 대한 간단한 예를 고려하십시오.

public abstract class Car {

   private String model;
   private String color;
   private int maxSpeed;

   public abstract void gas();

   public abstract void brake();

   public String getModel() {
       return model;
   }

   public void setModel(String model) {
       this.model = model;
   }

   public String getColor() {
       return color;
   }

   public void setColor(String color) {
       this.color = color;
   }

   public int getMaxSpeed() {
       return maxSpeed;
   }

   public void setMaxSpeed(int maxSpeed) {
       this.maxSpeed = maxSpeed;
   }
}
이것이 가장 단순한 추상 클래스의 모습입니다. 보시다시피 특별한 것은 아닙니다 :) 왜 필요할까요? 우선, 우리가 필요로 하는 개체인 자동차를 가장 추상적인 방식으로 설명합니다. 우리가 추상이라는 단어를 사용하는 이유가 있습니다 . 현실 세계에는 '추상적인 자동차'가 없습니다. 트럭, 경주용 자동차, 세단, 쿠페 및 SUV가 있습니다. 추상 클래스는 나중에 자동차 클래스를 만드는 데 사용할 '청사진'일 뿐입니다.

public class Sedan extends Car {

   @Override
   public void gas() {
       System.out.println("The sedan is accelerating!");
   }

   @Override
   public void brake() {
       System.out.println("The sedan is slowing down!");
   }

}
이것은 우리가 상속에 대한 수업에서 이야기한 것과 매우 유사합니다. 그러나 그 수업에는 Car 클래스가 있었고 그 방법은 추상적이지 않았습니다. 그러나 이 솔루션에는 추상 클래스에서 해결되는 여러 가지 단점이 있습니다. 무엇보다도 추상 클래스의 인스턴스를 만들 수 없습니다 .

public class Main {

   public static void main(String[] args) {

       Car car = new Car(); // Error! The Car class is abstract!
   }
}
Java 작성자는 이 '기능'을 특별히 설계했습니다. 다시 한 번 상기시켜 드리자면 추상 클래스는 미래의 '일반' 클래스를 위한 청사진일 뿐입니다 . 청사진 사본이 필요하지 않습니까? 그리고 추상 클래스의 인스턴스를 생성하지 않습니다 :) 그러나 Car클래스가 추상 클래스가 아닌 경우 인스턴스를 쉽게 생성할 수 있습니다.

public class Car {

   private String model;
   private String color;
   private int maxSpeed;

   public void gas() {
       // Some logic
   }

    public void brake() {
       // Some logic
   }
}


public class Main {

   public static void main(String[] args) {

       Car car = new Car(); // Everything is fine. A car is created.
   }
}
이제 우리 프로그램에는 일종의 이해할 수 없는 자동차가 있습니다. 트럭도, 경주용 자동차도, 세단도 아닙니다. 그리고 그것이 무엇인지 완전히 불분명합니다. 이것은 자연에 존재하지 않는 바로 '추상적인 자동차'입니다. 동물을 사용하여 동일한 예를 제공할 수 있습니다. if Animal클래스( 추상 동물 )를 상상해 보십시오. 어떤 종류의 동물인지, 어떤 과에 속하는지, 어떤 특징을 가지고 있는지는 불분명하다. 당신의 프로그램에서 그것을 보는 것은 이상할 것입니다. 자연에는 '추상적인 동물'이 없습니다. 개, 고양이, 여우, 두더지 등만 있습니다. 추상 클래스는 추상 개체에서 우리를 제공합니다. 그들은 우리에게 기본적인 상태와 행동을 제공합니다. 예를 들어 모든 자동차에는 모델 , 색상최대 속도 가 있어야 하며 다음을 적용할 수 있어야 합니다.가스브레이크 . 그게 다야. 이것은 일반적인 추상 계획입니다. 다음으로 필요한 클래스를 디자인합니다. 참고: 추상 클래스의 두 메서드도 abstract 로 지정되며 구현이 없습니다. 이유는 동일합니다. 추상 클래스는 추상 자동차에 대한 기본 동작을 생성하지 않습니다. 그들은 단지 모든 차가 할 수 있어야 하는 것을 나타냅니다. 그러나 기본 동작이 필요한 경우 추상 클래스에서 메서드를 구현할 수 있습니다. Java는 다음을 금지하지 않습니다.

public abstract class Car {

   private String model;
   private String color;
   private int maxSpeed;

   public void gas() {
       System.out.println("Gas!");
   }

   public abstract void brake();

   // Getters and setters
}


public class Sedan extends Car {

   @Override
   public void brake() {
       System.out.println("The sedan is slowing down!");
   }

}

public class Main {

   public static void main(String[] args) {

       Sedan sedan = new Sedan();
       sedan.gas();
   }
}
콘솔 출력: "Gas!" 보시다시피 추상 클래스에서 첫 번째 메서드를 구현했지만 두 번째 메서드는 구현하지 않았습니다. 결과적으로 클래스의 동작 Sedan은 두 부분으로 나뉩니다. 추상적인 부모 클래스 gas()까지 '상승' Car하지만 클래스 brake()의 메소드를 오버로드했습니다 Sedan. 이것은 매우 편리하고 유연합니다. 그러나 이제 우리 클래스는 그렇게 추상적이지 않습니다 . 결국 메소드의 절반이 구현됩니다. 이것은 실제로 매우 중요한 기능입니다. 클래스의 메소드 중 적어도 하나가 추상이면 클래스는 추상입니다.. 두 가지 방법 중 하나 또는 천 가지 방법 중 적어도 하나는 아무런 차이가 없습니다. 우리는 모든 방법을 구현하고 그 중 어느 것도 추상화하지 않을 수 있습니다. 그러면 추상 메서드가 없는 추상 클래스가 됩니다. 원칙적으로 이것은 가능하며 컴파일러는 오류를 생성하지 않지만 피하는 것이 좋습니다. 추상이라는 단어는 의미를 잃고 동료 프로그래머는 매우 놀랄 것입니다. 추상이라는 단어를 사용하면 각 자식 클래스가 이를 구현하거나 추상으로 선언해야 합니다. 그렇지 않으면 컴파일러에서 오류가 발생합니다. 물론 각 클래스는 하나의 추상 클래스만 상속할 수 있으므로 상속의 관점에서 추상 클래스와 일반 클래스 간에 차이가 없습니다. 추상 클래스를 상속하든 일반 클래스를 상속하든 상관없이 부모 클래스는 하나만 있을 수 있습니다.

Java에 클래스의 다중 상속이 없는 이유

우리는 이미 Java에 다중 상속이 없다고 말했지만 실제로 그 이유를 조사하지는 않았습니다. 지금 해보자. 사실 Java에 다중 상속이 있는 경우 하위 클래스는 선택해야 하는 특정 동작을 결정할 수 없습니다. Toaster다음과 같은 두 개의 클래스가 있다고 가정합니다 NuclearBomb.

public class Toaster {


 public void on() {

       System.out.println("The toaster is on. Toast is being prepared!");
   }

   public void off() {

       System.out.println("The toaster is off!");
   }
}


public class NuclearBomb {

   public void on() {

       System.out.println("Boom!");
   }
}
보시다시피 둘 다 on()방법이 있습니다. 토스터의 경우 토스트가 시작됩니다. 핵폭탄의 경우 폭발을 일으킵니다. 죄송합니다: / 이제 중간에 무언가를 만들기로 결정했다고 상상해 보세요(이유는 묻지 마세요!). 따라서 MysteriousDevice수업이 있습니다! 물론 이 코드는 작동하지 않으며 '하지만 그럴 수도 있습니다'라는 예로서만 제공합니다.

public class MysteriousDevice extends Toaster, NuclearBomb {

   public static void main(String[] args) {

       MysteriousDevice mysteriousDevice = new MysteriousDevice();
       mysteriousDevice.on(); // So what should happen here? Do we get toast or a nuclear apocalypse?
   }
}
우리가 가진 것을 살펴봅시다. 신비한 장치는 Toaster와 NuclearBomb을 동시에 상속합니다. 둘 다 방법이 있습니다 on(). 결과적으로 on()메서드를 호출하면 개체에서 어떤 메서드를 호출해야 하는지 명확하지 않습니다 MysteriousDevice. 개체가 알 수 있는 방법이 없습니다. 무엇보다도, NuclearBomb에는 off()방법이 없으므로 추측이 정확하지 않으면 장치를 비활성화하는 것이 불가능합니다. Java의 추상 클래스에 대한 구체적인 예 - 2객체가 어떤 행동을 보여야 할지 모르는 이러한 '혼란' 때문에 Java 작성자가 다중 상속을 포기했습니다. 그러나 Java 클래스가 여러 인터페이스를 구현할 수 있다는 것을 기억할 것입니다. 그건 그렇고, 당신의 연구에서 당신은 이미 적어도 하나의 추상 클래스를 만났습니다!

public abstract class Calendar implements Serializable, Cloneable, Comparable<Calendar>
그것은 당신의 오랜 친구, Calendar클래스입니다. 추상적이고 여러 하위 항목이 있습니다. 그 중 하나는 GregorianCalendar. 날짜에 대한 수업에서 이미 사용했습니다. :) 모든 것이 충분히 명확해 보입니다. 질문이 하나 있습니다. 어쨌든 추상 클래스와 인터페이스의 근본적인 차이점은 무엇입니까? 언어를 하나로 제한하지 않고 Java에 둘 다 추가한 이유는 무엇입니까? 결국 그것은 전적으로 적절했을 것입니다. 다음 강의 에서 이에 대해 이야기하겠습니다 ! 그때까지 :)
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION