[Java] 생성자(constructor)

Date:     Updated:

카테고리:

태그:

java.png

### 생성자란?

  • 인스턴스를 생성할 때 초기 수행할 명령이 있는 경우 미리 작성해두고, 인스턴스를 생성할 때 호출한다
  • 생성자 함수에 매개변수가 없는 생성자를 기본생성자(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());
    }
}

생성자의 작성 위치

  • 작성 위치는 문법상으로는 클래스 내부에 작성하면 되지만 통상적으로 필드 선언부오 ㅏ메소드 선언부 사이에 작성하는 것이 관례이다

생성자의 사용 목적

  1. 인서턴스 생성 시점에 수행할 명령이 있는 경우 사용한다
  2. 매개변수 있는 생성자의 경우 매개변수로 전달받은 값으로 필드를 초기화하며 인스턴스를 생성할 목적으로 주로 사용된다
  3. 작성한 생성자 외에는 인스턴스를 생성하는 방법을 제공하지 않는다는 의미를 가진다.
    따라서, 인스턴스를 생성하는 방법을 제한하기 위한 용도로 사용할 수 도 있다 (초기값 전달 강제화)

생성자 작성 방법


[표현식]

접근제한자 클래스명(매개변수) {
인스턴스 생성 시점에 수행할 명령 기술(주로 필드를 초기화)
this.필드명 = 매개변수; //설정자(setter) 여러 개의 기능을 한 번의 호출로 수행할 수 있다

생성자 작성 시 주의할 점

  1. 생성자 메소드는 반드시 클래스 이름과 동일해야 한다. 대/소문자까지 같아야함
  2. 생성자 메소드 반환형을 작성하지 않는다.(작성하는 경우 메소드로 인식한다)
  • 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 +
                '}';
    }
}

생성자를 이용한 초기화와 설정자를 이용한 초기화의 장단점을 이해할 수 있다

  • 생성자를 이용한 초기화와 설정자를 이용한 초기화는 각각의 장단점이 존재한다
  1. 생성자를 이용한 초기화
  • 장점 : setter 메소드를 여러 번 호출해서 사용하지않고 단 한번의 호출로 인스턴스를 생성 및 초기화 할 수 있다
  • 단점 : 필드를 초기화할 매개변수의 갯수들 경우의 수 별로 모두 만들어둬야 한다


호출 시 인자가 많아지는 경우 어떠한 값이 어떤 필드를 의미하는지 한 눈으로 보기 힘들다
예) 아이디, 비밀번호, 이름이 모두 ohgiraffers 인 경우

  • new User(“ohgiraffers”, “ohgiraffers”, “ohgiraffers”); 몇 번째 인자가 아이디인지 이름인지 알 수 없다
  1. 설정자를 이용한 초기화
  • 장점 : 필드를 초기화하는 각각의 값들이 어떤 필드를 초기화하는지 명확하게 볼 수 있다


예) 아이디, 비밀번호, 이름이 모두 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)이라고 부른다
  • 지금은 특정 목적에 따라 클레스를 작성하는 규칙이라고 보면 된다

자바빈 작성

  1. 자바빈은 특정 패키지에 속해있어야 함 (default 패키지 사용금지)
  2. 멤버변수의 접근제어자는 private 로 선언해야 함
  3. 기본생성자가 명시적으로 존재해야 한다 (매개변수 있는 생성자는 선택사항)
  4. 모든 맴버변수에 접근 가능한 설정자(setter)와 접근자(getter)가 public 으로 작성되어 있어야한다
  5. 직렬화(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 + '\'' +
                '}';
    }
}

요약. 생성자란 객체를 초기화하고 인스턴스를 생성하는 메소드 또는 함수이다

점점 헷갈리고 어려워 지기 시작한다.. ㅎㅎ 복습 또 복습!!

Java 카테고리 내 다른 글 보러가기

댓글 남기기