logo

Java 추상 클래스의 생성자

Java의 추상 클래스는 직접 인스턴스화할 수 없는 클래스입니다. 이것의 목표는 다른 클래스가 상속되고 확장될 수 있는 기본 클래스 역할을 하는 것입니다. 추상 클래스가 특수 메소드라고 알려져 있고 클래스의 객체가 생성될 때 호출되는 생성자를 정의하는 기능을 갖는 중요한 기능 중 하나입니다.

추상 클래스에서 생성자를 정의할 때 따라야 할 규칙은 다음과 같습니다.

  1. 추상 클래스는 생성자를 가질 수 있지만 직접 인스턴스화할 수는 없습니다. 생성자는 구체적인 하위 클래스가 생성될 때 사용됩니다.
  2. 추상 클래스에는 하나 이상의 추상 메서드가 있을 수 있습니다. 이는 해당 메서드가 클래스를 통해 구현되지 않음을 의미합니다. 인스턴스화하려면 추상 메서드를 사용하여 추상 클래스를 확장하는 하위 클래스가 해당 메서드를 구현해야 합니다. 이는 하위 클래스가 구체적인 클래스여야 하고 인스턴스화될 수 있어야 하는 경우 추상 클래스 내에 선언된 각 추상 메서드에 구현이 있어야 함을 의미합니다. 즉, 추상 클래스가 열어둔 기능을 하위 클래스에서 채워야 합니다.
  3. 서브클래스가 생성자를 사용하여 추상 클래스를 확장하는 경우 서브클래스는 슈퍼 키워드의 도움을 받아 슈퍼클래스 내부의 생성자 중 하나를 호출해야 합니다. 슈퍼클래스 생성자는 객체의 상태를 초기화하고 모든 중요한 리소스를 통합하기 때문입니다. 이제 하위 클래스가 상위 클래스의 생성자 중 하나를 호출하지 않으면 객체가 제대로 초기화되지 않고 효율적/올바르게 작동하지 않게 됩니다.
  4. 다른 클래스와 마찬가지로 추상 클래스에 둘 이상의 생성자를 정의하는 것이 가능합니다. 그러나 각 생성자는 서로 다른 매개변수 목록을 사용하여 정의되어야 합니다. 이를 통해 하위 클래스에서 특정 요구 사항에 따라 호출할 생성자를 선택할 수 있습니다.

추상 클래스를 사용하여 구현된 생성자의 유형:

생성자에는 세 가지 유형이 있습니다.

  1. 기본 생성자
  2. 매개변수화된 생성자
  3. 복사 생성자

1. 기본 생성자: 클래스에 다른 생성자가 정의되지 않은 경우 생성자는 Java를 통해 자동으로 생성됩니다. 매개변수가 없으며 클래스 필드의 기본값을 초기화하는 것 외에는 어떠한 이동도 수행하지 않습니다.

연산:

1 단계: 'Shape'이라는 추상 클래스를 정의합니다.

2 단계: 두 개의 정수 변수 'x'와 'y'를 보호됨으로 선언합니다.

경찰 부국장

3단계: Shape 클래스 기본 생성자를 만들고 'x'와 'y'를 0으로 설정합니다.

4단계: 이제 'getArea()' 메소드를 생성하십시오. 이는 double 값을 반환하는 추상 메소드입니다.

5단계: 그런 다음 Shape 클래스에 속하는 두 개의 비추상 메서드 'printPosition()' 및 'setPosition(int x, int y)'를 만듭니다.

6단계: setPosition 메소드는 x와 y의 값을 설정합니다.

7단계: printPosition 메소드는 x와 y의 값을 인쇄합니다.

8단계: Shape 클래스를 확장하는 Circle 클래스를 정의합니다.

9단계: Circle 클래스에서 보호되는 'radius'라는 이중 변수를 선언합니다.

10단계: 반지름에 대해 double 값을 허용하는 Circle 클래스의 생성자를 정의합니다.

11단계: 원의 면적을 계산하는 Circle 클래스의 getArea 메소드를 구현합니다.

12단계: Shape 클래스를 확장하는 Square 클래스를 정의합니다.

13단계: Square 클래스에서 'side'라는 이중 변수를 보호됨으로 선언합니다.

14단계: 측면에 대해 double 값을 허용하는 Square 클래스의 생성자를 정의합니다.

15단계: 정사각형의 면적을 계산하는 Square 클래스의 getArea 메소드를 구현하십시오.

16단계: 메인 클래스를 정의합니다.

17단계: Main 클래스에 main 함수를 정의합니다.

18단계: Circle 객체와 Square 객체를 만듭니다.

19단계: Circle 및 Square 개체 모두에 대해 setPosition 메서드를 호출합니다.

20단계: Circle 및 Square 개체 모두에 대해 getArea 메서드를 호출하고 결과를 인쇄합니다.

21단계: Circle 및 Square 개체 모두에 대해 printPosition 메서드를 호출하고 결과를 인쇄합니다.

구현:

위 단계의 구현은 다음과 같습니다.

파일 이름: DefaultMain.java

 import java.util.*; abstract class Shape { protected int x; protected int y; // default constructor public Shape() { // initialize default values for fields x = 0; y = 0; } // abstract method to calculate area public abstract double getArea(); // other methods public void setPosition(int x,int y) { this.x=x; this.y=y; } public void printPosition() { System.out.println('The Position: ('+x + ', '+ y +')'); } } class Circle extends Shape { protected double radius; // constructor public Circle(double radius) { this.radius=radius; } // implementation of getArea() for Circle public double getArea() { return Math.PI * radius * radius; } } class Square extends Shape { protected double side; // constructor public Square(double side) { this.side = side; } // implementation of getArea() for Square public double getArea() { return side * side; } } public class DefaultMain { public static void main(String args []) { // create a Circle object Circle circle = new Circle(5); circle.setPosition(2,3); // print the area and position of the Circle object System.out.println('Area of a circle is: '+circle.getArea()); circle.printPosition(); // create a Square object Square square = new Square(4); square.setPosition(5, 7); // print the area and position of the Square object System.out.println('Area of a square is: '+square.getArea()); square.printPosition(); } } 

산출:

 Area of a circle is: 78.53981633974483 The Position:(2, 3) Area of a square is: 16.0 The Position:(5, 7) 

2. 매개변수화된 생성자: 객체를 생성할 때 이러한 종류의 생성자를 사용하면 객체에 인수를 전달할 수 있습니다. 값을 사용하여 객체를 초기화하려는 경우 도움이 됩니다. 매개변수화된 생성자는 하나 이상의 매개변수로 정의되며, 객체가 생성되는 동안 생성자에 전달된 값은 항목의 해당 필드를 초기화하는 데 사용됩니다.

연산:

1 단계: 추상 클래스 Shape를 정의합니다.

2 단계: x 및 y라는 int 유형의 두 개의 보호된 인스턴스 변수를 추가합니다.

3단계: 인스턴스 변수 x 및 y를 초기화하고 int 유형인 x 및 y의 두 매개변수를 허용하는 매개변수화된 생성자를 만듭니다.

4단계: 추상 클래스 Shape를 정의합니다.

5단계: x 및 y라는 int 유형의 두 개의 보호된 인스턴스 변수를 추가합니다.

6단계: 인스턴스 변수 x 및 y를 초기화하고 int 유형인 x 및 y의 두 매개변수를 허용하는 매개변수화된 생성자를 만듭니다.

7단계: Shape를 확장하는 Circle 클래스를 정의합니다.

8단계: radius라는 이름의 double 유형의 보호된 인스턴스 변수를 추가합니다.

9단계: int x, y 및 double radius 유형의 세 가지 매개변수를 사용하고 super() 키워드를 사용하여 x, y 및 radius 인스턴스 변수를 초기화하는 매개변수화된 생성자를 정의합니다.

10단계: Circle의 면적을 계산하여 추상 메소드 getArea()를 구현합니다.

11단계: Shape를 확장하는 Square 클래스를 정의합니다.

12단계: side라는 이름의 double 유형의 보호된 인스턴스 변수를 추가합니다.

13단계: int x, y 및 double side 유형의 세 가지 매개변수를 사용하고 super() 키워드를 사용하여 x, y 및 측면 인스턴스 변수를 초기화하는 매개변수화된 생성자를 정의합니다.

14단계: Square의 면적을 계산하여 추상 메소드 getArea()를 구현합니다.

15단계: Main 클래스를 정의합니다.

16단계: 프로그램의 진입점인 main()이라는 정적 메서드를 정의합니다.

17단계: 매개변수화된 생성자를 사용하여 Circle 객체를 만듭니다.

18단계: getArea() 및 printPosition() 메서드를 각각 사용하여 Circle 객체의 영역과 위치를 인쇄합니다.

19단계: 매개변수화된 생성자를 사용하여 Square 객체를 만듭니다.

20단계: getArea() 및 printPosition() 메소드를 각각 사용하여 Square 객체의 영역과 위치를 인쇄합니다.

21단계: 프로그램이 종료됩니다.

구현:

아래에 언급된 위 단계의 구현

파일 이름: ParameterizedMain.java

 import java.util.*; abstract class Shape { protected int x; protected int y; // parameterized constructor public Shape(int x,int y) { this.x=x; this.y=y; } // abstract method to calculate area public abstract double getArea(); // other methods public void setPosition(int x,int y) { this.x=x; this.y=y; } public void printPosition() { System.out.println('The position: ('+ x+', ' +y+')'); } } class Circle extends Shape { protected double radius; // parameterized constructor public Circle(int x,int y,double radius) { super(x,y); this.radius=radius; } // implementation of getArea() for Circle public double getArea() { return Math.PI * radius * radius; } } class Square extends Shape { protected double side; // parameterized constructor public Square(int x,int y,double side) { super(x, y); this.side = side; } // implementation of getArea() for Square public double getArea() { return side * side; } } public class ParameterizedMain { public static void main(String args []) { // create a Circle object with parameterized constructor Circle circle = new Circle(2, 3, 5); // print the area and position of the Circle object System.out.println('Area of circle is: '+circle.getArea()); circle.printPosition(); // create a Square object with parameterized constructor Square square = new Square(5, 7, 4); // print the area and position of the Square object System.out.println('Area of square is:' +square.getArea()); square.printPosition(); } } 

산출:

 Area of circle is: 78.53981633974483 The position: (2, 3) Area of square is:16.0 The position: (5, 7) 

3. 복사 생성자: 복사 생성자는 기존 개체와 동일한 값을 가진 새 개체를 만드는 데 사용됩니다(즉, 항목이 이전에 생성됨). 이미 존재하거나 존재하는 객체의 복제본일 수 있는 새 객체를 생성해야 할 때 유용합니다. 복사 생성자는 하나의 인수 또는 동일한 클래스의 항목인 하나의 매개 변수로만 정의됩니다. 그런 다음 생성자는 매개변수 개체와 동일한 값을 가진 새 개체를 만듭니다.

연산:

1 단계: 인스턴스 변수와 기본 생성자를 사용하여 추상 클래스를 선언합니다.

2 단계: 동일한 클래스 유형의 매개변수를 사용하여 복사 생성자를 정의합니다.

3단계: 복사 생성자에서 super 키워드를 사용하여 슈퍼클래스 복사 생성자를 호출하여 매개변수 객체의 인스턴스 변수를 새 객체에 복사합니다.

4단계: 서브클래스 내의 추가 인스턴스 변수 값을 새 항목에 할당합니다.

5단계: 면적을 계산하는 추상 메서드를 구현합니다.

6단계: 필요에 따라 다른 방법을 정의합니다.

7단계: 메인 함수에서 클래스의 객체를 생성합니다.

8단계: 필요에 따라 위치 및 기타 인스턴스 변수를 설정합니다.

9단계: 복사 생성자를 사용하고 원본 항목을 매개변수로 전달하여 새 개체를 만듭니다.

10단계: 원본과 복사된 개체의 영역과 위치를 모두 인쇄합니다.

구현:

위 단계의 구현은 다음과 같습니다.

파일 이름: CopyMain.java

 import java.util.*; abstract class Shape { protected int x; protected int y; // copy constructor public Shape(Shape other) { this.x=other.x; this.y=other.y; } // default constructor public Shape() { // initialize default values for fields x=0; y=0; } // abstract method to calculate area public abstract double getArea(); // other methods public void setPosition(int x,int y) { this.x =x; this.y =y; } public void printPosition() { System.out.println('Position: (' +x+ ', ' +y+ ')'); } } class Circle extends Shape { protected double radius; // copy constructor public Circle(Circle other) { super(other); this.radius =other.radius; } // constructor public Circle(double radius) { this.radius =radius; } // implementation of getArea() for Circle public double getArea() { return Math.PI * radius * radius; } } class Square extends Shape { protected double side; // copy constructor public Square(Square other) { super(other); this.side =other.side; } // constructor public Square(double side) { this.side=side; } // implementation of getArea() for Square public double getArea() { return side * side; } } public class CopyMain { public static void main(String[] args) { // create a Circle object Circle circle1 = new Circle(5); circle1.setPosition(2,3); // create a copy of the Circle object using the copy constructor Circle circle2 = new Circle(circle1); // print the area and position of the original and copied Circle objects System.out.println('Original Area of circle: ' +circle1.getArea()); circle1.printPosition(); System.out.println('Copied Area of circle: '+circle2.getArea()); circle2.printPosition(); // create a Square object Square square1 =new Square(4); square1.setPosition(5,7); // create a copy of the Square object using the copy constructor Square square2 = new Square(square1); // print the area and position of the original and copied Square objects System.out.println('Original Area of square: '+square1.getArea()); square1.printPosition(); System.out.println('Copied Area of square: '+square2.getArea()); square2.printPosition(); } } 

산출:

 Original Area of circle: 78.53981633974483 Position: (2, 3) Copied Area of circle: 78.53981633974483 Position: (2, 3) Original Area of square: 16.0 Position: (5, 7) Copied Area of square: 16.0 Position: (5, 7)