한화시스템/백엔드
[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 안할 수도 있음! 그 외에 사용할 때.
}