[TIL] java - 2

Hyeseong·2023년 5월 17일
0

1. Q 생성자는 메서드의 일부분이야?

네, 생성자는 자바에서 메서드의 일부분입니다. 생성자는 클래스 내부에 선언되는 특수한 종류의 메서드이며, 객체(인스턴스)를 초기화하는 역할을 합니다.

생성자와 일반적인 메서드의 차이점은 다음과 같습니다:

이름: 생성자의 이름은 클래스의 이름과 동일합니다. 이를 통해 생성자는 객체를 생성할 때 호출되며, 객체를 초기화하는 역할을 수행합니다. 메서드는 임의의 이름을 가지며, 호출될 때 해당 메서드의 이름을 사용합니다.

반환 값: 생성자는 반환 값이 없는 특징을 가지고 있습니다. 반환 타입을 명시적으로 선언하지 않으며, 생성자가 호출될 때에는 생성된 객체(인스턴스) 자체를 반환합니다. 일반적인 메서드는 반환 타입을 명시하고, 해당 타입의 값을 반환합니다.

호출 방법: 생성자는 new 키워드를 사용하여 객체를 생성할 때 자동으로 호출됩니다. 객체를 생성할 때 생성자를 명시적으로 호출해야 하며, 생성자가 호출되면 해당 객체의 초기화 작업이 수행됩니다. 일반적인 메서드는 호출 시에 메서드 이름을 사용하여 호출합니다.

오버로딩: 생성자는 오버로딩(Overloading)을 통해 여러 개의 생성자를 가질 수 있습니다. 오버로딩은 같은 이름의 메서드나 생성자를 매개변수의 유형 또는 개수에 따라 다르게 선언하는 것을 의미합니다. 이를 통해 다양한 초기화 방법을 제공할 수 있습니다.

따라서 생성자는 메서드의 일종으로, 클래스 내부에 선언되어 객체의 초기화를 담당하는 특수한 형태의 메서드입니다.

2. Q 생성자는 몇개를 최대 가질수 있어?

자바에서 클래스는 여러 개의 생성자를 가질 수 있습니다. 생성자는 클래스 내부에 선언되는 특별한 메서드이며, 객체(인스턴스)를 초기화하는 역할을 수행합니다.

클래스는 기본적으로 아무 생성자도 선언하지 않았을 경우, 컴파일러에 의해 기본 생성자(default constructor)가 자동으로 생성됩니다. 그러나 클래스에 명시적으로 생성자를 선언하면 기본 생성자가 자동으로 생성되지 않습니다.

클래스는 필요한 만큼의 생성자를 가질 수 있으며, 다양한 매개변수 유형 및 개수를 가진 생성자를 정의할 수 있습니다. 이를 통해 다양한 초기화 방법을 제공하고 객체 생성 시에 필요한 값을 전달할 수 있습니다.

예를 들어, 다음과 같이 클래스에 여러 개의 생성자를 선언할 수 있습니다:

public class MyClass {
    // 기본 생성자
    public MyClass() {
        // 초기화 작업
    }

    // 매개변수가 있는 생성자
    public MyClass(int value) {
        // 초기화 작업
    }

    // 다른 매개변수 유형을 가진 생성자
    public MyClass(String name, int age) {
        // 초기화 작업
    }
}

위의 예시에서 MyClass 클래스는 기본 생성자와 매개변수가 있는 생성자, 그리고 다른 매개변수 유형을 가진 생성자를 가지고 있습니다. 이와 같이 클래스는 필요한 만큼의 생성자를 가질 수 있으며, 객체 생성 시에 적합한 생성자를 사용하여 초기화 작업을 수행할 수 있습니다.

3. Q 자바에서 생성자의 오버로딩이 뭐야?

자바에서 생성자의 오버로딩(Overloading)은 같은 이름을 가지면서 매개변수의 유형 또는 개수가 다른 여러 개의 생성자를 정의하는 것을 말합니다.

생성자 오버로딩을 통해 동일한 클래스 내에서 다양한 초기화 방법을 제공할 수 있습니다. 매개변수의 유형 또는 개수에 따라 호출될 생성자가 자동으로 선택되며, 객체 생성 시에 필요한 인자를 전달하여 생성자를 호출할 수 있습니다.

예를 들어, 다음은 생성자 오버로딩을 사용하여 여러 개의 생성자를 정의하는 예시입니다:

public class MyClass {
    private int value;

    public MyClass() {
        // 매개변수가 없는 생성자
        this.value = 0;
    }

    public MyClass(int value) {
        // int 타입의 매개변수를 받는 생성자
        this.value = value;
    }

    public MyClass(String name, int age) {
        // String과 int 타입의 매개변수를 받는 생성자
        this.value = age * 10;
    }
}

위의 예시에서 MyClass 클래스는 여러 개의 생성자를 가지고 있으며, 매개변수의 유형과 개수에 따라 생성자를 오버로딩하였습니다. 각 생성자는 다양한 초기화 방법을 제공하며, 객체 생성 시에 호출될 생성자는 전달하는 인자의 유형과 개수에 따라 자동으로 선택됩니다.

예를 들어, 다음과 같이 생성자 오버로딩을 활용하여 객체를 생성할 수 있습니다:

MyClass obj1 = new MyClass();                // 매개변수가 없는 생성자 호출
MyClass obj2 = new MyClass(10);              // int 타입의 매개변수를 받는 생성자 호출
MyClass obj3 = new MyClass("John", 25);      // String과 int 타입의 매개변수를 받는 생성자 호출

각 객체 생성 시에 전달하는 인자에 맞는 생성자가 자동으로 선택되어 호출되며, 해당 생성자에 정의된 초기화 작업이 수행됩니다. 생성자 오버로딩을 통해 다양한 초기화 방법을 제공할 수 있습니다.

4. Q 오버로딩이 지원 NO

  • 변수와 필드: 변수나 필드의 경우, 같은 이름을 가지고 매개변수의 유형 또는 개수가 다르더라도 오버로딩이 지원되지 않습니다. 변수나 필드는 유일한 식별자로서 중복될 수 없습니다.

  • 지역 변수: 메서드나 블록 내에서 선언된 지역 변수의 경우, 같은 이름을 가지고 매개변수의 유형 또는 개수가 다른 형태로 오버로딩할 수 없습니다. 지역 변수도 유일한 식별자로서 중복될 수 없습니다.

  • 메서드 반환 유형: 메서드의 반환 유형은 오버로딩에 영향을 주지 않습니다. 즉, 같은 이름의 메서드는 매개변수의 유형 또는 개수가 다르더라도 반환 유형이 다른 경우에도 오버로딩이 지원되지 않습니다.

  • 예외 타입: 메서드가 예외를 던지는 경우, 예외 타입만 다르고 매개변수의 유형 또는 개수가 동일한 메서드를 오버로딩할 수 없습니다. 예외 타입은 메서드 시그니처의 일부가 아니기 때문에 오버로딩에 영향을 주지 않습니다.

  • 생성자와 메서드의 매개변수 이름: 오버로딩에는 매개변수의 이름이 영향을 주지 않습니다. 같은 이름의 매개변수를 가지고 매개변수의 유형 또는 개수가 다른 생성자나 메서드를 오버로딩할 수 없습니다.

5. Q 오버로딩 지원 OK

  • 생성자: 클래스 내의 생성자는 같은 이름을 가지고 매개변수의 유형 또는 개수가 다르면 오버로딩될 수 있습니다.
  • 메서드 : 클래스 내의 메서드도 같은 이름을 가지고 매개변수의 유형 또는 개수가 다르면 오버로딩될 수 있습니다.
  • 연산자 : 특정 연산자에 대해서도 오버로딩이 가능합니다. 예를 들어, + 연산자는 정수형, 실수형, 문자열 등 다양한 유형에 대해서 오버로딩될 수 있습니다.
  • 캐스팅 : 타입 캐스팅에 대해서도 오버로딩이 가능합니다. 다양한 유형 간의 캐스팅 연산을 오버로딩할 수 있습니다.
  • 가변 인자: 메서드 매개변수에 가변 인자(varargs)를 사용할 경우, 해당 메서드는 인자 개수에 따라 오버로딩될 수 있습니다.
  • 생성자와 메서드의 접근 제어자 : 생성자와 메서드의 접근 제어자도 오버로딩에 영향을 줄 수 있습니다. 같은 이름을 가지고 매개변수의 유형 또는 개수가 다르면서, 접근 제어자가 다른 생성자나 메서드를 정의할 수 있습니다.
  • 예외 던지기 : 메서드가 예외를 던지는 경우, 예외 타입에 따라 다른 메서드를 오버로딩할 수 있습니다.
  • 정적 메서드: 정적 메서드도 같은 이름을 가지고 매개변수의 유형 또는 개수가 다르면 오버로딩될 수 있습니다.
  • 인터페이스 메서드 : 인터페이스 내에 메서드도 오버로딩이 가능합니다. 동일한 인터페이스 내에서 같은 이름의 메서드를 매개변수의 유형 또는 개수가 다른 형태로 정의할 수 있습니다.
  • 추상 클래스의 추상 메서드 : 추상 클래스 내에도 오버로딩이 가능한 추상 메서드를 정의할 수 있습니다. 동일한 추상 클래스 내에서 같은 이름의 추상 메서드를 매개변수의 유형 또는 개수가 다른 형태로 정의할 수 있습니다.
  • 상속 관계에서의 메서드 오버로딩 : 상속 관계에 있는 클래스들 간에도 메서드 오버로딩이 가능합니다. 부모 클래스의 메서드와 동일한 이름의 메서드를 자식 클래스에서 매개변수의 유형 또는 개수가 다른 형태로 정의할 수 있습니다.
  • 내부 클래스 : 내부 클래스도 오버로딩이 가능합니다. 내부 클래스는 외부 클래스 내에서 정의되며, 같은 이름을 가지고 매개변수의 유형 또는 개수가 다른 여러 개의 내부 클래스를 정의할 수 있습니다.
  • 제네릭 메서드 : 제네릭 메서드는 메서드 시그니처에 타입 매개변수를 포함하는 메서드입니다. 제네릭 메서드도 매개변수의 유형 또는 개수에 따라 오버로딩될 수 있습니다.
  • 배열 : 배열도 오버로딩이 가능합니다. 다른 유형의 배열을 선언하여 오버로딩된 형태로 사용할 수 있습니다.
  • 열거형 : 열거형은 오버로딩이 가능합니다. 열거형 상수를 처리하기 위한 다양한 메서드를 오버로딩하여 정의할 수 있습니다.
  • Setter와 Getter 메서드 : 클래스에서 인스턴스 변수에 대한 값을 설정하거나 가져오는 Setter와 Getter 메서드도 오버로딩될 수 있습니다. 동일한 이름을 가지고 매개변수의 유형 또는 개수가 다른 Setter와 Getter 메서드를 정의할 수 있습니다.
  • 생성자의 체이닝:생성자를 체이닝하여 오버로딩할 수 있습니다. 한 생성자에서 다른 생성자를 호출하여 초기화하는 방식으로 오버로딩을 구현할 수 있습니다.
  • Lambda 표현식: 자바 8 이상에서는 Lambda 표현식을 사용하여 함수형 인터페이스를 구현할 수 있습니다. Lambda 표현식은 매개변수의 유형 또는 개수에 따라 오버로딩될 수 있습니다.
  • 메서드 참조 : 메서드 참조는 메서드의 참조를 전달하는 방식으로 동작합니다. 메서드 참조는 매개변수의 유형 또는 개수에 따라 오버로딩될 수 있습니다.
  • 제네릭 클래스 : 제네릭 클래스를 정의할 때, 동일한 클래스 이름을 가지고 매개변수의 유형이나 개수에 따라 다른 유형의 클래스를 생성할 수 있습니다.

6. Q. 기본 생성자를 호출하지 않고 클래스를 이용할 수 있는지?

기본 생성자를 호출하지 않고 클래스를 사용하는 것은 일반적으로는 불가능합니다. 생성자는 객체의 초기화를 담당하며, 객체를 생성할 때 반드시 호출되어야 합니다. 따라서 클래스를 사용하려면 해당 클래스의 생성자를 호출하여 객체를 생성해야 합니다.

그러나 클래스의 정적(static) 멤버들(정적 변수 또는 정적 메서드)은 객체의 인스턴스화 없이 사용할 수 있습니다. 정적 멤버들은 클래스 수준에서 존재하므로, 클래스 이름을 통해 직접 접근할 수 있습니다.

예를 들어, 다음과 같이 클래스의 정적 멤버를 사용할 수 있습니다:

public class MyClass {
    public static int myStaticVariable = 10;
    public static void myStaticMethod() {
        System.out.println("Static method called");
    }
}

// 정적 멤버 사용
int value = MyClass.myStaticVariable;
MyClass.myStaticMethod();

위의 코드에서는 MyClass의 객체를 생성하지 않고도 myStaticVariable과 myStaticMethod()을 직접 사용할 수 있습니다. 하지만 일반적인 멤버 변수나 인스턴스 메서드를 사용하려면 해당 클래스의 객체를 생성해야 합니다.

7. Q 자바에서 접근 지정자가 유용하게 사용되는 케이스는?

자바에서 접근 지정자는 클래스 멤버들의 접근을 제어하는 데 사용됩니다. 다른 클래스나 모듈에서 어떤 멤버에 접근 가능한지를 명확하게 정의함으로써 코드의 가독성, 유지 보수성, 안정성을 향상시킬 수 있습니다. 아래는 접근 지정자가 유용하게 사용되는 몇 가지 케이스입니다:

  • 캡슐화(Encapsulation): 접근 지정자를 사용하여 클래스의 내부 상태를 숨길 수 있습니다. 클래스의 내부 구현 세부 사항을 외부로부터 감추고, 필요한 기능에 대한 인터페이스만 노출함으로써 객체 지향적인 캡슐화를 달성할 수 있습니다.

  • 정보 은닉(Information Hiding): 접근 지정자를 통해 멤버 변수를 private로 선언하고, 해당 변수에 대한 접근을 제한할 수 있습니다. 외부에서 직접적으로 접근하지 못하도록 함으로써 데이터의 무결성과 보안을 유지할 수 있습니다.

  • 모듈화(Modularity): 접근 지정자를 사용하여 클래스의 내부를 모듈화할 수 있습니다. 클래스를 작은 부분으로 분할하고, 각 부분에 필요한 접근 수준을 부여함으로써 코드의 모듈화와 재사용성을 높일 수 있습니다.

  • 상속과 다형성 관리: 접근 지정자를 사용하여 상속과 다형성을 관리할 수 있습니다. protected 접근 지정자를 사용하여 서브클래스에서만 접근 가능한 멤버를 정의하거나, public 접근 지정자를 사용하여 외부에서 접근 가능한 메서드를 정의할 수 있습니다.

  • API 설계: 접근 지정자를 사용하여 외부에 노출되는 클래스, 메서드 및 변수를 명시적으로 정의할 수 있습니다. API의 일부를 public으로 선언하여 외부에서 사용 가능한 인터페이스를 제공하고, 나머지 부분은 private으로 선언하여 내부 구현을 감출 수 있습니다.

위의 케이스들은 접근 지정자를 사용하여 코드를 더 구조화하고, 다른 개발자들과의 협업을 원활하게 만들며, 코드의 유지 보수성을 향상시키는 데 도움을 줍니다.

profile
어제보다 오늘 그리고 오늘 보다 내일...

0개의 댓글