programing

Java 추상 클래스

newsource 2022. 8. 13. 12:17

Java 추상 클래스

자바어로 '추상 클래스'가 뭐죠?

추상 클래스는 인스턴스화할 수 없는 클래스입니다.추상 클래스는 인스턴스화할 수 있는 상속 하위 클래스를 만드는 데 사용됩니다.추상 클래스는 상속되는 하위 클래스에 대해 몇 가지 작업을 수행합니다.

  1. 상속되는 서브클래스에서 사용할 수 있는 메서드를 정의합니다.
  2. 상속 하위 클래스에서 구현해야 하는 추상 메서드를 정의합니다.
  3. 서브클래스를 다른 모든 서브클래스와 교환할 수 있는 공통 인터페이스를 제공합니다.

다음은 예를 제시하겠습니다.

abstract public class AbstractClass
{
    abstract public void abstractMethod();
    public void implementedMethod() { System.out.print("implementedMethod()"); }
    final public void finalMethod() { System.out.print("finalMethod()"); }
}

"abstract Method()"에는 메서드 본문이 없습니다.따라서 다음 작업을 수행할 수 없습니다.

public class ImplementingClass extends AbstractClass
{
    // ERROR!
}

abstractMethod()JVM이 알 있는 new ImplementingClass().abstractMethod().

정답이 요.ImplementingClass.

public class ImplementingClass extends AbstractClass
{
    public void abstractMethod() { System.out.print("abstractMethod()"); }
}

, 굳이.implementedMethod() ★★★★★★★★★★★★★★★★★」finalMethod()되어 있습니다.AbstractClass.

또 정답이 있습니다.ImplementingClass.

public class ImplementingClass extends AbstractClass
{
    public void abstractMethod() { System.out.print("abstractMethod()"); }
    public void implementedMethod() { System.out.print("Overridden!"); }
}

이 경우 오버라이드되었습니다.implementedMethod().

다만, 「」에, 「」가 .final츠키다

public class ImplementingClass extends AbstractClass
{
    public void abstractMethod() { System.out.print("abstractMethod()"); }
    public void implementedMethod() { System.out.print("Overridden!"); }
    public void finalMethod() { System.out.print("ERROR!"); }
}

수 요. 왜냐하면 '이렇게 하다'가 구현되어 있기 입니다.finalMethod()AbstractClass의 최종 실시로서 마크된다.finalMethod() : 하다

이제 추상 클래스를 두 번 구현할 도 있습니다.

public class ImplementingClass extends AbstractClass
{
    public void abstractMethod() { System.out.print("abstractMethod()"); }
    public void implementedMethod() { System.out.print("Overridden!"); }
}

// In a separate file.
public class SecondImplementingClass extends AbstractClass
{
    public void abstractMethod() { System.out.print("second abstractMethod()"); }
}

이제 다른 방법을 쓸 수 있습니다.

public tryItOut()
{
    ImplementingClass a = new ImplementingClass();
    AbstractClass b = new ImplementingClass();

    a.abstractMethod();    // prints "abstractMethod()"
    a.implementedMethod(); // prints "Overridden!"     <-- same
    a.finalMethod();       // prints "finalMethod()"

    b.abstractMethod();    // prints "abstractMethod()"
    b.implementedMethod(); // prints "Overridden!"     <-- same
    b.finalMethod();       // prints "finalMethod()"

    SecondImplementingClass c = new SecondImplementingClass();
    AbstractClass d = new SecondImplementingClass();

    c.abstractMethod();    // prints "second abstractMethod()"
    c.implementedMethod(); // prints "implementedMethod()"
    c.finalMethod();       // prints "finalMethod()"

    d.abstractMethod();    // prints "second abstractMethod()"
    d.implementedMethod(); // prints "implementedMethod()"
    d.finalMethod();       // prints "finalMethod()"
}

「 」라고 했지만, 「 」라고 하는 해 주세요.b한 사람AbstractClass이 됩니다."Overriden!"왜냐하면 우리가 인스턴스화한 객체가 실제로는ImplementingClass 사람, 그 사람, 그 사람.implementedMethod()(하다

특정 서브클래스에 고유한 멤버에 액세스하려면 먼저 해당 서브클래스로 캐스트해야 합니다.

// Say ImplementingClass also contains uniqueMethod()
// To access it, we use a cast to tell the runtime which type the object is
AbstractClass b = new ImplementingClass();
((ImplementingClass)b).uniqueMethod();

마지막으로 다음 작업을 수행할 수 없습니다.

public class ImplementingClass extends AbstractClass, SomeOtherAbstractClass
{
    ... // implementation
}

한 번에 1개의 클래스만 확장할 수 있습니다.여러 클래스를 확장해야 하는 경우 인터페이스여야 합니다.다음과 같이 할 수 있습니다.

public class ImplementingClass extends AbstractClass implements InterfaceA, InterfaceB
{
    ... // implementation
}

다음으로 인터페이스의 예를 나타냅니다.

interface InterfaceA
{
    void interfaceMethod();
}

이는 기본적으로 다음과 같습니다.

abstract public class InterfaceA
{
    abstract public void interfaceMethod();
}

유일한 차이점은 두 번째 방법은 컴파일러가 실제로 인터페이스라는 것을 알리지 않는다는 것입니다.이것은, 유저가 자신의 인터페이스만을 실장하지 않고 실장하는 경우에 편리합니다.단, 일반적인 초보자의 경험칙으로서 추상 클래스에는 추상 메서드만 있는 경우에는 인터페이스로 해야 합니다.

다음은 불법입니다.

interface InterfaceB
{
    void interfaceMethod() { System.out.print("ERROR!"); }
}

인터페이스에는 메서드를 구현할 수 없습니다.즉, 2개의 다른 인터페이스를 실장했을 경우, 이러한 인터페이스의 다른 메서드는 경합할 수 없습니다.인터페이스의 모든 메서드가 추상적이기 때문에 메서드를 구현해야 하며 상속 트리에서 메서드가 유일한 구현이기 때문에 컴파일러는 메서드를 사용해야 한다는 것을 알고 있습니다.

Java 클래스는 다음 조건에서 추상화됩니다.

(1) 적어도 하나의 방법이 추상적인 것으로 표시되어 있다.

public abstract void myMethod()

이 경우 컴파일러는 전체 클래스를 추상이라고 표시하도록 강제합니다.

2. 클래스는 추상적인 것으로 표시됩니다.

abstract class MyClass

이미 말했듯이:추상적인 메서드가 있는 경우 컴파일러는 클래스 전체를 추상적인 것으로 표시하도록 강제합니다.그러나 추상적인 방법이 없어도 클래스를 추상적인 것으로 표시할 수 있습니다.

일반적인 용도:

추상 클래스의 일반적인 용도는 인터페이스와 유사한 클래스의 개요를 제공하는 것입니다.그러나 인터페이스와는 달리 이미 기능을 제공할 수 있습니다.즉, 클래스의 일부는 실장되어 있고 일부는 메서드 선언으로 개요를 나타내고 있습니다.("추상")

추상 클래스는 인스턴스화할 수 없지만 추상 클래스를 기반으로 구체적인 클래스를 만들어 인스턴스화할 수 있습니다.이를 위해서는 추상 클래스에서 상속하고 추상 메서드를 재정의해야 합니다. 즉, 구현해야 합니다.

abstract 키워드를 사용하여 선언된 클래스는 다음과 같습니다.abstract class추상화는 데이터 구현의 세부사항을 숨기고 사용자에게 기능성만을 보여주는 과정입니다.추상화를 사용하면 객체가 수행하는 방식 대신 객체가 수행하는 작업에 집중할 수 있습니다.

추상 수업의 주요 사항

  • 추상 클래스는 추상 메서드를 포함할 수도 있고 포함할 수도 없습니다.추상적이지 않은 방법이 있을 수 있습니다.

    추상 메서드는 다음과 같이 구현 없이(괄호 없이 세미콜론 뒤에) 선언되는 메서드입니다.

    : ex :abstract void moveTo(double deltaX, double deltaY);

  • 클래스에 추상 메서드가 하나 이상 있는 경우 해당 클래스는 추상적이어야 합니다.

  • 추상 클래스는 인스턴스화할 수 없습니다(추상 클래스의 개체를 만들 수 없습니다).

  • 추상 클래스를 사용하려면 다른 클래스에서 상속해야 합니다.그 안에 있는 모든 추상적인 방법에 대한 구현을 제공합니다.

  • 추상 클래스를 상속하는 경우 해당 클래스의 모든 추상 메서드에 구현을 제공해야 합니다.

추상 클래스 선언 지정abstract선언 중 클래스 앞에 키워드를 지정하면 추상화됩니다.아래의 코드를 봐 주세요.

abstract class AbstractDemo{ }

추상 메서드 선언 지정abstract선언 중 메서드 앞에 키워드를 지정하면 추상화됩니다..

abstract void moveTo();//no body

수업을 추상화해야 하는 이유

객체 지향 그리기 응용 프로그램에서는 원, 직사각형, 선, 베지어 곡선 및 기타 여러 그래픽 객체를 그릴 수 있습니다.이러한 개체는 모두 특정 상태(예: 위치, 방향, 선 색상, 채우기 색상)와 동작(예: 이동, 회전, 크기 조정, 그리기)을 공통으로 가집니다.이러한 상태 및 동작 중 일부는 모든 그래픽 개체에 대해 동일합니다(예: 채우기 색상, 위치 및 이동 위치).다른 구현이 필요한 경우도 있습니다(예: 크기 조정 또는 그리기).모든 그래픽 오브젝트는 스스로 그리거나 크기를 조정할 수 있어야 하며, 그 방법은 다를 뿐입니다.

추상적인 슈퍼클래스를 위한 완벽한 상황입니다.유사점을 이용하여 모든 그래픽 개체를 동일한 추상 부모 개체에서 상속할 것을 선언할 수 있습니다(예:GraphicObject)를 참조해 주세요.여기에 이미지 설명 입력

합니다.GraphicObject현재 위치 및 moveTo 메서드 등 모든 서브클래스에서 완전히 공유되는 멤버 변수 및 메서드를 제공합니다. GraphicObject또한 모든 하위 클래스에서 구현되어야 하지만 다른 방식으로 구현되어야 하는 그리기 또는 크기 조정과 같은 추상적 메서드도 선언했습니다.GraphicObject될 수 요.

abstract class GraphicObject {

  void moveTo(int x, int y) {
    // Inside this method we have to change the position of the graphic 
    // object according to x,y     
    // This is the same in every GraphicObject. Then we can implement here. 
  }

  abstract void draw(); // But every GraphicObject drawing case is 
                        // unique, not common. Then we have to create that 
                        // case inside each class. Then create these    
                        // methods as abstract 
  abstract void resize();
}

하위 클래스에서 추상 메서드의 사용 추상화되지 않은 각 하위 클래스GraphicObject 「」, 「」등입니다.Circle ★★★★★★★★★★★★★★★★★」Rectangle 「을 필요가 있습니다.draw ★★★★★★★★★★★★★★★★★」resize★★★★★★★★★★★★★★★★★★.

class Circle extends GraphicObject {
  void draw() {
    //Add to some implementation here
  }
  void resize() {
    //Add to some implementation here   
  }
}
class Rectangle extends GraphicObject {
  void draw() {
    //Add to some implementation here
  }
  void resize() {
    //Add to some implementation here
  }
}

<고객명>main을 부를 수 .

public static void main(String args[]){
   GraphicObject c = new Circle();
   c.draw();
   c.resize();
   c.moveTo(4,5);   
}

Java에서 추상화를 실현하는 방법

Java에서 추상화를 달성하는 방법은 두 가지가 있습니다.

  • 추상 클래스(0~100%)
  • 인터페이스(100%)

생성자, 데이터 멤버, 메서드 등이 포함된 추상 클래스

abstract class GraphicObject {

  GraphicObject (){
    System.out.println("GraphicObject  is created");
  }
  void moveTo(int y, int x) {
       System.out.println("Change position according to "+ x+ " and " + y);
  }
  abstract void draw();
}

class Circle extends GraphicObject {
  void draw() {
    System.out.println("Draw the Circle");
  }
}

class TestAbstract {  
 public static void main(String args[]){

   GraphicObject  grObj = new Circle ();
   grObj.draw();
   grObj.moveTo(4,6);
 }
}

출력:

GraphicObject  is created
Draw the Circle
Change position according to 6 and 4

다음 두 가지 규칙을 기억하십시오.

  • 가 거의 구체적인 메서드가 , 를 '추상적 메서드'라고합니다.abstract를 누릅니다

  • 메서드만 해당 합니다.interface.

참고 자료:

이것은 인스턴스화할 수 없는 클래스이며, 개략적으로 추상적인 메서드를 구현하도록 강제할 수 있습니다.

간단히 말해서 추상 클래스는 조금 더 많은 기능을 가진 인터페이스와 같다고 생각할 수 있습니다.

추상 클래스도 보유하고 있는 인터페이스를 인스턴스화할 수 없습니다.

인터페이스에서는 메서드헤더를 정의하기만 하면 모든 구현자가 모든 헤더를 구현하도록 강제됩니다.추상 클래스에서는 메서드헤더를 정의할 수도 있지만 인터페이스의 차이에 따라 메서드의 본문(일반적으로 기본 구현)을 정의할 수도 있습니다.게다가 다른 클래스가 추상 클래스를 확장할 때(주의, 구현하지 않기 때문에 자녀 클래스당 추상 클래스를 하나만 가질 수도 있습니다), 추상 메서드를 지정하지 않는 한 추상 클래스의 메서드를 모두 구현하도록 강요받지 않습니다(이 경우 인터페이스에 대해 동작하는 것처럼 메서드 본문을 정의할 수 없습니다).

public abstract class MyAbstractClass{
  public abstract void DoSomething();
}

그렇지 않으면 추상 클래스의 일반 메서드의 경우 "상속자"는 평소처럼 기본 동작을 사용하거나 재정의할 수 있습니다.

예:

public abstract class MyAbstractClass{

  public int CalculateCost(int amount){
     //do some default calculations
     //this can be overriden by subclasses if needed
  }

  //this MUST be implemented by subclasses
  public abstract void DoSomething();
}

Oracle 문서에서

추상 메서드 및 클래스:

추상 클래스는 추상이라고 선언된 클래스입니다. 추상 메서드를 포함할 수도 있고 포함하지 않을 수도 있습니다.

추상 클래스는 인스턴스화할 수 없지만 하위 클래스는 지정할 수 있습니다.

추상 메서드는 다음과 같이 구현 없이(괄호 없이 세미콜론 뒤에) 선언되는 메서드입니다.

abstract void moveTo(double deltaX, double deltaY);

클래스에 추상 메서드가 포함된 경우 다음과 같이 클래스 자체를 추상이라고 선언해야 합니다.

public abstract class GraphicObject {
   // declare fields
   // declare nonabstract methods
   abstract void draw();
}

추상 클래스가 하위 클래스인 경우 일반적으로 하위 클래스는 상위 클래스의 모든 추상 메서드에 대한 구현을 제공합니다. 그러나 그렇지 않으면 하위 클래스도 추상이라고 선언해야 합니다.

★★abstract classes ★★★★★★★★★★★★★★★★★」interfacesSE를 사용하다

인터페이스와 추상 클래스의 차이점은 무엇입니까?

인터페이스와 추상 클래스의 차이를 어떻게 설명해야 합니까?

답변은 이쪽에서 확인:

Java에서의 추상 클래스 vs 인터페이스

추상 클래스는 최종 메서드를 가질 수 있습니까?

그나저나 그건 네가 최근에 물어봤던 질문이야.평판을 쌓기 위해 새로운 질문을 생각해 보세요.

편집:

이 질문의 포스터와 참조된 질문의 이름은 같거나 비슷하지만 사용자 ID는 항상 다르다는 것을 방금 깨달았습니다.기술적인 문제가 있거나 Keyur가 다시 로그인하여 질문에 대한 답을 찾는 데 문제가 있거나 SO 커뮤니티를 즐겁게 하기 위한 일종의 게임입니다.

이 모든 게시물에 거의 추가되지 않았습니다.

클래스를 선언하고 싶지만 해당 클래스에 속하는 모든 메서드를 정의하는 방법을 모를 수 있습니다.예를 들어 Writer라는 클래스를 선언하고 write()라는 멤버 메서드를 포함할 수 있습니다.단, write()의 코드화 방법은 Writer 디바이스의 종류에 따라 다르기 때문에 알 수 없습니다.물론 프린터, 디스크, 네트워크, 콘솔 등의 라이터 서브클래스를 취득함으로써 이 문제를 해결할 예정입니다.

추상 클래스는 직접 인스턴스화할 수 없지만 에서 파생해야 사용할 수 있습니다.추상 메서드를 포함하는 경우 클래스는 추상적이어야 합니다. 직접적이어야 합니다.

abstract class Foo {
    abstract void someMethod();
}

또는 간접적으로

interface IFoo {
    void someMethod();
}

abstract class Foo2 implements IFoo {
}

그러나 클래스는 추상 메서드를 포함하지 않고 추상화할 수 있습니다.예를 들어, 직접적인 인스턴스화를 방지하는 방법입니다.

abstract class Foo3 {
}

class Bar extends Foo3 {

}

Foo3 myVar = new Foo3(); // illegal! class is abstract
Foo3 myVar = new Bar(); // allowed!

후자의 추상 클래스 스타일을 사용하여 "인터페이스와 같은" 클래스를 만들 수 있습니다.인터페이스와 달리 추상 클래스는 추상적이지 않은 메서드와 인스턴스 변수를 포함할 수 있습니다.이를 통해 클래스를 확장하는 데 몇 가지 기본 기능을 제공할 수 있습니다.

또 다른 빈번한 패턴은 추상 클래스에서 주요 기능을 구현하고 확장 클래스에 의해 구현되는 추상 방법으로 알고리즘의 일부를 정의하는 것이다.어리석은 예:

abstract class Processor {
    protected abstract int[] filterInput(int[] unfiltered);

    public int process(int[] values) {
        int[] filtered = filterInput(values);
        // do something with filtered input
    }
}

class EvenValues extends Processor {
    protected int[] filterInput(int[] unfiltered) {
        // remove odd numbers
    }
}

class OddValues extends Processor {
    protected int[] filterInput(int[] unfiltered) {
        // remove even numbers
    }
}

솔루션 - 기본 클래스(추상)

public abstract class Place {

String Name;
String Postcode;
String County;
String Area;

Place () {

        }

public static Place make(String Incoming) {
        if (Incoming.length() < 61) return (null);

        String Name = (Incoming.substring(4,26)).trim();
        String County = (Incoming.substring(27,48)).trim();
        String Postcode = (Incoming.substring(48,61)).trim();
        String Area = (Incoming.substring(61)).trim();

        Place created;
        if (Name.equalsIgnoreCase(Area)) {
                created = new Area(Area,County,Postcode);
        } else {
                created = new District(Name,County,Postcode,Area);
        }
        return (created);
        }

public String getName() {
        return (Name);
        }

public String getPostcode() {
        return (Postcode);
        }

public String getCounty() {
        return (County);
        }

public abstract String getArea();

}

추상 클래스는 추상이라고 선언된 클래스입니다. 추상 메서드를 포함할 수도 있고 포함하지 않을 수도 있습니다.추상 클래스는 인스턴스화할 수 없지만 하위 클래스는 지정할 수 있습니다.

즉, 추상 키워드로 선언된 클래스를 자바에서는 추상 클래스라고 합니다.추상적 방법(본문 없는 방법)과 비추상적 방법(본문 없는 방법)이 있을 수 있습니다.

중요사항:- 객체 인스턴스화에 추상 클래스를 사용할 수 없으며 객체 참조를 만드는 데 사용할 수 있습니다. 이는 런타임 다형성에 대한 Java의 접근 방식이 슈퍼 클래스 참조를 사용하여 구현되기 때문입니다.따라서 추상 클래스를 사용하여 하위 클래스 개체를 가리킬 수 있도록 참조를 만들 수 있어야 합니다.이 기능은 다음 예에서 확인할 수 있습니다.

abstract class Bike{  
  abstract void run();  
}  

class Honda4 extends Bike{  
    void run(){
        System.out.println("running safely..");
    }  

    public static void main(String args[]){  
       Bike obj = new Honda4();  
       obj.run();  
    }  
} 

추상 클래스는 완전히 구현되지는 않았지만 하위 클래스에 대한 청사진을 제공합니다.그것은 완전히 정의된 구체적인 방법을 포함하고 있다는 점에서 부분적으로 구현될 수 있지만 추상적인 방법을 보유할 수도 있다.시그니처는 있지만 메서드 본문은 없는 메서드입니다.하위 클래스는 각 추상 메서드에 대한 본문을 정의해야 합니다. 그렇지 않으면 본문도 추상이라고 선언해야 합니다.추상 클래스는 인스턴스화할 수 없기 때문에 사용하려면 하나 이상의 하위 클래스를 확장해야 합니다.추상 클래스는 일반 클래스로 간주하고 서브 클래스는 누락된 정보를 채웁니다.

구체적이고 비구체적인 방법(바디 유무)을 모두 가질 수 있는 클래스.

  1. 구현되지 않은 메서드는 '추상' 키워드를 포함해야 합니다.
  2. 추상 클래스는 인스턴스화할 수 없습니다.

아무것도 하지 않고 서브클래스에 대해 공유할 공통 템플릿을 제공합니다.

언급URL : https://stackoverflow.com/questions/1320745/abstract-class-in-java