JAVA_BEAN, VO, DTO

JW__1.7·2022년 8월 3일
0

JAVA 공부일지

목록 보기
19/30

Bean

  • 값을 가지고 있는 객체 (BEAN, VO, DTO와 같은 말)

setter

  • 필드는 private하기 때문에 외부에서 직접 접근하는 것이 불가능
  • 외부에서 필드에 접근할 수 있도록 만들어 두는 메소드
    • 외부로부터 전달 받은 값을 필드에 저장하는 메소드
    • set + 필드명의 메소드명을 가짐
    • 매개변수명과 필드명을 동일하게 구성하기 때문에 this가 사용
package ex01_setter;
public class User {
	
	private int userNo;
	private String id;
	private String email;
	
	public int getUserNo() {
		return userNo;
	}
	public void setUserNo(int userNo) {
		this.userNo = userNo;
	}
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	
	@Override
	public String toString() {
		return "User [userNo=" + userNo + ", id=" + id + ", email=" + email + "]";
	}	
}
package ex01_setter;
public class Main {
	public static void main(String[] args) {

		// Bean - 값을 가지고 있는 객체 (BEAN, VO, DTO와 같은 말)
		
		User user = new User();
		user.setUserNo(1);
		user.setId("admin");
		user.setEmail("admin@naver.com");
		
		System.out.println(user);
	}
}

반환값

User [userNo=1, id=admin, email=admin@naver.com]

constructor

  • 객체(Object)를 생성할 때 사용되는 특별한 메소드
  • 생성자 특징
    • 클래스의 이름과 메소드의 이름이 같음
    • 반환타입이 없음
    • 객체가 생성될 때(new) 자동으로 한 번만 호출
    • 매개변수 처리는 일반 메소드와 동일
    • 매개변수로 전달된 값을 이용해서 객체의 필드값을 초기화할 때 사용
package ex02_constructor;
public class User {
	
	private int userNo;
	private String id;
	private String email;
	
	public User(int userNo, String id, String email) {
		super();
		this.userNo = userNo;
		this.id = id;
		this.email = email;
	}
	
	@Override
	public String toString() {
		return "User [userNo=" + userNo + ", id=" + id + ", email=" + email + "]";
	}	
}
package ex02_constructor;
public class Main {
	public static void main(String[] args) {

		User user = new User(1, "admin", "admin@naver.com");		
		System.out.println(user);		
	}
}

반환값

User [userNo=1, id=admin, email=admin@naver.com]

singleton 패턴

  • 하나의 객체를 생성하면 생성된 객체를 어디서든 참조할 수 있지만, 여러 프로세스가 동시에 참조할 수는 없다.
  • 클래스 내에서 인스턴스가 하나뿐임을 보장하며, 불필요한 메모리 낭비를 최소화할 수 있다.
package ex03_singleton;
public class User {
	
	// static 필드
	// 객체 생성 이전에 메모리에 미리 만들어 두는 필드
	private static User user = new User();
	
	private User() {	// User 객체 생성은 User 내부에서만 가능하다.
		
	}
	
	// static 메소드 (클래스 메소드)
	// 클래스가 생성될 때 함께 생성되는 메소드
	// 객체 생성 이전에 만들어지기 때문에 객체로 접근하지 않는다.
	// 클래스 이름으로 접근한다.
	// User user = User.getInstance(); 오직 이 방법으로만 가져다 사용할 수 있다.
	// 외부에서 new User 만들지 못한다.
	public static User getInstance() {	// User 타입의 user를 받겠다.
		return user;
	}
}
package ex03_singleton;
public class Main {

	public static void main(String[] args) {

		// singleton 객체는 하나만 생성된다.
		// new User를 막는 방법
		
		// 아래 둘은 같은 객체이다.
		User user1 = User.getInstance();
		System.out.println(user1);
		
		User user2 = User.getInstance();
		System.out.println(user2);
		
		// User user = new User(); 외부에서는 새로운 객체를 생성할 수 없다.		
	}
}

반환값

ex03_singleton.User@26f0a63f
ex03_singleton.User@26f0a63f

builder 패턴

  • 작게 분리된 인스턴스를 건축하듯이 조합하여 객체를 생성한다.
  • 객체의 생성 과정과 표현 방법을 분리하고 있어, 동일한 객체 생성에서도 서로 다른 결과를 만들어 낼 수 있다.

장점

  • 필요한 데이터만 설정 가능
  • 유연성 확보
  • 가독성
  • 변경 가능성 최소화
package ex04_builder;
public class User {
	
	// 필드 (Builder 객체가 가진 값을 받아 옴)
	private int userNo;
	private String id;
	private String email;
	
	// Builder 클래스의 build() 메소드가 호출하는 생성자
	public User(Builder builder) {		
		this.userNo = builder.userNo;
		this.id = builder.id;
		this.email = builder.email;
	}
	
	// Builder 반환 메소드
	public static Builder builder() {
		return new Builder();
	}
	
	// User 클래스 내부에 Builder 클래스 생성
	// User 클래스를 이용해서 호출하기 위해 static 처리
	public static class Builder{
		
		// 내부 필드 (여기에 값을 전달 받아서 User의 필드로 보내는 원리)
		private int  userNo;
		private String id;
		private String email;
		
		// userNo() 메소드
		public Builder userNo(int userNo) {
			this.userNo = userNo;
			return this;
		}
		
		// id() 메소드
		public Builder id(String id) {
			this.id = id;
			return this;
		}
		
		// email() 메소드
		public Builder email(String email) {
			this.email = email;
			return this;
		}
		
		// build() 메소드
		public User build() {
			return new User(this);	// this는 Builder 객체(userNo, id, email을 가지고 있는 객체)를 의미
		}
	
	}	// class Builder

	@Override
	public String toString() {
		return "User [userNo=" + userNo + ", id=" + id + ", email=" + email + "]";
	}	// 정보 확인용	
}
package ex04_builder;
public class Main {
	public static void main(String[] args) {

		User user = User.builder()
				.userNo(1)
				.id("admin")
				.email("admin@naver.com")
				.build();
		
		System.out.println(user);
	}
}

반환값

User [userNo=1, id=admin, email=admin@naver.com]

lombok

  • 편집기와 빌드 도구에 자동으로 연결되어 자바를 향상시켜주는 자바 라이브러리

  • 주요 Annotation

사용 방법

  • 프로젝트 우클릭 - [Build Path] - [Libraries]탭 - Classpath선택 - [Add External JARs…] 클릭


package ex05_lombok;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder
@ToString
public class User {
	private int userNo;
	private String id;
	private String email;
}
package ex05_lombok;
public class Main {
	public static void main(String[] args) {

		// 방법 1
		User user1 = new User();
		user1.setUserNo(1);
		user1.setId("admin");
		user1.setEmail("admin@naver.com");
		System.out.println(user1);
		
		// 방법 2
		User user2 = new User(1, "admin", "admin@naver.com");
		System.out.println(user2);
		
		// 방법 3
		User user3 = User.builder()
				.userNo(1)
				.id("admin")
				.email("admin@naver.com")
				.build();
		System.out.println(user3);
	}
}

반환값

User(userNo=1, id=admin, email=admin@naver.com)
User(userNo=1, id=admin, email=admin@naver.com)
User(userNo=1, id=admin, email=admin@naver.com)

0개의 댓글