Java ArrayList로 회원 관리 프로그램 만들기: 초보자를 위한 완벽 가이드

Java ArrayList로 회원 관리 프로그램 만들기: 시작하기

프로그래밍 학습의 즐거움은 배운 지식을 활용해 실제로 동작하는 프로그램을 만들어보는 데 있습니다. 특히, 많은 개발자가 처음 접하는 핵심 데이터 구조 중 하나인 ArrayList를 이용하면 간단하면서도 유용한 회원 관리 프로그램을 만들 수 있습니다. 이 글에서는 Java ArrayList를 사용하여 회원 정보를 효과적으로 관리하는 프로그램을 어떻게 만들 수 있는지, 초보자도 쉽게 이해할 수 있도록 단계별로 안내해 드리겠습니다.

왜 ArrayList를 사용해야 할까요?

ArrayList는 Java에서 가장 흔하게 사용되는 동적 배열 컬렉션입니다. 일반적인 배열과 달리, ArrayList는 크기가 고정되어 있지 않아 요소를 추가하거나 삭제할 때마다 자동으로 크기를 조절합니다. 이는 회원 정보가 늘어나거나 줄어들 때마다 유연하게 대처할 수 있다는 큰 장점을 가집니다. 또한, 데이터를 쉽게 추가, 삭제, 검색, 수정할 수 있는 다양한 메서드를 제공하여 회원 관리 프로그램 개발에 매우 효율적입니다.

회원 관리 프로그램, 무엇을 만들 건가요?

우리가 만들 회원 관리 프로그램은 기본적인 CRUD(Create, Read, Update, Delete) 기능을 수행합니다.

  • Create (등록): 새로운 회원의 정보를 입력받아 저장합니다.

  • Read (조회): 저장된 모든 회원의 목록을 보여주거나, 특정 회원을 이름이나 ID로 검색하여 보여줍니다.

  • Update (수정): 기존 회원의 정보를 새로운 내용으로 변경합니다.

  • Delete (삭제): 특정 회원의 정보를 목록에서 제거합니다.

이 모든 기능을 ArrayList를 활용하여 구현할 것입니다.

1단계: 회원 정보 표현을 위한 클래스 설계

회원 관리 프로그램의 핵심은 ‘회원’이라는 데이터를 어떻게 표현하고 저장할 것인가입니다. 각 회원은 이름, 전화번호, 이메일 주소 등 여러 정보를 가지고 있을 수 있습니다. 이러한 정보를 묶어서 하나의 ‘객체’로 다루기 위해 Java의 클래스를 사용합니다.

Member 클래스 만들기

Member라는 이름의 클래스를 만들고, 회원 정보를 담을 필드(변수)를 선언합니다.

public class Member {

private String name;

private String phoneNumber;

private String email;

// 생성자 (객체를 만들 때 초기값을 설정)

public Member(String name, String phoneNumber, String email) {

this.name = name;

this.phoneNumber = phoneNumber;

this.email = email;

}

// 각 필드에 접근하기 위한 Getter 메서드

public String getName() {

return name;

}

public String getPhoneNumber() {

return phoneNumber;

}

public String getEmail() {

return email;

}

// 회원의 정보를 보기 좋게 출력하기 위한 toString() 메서드 오버라이딩

@Override

public String toString() {

return "이름: " + name + ", 전화번호: " + phoneNumber + ", 이메일: " + email;

}

}
  • private 접근 제어자: 필드를 private으로 선언하여 외부에서 직접 접근하지 못하도록 합니다. 대신 public 메서드인 Getter를 통해 값을 읽어올 수 있습니다. 이는 데이터의 무결성을 유지하는 데 도움이 됩니다.

  • 생성자: Member 객체를 생성할 때 이름, 전화번호, 이메일 정보를 받아 초기화하는 역할을 합니다.

  • toString() 메서드: ArrayList에 저장된 Member 객체를 출력할 때, 객체 자체 대신 사람이 읽기 쉬운 형태로 회원 정보를 보여주기 위해 재정의합니다.

2단계: 회원 정보를 저장할 ArrayList 준비

이제 Member 객체들을 담을 ArrayList를 준비해야 합니다. ArrayList는 제네릭(Generic)을 사용하여 어떤 타입의 객체를 저장할지 명시할 수 있습니다. 여기서는 Member 타입의 객체들을 저장할 것이므로 ArrayList<Member>와 같이 선언합니다.

MemberManagement 클래스 만들기

회원 관리 프로그램의 전체 로직을 담을 MemberManagement 클래스를 만듭니다. 이 클래스 안에 ArrayList<Member>를 선언하고, 회원 관리 기능을 위한 메서드들을 구현할 것입니다.

import java.util.ArrayList;

import java.util.List; // List 인터페이스를 사용하기 위해 import

import java.util.Scanner; // 사용자 입력을 받기 위해 import

public class MemberManagement {

// Member 객체를 저장할 ArrayList 선언

private List<Member> memberList = new ArrayList<>();

private Scanner scanner = new Scanner(System.in); // 사용자 입력을 위한 Scanner 객체

// 메인 메서드: 프로그램 시작점

public static void main(String[] args) {

MemberManagement manager = new MemberManagement();

manager.run(); // 프로그램 실행

}

// 프로그램 실행 로직

public void run() {

int choice;

do {

printMenu(); // 메뉴 출력

choice = scanner.nextInt();

scanner.nextLine(); // 버퍼 비우기

switch (choice) {

case 1:

addMember(); // 회원 등록

break;

case 2:

displayAllMembers(); // 전체 회원 조회

break;

case 3:

findMemberByName(); // 회원 이름으로 조회

break;

case 4:

updateMember(); // 회원 정보 수정

break;

case 5:

deleteMember(); // 회원 삭제

break;

case 6:

System.out.println("프로그램을 종료합니다.");

break;

default:

System.out.println("잘못된 입력입니다. 1부터 6까지의 숫자를 입력해주세요.");

}

} while (choice != 6);

scanner.close(); // Scanner 닫기

}

// 메뉴 출력 메서드

private void printMenu() {

System.out.println("\n===== 회원 관리 프로그램 =====");

System.out.println("1. 회원 등록");

System.out.println("2. 전체 회원 조회");

System.out.println("3. 회원 이름으로 조회");

System.out.println("4. 회원 정보 수정");

System.out.println("5. 회원 삭제");

System.out.println("6. 프로그램 종료");

System.out.print("선택: ");

}

// TODO: 아래에 각 기능별 메서드 구현

}
  • List<Member> memberList = new ArrayList<>();: ArrayListList 인터페이스 타입으로 선언하는 것이 좋은 프로그래밍 습관입니다. 이렇게 하면 나중에 다른 List 구현체(예: LinkedList)로 변경해야 할 때 코드 수정량을 최소화할 수 있습니다.

  • Scanner scanner = new Scanner(System.in);: 사용자로부터 키보드 입력을 받기 위해 Scanner 클래스의 객체를 생성합니다.

  • run() 메서드: 프로그램의 메인 루프입니다. 사용자에게 메뉴를 보여주고, 선택에 따라 해당 기능을 수행하는 메서드를 호출합니다. do-while 루프를 사용하여 사용자가 6번(종료)을 선택할 때까지 반복합니다.

  • printMenu() 메서드: 사용자에게 제공할 메뉴 옵션을 화면에 출력합니다.

  • scanner.nextLine();: nextInt() 메서드 호출 후에는 입력 버퍼에 개행 문자(\n)가 남아있습니다. 이를 제거하기 위해 scanner.nextLine()을 호출하여 버퍼를 비워주는 것이 중요합니다. 그렇지 않으면 다음 nextLine() 호출 시 빈 문자열이 입력되는 문제가 발생할 수 있습니다.

3단계: 회원 등록 기능 구현 (Create)

새로운 회원을 memberList에 추가하는 기능을 구현합니다.

// 1. 회원 등록 메서드

private void addMember() {

System.out.println("\n--- 회원 등록 ---");

System.out.print("이름: ");

String name = scanner.nextLine();

System.out.print("전화번호: ");

String phoneNumber = scanner.nextLine();

System.out.print("이메일: ");

String email = scanner.nextLine();

// 입력받은 정보로 새로운 Member 객체 생성

Member newMember = new Member(name, phoneNumber, email);

// ArrayList에 새로운 회원 객체 추가

memberList.add(newMember);

System.out.println("회원 등록이 완료되었습니다.");

}
  • 사용자로부터 이름, 전화번호, 이메일을 입력받습니다.

  • 입력받은 값으로 Member 객체를 생성합니다.

  • memberList.add(newMember);를 사용하여 생성된 Member 객체를 ArrayList의 끝에 추가합니다.

4단계: 전체 회원 조회 기능 구현 (Read)

memberList에 저장된 모든 회원의 정보를 화면에 출력하는 기능을 구현합니다.

// 2. 전체 회원 조회 메서드

private void displayAllMembers() {

System.out.println("\n--- 전체 회원 목록 ---");

if (memberList.isEmpty()) { // ArrayList가 비어있는지 확인

System.out.println("등록된 회원이 없습니다.");

return; // 회원 없을 시 메서드 종료

}

// ArrayList의 모든 요소를 순회하며 출력

for (int i = 0; i < memberList.size(); i++) {

Member member = memberList.get(i); // i번째 회원 객체 가져오기

System.out.println((i + 1) + ". " + member); // toString() 메서드가 호출됨

}

}
  • memberList.isEmpty()를 사용하여 ArrayList가 비어있는지 먼저 확인합니다. 비어있다면 “등록된 회원이 없습니다.” 메시지를 출력하고 함수를 종료합니다.

  • for 루프를 사용하여 ArrayList의 처음부터 끝까지 모든 요소를 순회합니다.

  • memberList.get(i)ArrayList에서 i번째 인덱스에 있는 Member 객체를 반환합니다.

  • System.out.println(member);Member 객체의 toString() 메서드를 자동으로 호출하여 회원 정보를 보기 좋게 출력합니다.

5단계: 회원 이름으로 조회 기능 구현 (Read)

특정 회원을 이름으로 검색하여 해당 회원의 정보만 보여주는 기능을 구현합니다.

// 3. 회원 이름으로 조회 메서드

private void findMemberByName() {

System.out.println("\n--- 회원 이름으로 조회 ---");

System.out.print("조회할 회원의 이름을 입력하세요: ");

String searchName = scanner.nextLine();

boolean found = false; // 회원을 찾았는지 여부를 나타내는 플래그

for (Member member : memberList) { // 향상된 for문 (Enhanced for loop) 사용

if (member.getName().equals(searchName)) { // 회원의 이름과 입력받은 이름이 같은지 비교

System.out.println("회원을 찾았습니다:");

System.out.println(member); // 찾은 회원 정보 출력

found = true;

// break; // 이름이 중복될 수 있으므로, 모든 일치하는 회원 찾기 위해 break 제거

}

}

if (!found) {

System.out.println("입력하신 이름의 회원을 찾을 수 없습니다.");

}

}
  • 사용자로부터 검색할 회원의 이름을 입력받습니다.

  • 향상된 for문 (Enhanced for loop): for (Member member : memberList) 구문은 memberList에 있는 각 Member 객체를 순서대로 member 변수에 할당하여 반복합니다. 코드가 더 간결해집니다.

  • member.getName().equals(searchName)를 사용하여 현재 Member 객체의 이름과 사용자가 입력한 이름이 같은지 비교합니다. 주의: 문자열 비교는 ==가 아닌 .equals()를 사용해야 합니다.

  • 이름이 일치하는 회원을 찾으면 해당 회원 정보를 출력하고 found 플래그를 true로 설정합니다.

  • 만약 루프가 끝날 때까지 foundfalse이면, 해당 이름의 회원이 없다는 메시지를 출력합니다.

팁: 만약 이름이 중복될 수 있다면, break; 문을 사용하지 않고 모든 일치하는 회원을 찾아 출력하는 것이 좋습니다.

6단계: 회원 정보 수정 기능 구현 (Update)

기존 회원의 정보를 수정하는 기능을 구현합니다. 먼저 수정할 회원을 찾고, 새로운 정보를 입력받아 업데이트합니다.

// 4. 회원 정보 수정 메서드

private void updateMember() {

System.out.println("\n--- 회원 정보 수정 ---");

System.out.print("수정할 회원의 이름을 입력하세요: ");

String searchName = scanner.nextLine();

Member memberToUpdate = null; // 수정할 회원 객체를 담을 변수

// 먼저 수정할 회원을 찾습니다.

for (Member member : memberList) {

if (member.getName().equals(searchName)) {

memberToUpdate = member;

break; // 찾았으면 루프 종료

}

}

if (memberToUpdate == null) {

System.out.println("입력하신 이름의 회원을 찾을 수 없습니다.");

return;

}

// 새로운 정보 입력받기

System.out.println("새로운 전화번호를 입력하세요 (변경 없으면 Enter): ");

String newPhoneNumber = scanner.nextLine();

if (!newPhoneNumber.isEmpty()) {

// TODO: Member 클래스에 Setter 메서드 추가 필요

// memberToUpdate.setPhoneNumber(newPhoneNumber); // 임시 코드

System.out.println("전화번호가 수정되었습니다.");

}

System.out.println("새로운 이메일을 입력하세요 (변경 없으면 Enter): ");

String newEmail = scanner.nextLine();

if (!newEmail.isEmpty()) {

// TODO: Member 클래스에 Setter 메서드 추가 필요

// memberToUpdate.setEmail(newEmail); // 임시 코드

System.out.println("이메일이 수정되었습니다.");

}

// Member 클래스에 Setter 메서드 추가 후 실제 수정 로직 구현

System.out.println("회원 정보 수정이 완료되었습니다.");

}

문제점 및 개선:

현재 Member 클래스는 private 필드와 Getter만 가지고 있어 외부에서 필드 값을 직접 수정할 수 없습니다. 이를 해결하기 위해 Member 클래스에 Setter 메서드를 추가해야 합니다.

Member 클래스 수정 (Setter 추가)

public class Member {

private String name;

private String phoneNumber;

private String email;

public Member(String name, String phoneNumber, String email) {

this.name = name;

this.phoneNumber = phoneNumber;

this.email = email;

}

// Getter 메서드들 (이전과 동일)

public String getName() { return name; }

public String getPhoneNumber() { return phoneNumber; }

public String getEmail() { return email; }

// Setter 메서드 추가

public void setPhoneNumber(String phoneNumber) {

this.phoneNumber = phoneNumber;

}

public void setEmail(String email) {

this.email = email;

}

@Override

public String toString() {

return "이름: " + name + ", 전화번호: " + phoneNumber + ", 이메일: " + email;

}

}

이제 MemberManagement 클래스의 updateMember() 메서드를 다음과 같이 수정하여 실제 수정을 진행할 수 있습니다.

// 4. 회원 정보 수정 메서드 (수정된 부분)

private void updateMember() {

System.out.println("\n--- 회원 정보 수정 ---");

System.out.print("수정할 회원의 이름을 입력하세요: ");

String searchName = scanner.nextLine();

Member memberToUpdate = null;

for (Member member : memberList) {

if (member.getName().equals(searchName)) {

memberToUpdate = member;

break;

}

}

if (memberToUpdate == null) {

System.out.println("입력하신 이름의 회원을 찾을 수 없습니다.");

return;

}

System.out.println("현재 정보: " + memberToUpdate);

System.out.print("새로운 전화번호를 입력하세요 (변경 없으면 Enter): ");

String newPhoneNumber = scanner.nextLine();

if (!newPhoneNumber.isEmpty()) {

memberToUpdate.setPhoneNumber(newPhoneNumber); // Setter 호출

System.out.println("전화번호가 수정되었습니다.");

}

System.out.print("새로운 이메일을 입력하세요 (변경 없으면 Enter): ");

String newEmail = scanner.nextLine();

if (!newEmail.isEmpty()) {

memberToUpdate.setEmail(newEmail); // Setter 호출

System.out.println("이메일이 수정되었습니다.");

}

System.out.println("회원 정보 수정이 완료되었습니다.");

}
  • 사용자는 수정할 회원의 이름을 입력합니다.

  • 해당 이름의 회원을 찾으면, 새로운 전화번호와 이메일을 입력받습니다.

  • 사용자가 값을 입력하면 (빈 문자열이 아니면) 해당 Setter 메서드를 호출하여 정보를 업데이트합니다.

7단계: 회원 삭제 기능 구현 (Delete)

특정 회원을 memberList에서 제거하는 기능을 구현합니다.

// 5. 회원 삭제 메서드

private void deleteMember() {

System.out.println("\n--- 회원 삭제 ---");

System.out.print("삭제할 회원의 이름을 입력하세요: ");

String searchName = scanner.nextLine();

Member memberToDelete = null;

// 삭제할 회원을 찾습니다.

for (Member member : memberList) {

if (member.getName().equals(searchName)) {

memberToDelete = member;

break;

}

}

if (memberToDelete == null) {

System.out.println("입력하신 이름의 회원을 찾을 수 없습니다.");

return;

}

// ArrayList에서 해당 회원 객체를 제거합니다.

memberList.remove(memberToDelete);

System.out.println("'" + searchName + "' 회원의 정보가 삭제되었습니다.");

}
  • 삭제할 회원의 이름을 입력받습니다.

  • 해당 이름의 회원을 찾습니다.

  • 회원을 찾았다면, memberList.remove(memberToDelete);를 사용하여 ArrayList에서 해당 Member 객체를 제거합니다. remove() 메서드는 객체를 직접 전달받아 해당 객체를 찾아 제거하는 기능을 합니다.

주의: ArrayList에서 요소를 제거할 때는 주의가 필요합니다. 만약 for 루프 안에서 remove()를 직접 호출하면, 인덱스가 변경되어 예기치 않은 동작(예: 특정 항목이 건너뛰어지는 현상)이 발생할 수 있습니다. 따라서 위 코드처럼 먼저 제거할 객체를 찾은 후, 루프 밖에서 remove()를 호출하는 것이 안전합니다. 또는 Iterator를 사용하는 방법도 있습니다.

8단계: 프로그램 실행 및 테스트

이제 모든 메서드가 구현되었습니다. MemberManagement 클래스의 main 메서드를 실행하여 프로그램을 테스트해 보세요.

  1. 프로그램 실행: IDE(Eclipse, IntelliJ IDEA 등)에서 MemberManagement 클래스를 실행하거나, 터미널에서 javac MemberManagement.java로 컴파일 후 java MemberManagement로 실행합니다.

  2. 회원 등록: 메뉴에서 ‘1’을 선택하고, 이름, 전화번호, 이메일을 입력하여 회원을 몇 명 등록합니다.

  3. 전체 회원 조회: 메뉴에서 ‘2’를 선택하여 등록된 회원 목록이 올바르게 출력되는지 확인합니다.

  4. 회원 이름으로 조회: 메뉴에서 ‘3’을 선택하고, 등록한 회원의 이름을 입력하여 해당 회원 정보가 잘 나오는지 확인합니다. 존재하지 않는 이름을 입력했을 때의 메시지도 확인합니다.

  5. 회원 정보 수정: 메뉴에서 ‘4’를 선택하고, 수정할 회원의 이름을 입력한 후 새로운 전화번호나 이메일을 입력하여 정보가 변경되는지 확인합니다. 변경하지 않을 항목은 Enter 키만 눌러 통과시킵니다.

  6. 회원 삭제: 메뉴에서 ‘5’를 선택하고, 삭제할 회원의 이름을 입력하여 목록에서 제거되는지 확인합니다.

  7. 프로그램 종료: 메뉴에서 ‘6’을 선택하여 프로그램이 정상적으로 종료되는지 확인합니다.

추가 학습 및 개선 아이디어

이 프로그램은 ArrayList를 활용한 기본적인 회원 관리 기능을 구현한 예시입니다. 여기서 더 나아가 다음과 같은 기능들을 추가하거나 개선해 볼 수 있습니다.

  • 회원 ID 자동 생성 및 관리: 각 회원에게 고유한 ID를 부여하고 관리합니다.

  • 중복 회원 검사: 회원 등록 시 이름, 전화번호, 이메일 등이 중복되지 않

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

위로 스크롤