한화시스템/백엔드

[BE] JAVA_클래스와 객체_생성자

jjam-mo 2024. 7. 16. 21:08

 

💡 인스턴스를 생성할 때 초기 수행할 명령이 있는 경우 미리 작성해두고, 인스턴스를 생성할 때 단 한 번 호출되는 함수.
지금까지 인스턴스를 생성할 때 클래스명 레퍼런스변수 = new 클래스명(); 이렇게 사용해왔다.
new 뒤에 클래스명은 사실 생성자(constructor)라는 메소드를 호출하는 구문.
생성자 함수에 매개변수가 없는 생성자를 기본생성자(default constructor)라고 하며, 기본 생성자는 compiler에 의해 자동으로 추가되기 때문에 지금까지 명시적으로 작성하지 않고 사용할 수 있었다.

Constructor(생성자)

package com.ohgiraffers.section04.constructor;

public class Application {
    public static void main(String[] args) {

        /* 수업목표. 생성자 함수가 무엇인지 이해하고 선언 및 호출할 수 있다. */

        /* 필기.
        *   생성자란?
        *    인스턴스를 생성할 때 호출하는 반환형이 없는 함수로 기본 생성자와 매개변수 있는 생성자로 나눌 수 있다.
        * */
        User user1 = new User();        // User() 가 (기본)생성자
        System.out.println(user1.information());

        User user2 = new User("user01", "pass01","피카츄", new java.util.Date());
        System.out.println(user2.information());
    }
}

// 실행 결과
User 객체 생성 됩니다!~
id: null, pwd: null, name: null, enrollDate: null
id: user01, pwd: pass01, name: 피카츄, enrollDate: Tue Jul 16 21:03:48 KST 2024
package com.ohgiraffers.section04.constructor;

public class User {

    // 클래스의 필드 -> 캡슐화까지 적용! 직접 접근 막는다.
    private String id;
    private String pwd;
    private String name;
    private java.util.Date enrollDate;

    /* 설명. 기본 생성자(매개변수가 없는)를 활용한 객체 생성(반드시 명시적으로 써 줄 것!) */
    /* 필기. 이름이 클래스 이름과 같다. 반환형이 없는 메소드. */
    public User() {     // 자동으로 생성
        System.out.println("User 객체 생성 됩니다!~");
    }   // 안에 무엇인가 로직이 있으면 끝나고 객체가 생성된다. 즉, 이걸 통해서 생성되는거다.

    public User(String id, String pwd, String name) {
        this.id = id;
        this.pwd = pwd;
        this.name = name;
    }

    /* 설명. 원하는 필드를 초기화 하는 매개변수 있는 생성자를 활용한 객체 생성 */
    // 둘 중 하나만 실행?? 흐름이 어떻게 되는거지??? -> 매개 변수가 없으면 기본생성자, 매개 변수가 있으면 매개변수 생성자로!!
    public User(String id, String pwd, String name, java.util.Date enrollDate) {

        /* 설명. 생성자 내부의 this.은 이 생성자로 생성될 객체를 뜻한다. */ // 무슨 뜻? -> Application의 user1,2 이런 애들을 this라고 명명
//        this.id = id;
//        this.pwd = pwd;
//        this.name = name;

        /* 설명. this()를 통해 다른 생성자를 활용하여 코드와 줄 수를 줄일 수 있다. */
        /* 설명. this()를 통해 다른 생성자를 활용할 때는 한번만 코드 첫 줄에서 활용할 수 있다. */
        this(id, pwd, name);            // this. 과 this()의 차이점??? 줄 수를 줄인다.
        this.enrollDate = enrollDate;
    }

    public String information() {
        return "id: " + this.id + ", pwd: " + this.pwd + ", name: " + this.name + ", enrollDate: " + this.enrollDate;
    }
}

 

DTO

package com.ohgiraffers.section04.dto;

public class Application {
    public static void main(String[] args) {

        /* 수업목표. 생성자를 이용한 객체 초기화와 설정자를 이용한 초기화의 장단점을 이해할 수 있다.(feat. 자바 빈) */
        UserDTO user1 = new UserDTO();
        System.out.println(user1.toString());
        user1.setId("user01");
        System.out.println(user1.getId());
        System.out.println(user1.toString());   // toString 없어도 있는 걸로 실행된다.
    }
}

// 실행 결과
UserDTO{id='null', pwd='null', name='null', enrollDate=null}
user01
UserDTO{id='user01', pwd='null', name='null', enrollDate=null}
package com.ohgiraffers.section04.dto;

import java.util.Date;

/* 필기.
*   자바빈(Java Bean)이란?
*    JSP에서 사용되는 표준 액션 태그*로 접근할 수 있게 만든 자바 클래스형태이다.
*    자바 코드를 모르는 웹 퍼블리셔들도 자바 코드를 사용할 수 있도록 태그 형식으로 지원하는 문법을 의미하는데,
*    그 때 사용할 수 있도록 규칙을 지정해 놓은 java 클래스를 자바빈(Java bean)이라고 부른다.
*    지금은 특정 목적 및 프레임워크를 위해 클래스를 작성하는 규칙이라고 보면 된다.
* */

// 표준 액션 태그 : 미리 정해진 기능들을 JSP 스펙에 명시함으로써 모든 컨테이너가 동일하게 구현하는 태그

/* 필기.
*   자바빈 작성 규칙
*   1. 자바빈은 특정 패키지에 속해 있어야 함(default 패키지 사용 금지)
*   2. 필드의 접근제어자는 private로 선언해야 함(캡슐화 적용)
*   3. 기본 생성자가 명시적으로 존재해야 한다.(매개변수 있는 생성자는 선택사항)
*   4. 모든 필드에 접근 가능한 설정자(setter)와 접근자(getter)가 public으로 작성되어 있어야 함.
*   5. 직렬화(Serializable 구현)를 고려해야 한다.(선택사항)
* */


public class UserDTO {

    /* 필기. 1. 필드(멤버변수)*/
    private String id;
    private String pwd;
    private String name;
    private java.util.Date enrollDate;

    /* 필기. 2. 생성자(기본생성자 필수로 명시적 작성) */
    public UserDTO() {
    }

    public UserDTO(String id, String pwd, String name, Date enrollDate) {
        this.id = id;
        this.pwd = pwd;
        this.name = name;
        this.enrollDate = enrollDate;
    }

    /* 필기. 3. 설정자(setter)와 접근자(getter) */
    public String getId() {
        return this.id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getPwd() {
        return pwd;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Date getEnrollDate() {
        return enrollDate;
    }

    public void setEnrollDate(Date enrollDate) {
        this.enrollDate = enrollDate;
    }

    /* 필기. 4. 모든 멤버 변수를 하나의 String 문자열로 반환하는 toString() */
    @Override
    public String toString() {
        return "UserDTO{" +
                "id='" + id + '\'' +
                ", pwd='" + pwd + '\'' +
                ", name='" + name + '\'' +
                ", enrollDate=" + enrollDate +
                '}';
    }   // print 안할 수도 있음! 그 외에 사용할 때.

}