JAVA/이론 정리 및 예제

[JAVA/자바] #6_4 생성자(constructor) / 예제

chaewon 2021. 9. 14. 17:15

생성자란?

  • 객체가 heap에 할당될 때 객체 안에서 만들어지는 필드의 초기화를 담당한다.
  • new 연산자를 할 때 실행되는 함수로 초기값을 생성자 함수의 인자로 전달함.
  • 생성자 함수가 매개변수로 전달 받은 값으로 필드를 초기화 하고 객체를 생성해 주기위한 목적

 

생성자 규칙

  • 생성자 선언은 메소드 선언과 유사하나 반환형을 작성하지 않는다. (void, int, char, …)
  • 클래스 이름이랑 똑같이 지정해야 한다.(대/소문자)

 

생성자 종류

  • 기본 생성자(매개변수가 없는 생성자)
    • 작성하지 않은 경우, 클래스 사용시 JVM이 자동으로 생성해준다.
  • 매개변수 있는 생성자
    • 객체 생성시 전달 받은 값으로 객체를 초기화 하기 위해 사용함
    • 매개변수 있는 생성자 작성시 JVM이 기본 생성자 자동 생성 하지 않음
    • 상속에 사용시 반드시 기본 생성자를 작성해야 함
    • 오버로딩을 이용하여 작성
//기본생성자 ([접근제한자] 클래스명(){})
public Product() {}
//매개변수 있는 생성자 ([접근제한자] 클래스명(매개변수){(this.)필드명 = 매개변수})
public Product(String pName, int price, String brand) {
//모든 필드에 대한 setter 역할
this.pName = pName;
this.price = price;
Product.brand = brand;
}

 

this.

  • 모든 인스턴스의 메소드에 숨겨진 채 존재하는 레퍼런스로, 할당된 객체를 가르킨다. 해당 객체의 주소 값을 담고 있다. (= 레퍼런스 변수)
    • 생성된 객체의 주소를 this라고 한다. 객체마다 존재하고 자기 자신의 주소를 보관하고 있다. (집을 찾아가기위해)
//매개변수 있는 생성자 -> 객체 생성과 필드를 초기화하는 두 가지 목적으로 사용한다.
//같은 이름의 생성자 혹은 메소드를 작성하려고 하는 경우 오버로딩을 사용한다.
public User(String userId, String userPwd, String userName) {
//this. 은 메소드 내에 숨겨진 채 존재하는 레퍼런스 변수로,
//할당된 객체 자신의 주소를 저장한다.
//지역변수와 필드 이름이 동일한 경우 지역변수가 우선시 되기 때문에
//필드를 구분하기 위해서 반드시 this.을 명시해 주어야 한다.
this.userId = userId;
this.userPwd = userPwd;
this.userName = userName;
}

 

오버로딩

  • 한 클래스 내에서 라미터선언부가 다른 생성자를 여러 개 정의하는 것.

오버로딩 성립조건

  • 메소드 이름이 같아야한다.
  • 매개변수 선언부가 달라야한다.
    • 매개변수 타입, 개수, 순서
//기본 생성자 -> 필드의 초기화 역할은 수행하지 못하고 객체만 생성할 때 사용
//매개변수 있는 생성자를 1개 이상 작성하게 되면
//자동생성이 되지 않기 때문에 반드시 명시해야 한다.
public User() {} //리턴타입을 명시하게 되면 메소드가 된다. / 대소문자 / ()
//같은 이름의 생성자 혹은 메소드의 경우 에러 발생한다.
/*public User() {}*/
//매개변수 있는 생성자 -> 객체 생성과 필드를 초기화하는 두 가지 목적으로 사용한다.
//같은 이름의 생성자 혹은 메소드를 작성하려고 하는 경우 오버로딩을 사용한다.
public User(String userId, String userPwd, String userName) {
this.userId = userId;
this.userPwd = userPwd;
this.userName = userName;
}

 

this()

  • 같은 클래스의 다른 생성자를 호출할 때 사용 (생성자안에서 첫 줄에 명시)
public User(String userId, String userPwd, String userName, Date enrollDate) {
/*this.userId = userId;
this.userPwd = userPwd;
this.userName = userName;*/
//중복되는 동일한 초기화 하는 내용의 생성자가 존재하는 경우
//this()를 사용할 수 있다.
this(userId, userPwd, userName);
this.enrollDate = enrollDate;
}

 

User.Run

package com.kh.chap04_constructor.user.controller;
import java.util.Date;
import java.util.Scanner;
import com.kh.chap04_constructor.user.model.vo.User;
public class Run {
public static void main(String[] args) {
User u1 = new User();
u1.information();
User u2 = new User("user01", "pass01", "김진호");
u2.information();
User u3 = new User("user02", "pass02", "홍길동", new Date());
u3.information();
Scanner sc = new Scanner(System.in);
System.out.print("아이디를 입력하세요 : ");
String userId = sc.nextLine();
System.out.print("비밀번호를 입력하세요 : ");
String userPwd = sc.nextLine();
System.out.print("이름을 입력하세요 : ");
String userName = sc.nextLine();
User u4 = new User(userId, userPwd, userName, new Date());
u4.information();
}
}