728x90
반응형
생성자 Constructor
- 객체를 생성할 때 new 연산자 뒤에 붙어서 호출되며, 객체 초기화를 담당하는 메서드의 일종
- 객체 생성 시 단 한 번만 호출 가능(임의로 호출 불가능)
- 메서드와 다른 점
- 생성자의 이름은 반드시 클래스명과 동일해야한다
- 리턴타입을 기술하지 않는다 (void 도 사용하지 않음)
- 클래스 정의 시 생성자를 하나도 정의하지 않을 경우 컴파일러에 의해 기본 생성자 Default Constructor가 자동으로 생성됨 매개변수가 없고, 중괄호 블록 내에 코드가 없는 빈 생성자
생성자 정의 기본 문법
[접근제한자] 클래스명([매개변수...]) {
// 생성자 호출(객체 생성) 시 수행할 코드들...
}
기본 생성자 형태
public 클래스명() {}
/*
* Person 클래스 정의
* 멤버변수 : 이름(name, 문자열), 나이(age, 정수)
*/
class Person {
// 생성자가 하나도 정의되지 않은 클래스는 컴파일러에 의해
// 기본 생성자가 자동으로 생성됨
// public Person() {}
// => 컴파일러에 의해 생성될 기본 생성자
String name;
int age;
}
// 파라미터가 없는 기본 생성자 정의
class DefaultPerson {
String name;
int age;
// 매개변수가 없는 기본 생성자와 동일한 형태의 생성자를 정의
// => 출력문을 사용하여 메세지 출력
public DefaultPerson() {
// DefaultPerson 클래스의 인스턴스가 호출될 때
// 생성자가 호출되며, 내부의 코드가 실행됨
System.out.println("DefaultPerson() 생성자 호출됨!");
// 생성자에서는 주로 멤버변수의 초기화나 다른 메서드의 호출을 통해
// 객체가 실행될 때 수행할 초기 작업을 수행하는 내용이 기술됨
name = "홍길동";
age = 20;
}
}
// 파라미터가 1개 이상인 파라미터 생성자 정의
class ParameterPerson {
String name;
int age;
// 일반 메서드와 동일하게 생성자에 전달할 데이터가 있을 경우
// 생성자 정의 시 파라미터 부분에 매개변수를 선언할 수 있다!
// 이름(newName)과 나이(newAge)를 전달받는 파라미터 생성자 정의
// => "ParameterPerson(String, int) 생성자 호출됨" 출력 후
// 이름과 나이를 멤버변수에 저장
public ParameterPerson(String newName, int newAge) {
System.out.println("ParameterPerson(String, int) 생성자 호출됨!");
// 생성자 호출 시 전달받는 데이터를 사용하여 멤버변수 초기화
name = newName;
age = newAge;
}
// => 파라미터 생성자를 하나라도 정의하게 되면
// 기본 생성자는 더 이상 자동으로 생성되지 않는다!
}
// Person 클래스 인스턴스 생성
// 이름 : "홍길동", 나이 : 20 으로 초기화
Person p = new Person();
// => Person 클래스의 매개변수가 없는 Person() 생성자를 호출
// 만약, Person() 생성자가 없으면 컴파일러에 자동으로 생성
p.name = "홍길동";
p.age = 20;
System.out.println("이름 : " + p.name);
System.out.println("나이 : " + p.age);
System.out.println("-------------------------");
DefaultPerson dp = new DefaultPerson();
// new DefaultPerson() 코드에 의해 객체 생성 시점에서
// DefaultPerson() 생성자가 호출됨
System.out.println("이름 : " + dp.name);
System.out.println("나이 : " + dp.age);
System.out.println("------------------------");
// 파라미터 2개(String, int)를 전달받는 생성자 ParameterPerson() 호출
ParameterPerson pp = new ParameterPerson("홍길동", 20);
// => 객체 생성 시 전달된 데이터를 사용하여 생성자에서 초기화 수행
System.out.println("이름 : " + pp.name);
System.out.println("나이 : " + pp.age);
// 파라미터 생성자가 1개 존재하는 클래스의 기본 생성자를 호출하면
// 자동으로 생성되지 않기 때문에 컴파일 에러 발생한다!
// ParameterPerson pp2 = new ParameterPerson(); // 컴파일 에러 발생!
// => The constructor ParameterPerson() is undefined
생성자 오버로딩
- 메서드 오버로딩과 기본적인 규칙 및 동작이 동일함
- 객체 생성 시 다양한 타입 및 갯수의 파라미터를 갖는 여러 생성자를 호출하여 다양한 초기화를 수행하는 용도로 사용
class Person2 {
String name;
int age;
// 1. 기본 생성자 정의
// => Person2() 생성자 호출됨! 출력
public Person2() {
System.out.println("Person2() 생성자 호출됨!");
}
// 2. 이름(newName)을 전달받아 초기화하는 생성자 정의
// => Person2(String) 생성자 호출됨! 출력 및 이름 초기화
public Person2(String newName) {
System.out.println("Person2(String) 생성자 호출됨!");
name = newName;
}
// 3. 이름(newName)과 나이(newAge)를 전달받아 초기화하는 생성자 정의
// => Person2(String, int) 생성자 호출됨! 출력 및 이름, 나이 초기화
// public Person2(String newName, int newAge) {
// System.out.println("Person2(String, int) 생성자 호출됨!");
// name = newName;
// age = newAge;
// }
// 생성자 자동 생성 단축키 : Alt + Shift + S -> O
public Person2(String name, int age) {
System.out.println("Person2(String, int) 생성자 호출됨!");
this.name = name;
this.age = age;
}
// 멤버변수(이름, 나이)를 출력하는 print() 메서드 정의
public void print() {
System.out.println("이름 : " + name);
System.out.println("나이 : " + age);
}
}
Person2 p1 = new Person2();
p1.print();
System.out.println("-----------------------");
Person2 p2 = new Person2("홍길동");
p2.print();
System.out.println("-----------------------");
Person2 p3 = new Person2("이순신", 44);
p3.print();
상속에서의 생성자
- 생성자는 상속되지 않는다. 생성자의 이름은 자신의 클래스 이름과 동일해야하므로 부모의 생성자를 상속받으면 클래스 이름과 다르기 때문이다
- 서브클래스의 ****인스턴스를 생성하기 위해 생성자를 호출하면 암묵적으로 슈퍼클래스의 ****인스턴스가 생성되고 슈퍼클래스의 ****생성자를 호출하여 작업을 수행한 후 서브클래스 생성자 내의 코드가 실행됨
class Person {
// => Person 클래스는 별도의 상속이 표시되지 않았으므로
// 자동으로 Object 클래스를 상속받는다!
String name;
int age;
// 기본 생성자 정의
public Person() {
// Object 클래스의 기본 생성자 Object() 가 자동으로 먼저 호출됨
System.out.println("생성자 Person() 호출됨!");
}
// name, age 를 파라미터로 갖는 파라미터 생성자 정의
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
// Person 클래스를 상속받는 SpiderMan 클래스 정의
class SpiderMan extends Person {
public SpiderMan() {
// 서브클래스 생성자 호출 시 다른 코드를 실행하기 전
// 먼저 슈퍼클래스의 생성자가 자동으로 호출됨
// => Person() 생성자 호출됨
System.out.println("생성자 SpiderMan() 호출됨!");
}
public void fireWeb() {
System.out.println("거미줄 발사!");
}
}
// 아무런 생성자도 정의하지 않고, 생성자가 상속되지 않았으므로
// 컴파일러에 의해 기본 생성자가 자동으로 생성됨
SpiderMan s = new SpiderMan();
// 생성자가 상속되지 않았으므로
// 파라미터 생성자는 SpiderMan 클래스에 존재하지 않는다.
// SpiderMan s2 = new SpiderMan("피터 파커", 20); // 오류 발생!
728x90
반응형
'프로그래밍 언어 > JAVA' 카테고리의 다른 글
[JAVA] 자바의 상속 Inheritance (0) | 2021.01.18 |
---|---|
[JAVA] 자바의 패키지 Package (0) | 2021.01.18 |
[JAVA] 자바의 접근제한자 Access Modifier (0) | 2021.01.18 |
[JAVA] 자바의 클래스 Class (0) | 2021.01.18 |
[JAVA] 자바의 메서드 Method (0) | 2021.01.18 |