[Java] 생성자(constructor)
카테고리: Java
태그: coding Programming Java
### 생성자란?
- 인스턴스를 생성할 때 초기 수행할 명령이 있는 경우 미리 작성해두고, 인스턴스를 생성할 때 호출한다
- 생성자 함수에 매개변수가 없는 생성자를 기본생성자(default Constructor)라고 하며 기본 생성자는 compiler 에서 자동으로 추가되기 때문에 지금껏 명시적으로 작성하지 않고 사용할 수 있었다
-
인스턴스 생성 시 별도로 수행할 명령이 없었기 때문에 아무것도 작성하지 않은 것이다
- Application.java
package section04.constructor;
public class Application {
public static void main(String[] args) {
// 기본생성자 호출하여 인스턴스 생성 후 필드값 출력
User user1 = new User();
System.out.println(user1.getinformation());
// 매개변수를 전달 받는 생성자를 호출해 인스턴스 생성 후 필드값 출력
User user2 = new User("user01","pass01","홍길동");
System.out.println(user2.getinformation());
}
}
생성자의 작성 위치
- 작성 위치는 문법상으로는 클래스 내부에 작성하면 되지만 통상적으로 필드 선언부오 ㅏ메소드 선언부 사이에 작성하는 것이 관례이다
생성자의 사용 목적
- 인서턴스 생성 시점에 수행할 명령이 있는 경우 사용한다
- 매개변수 있는 생성자의 경우 매개변수로 전달받은 값으로 필드를 초기화하며 인스턴스를 생성할 목적으로 주로 사용된다
- 작성한 생성자 외에는 인스턴스를 생성하는 방법을 제공하지 않는다는 의미를 가진다.
따라서, 인스턴스를 생성하는 방법을 제한하기 위한 용도로 사용할 수 도 있다 (초기값 전달 강제화)
생성자 작성 방법
[표현식]
접근제한자 클래스명(매개변수) {
인스턴스 생성 시점에 수행할 명령 기술(주로 필드를 초기화)
this.필드명 = 매개변수; //설정자(setter) 여러 개의 기능을 한 번의 호출로 수행할 수 있다
생성자 작성 시 주의할 점
- 생성자 메소드는 반드시 클래스 이름과 동일해야 한다. 대/소문자까지 같아야함
- 생성자 메소드 반환형을 작성하지 않는다.(작성하는 경우 메소드로 인식한다)
- User.java
package section04.constructor;
public class User {
private String id;
private String pwd;
private String name;
private java.util.Date enrollDate;
/* 1. 기본생성자(default constructor) */
public User() {
/*
* 수행할 내용이 아무것도 존재하지 않는다.
* 호출 확인을 위한 출력구문만 작성해보자
* 매소드와 같이 수행할 명령들을 작성할 수 있다.
* */
System.out.println("기본 생정자 호출함...");
}
/* 주의사항. 동일한 이름의 생성자 혹은 매소드를 한 클레스 안에서 작성하는 것은 불가능하다.(컴파일에러) */
//public User(){}
/* 2. 매개변수 있는 생성자 */
/* id, pwd, name의 초기화를 담당할 생성자*/
public User(String id, String pwd, String name) {
this.id = id;
this.name = name;
this.pwd = pwd;
System.out.println("id, pwd, name을 초기화하는 생성자 호출됨....");
}
public String getinformation() {
return "user{" +
"id='" + this.id + '\'' +
", pwd='" + this.pwd + '\'' +
", name='" + this.name + '\'' +
", enrollDate=" + this.enrollDate +
'}';
}
}
생성자를 이용한 초기화와 설정자를 이용한 초기화의 장단점을 이해할 수 있다
- 생성자를 이용한 초기화와 설정자를 이용한 초기화는 각각의 장단점이 존재한다
- 생성자를 이용한 초기화
- 장점 : setter 메소드를 여러 번 호출해서 사용하지않고 단 한번의 호출로 인스턴스를 생성 및 초기화 할 수 있다
- 단점 : 필드를 초기화할 매개변수의 갯수들 경우의 수 별로 모두 만들어둬야 한다
호출 시 인자가 많아지는 경우 어떠한 값이 어떤 필드를 의미하는지 한 눈으로 보기 힘들다
예) 아이디, 비밀번호, 이름이 모두 ohgiraffers 인 경우
- new User(“ohgiraffers”, “ohgiraffers”, “ohgiraffers”); 몇 번째 인자가 아이디인지 이름인지 알 수 없다
- 설정자를 이용한 초기화
- 장점 : 필드를 초기화하는 각각의 값들이 어떤 필드를 초기화하는지 명확하게 볼 수 있다
예) 아이디, 비밀번호, 이름이 모두 ohgiraffers 인 경우
User user = new User();
user.setId(“ohgiraffers”);
user.setPwd(“ohgiraffers”);
user.setName(“ohgiraffers”);
호출하는 코드만 봐도 어떤 값이 어떤 필드를 초기화하는 내용인지 쉽게 알 수 있다
- 단점 : 하나의 인스턴스를 생성할 때 한 번의 호출로 끝나지 않는다
상황에 따라 interrupt 등 여러 가지 문제가 발생할 수 있음
- Application
package section04.dto;
public class Application {
public static void main(String[] args) {
/* 1. 생성자를 이용한 초기화 */
UserDTO user = new UserDTO("ohgiraffers", "ohgiraffers", "ohgiraffers");
System.out.println(user.toString());
/* 2. 기본생성자와 설정자를 이용한 초기화 */
UserDTO user2 = new UserDTO();
user2.setId("ohgiraffers");
user2.setPwd("ohgiraffers");
user2.setName("ohgiraffers");
System.out.println("user2 = " + user2.toString());
}
}
자바빈(Java Vean)이란?
- JSP 에서 배우게 될 표준 액션 태그로 접근할 수 있는 자바 클래스이다
- 자바 코드를 모르는 웹 퍼블리셔들도 자바 코드를 사용할 수 있도록 태그 형식으로 지원하는 문법을 의미하는데, 그 때 사용할 수 있도록 규칙을 지정해놓은 java 클래스를 자바빈(java bean)이라고 부른다
- 지금은 특정 목적에 따라 클레스를 작성하는 규칙이라고 보면 된다
자바빈 작성
- 자바빈은 특정 패키지에 속해있어야 함 (default 패키지 사용금지)
- 멤버변수의 접근제어자는 private 로 선언해야 함
- 기본생성자가 명시적으로 존재해야 한다 (매개변수 있는 생성자는 선택사항)
- 모든 맴버변수에 접근 가능한 설정자(setter)와 접근자(getter)가 public 으로 작성되어 있어야한다
- 직렬화(Serializable 구현)가 되어야 한다 (선택사항)
- UserDto
package section04.dto;
public class UserDTO {
/* 맴버변수의 접근제어자는 private로 선언해야 함.*/
private String id;
private String pwd;
private String name;
/* 기본생성자가 명시적으로 존재해야 한다. */
public UserDTO(){}
public UserDTO(String id, String pwd, String name) {
this.id = id;
this.pwd = pwd;
this.name = name;
}
/* 설정자(setter) */
public void setId(String id) {
this.id = id;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public void setName(String name) {
this.name = name;
}
/* 접근자(getter) */
public String getId() {
return id;
}
public String getPwd() {
return pwd;
}
public String getName() {
return name;
}
@Override
public String toString() {
return "UserDTO{" +
"id='" + id + '\'' +
", pwd='" + pwd + '\'' +
", name='" + name + '\'' +
'}';
}
}
댓글 남기기