1. 객체 생성

글쎄, 우리는 객체 생성에 도달했습니다. 이전에 이미 이 문제를 접했지만 이제 이 주제를 더 자세히 분석하겠습니다. 실제로 개체를 만드는 것은 매우 쉽습니다.

객체를 생성하려면 new 연산자를 사용해야 합니다 . 객체 생성은 대략 다음과 같습니다.

new Class(arguments)

개체를 생성한 후 우리는 가장 자주 생성된 개체와 동일한 유형을 공유하는 변수에 해당 개체에 대한 참조를 즉시 저장합니다. 즉, 개체를 만들 때 일반적으로 다음과 같은 코드가 표시됩니다.

Class name = new Class(arguments)

새 변수 생성은 어디에 있으며 등호 오른쪽에 있는 코드는 유형이 인 새 객체 생성입니다 .Class nameClass

예:

암호 메모
Object o = new Object();
Object개체 만들기
Cat pet = new Cat();
Cat개체 만들기
Scanner console = new Scanner(System.in)
Scanner개체 만들기

프로그래머는 종종 클래스 이름을 따라 변수 이름을 지정하지만 소문자를 사용합니다. 초보 프로그래머에게 이러한 코드는 혼란스러울 수 있습니다.

암호
BufferedReader bufferedReader = new BufferedReader( reader );
Cat cat = new Cat();
PersonInfo personInfo = new PersonInfo()

이 코드에는 아무런 문제가 없습니다. 이것은 변수가 생성된 다음 동일한 유형의 개체에 의해 즉시 초기화되는 가장 일반적인 코드입니다.

등호 왼쪽에는 변수 생성이 있습니다. 오른쪽은 개체 생성입니다. 그게 다야.

2. 생성자

개체를 만들 때 일부 인수가 자주 전달되는 것을 보셨을 것입니다. 또한 일부 객체에 대해서는 인수가 전달되지만 다른 객체에는 전달되지 않습니다. 인수가 있는 이 전체 메커니즘은 어떻게 작동합니까?

여기서도 모든 것이 간단합니다. 각 클래스에는 개체를 만들 때 전달되는 인수를 처리하는 특수 메서드가 있습니다. 이러한 메서드를 생성자 라고 합니다 . 또는 하나만 이야기할 때: 생성자 .

일반 메서드와 생성자 메서드를 구별하는 것은 쉽습니다. 이 방법에는 두 가지 특징이 있습니다.

  • 생성자의 이름은 해당 클래스의 이름과 동일합니다(대문자로 시작).
  • 생성자에는 반환 유형이 없습니다.

일반적으로 일반적으로 다음과 같습니다.

modifiers Class(arguments)
{
   Code
}

예:

암호 메모
public class Point
{
   public int x;
   public int y;

   Point(int x, int y)
   {
      this.x = x;
      this.y = y;
   }
}
Point클래스




Point클래스 생성자
public class Solution
{
   public static void main(String[] args)
   {
      Point point = new Point(5, 10);
   }
}




클래스 의 개체를 만듭니다 Point. 클래스 생성자가 호출됩니다.

생성자가 어떻게 생겼는지 확인하세요. 반환 유형이 없고 이름이 클래스 이름과 같습니다.

그리고 한 가지 더: 생성자 내부의 코드를 살펴보십시오. 생성자의 매개변수는 클래스의 필드와 동일한 이름(x 및 y)을 가집니다. 새로운 매개변수 이름을 만들지 않는 것이 표준 관행입니다. 이름은 클래스의 필드 이름과 동일합니다. 이름 충돌은 this 키워드를 사용하여 해결됩니다.

3. 생성자 호출

new 연산자와 "new Class ( arguments )" 와 같은 명령을 사용하여 새 개체를 만들 때 두 가지 일이 발생합니다.

  • Java 머신은 유형이 클래스 인 객체를 생성합니다.
  • Java 시스템은 개체의 생성자를 호출하고 인수를 전달합니다.

프로그래머는 클래스에 어떤 생성자가 있어야 하고 이러한 생성자에 어떤 매개변수가 있어야 하는지 결정할 수 있습니다.

동물 보호소에서 고양이를 추적하는 클래스를 만들기로 결정했다고 가정합니다. 그러면 Cat수업은 다음과 같을 수 있습니다.

class Cat
{
   public String name;
   public int age;

   public Cat(String name, int age)
   {
      this.name = name;
      this.age = age;
   }
}
Cat cat = new Cat("Whiskers", 2);
이것은 허용됩니다
Cat cat = new Cat("Whiskers");
그러나 이것은 허용되지 않습니다. 이 코드는 컴파일되지 않습니다.
Cat cat = new Cat();
그리고 이것은 허용되지 않습니다. 이 코드는 컴파일되지 않습니다.

Cat클래스에는 name 및 age 매개 변수가 있는 하나의 생성자만 있습니다. 다른 생성자가 없기 때문에 객체를 생성할 때 고양이 이름( name)과 나이( )를 인자로 전달해야 합니다. age생성자에 인수를 전달하는 것은 선택 사항이 아닙니다 .

4. 다중 생성자

그러나 필요한 경우 클래스에 여러 생성자를 추가할 수 있습니다. 생성자 또는 해당 매개변수의 수에는 제한이 없습니다. 개체를 만들 때 컴파일러는 매개 변수와 일치하는 생성자를 자동으로 선택합니다.

암호 메모
class Cat
{
   public static final int UNKNOWN = -1;
   public String name;
   public int age;

   public Cat(String name, int age)
   {
      this.name = name;
      this.age = age;
   }
   public Cat(String name)
   {
      this.name = name;
      this.age = UNKNOWN; // Unknown
   }
}
Cat cat = new Cat("Whiskers", 2);
이것은 허용됩니다: 첫 번째 생성자가 호출됩니다
Cat cat = new Cat("Whiskers");
이것은 허용됩니다: 두 번째 생성자가 호출됩니다
Cat cat = new Cat();
그러나 이것은 허용되지 않습니다. 이 코드는 컴파일되지 않습니다.

우리는 고양이의 나이를 알 수 없다는 사실을 설명하기로 결정했습니다. UNKNOWN이 경우를 처리하기 위해 고양이 이름이라는 매개변수가 하나만 있는 생성자와 함께 특수 상수를 추가했습니다 .

우리는 여전히 두 생성자 내에서 두 변수를 모두 초기화합니다. 알 수 없는/누락된 매개변수를 상수로 바꿉니다 UNKNOWN.

연령 변수에 값이 지정되지 않은 경우 기본값은 0입니다. 결국 길거리에서 발견된 새끼 고양이는 만 0세일 수 있습니다. 즉, 연령 변수의 0이 반드시 "알 수 없는 연령"을 의미하지는 않습니다.

5. 기본 생성자

개체를 매개 변수 없이 인스턴스화하려면 클래스에서 인수가 없는 생성자를 선언해야 합니다.

매개변수가 없는 생성자는 반드시 코드가 없는 생성자인 것은 아닙니다. 이러한 생성자는 시작 값으로 변수를 초기화하는 코드를 포함할 수 있습니다.

암호 메모
class Cat
{
   public static final int UNKNOWN = -1;
   public String name;
   public int age;

   public Cat(String name, int age)
   {
      this.name = name;
      this.age = age;
   }

   public Cat()
   {
      this.name = "Nameless";
      this.age = UNKNOWN; // Unknown
   }
}
Cat cat = new Cat("Whiskers", 2);
이것은 허용됩니다: 첫 번째 생성자가 호출됩니다
Cat cat = new Cat();
이것은 허용됩니다: 두 번째 생성자가 호출됩니다

기본 생성자

알고 기억해야 할 매우 중요한 점이 있습니다.

클래스가 하나도 생성자를 선언하지 않으면 컴파일러는 기본 생성자를 추가합니다. 이 생성자는 public 한정자가 있는 인수가 없는 생성자입니다.

그러나 클래스가 생성자를 하나만 선언 하면 기본 생성자가 추가되지 않으며 원하는 경우 직접 추가해야 합니다.

암호 메모
class Cat
{
   public String name;
   public int age;
}
Cat cat = new Cat();
이것은 허용됩니다: 기본 생성자가 호출됩니다