목표
Java의 추상클래스와 인터페이스, 자바 컬렉션 API에 대해 이해하고 로그인, 회원가입, 회원정보 수정 기능을 갖춘 데이터베이스 대체 클래스를 제작해봅니다.
내용정리
인터페이스의 사용 이유
- 정보 은닉: 실제 구현 클래스를 몰라도 인터페이스를 통해 사용할 수 있습니다.
- 구현 클래스의 독립성: 인터페이스를 통해 여러 클래스가 독립적으로 구현될 수 있습니다.
- 다형성: 인터페이스를 구현하는 클래스들을 통일된 타입으로 다룰 수 있습니다.
2. 인터페이스와 추상 클래스의 차이점
- 다중 상속: 인터페이스는 다중 상속이 가능하며, 추상 클래스는 단일 상속만 가능합니다.
- 구현: 인터페이스는 메서드의 선언만 있고, 구현이 없습니다. 반면에 추상 클래스는 일부 메서드의 구현이 가능합니다.
- 느슨한 결합: 인터페이스는 구현 클래스와 더 느슨한 결합을 제공합니다.
3. 실무에서의 활용
실무에서는 인터페이스를 통해 여러 클래스들이 통일된 방식으로 동작할 수 있습니다. 예를 들어, DB가 없는 경우에는 자바 컬렉션 API를 사용하여 데이터를 관리할 수 있습니다. 이를 통해 클래스 간의 의존성을 줄이고, 유연하고 확장 가능한 코드를 작성할 수 있습니다.
DAO 클래스: 데이터 액세스 객체(Data Access Object)로, 회원 관리에 필요한 기능들을 구현합니다.
내부에는 HashMap을 사용하여 ID를 키로 하고, 비밀번호와 이름을 값으로 하는 데이터베이스를 관리합니다.
- signUp(String id, String pw, String name): 새로운 회원을 등록하는 메서드입니다. 주어진 ID, 비밀번호, 이름을 받아서 HashMap에 저장합니다.
- signIn(String id, String pw): 회원 로그인을 처리하는 메서드입니다. 주어진 ID와 비밀번호를 사용하여 회원을 인증하고, 인증되면 환영 메시지를 출력합니다.
- modifyInfo(String id, String pw, String newName): 회원 정보를 수정하는 메서드로, 회원을 인증한 후에 새로운 이름으로 정보를 업데이트합니다.
- withdraw(String id, String pw): 회원 탈퇴를 처리하는 메서드로, 회원을 인증한 후에 데이터베이스에서 해당 회원 정보를 삭제합니다.
- main 메서드: 프로그램의 진입점입니다. 사용자에게 메뉴를 제공하고, 입력에 따라 적절한 DAO 메서드를 호출하여 기능을 수행합니다. 반복문을 통해 사용자가 프로그램을 종료할 때까지 계속해서 메뉴를 보여줍니다.
이 프로그램은 간단한 콘솔 기반의 회원 관리 시스템으로, 사용자가 회원 가입, 로그인, 회원 정보 수정, 회원 탈퇴와 같은 기능을 수행할 수 있습니다. 데이터베이스가 없어도 HashMap을 활용하여 데이터를 관리하고, 이를 통해 회원 관리를 구현하였습니다.
더보기
package day04;
import java.util.HashMap;
import java.util.Scanner;
public class DAO {
private HashMap<String, String[]> database; // ID를 키로 하고, [비밀번호, 이름] 배열을 값으로 하는 HashMap
public DAO() {
database = new HashMap<>();
}
// 회원 가입 기능
public void signUp(String id, String pw, String name) {
String[] userInfo = {pw, name};
database.put(id, userInfo);
System.out.println("회원 가입이 완료되었습니다.");
}
// 로그인 기능
public boolean signIn(String id, String pw) {
if (database.containsKey(id)) {
String[] userInfo = database.get(id);
if (userInfo[0].equals(pw)) {
System.out.println("로그인 성공! 환영합니다, " + userInfo[1] + "님");
return true;
} else {
System.out.println("비밀번호가 일치하지 않습니다.");
return false;
}
} else {
System.out.println("존재하지 않는 ID입니다.");
return false;
}
}
// 회원 정보 수정 기능
public void modifyInfo(String id, String pw, String newName) {
if (signIn(id, pw)) {
String[] userInfo = database.get(id);
userInfo[1] = newName;
System.out.println("회원 정보가 수정되었습니다.");
} else {
System.out.println("회원 정보 수정에 실패했습니다.");
}
}
// 회원 탈퇴 기능
public void withdraw(String id, String pw) {
if (signIn(id, pw)) {
database.remove(id);
System.out.println("회원 탈퇴가 완료되었습니다.");
} else {
System.out.println("회원 탈퇴에 실패했습니다.");
}
}
public static void main(String[] args) {
DAO dao = new DAO();
Scanner scanner = new Scanner(System.in);
while (true) {
System.out.println("1. 회원 가입");
System.out.println("2. 로그인");
System.out.println("3. 회원 정보 수정");
System.out.println("4. 회원 탈퇴");
System.out.println("5. 종료");
System.out.print("메뉴를 선택하세요: ");
int menu = scanner.nextInt();
scanner.nextLine(); // 버퍼 비우기
switch (menu) {
case 1:
System.out.print("ID를 입력하세요: ");
String signUpId = scanner.nextLine();
System.out.print("비밀번호를 입력하세요: ");
String signUpPw = scanner.nextLine();
System.out.print("이름을 입력하세요: ");
String signUpName = scanner.nextLine();
dao.signUp(signUpId, signUpPw, signUpName);
break;
case 2:
System.out.print("ID를 입력하세요: ");
String signInId = scanner.nextLine();
System.out.print("비밀번호를 입력하세요: ");
String signInPw = scanner.nextLine();
dao.signIn(signInId, signInPw);
break;
case 3:
System.out.print("ID를 입력하세요: ");
String modifyId = scanner.nextLine();
System.out.print("비밀번호를 입력하세요: ");
String modifyPw = scanner.nextLine();
System.out.print("새로운 이름을 입력하세요: ");
String newName = scanner.nextLine();
dao.modifyInfo(modifyId, modifyPw, newName);
break;
case 4:
System.out.print("ID를 입력하세요: ");
String withdrawId = scanner.nextLine();
System.out.print("비밀번호를 입력하세요: ");
String withdrawPw = scanner.nextLine();
dao.withdraw(withdrawId, withdrawPw);
break;
case 5:
System.out.println("프로그램을 종료합니다.");
System.exit(0);
default:
System.out.println("올바른 메뉴를 선택해주세요.");
}
}
}
}
프로젝트 번외편 생각해보기
- 비밀번호 암호화 vs 복호화
- K & R 스타일 vs BSD(알만) 스타일 vs 호스만 스타일
- 출력(실행 결과)
- 로그아웃이라니! 회원 정보 조회라니!
- collaborate 추가
🤩기본에 충실한 프로젝트를 진행했었는데 이렇게 번외 기능을 더 추가해서 풍부한 서비스를 제공하기로 결정했습니다!
'BackEnd' 카테고리의 다른 글
클라우드 기반 백엔드 기초 : 내가 생각하는 객체 지향이란? (2) | 2024.04.11 |
---|---|
클라우드 기반 백엔드 기초 : 클린코드와 리팩토링 (0) | 2024.04.11 |
클라우드 기반 백엔드 기초 : 페어프로그래밍 (0) | 2024.04.05 |
클라우드 기반 백엔드 기초 : JAVA (2) (0) | 2024.04.04 |
클라우드 기반 백엔드 기초 : JAVA 개요 (0) | 2024.04.03 |