java - 생성자

yunzivv·2025년 3월 13일

JAVA 기초

목록 보기
13/23

생성자

클래스 게시물과 이어지는 내용 이전글. java-클래스


java의 생성자인스턴스의 필드를 초기화 시키는 메서드다.
클래스는 생성자를 무조건 1개 이상 가지고, 인스턴스의 생성과 동시에 생성자가 실행되어 필드를 초기화시킨다. 난 지금까지 생성자라는 메서드를 만든적이 없는데? 라고 할 수 있다. 생성자를 직접 구현하지 않는다면 컴파일러는 기본 생성자를 만들어 실행한다.

생성자는 인스턴스를 만드는 순간 자동으로 실행된다. 지금까지 인스턴스를 만드려고 작성했던 코드가 생성자를 실행하는 코드였다.

Myclass class1 = new Myclass();
//                  ---------- 이부분!!

실제로 다른 메서드와 작성방식이 같은 것을 알 수 있다.


1. 특징


  1. 생성자는 클래스명과 같은 이름을 가진다.
  2. 리턴타입과 리턴밸류가 없다.
  3. 매개변수를 가질 수 있다.
  4. 하나의 클래스가 생성자를 여러개 가질 수 있다. -> 메서드 오버로딩이 가능하다.
  5. 상속되지 않는 유일한 메서드다.

2. 선언


생성자는 인스턴스 생성과 동시에 실행이 되고, 매개변수를 가질 수 있다. 인스턴스를 만들 때 new 클래스명() 괄호 안에 인수를 전달하고 생성자는 매개변수로 전달받아 필드 초기화에 사용할 수 있다.

// Main 클래스 
frog frog1 = new frog("keroro"); // 1 
class frog { // 2 
	String name; // 2-1
	frog (String s) { // 2-2
    	this.name = s; // 2-3
    }
}
  1. frog 인스턴스를 만들어 frog1에 저장한다.
  2. frog인스턴스는 생성과 동시에 2-2 생성자를 호출한다.
  3. 생성자는 문자열을 매개변수로 받아 필드 name을 전달받은 매개변수로 초기화한다.

-> 이 3단계는 1번 코드에서 모두 실행이된다.


3. 상위 클래스의 생성자


상위 클래스에 사용자가 정의한 생성자가 있고, 상위 클래스를 상속받는 하위클래스에도 새로 정의한 생성자가 있다고 가정해보자. 모르겠으면 아래 코드랑 보자.

class higher {
	higher() {
    	System.out.println("상위 클래스 생성자 실행");    
    }
}

class lower extends higher {
	lower() {
    	System.out.println("하위 클래스 생성자 실행");
    }
}

이런 클래스가 두개 있고 메인 클래스에서 하위 클래스 인스턴스를 생성한다면 어떤 실행이 될까.

// Main 클래스 
lower lower1 = new lower(); 

일단 생성자는 인스턴스가 생성되면 자동으로 실행된다고 했으니 하위클래스 생성자 실행 문장이 출력될 것이다. 인스턴스를 만들 때 하위클래스로 만들었으니 상위클래스의 생성자는 관련이 없을 것 같다고 생각했다.
출력을 해보면 아래와 같다.

// 출력 터미널
상위클래스 생성자 실행
하위클래스 생성자 실행

실제로 프로그램을 돌려보면 상위클래스 생성자 실행이 먼저 출력되고 하위클래스 생성자 실행이 다음으로 출력되는 결과를 볼 수 있다.

하위 클래스의 인스턴스가 생성되면 상속 받는 상위 클래스의 생성자도 함께 실행된다.


4. static 생성자


클래스 변수 즉, static 키워드가 붙은 변수는 static 변수 전용 생성자가 필요하다. static 생성자는 아래과 같은 특징을 가진다.

  1. 프로그램이 실행될 때 한 번만 실행이되며, 호출 할 수 없다.
  2. 매개변수가 없다.
class a {
	static { // 단 한 번만 실행
    }
    
	a() { // 인스턴스가 생성될 때마다 실행
    }
}

5. Constructor Call


한 클래스가 생성자를 여러개 갖고 있는 경우, 한 생성자 내부에서 다른 생성자를 호출할 수도 있다. 다른 생성자를 호출하는 것을 Constructor Call이라고 한다.

생성자에서 다른 생성자를 호출하는 것은 한 번만 가능하다. (연계는 가능) 또 Constructor Call은 첫 줄에 위치해야한다. (생성자를 두 번 호출할 경우 첫줄에 위치하지 못함)

class a {
	a() { // 생성자 1
    	this(3)
    }
	a(int i) { // 생성자 2
    	this(i, 3)
    }
	a(int i, int j) { // 생성자 3
    }
}

만약 매개변수 없이 인스턴스가 생성되었다면 생성자 1이 실행되고 내부에서 생성자 2를 호출한다. 생성자 2는 다시 생성자 3을 호출하여 실행된다.

Constructor Call



모든 클래스는 생성자를 1개 이상 가진다는 것을 알았을 때, 지금까지는 클래스 안에 생성자 메서드를 구현한 적이 없는데? 라고 생각했다. 컴파일러가 직접 만들어서 사용할 줄이야.. (사용자가 작성한 코드에는 보이지 않음) 기본 생성자는 매개변수를 갖지 않고 필드를 기본값으로 초기화한다. 그래서 생성자 없이 객체를 만들어 냈다고 생각할 수 있지만 사실은 생성자가 있었음........

참고 자료


참고 1
참고 2

0개의 댓글