Post

[Java] 자바 생성자 개념 정리

[Java] 자바 생성자 개념 정리

생성자란?

생성자는 객체를 생성하는 역할을 하는 클래스의 구성요소이다. 객체를 생성할 때 사용하는 new 키워드가 바로 이 생성자를 호출하는 것이다.
즉, 인스턴스 생성을 담당하는 것은 new 키워드이며, 생성자는 인스턴스 변수들을 초기화하는 데 사용되는 특수한 메서드이다.

  • 객체와 인스턴스
    • 큰 의미 차이를 가지지는 않지만, 엄밀히 말하면 객체는 모든 인스턴스를 포괄하는 넓은 의미를 가지고, 인스턴스는 해당 객체가 어떤 클래스로부터 생성된 것인지를 강조한다.

생성자는 메서드와 비슷한 구조를 가지고 있으나 조건이 붙는다.

  • 생성자의 이름은 반드시 클래스의 이름과 같아야 한다.
  • 생성자는 리턴 타입이 없으며, void 키워드를 사용하지 않는다.
1
2
3
4
5
6
7
8
Car c = new Car(); // Car() 부분이 생성자

c.name = "abd";
c.speed = 100;
c.weight = 10;

// 생성자 사용 시
Car c1 = new Car("abc", 100, 10); //

기본 생성자

기본 생성자는 매개변수가 없는 생성자를 의미한다. 자바 컴파일러는 생성자가 클래스 안에 존재하지 않을 경우, 기본 생성자를 자동으로 추가해준다.

매개변수가 있는 생성자

매개변수가 있는 생성자는 매개변수를 통해 호출해야 하며, 호출 시 해당 값을 받아 인스턴스를 초기화하는 데 사용한다.
new 생성자(값)과 같은 형태로 생성자 매개변수에 알맞은 값을 넣어 생성자를 호출하면 객체를 생성할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
public class Car {
    public static void main(String[] args) {
        Car c = new Car("abc", 100, 10)
    }
}

class Car {
    Car(String n, int s, int w) {
        this.name = n;
        this.speed = s;
        this.weight = w;
    }
}

인스턴스 예제 (정보처리기사 실기 2024년 1회 문제)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class classOne {
    int a, b;

    public classOne(int a, int b) {
        this.a = a;
        this.b = b;
    }

    public void print() {
        System.out.println(a + b);
    }

}
class classTwo extends classOne {
    int po = 3;

    public classTwo(int i) {
        super(i, i+1);
    }

    public void print() {
        System.out.println(po*po);
    }
}

public class main {
    public static void main(String[] args) {
        classOne one = new classTwo(10);
        one.print();
    }
}

클래스 구조

  1. classOne
  • 두 개의 정수 a와 b를 멤버 변수로 가지고 있음.
  • 생성자에서 a와 b를 초기화
  • print 메서드는 a와 b의 합을 출력
  1. classTwo
  • classOne을 상속받음
  • 추가로 po라는 변수를 정의하고 초기값을 3으로 설정
  • 생성자에서 super(i, i+1)을 호출하여 classOne의 생성자를 호출하고 a를 i, b를 i+1로 설정
  • print 메서드는 po의 제곱을 출력
  1. main
  • classTwo의 인스턴스를 classOne 타입으로 참조
  • one.print() 호출

실행 과정

  1. classTwo의 생성자 호출
  • super(i, i+1)가 호출되어 classOne의 생성자 실행, a = 10, b = 11로 초기화
    • super() 메서드?
      • 상속받은 부모의 생성자를 호출하는 메서드.
      • 여기에서는 classTwo (자식 클래스)의 부모인 classOne의 생성자를 호출하여 a와 b를 각각 10, 11로 초기화시킨다.
  1. one.print() 호출
  • one은 classTwo 타입의 객체를 참조하지만, 참조 타입은 classOne
  • 다형성이 작동하여 classTwo의 print 메서드가 호출됨.

즉, 다시 말해 one은 classTwo의 인스턴스를 참조하므로, classTwo의 print 메서드가 호출되는 것이다.

This post is licensed under CC BY 4.0 by the author.