JavaRush /Java Blog /Random-KO /커피 브레이크 #123. Java 생성자 - 기술 인터뷰 질문 및 답변

커피 브레이크 #123. Java 생성자 - 기술 인터뷰 질문 및 답변

Random-KO 그룹에 게시되었습니다
출처: 해커눈

생성자 란 무엇입니까?

생성자는 클래스 이름과 동일한 이름을 가진 클래스에 정의된 특수 메서드입니다. Java 생성자는 반환 유형이 없는 메서드와 같습니다. 커피 브레이크 #123.  Java 생성자 - 기술 인터뷰 질문 및 답변 - 1생성자는 객체 초기화에서 가장 중요한 역할을 하며 이 기사에서는 Java의 생성자를 다루는 샘플 인터뷰 질문을 나열합니다. 또한 Java에서 생성자의 중요성에 대해 배우고, 인터뷰에서 Java 생성자에 대한 질문에 답변하는 데 도움이 될 코드 예제 및 기타 중요한 세부 정보를 확인합니다.

생성자는 왜 필요한가요? 자세히 설명해주세요

Student 라는 클래스가 있다고 가정해 보겠습니다 . 그리고 인스턴스 변수 name과 Roll_number가 있습니다 .
class Student{
String name;
int rollNo;
}
이제 1000개의 객체를 생성하면 JVM은 기본 유형 Name = nullRollNo = 0 으로 이러한 값을 초기화합니다 . 이러한 개별 개체를 식별하는 것은 불가능하며, 각 개체에 값을 할당하면 코드 양이 늘어나므로 나쁜 프로그래밍 관행으로 간주됩니다. 따라서 이를 방지하기 위해 생성자를 사용합니다. 즉, Java에서 생성자의 목적은 클래스 인스턴스 변수의 값을 초기화하는 것입니다.

Java에는 어떤 유형의 생성자가 있습니까?

Java에는 세 가지 유형의 생성자가 있습니다.
  • 기본 생성자
  • 인수 없는 생성자
  • 매개변수화된 생성자

Java의 기본 생성자란 무엇입니까?

기본 생성자는 클래스에 생성자가 정의되지 않은 경우 런타임 시 JVM에 의해 생성되는 생성자입니다. 기본 생성자의 주요 작업은 기본 유형에 따라 인스턴스의 값을 초기화하는 것입니다. Java의 기본 생성자 예:
class DefaultConstructor{
int id;
String name;
}
이제 이 클래스의 경우 객체를 생성하면 JVM 내부에 기본값이 제공되는 기본 생성자가 있습니다.
DefaultConstructor df= new DefaultConstructor();
이제 값을 인쇄하면 다음과 같은 결과를 얻을 수 있습니다.
인쇄 = df.id = 0.df.name = null.

인수 없는 생성자란 무엇입니까?

인수 없는 생성자는 인스턴스 값을 초기화하기 위해 명시적으로 정의할 수 있는 생성자입니다. 예를 들어:
class NoArgConstuctor{ int a; int b;

//No Argument Constructor
NoArgConstuctor(){
a = 10;
b = 20;
}

}

매개변수화된 생성자란 무엇입니까?

매개변수화된 생성자는 매개변수를 받아 인스턴스를 초기화하는 생성자입니다. 예를 들어:
class ParameterizedConstuctor{
String name;
int age;
//Parameterized Constructor
ParameterizedConstuctor(String name, int age){
this.name = name;
this.age = age;
}
}

생성자를 정의하는 규칙은 무엇입니까?

생성자를 정의하려면 다음과 같은 몇 가지 규칙을 따라야 합니다.
  • 생성자 이름은 클래스 이름과 일치해야 합니다.

  • Java에는 생성자 반환 유형이 있어서는 안됩니다.

  • 생성자에 적용 가능한 유일한 수정자는 다음과 같습니다.

    • 공공의
    • 기본
    • 보호됨
    • 사적인
  • 생성자는 원하는 만큼의 매개변수를 사용할 수 있습니다.

  • 최종, 동기화, 정적 및 추상 수정자는 생성자에서 허용되지 않습니다.

  • 생성자는 본문 내에서 return 문을 지원하지 않습니다.

  • 생성자의 throw 문 에 예외가 있을 수 있습니다 .

  • 생성자와 함께 throws 절을 사용하는 것이 허용됩니다 .

  • 생성자는 재귀를 생성해서는 안 됩니다.

비공개 생성자는 언제 사용할 수 있나요?

외부에서 특정 클래스의 객체를 생성하고 싶지 않다면 폐쇄형 생성자나 비공개 생성자를 사용할 수 있습니다. 생성자를 비공개로 선언하면 클래스 내에서만 객체를 생성할 수 있습니다. 싱글톤 클래스는 전용 생성자를 사용하는 좋은 예입니다.

명시적으로 정의하지 않으면 기본 생성자 액세스 수정자는 무엇입니까?

생성자의 기본 액세스 수정자는 항상 클래스 수정자와 동일합니다. 클래스가 public이면 생성자도 public이 됩니다. 클래스가 비공개이면 생성자도 비공개입니다. 다른 액세스 수정자에서도 마찬가지입니다.

아래 코드 조각의 출력을 작성하고 설명하세요.

class InterviewBit{
InterviewBit(){
System.out.println(" Welcome to InterviewBit ");
}
}
class ScalerAcademy extends InterviewBit{
ScalerAcademy(){
System.out.println(" Welcome to Scaler Academy by InterviewBit");
}
}
class Main{
public static void main(String[] args) {
ScalerAcademy sc = new ScalerAcademy();
}
}
위의 코드는 다음과 같이 인쇄됩니다.
InterviewBit에 오신 것을 환영합니다. InterviewBit의 Scaler Academy에 오신 것을 환영합니다.
첫 번째 줄의 생성자에 super() 또는 this() 키워드를 포함하지 않으면 JVM이 자동으로 런타임에 이를 넣기 때문에 이 출력을 얻게 됩니다. JVM은 다른 클래스에서 상속하고 해당 기능도 파생 클래스에서 구현되기 때문에 이를 수행합니다. 따라서 기본 클래스 인스턴스에 기본값을 할당할 때 JVM은 기본적으로 super() 키워드를 추가합니다 .

코드를 검토하고 유효한지 또는 유효하지 않은지를 표시합니다. 이유를 설명하세요

class InterviewBit{
InterviewBit(){
System.out.println(" Welcome to InterviewBit ");
}
}
class ScalerAcademy extends InterviewBit{
ScalerAcademy(){
this();
System.out.println(" Welcome to Scaler Academy by InterviewBit");
}
}
class Main{
public static void main(String[] args) {
ScalerAcademy sc = new ScalerAcademy();
}
}
위 코드는 Scaler Academy 생성자 내부의 동일한 생성자이므로 유효하지 않습니다 . 이로 인해 생성자에 재귀가 생성되는데 이는 허용되지 않습니다. 따라서 재귀 생성자 호출과 관련된 컴파일 타임 오류가 발생합니다.

Java의 한 클래스에서 두 개의 생성자를 사용할 수 있습니까?

예, 두 가지 조건에 따라 한 클래스에서 생성자를 원하는 만큼 사용할 수 있습니다.
  • 생성자 매개변수는 달라야 합니다.
  • 생성자에는 재귀가 없어야 합니다.
예. 동일한 InterviewBit 클래스의 두 생성자를 고려하십시오 .
InterviewBit(){
    this("Scaler"); // Calling parameterized constructor
    System.out.println(" No Argument Constructor");
}
InterviewBit(String name){
    this(); // Calling no-arg constructor
    System.out.println(" Constructor with Parameters.");
}
이 코드는 재귀를 생성하므로 유효하지 않습니다. 인수가 없는 생성자는 매개변수가 있는 생성자를 호출하고, 매개변수가 있는 생성자는 인수가 없는 생성자를 호출합니다.

Java에서 생성자를 재정의할 수 있나요?

아니요, 생성자 오버로드 개념은 Java에 적용되지 않습니다.

Java에서 생성자가 최종일 수 있나요?

어떤 생성자도 최종 생성자가 될 수 없습니다. 이는 파생 클래스에서 메서드 재정의를 중지하는 데 final 키워드가 사용되기 때문입니다. 하지만 생성자에서는 재정의 개념이 적용되지 않으므로 final 키워드를 작성할 필요가 없습니다 . 생성자에 final 키워드를 작성하면 컴파일러가 이를 메소드로 처리하기 때문에 필수 반환 유형 이라는 컴파일 시간 오류가 발생합니다 .

Java에서 생성자가 정적일 수 있나요?

아니요, Java 생성자는 정적일 수 없습니다. 이는 멤버가 객체가 아닌 클래스에 속하도록 할 때 정적 키워드가 사용되기 때문입니다. 그러나 생성자는 객체를 초기화하기 위한 것이므로 컴파일러는 이를 메서드로 처리합니다. 필수 반환 유형 오류가 발생합니다 .

super(), super 및 this()의 차이점을 설명하세요.

super()this()는 생성자 호출입니다. 상위 클래스나 현재 클래스의 생성자를 호출하는 데에만 사용됩니다. "super"와 "this"는 자체 클래스나 기본 클래스의 인스턴스 멤버를 지정하는 데 사용되는 키워드입니다. 아래 코드를 고려해보세요:
class InterviewBit{
    String message = " Welcome to InterviewBit";
}
public class Scaler extends InterviewBit
{
    String message = " Welcome to Scaler Academy";
    public void printMethod(){
        //this will print the message variable of the current class.
        System.out.println(this.message);

        //this will print the message variable of Base class.
        System.out.println(super.message);
    }
	public static void main(String[] args) {
		Scaler sa = new Scaler();
		sa.printMethod();
	}
}
이 코드 조각에서 this.message는 " Scaler Academy에 오신 것을 환영합니다 " 라는 메시지를 인쇄 하고 super.message는 " InterviewBit에 오신 것을 환영합니다 "라는 메시지를 인쇄합니다. 이는 이 두 키워드가 기본 클래스와 파생 클래스의 멤버 인스턴스를 참조하는 데 사용되는 방식입니다.

소멸자는 무엇입니까? Java에 소멸자가 있습니까?

소멸자는 프로그램이 획득한 메모리를 해제하는 데 사용됩니다. 예를 들어 프로그램 실행 중에 메모리가 필요한 경우 소멸자는 다른 프로그램이 사용할 수 있도록 해당 메모리를 해제합니다. Java에서 메모리 해제 작업은 가비지 수집기에서 처리되므로 Java에는 소멸자 개념이 없습니다.

Java에서 생성자 연결이란 무엇입니까?

한 생성자가 다른 생성자에서 호출되는 경우 이를 생성자 연결이라고 할 수 있습니다. 생성자 호출은 동일한 클래스에서 이루어질 필요가 없습니다. 이는 상위 클래스에서도 수행될 수 있습니다. 예를 들어 아래 이미지를 살펴보세요. 커피 브레이크 #123.  Java 생성자 - 기술 인터뷰 질문 및 답변 - 2다음으로, 이러한 인스턴스 변수의 값으로 객체를 초기화하는 코드를 살펴볼 수 있습니다.
class EmployeeAddess{
    int pinCode;
    String address;
    String mobNo;
    EmployeeAddress(int pinCode, String address, String mobNo){
        this.pinCode = pinCodel
        this.address = address;
        this.mobNo = mobNo;
    }
}
class Employees extends EmployeeAddress{
    int ID;
    String name;
    String designation;
    String department;
    Employee(int ID, String name, String designation,String department,
                    int pinCode, String address, String mobNo){

        //Calling Constructor for Base class to initialize the object.
        //This can be a constructor chaining.
        super(pinCode, address, mobNo);
        this.ID = ID;
        this.name = name;
        this.designation = designation;
        this.department = department;
    }
}
public class Main{
    Employee emp = new Employee(101, "XYX", "SDE", "Cloud", 123456, "no 150, xys, xys, INDIA", "999999999");
}
위 코드에서는 직원 세부 정보와 주소가 포함된 Employee 클래스 개체를 생성합니다 . Employee 주소 클래스는 Employee 클래스 에 상속됩니다 . 이제 주소에 대한 개체 값을 인스턴스화하기 위해 직원의 주소에 명시적인 값을 할당하지 않습니다. 대신 Employee Address 클래스의 생성자를 사용하여 이 작업을 수행합니다 . 그리고 super(인수) 의 도움으로 우리는 값을 초기화하는 생성자 체인을 형성합니다. 이것이 바로 생성자 체인입니다.

코드의 프로그램 출력을 결정하고 답을 설명하십시오.

class InterviewBit{
void InterviewBit(){
System.out.println(" Java Constructor interview questions by InterviewBit");
}
int InterviewBit(int val){
System.out.println(" Java Constructor. And Value = "+val);
}
}
public class Main{
InterviewBit ib1 = new InterviewBit();
InterviewBit ib2 = new InterviewBit();
}
위의 코드는 여기서 InterviewBit()가 생성자가 아니기 때문에 아무것도 인쇄하지 않습니다 . Voidint 키워드를 사용 하므로 메소드가 됩니다. 그러므로 우리는 메소드를 호출하지 않습니다. 메서드를 실행하려면 개체에서 해당 메서드를 명시적으로 호출해야 하기 때문에 어떤 출력도 얻지 못합니다.

생성자를 사용하여 객체의 값을 새 객체에 복사하는 프로그램을 작성하세요.

class Rectangle{
    int length;
    int breadth;
    Rectangle(int length, int breadth){
        this.length = length;
        this.breadth = breadth;
    }

    //Overloaded Constructor for copying the value of old Object to new object
    Rectangle(Rectangle obj){
        this.length = obj.length;
        this.breadth = obj.breadth;
    }
}
public class Main{
    Rectangle obj1 = new Rectangle(10, 5);

    //New Object of rectangle class will be created with the value from obj1.
    Rectangle obj2 = new Rectangle(obj1);
}
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION