가쟤의 해변일기 🐳

풀스택과정 3주차 - 생성자 오버로딩 | MVC 구조 코드 작성 | 서비스 클래스와 싱글톤 본문

풀스택과정

풀스택과정 3주차 - 생성자 오버로딩 | MVC 구조 코드 작성 | 서비스 클래스와 싱글톤

바닷가쟤 2025. 4. 21. 18:34
💡 2025 04 21

1. 생성자 오버로딩
2. MVC 구조 코드 작성 Review
3. 서비스 클래스와 싱글톤

 

생성자 오버로딩

필수 정보, 필수가 아닌 정보가 있을 수 있는데... 이 때 → 생성자 오버로딩을 사용!

이름, 주소, 아이디, 전화번호 가 있는데, 이름, 아이디만 필수 정보라면 →

이름, 아이디만 있는 메소드, 이름, 주소, 전화번호, 아이디가 있는 메소드..

이렇게 생길 수 있으니 생성자 오버로딩

화면으로부터 입력된 필수 정보만으로 vo 객체를 생성하려면

생성자 오버로딩에 대한 이해와 사용법을 반드시 알아야한다!

서버에서 데이터에 저장하는 값 vo

브라우저에서 서버로 vo로 날리고

DB에 하나의 행(컬럼)으로 들어감

필드에 있는 값이 화면으로 출력

 

생성자명은 동일하고 인자값 리스트는 서로 다르다 --> 생성자 오버로딩

필수값만으로 객체를 생성할 때 사용한다.

 

나머지 필드는 초기화가 안 되기 때문에 기본값

결과적으로 데이터베이스 테이블 컬럼에 기본값이 들어갈 것이다...

 

근데??? 데이터분석에서 중요한 건 null값이 들어가면 안 됨!! → 결측치 제거.. 해야 하는데 이 과정에서 데이터 손실이 일어나니까…

그래서 디폴트 값을 줘야 한다 !!!

 

package com.edu.overloading.test;

import com.edu.overloading.Employee;

public class EmployeeTest1 {

	public static void main(String[] args) {
		Employee e1 = new Employee(232); 
		Employee e2 = new Employee(7369, "SCOTT");
		Employee e3 = new Employee(7521, "ADAMS", 30000.0, "Brandon");

		System.out.println(e1.getDetails());
		System.out.println(e2.getDetails());
		System.out.println(e3.getDetails());
	}
}
package com.edu.overloading;

// 직원에 대한 정보를 저장하는 클래스

public class Employee {
	private int empno;
	private String name;
	private double salary;
	private String address;
	
	/////// 필드 기본값 설정 ///////
	public final static String DEFAULT_NAME = "홍길동"; // 상수값
	public final static double BASIC_SALARY = 100.0;
	public final static String DEFAULT_ADDRESS = "서울시";
	
	/*
	 * Employee 생성자는 3개
	 * 생성자명은 동일하고 인자값 리스트는 서로 다르다
	 * --> 생성자 오버로딩
	 * 
	 * 필수값만으로 객체를 생성할 때 사용
	 */
	
	public Employee(int empno) {
//		this.empno = empno;
		// 생성자() 앞에 쓰이는 this
		this(empno, DEFAULT_NAME, BASIC_SALARY, DEFAULT_ADDRESS);
	};
	
	public Employee(int empno, String name, double salary, String address) {
		this.empno = empno;
		this.name = name;
		this.salary = salary;
		this.address = address;
	}

	public Employee(int empno, String name) {
		this.empno = empno;
		this.name = name;
	}
	
	public String getDetails() {
		return empno + ", " + name + ", " + salary + ", " + address;
	}
	
} // class

싱글톤

: “단 하나의 객체”만 만들도록 강제하는 설계 방법이다.

여러 번 new 해서 객체를 생성하는 것이 아닌,

딱 하나의 인스턴스만 생성해서 모든 곳에서 공유하게 만든다.

 

왜??

 

1. 객체 하나만 있으면 되는 경우

직원 목록 관리, 추가, 검색 등 기능을 하나의 인스턴스에서 공유하면 되니까 굳이 여러 개 만들 필요가 없음 !

 

2. 자원 낭비 줄이기

객체를 계속 만들면 메모리 낭비. 딱 하나만 만들면 효율적 !

클라이언트가 회원가입, 혹은 회원 검색 서비스를 서버에 요청할 수 있다.

이 때 여러 명의 클라이언트가 서비스를 아무리 많이 요청한다고 해도

EmployeeService 인스턴스는 오직 단 하나만 생성 되어야 한다.

이유는 서비스 요청과 연결되는 것은 클래스의 메소드이기 때문이다.

 

즉, 회원가입이 10번 이루어져도 EmployeeService 객체는 단 하나만 생성되고,

그 안에 addEmployee 메소드만 10번 호출된다.

 

이때, 서로 다른 정보를 가지는 vo가 생성되고 함수가 호출될 때 인자값으로 넘겨진다.

하나의 클래스를 통해서 단 하나의 객체만 생성되도록강제하는 패턴싱글톤 패턴이라고 한다.

아주 중요한 패턴으로써 앞으로 많이 사용할 것이다.

 

클라이언트 요청이 있기 전 EmployeeService 객체는 이미 메모리에 한 번 올라가 있다.process 단위로 이해하자.

 

회원가입 요청이 있으면 EmployeeService 클래스 안에 addEmployee 메소드가 요청을 수행한다. → 스레드 단위로 이해하자

 

회원가입이 다 끝나면(서비스 수행이 끝나면) 메소드는 메모리에서 자동으로 소멸된다.

.toString() 주소값 뒤에 기본으로 붙어있음.

주소값을 숫자와 문자의 조합으로 변환해줌.

 

1단계 - 하나 만들기 private static EmployeeService = new EmployeeService();

2단계 - 다른 데서 new 못하게 막기 private EmployeeService()

3단계 - 가져다 쓸 수 있게 제공 public static EmployeeService getInstance()

 

 

Employee.java

package com.edu.vo

public class Engineer {
	private int empno;
	private String name;
	private String mainSkill

	public Engineer() {
	};

	public Engineer(int empno, String name, String mainSkill) {
		this.empno = empno;
		this.name = name;
		this.mainSkill = mainSkill;
	}

	public int getEmpno() {
		return empno;
	}

	public void setEmpno(int empno) {
		this.empno = empno;
	}

	public String getName() {
		return name;
	}

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

	public String getMainSkill() {
		return mainSkill;
	}

	public void setMainSkill(String mainSkill) {
		this.mainSkill = mainSkill;
	}

	public MyDate getBirthDate() {
		return birthDate;
	}

	public void setBirthDate(MyDate birthDate) {
		this.birthDate = birthDate;
	}

	@Override
	public String toString() {
		return "Engineer [empno=" + empno + ", name=" + name + ", mainSkill=" + mainSkill + ", birthDate=" + birthDate
				+ "]";
	}
}

 

SalesMan.java

package com.edu.vo;

public class SalesMan {
	private int empno;
	private String name;
	private int bonus;

	public SalesMan() {
	};

	public SalesMan(int empno, String name, int bonus) {
		this.empno = empno;
		this.name = name;
		this.bonus = bonus;
	}

	public int getEmpno() {
		return empno;
	}

	public void setEmpno(int empno) {
		this.empno = empno;
	}

	public String getName() {
		return name;
	}

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

	public int getBonus() {
		return bonus;
	}

	public void changeBonus(int bonus) {
		this.bonus = bonus;
	}

	public MyDate getBirthDate() {
		return birthDate;
	}

	public void setBirthDate(MyDate birthDate) {
		this.birthDate = birthDate;
	}

	@Override
	public String toString() {
		return "SalesMan [empno=" + empno + ", name=" + name + ", bonus=" + bonus + ", birthDate=" + birthDate + "]";
	}
}

 

HRServiceTest.java

package com.edu.service.test;

import com.edu.service.HRService;
import com.edu.vo.Engineer;
import com.edu.vo.SalesMan;

public class HRServiceTest3 {

	public static void main(String[] args) {
		// 1. HRService 객체를 하나 받아온다.
		HRService service = HRService.getInstance();

		// 2. addEngineer() 호출(3번) - 3명 등록
		service.addEmployee(new Engineer(111, "박영일", "운전"));
		service.addEmployee(new Engineer(222, "박영이", "남땜"));
		service.addEmployee(new Engineer(333, "박영삼", "수리"));

		// 3. addSalesMan() 호출(2번) - 2명 등록
		service.addEmployee(new SalesMan(123, "양관식", 20000));
		service.addEmployee(new SalesMan(234, "박금명", 35000));

		// 4. 2번째 Engineer의 mainSkill을 변경
		service.updateEmployee(new Engineer(222, "박영이", "정비"));

		// 5. 1번째 SaleMan의 bonus를 변경
		service.updateEmployee(new SalesMan(123, "양관식", 55000));

		// 6. 모든 Engineer, SalesMan의 정보를 콘솔로 출력

		System.out.println("=======================");
		service.getEngineers();
		service.getSalesMans();
	}
}
728x90