diff --git a/me/day05/practice/Electronic.java b/me/day05/practice/Electronic.java new file mode 100644 index 0000000..54aa545 --- /dev/null +++ b/me/day05/practice/Electronic.java @@ -0,0 +1,105 @@ +package me.day05.practice; + +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.Arrays; +import java.util.Objects; + +public class Electronic { + + enum CompanyName { SAMSUNG, LG, APPLE } + enum AuthMethod { FINGERPRINT, PIN, PATTERN, FACE } + + private static final int MAX_REGISTRATION_NUMBER = 9999; + + private static int registrationNo; + + private String productNo; + private String modelName; + private CompanyName companyName; + private String dateOfMade; + private AuthMethod[] authMethod; + + Electronic () { + registrationNo++; + setDateOfMade(); + setProductNo(); + } + + Electronic (String modelName, CompanyName companyName, AuthMethod[] authMethod) { + this(); + this.modelName = modelName; + this.companyName = companyName; + this.authMethod = authMethod; + } + + private void setDateOfMade(){ + DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("yyMMdd"); + dateOfMade = timeFormatter.format(LocalDate.now()); + } + + private void setProductNo(){ + if (registrationNo > MAX_REGISTRATION_NUMBER) registrationNo = 1; + productNo = dateOfMade + String.format("%4d", registrationNo).replace(" ", "0"); + } + + public boolean isContainsAuthMethod(AuthMethod authMethod){ + for (AuthMethod auth : this.authMethod) + if (authMethod.equals(auth)) return true; + return false; + } + + public String getProductNo() { + return productNo; + } + + public String getModelName() { + return modelName; + } + + public void setModelName(String modelName) { + this.modelName = modelName; + } + + public CompanyName getCompanyName() { + return companyName; + } + + public void setCompanyName(CompanyName companyName) { + this.companyName = companyName; + } + + public String getDateOfMade() { + return dateOfMade; + } + + public AuthMethod[] getAuthMethod() { + return authMethod; + } + + public void setAuthMethod(AuthMethod[] authMethod) { + this.authMethod = authMethod; + } + + @Override + public int hashCode() { + return Objects.hash(productNo, modelName, companyName, dateOfMade, Arrays.hashCode(authMethod)); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) return true; + if (obj == null || getClass() != obj.getClass()) return false; + return Objects.equals(productNo, ((Electronic)obj).productNo); + } + + @Override + public String toString() { + return "Electronic { " + + "productNo=" + productNo + + ", modelName=" + modelName + + ", companyName= " + companyName + + ", dateOfMade=" + dateOfMade + + ", authMethod=" + Arrays.toString(authMethod) + " }"; + } +} diff --git a/me/day05/practice/Electronics.java b/me/day05/practice/Electronics.java new file mode 100644 index 0000000..22986a5 --- /dev/null +++ b/me/day05/practice/Electronics.java @@ -0,0 +1,119 @@ +package me.day05.practice; + +import me.day05.practice.Electronic.AuthMethod; +import me.day05.practice.Electronic.CompanyName; + +import java.util.*; + +public class Electronics { + + private static final Electronic[] EMPTY_ELECTRONIC_LIST = {}; + + private static Electronic[] electronicList; + private static Electronics electronicsInstance; + + private int size; + private int capacity; + + private Electronics(){ + electronicList = EMPTY_ELECTRONIC_LIST; + } + + // TODO: 1. Electronics 클래스의 객체를 싱글톤으로 생성하는 함수를 작성하시오. + public static Electronics getInstance() { + if (electronicsInstance == null) electronicsInstance = new Electronics(); + return electronicsInstance; + } + + // TODO: 2. 전자제품 일련번호 productNo를 통해 인자로 주어진 일련번호에 해당하는 전자제품을 반환하는 함수를 작성하시오. + public Optional findByProductNo(String productNo){ + for (Electronic electronic : electronicList) + if (productNo.equals(electronic.getProductNo())) + return Optional.of(electronic); + + return Optional.empty(); + } + + // TODO: 3. 전자제품들 중 인자로 주어진 제조 회사를 찾아서 하나의 배열에 반환하는 함수를 작성하시오. + public Optional groupByCompanyName(CompanyName company){ + + List temp = new ArrayList<>(); + + for (Electronic electronic : electronicList) + if (electronic.getCompanyName().equals(company)) + temp.add(electronic); + + Electronic[] companyNameGroup = + temp.isEmpty() ? null : listToArray(temp); + + return Optional.ofNullable(companyNameGroup); + } + + public Optional findByCompanyName(CompanyName company){ + for (Electronic electronic : electronicList) + if (company.equals(electronic.getCompanyName())) + return Optional.of(electronic); + + return Optional.empty(); + } + + // TODO: 4. 전자제품들 중 인자로 주어진 인증 방법을 찾아서 하나의 배열에 반환하는 함수를 작성하시오. + public Optional groupByAuthMethod(AuthMethod authMethod){ + + List temp = new ArrayList<>(); + + for (Electronic electronic : electronicList) + if (electronic.isContainsAuthMethod(authMethod)) + temp.add(electronic); + + Electronic[] authMethodNameGroup = + temp.isEmpty() ? null : listToArray(temp); + + return Optional.ofNullable(authMethodNameGroup); + } + + private Electronic[] listToArray(List list){ + Electronic[] array = new Electronic[list.size()]; + + for (int i = 0; i < array.length; i++) + array[i] = list.get(i); + + return array; + } + + public int getSize() { + return size; + } + + public void setSize(int size) { + this.size = size; + } + + public int getCapacity() { + return capacity; + } + + public void setCapacity(int capacity) { + this.capacity = capacity; + } + + @Override + public int hashCode() { + return Objects.hash(Arrays.hashCode(electronicList), size, capacity); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) return true; + if (obj == null || getClass() != obj.getClass()) return false; + return Objects.equals(hashCode(), ((Electronics)obj).hashCode()); + } + + @Override + public String toString() { + return "Users { " + + "size=" + size + + ", capacity=" + capacity + + ", electronicList= " + Arrays.toString(electronicList) + " }"; + } +} diff --git a/me/day05/practice/User.java b/me/day05/practice/User.java new file mode 100644 index 0000000..527500e --- /dev/null +++ b/me/day05/practice/User.java @@ -0,0 +1,126 @@ +package me.day05.practice; + +import java.time.LocalDate; +import java.util.Arrays; +import java.util.Objects; + +public class User { + + private String userId; + private String userPassword; + private String userPhoneNumber; + private String userEmail; + private String userBirthDate; + private Electronic[] electronicDevice; + private LocalDate registerTime; + + User() { + setRegisterTime(); + } + + User(String userId, String userPassword, String userPhoneNumber, String userEmail, String userBirthDate, Electronic[] electronicDevice) { + this(); + this.userId = userId; + this.userPassword = userPassword; + this.userPhoneNumber = userPhoneNumber; + this.userEmail = userEmail; + this.userBirthDate = userBirthDate; + this.electronicDevice = electronicDevice; + } + + private User(String userId, String userPassword, String userPhoneNumber, String userEmail, String userBirthDate, Electronic[] electronicDevice, LocalDate registerTime){ + this.userId = userId; + this.userPassword = userPassword; + this.userPhoneNumber = userPhoneNumber; + this.userEmail = userEmail; + this.userBirthDate = userBirthDate; + this.electronicDevice = electronicDevice; + this.registerTime = registerTime; + } + + private void setRegisterTime() { + registerTime = LocalDate.now(); + } + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getUserPassword() { + return userPassword; + } + + public void setUserPassword(String userPassword) { + this.userPassword = userPassword; + } + + public String getUserPhoneNumber() { + return userPhoneNumber; + } + + public void setUserPhoneNumber(String userPhoneNumber) { + this.userPhoneNumber = userPhoneNumber; + } + + public String getUserEmail() { + return userEmail; + } + + public void setUserEmail(String userEmail) { + this.userEmail = userEmail; + } + + public String getUserBirthDate() { + return userBirthDate; + } + + public void setUserBirthDate(String userBirthDate) { + this.userBirthDate = userBirthDate; + } + + public Electronic[] getElectronicDevice() { + return electronicDevice; + } + + public void setElectronicDevice(Electronic[] electronicDevice) { + this.electronicDevice = electronicDevice; + } + + public LocalDate getRegisterTime() { + return registerTime; + } + + @Override + public int hashCode() { + return Objects.hash(userId, userPassword, userEmail, userBirthDate, Arrays.hashCode(electronicDevice), registerTime); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) return true; + if (obj == null || getClass() != obj.getClass()) return false; + return Objects.equals(hashCode(), ((User)obj).hashCode()); + } + + @Override + public String toString() { + return "User { " + + "userId=" + userId + + ", userPassword=" + userPassword + + ", userPhoneNumber= " + userPhoneNumber + + ", userEmail=" + userEmail + + ", userBirthDate=" + userBirthDate + + ", electronicDevice=" + Arrays.toString(electronicDevice) + + ", registerTime=" + registerTime + " }"; + } + + @Override + protected User clone() { + return new User(userId, userPassword, userPhoneNumber, userEmail, userBirthDate, electronicDevice, registerTime); + } +} + diff --git a/me/day05/practice/Users.java b/me/day05/practice/Users.java new file mode 100644 index 0000000..92fc998 --- /dev/null +++ b/me/day05/practice/Users.java @@ -0,0 +1,78 @@ +package me.day05.practice; + +import java.util.Arrays; +import java.util.Objects; +import java.util.Optional; + +public class Users { + + private static final int DEFAULT_CAPACITY = 10; // Default initial capacity + private static final User[] EMPTY_USER_LIST = {}; + + private static User[] userList; + private static Users usersInstance; + + private int size; + private int capacity; + + private Users(){ + userList = EMPTY_USER_LIST; + } + + // TODO: 1. Users 클래스의 객체를 싱글톤으로 생성하는 함수를 작성하시오. + public static Users getInstance() { + if (usersInstance == null) usersInstance = new Users(); + return usersInstance; + } + + // TODO: 2. 회원 아이디 userId를 통해 인자로 주어진 회원번호에 해당하는 회원을 반환하는 함수를 작성하시오. + public Optional findById(String userId){ + for (User user : userList) + if (userId.equals(user.getUserId())) + return Optional.of(user); + + return Optional.empty(); + } + + // TODO: 3. 인자로 주어진 회원 정보를 깊은 복사 (deepCopy) 하는 함수를 작성하시오. + public User copy(User user) { + User copyUser = findById(user.getUserId()).orElseThrow(NullPointerException::new); // 예외 처리 추가 구현 필요 + return copyUser.clone(); + } + + public int getSize() { + return size; + } + + public void setSize(int size) { + this.size = size; + } + + public int getCapacity() { + return capacity; + } + + public void setCapacity(int capacity) { + this.capacity = capacity; + } + + @Override + public int hashCode() { + return Objects.hash(Arrays.hashCode(userList), size, capacity); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) return true; + if (obj == null || getClass() != obj.getClass()) return false; + return Objects.equals(hashCode(), ((Users)obj).hashCode()); + } + + @Override + public String toString() { + return "Users { " + + "size=" + size + + ", capacity=" + capacity + + ", userList= " + Arrays.toString(userList) + " }"; + } +}