[Java] 객체배열(클래스 자료형 배열)을 매개변수와 리턴값으로 사용할 수 있다

Date:     Updated:

카테고리:

태그:

java.png

객체배열(클래스 자료형 배열)을 매개변수와 리턴값으로 사용할 수 있다

  • 동일한 타입의 여러 개의 인스턴스를 인자로 전달하거나 리턴 받는 경우에도 객체 배열을 이용할 수 있다

이번에는 실무처럼 시스템 요구사항과 제약사항을 전달받아 내용에 맞게 시스템을 작성해보자

시스템 요구사항

  1. 여러명의 회원 정보를 받아 한 번에 여러 회원 정보를 등록
  2. 전체 회원 조회 시 여러 명의 회원정보 반환

제약사항

  1. MemberRepository 에서 static 필드로 회원정보를 관리한다
  2. 회원정보는 최대 10명까지 저장할 수 있다

우선 6개의 클래스를 만든다

  1. Application (main클래스)
  2. Member
  3. MemberFinder(회원 찾기)
  4. MemberRegister(회원 등록)
  5. MemberRepository(회원 저장소)
  6. MemberService(회원 서비스)

우선 Application 을 작성해보겠다

  • Application
package uses;

import java.util.Scanner;

public class Application {
    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);

        MemberService memberService = new MemberService();

        while(true){
            System.out.println("========== 회원관리 프로그램 ==========");
            System.out.println("1. 회원등록");
            System.out.println("2. 회원전체조회");
            System.out.println("9. 프로그램 종료");
            System.out.println("메뉴 선택 :");
            int no = sc.nextInt();

            switch (no){
                case 1 : memberService.signUpMember();break;
                case 2 : memberService.showAllMembers();break;
                case 9 : System.out.println("프로그램을 종료합니다.");return;
                default: System.out.println("잘못된 번호를 입력하셨습니다.");break;

            }
        }
    }
}

시스템 요구사항에 맞춰서

  1. 회원등록을 할 수 있는 회원등록
  2. 전체 회원을 조회할 수 있는 전체회원
  3. 프로그램 종료

이렇게 3가지 메뉴로 작성을 했다

1. while 문의 (true)을 조건식으로 하여 올바른 메뉴 번호를 선택하게 하였다

while 문이란?

  • while 문은 프로그래밍에서 반복적인 작업을 수행할 때 사용되는 제어문 중 하나이다. while 문은 조건식이 참(true)또는 거짓(false)인 동안 반복하여 코드 블록을 실행한다
  • while (조건식){
  • // 조건식이 참일 때 수행할 코드
  • }

2. switch 문을 사용하여 하나를 선택하여 동작을 수행하도록 하였다

switch 문이란?

  • switch 문은 프로그래밍에서 조건에 따라 다른 동작을 수행해야 할 때 사용되는 제어문 중 하나이다
  • switch (식 또는 값) {
  • case 값1:
  • //값1에 해당하는 동작수행
  • break;
  • case 값2:
  • //값2에 해당하는 동작수행
  • break;
  • //추가적인 case 문 가능
  • default:
  • //어떤 case 에도 해당하지 않을 때 수행할 동작
  • }

  • case 1 : memberService 클래스의 signUpMember 메뉴를 실행한다
  • case 2 : memberService 클래스의 showAllMembers 메뉴를 실행한다
  • case 9 : 프로그램을 종료합니다 라는 문구를 출력후에 return;문이 사용되여 main 메서드가 종료되고 프로그램이 종료된다
  • default : 잘못된 값을 입력하면 잘못된 번호를 입력하였다고 출력한다

다음 Member 클래스를 작성한다

  • Member
package uses;

public class Member {
    private int num;
    private String id;
    private String pwd;
    private String name;
    private int age;
    private char gender;
    public Member(){}

    public Member(int num, String id, String pwd, String name, int age, char gender) {
        this.num = num;
        this.id = id;
        this.pwd = pwd;
        this.name = name;
        this.age = age;
        this.gender = gender;
    }

    public int getNum() {
        return num;
    }

    public void setNum(int num) {
        this.num = num;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getPwd() {
        return pwd;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public char getGender() {
        return gender;
    }

    public void setGender(char gender) {
        this.gender = gender;

        }
        public String getInformation(){

        return "Member[ num =" + num + ", id=" + id + ",pwd=" + pwd + ".name=" +name + ",age=" + age + ",gender=" + gender +" ]";
        }
    }
  1. 멤버에 필요한 정보를 선언한다 (num,id,pwd,name,age,gender,Member)
  2. 생정자를 만들어 객체를 초기화 한다
  3. getter, setter 를 만들어준다
  4. getInformation 메서드를 선언해서 정보은닉을 적용하고, 외부에서 직접적으로 필드에 접근하는 것을 방지하고 대신에 필드값을 반환하도록 설계한다

그 다음은 클래스를 인스턴스화 했던 MemberService 클래스로 이동한다

  • MemberService
package uses;

public class MemberService {

    public void signUpMember() {
        Member[] members = new Member[5];
        members[0] = new Member(1, "user01", "pass01", "홍길동", 20, '남');
        members[1] = new Member(2, "user02", "pass02", "유관순", 13, '여');
        members[2] = new Member(3, "user03", "pass03", "이순신", 22, '남');
        members[3] = new Member(4, "user04", "pass04", "신사임당", 36, '여');
        members[4] = new Member(5, "user05", "pass05", "윤봉길", 22, '남');

        MemberRegister memberRegister = new MemberRegister();

        memberRegister.regist(members);
    }
    public void showAllMembers(){
        MemberFinder finder = new MemberFinder();
        for(Member member: finder.findAllMembers()){
            if(member!=null){
                System.out.println(member.getInformation());
            }
        }
    }
}

signUpMember 선언

  1. 먼저 Application 클래스 switch 문의 case1 에서 호출한 signUpMember(회원등록) 메서드를 선언해준다
  2. signUpMember 메서드가 호출이 되면 길이가 5인 Member 객체 배열인 members를 생성한다
  3. 배열 members 의 각 요소에 Member 객체를 생성하여 할당한다
  4. MemberRegister 클래스의 인스턴스를 생성하여 memberRegister 변수에 할당한다
  5. memberRegister 객체의 regist 메서드를 호출하고, 이 때 members 배열을 전달한다
  • 여기서 members[0]과 같은 표현은 배열(array)의 첫 번째 요소를 가리킨다. 배열은 동일한 데이터 타입의 요소들을 여러 개 담을 수 있는 자료 구조이고, members[0]은 배열 members의 첫 번째 요소를 나타내며, 이 경우에는 Member 객체가 된다

showAllMembers 선언

  1. 먼저 Application 클래스 switch 문의 case2 에서 호출한 showAllMembers(회원 정보 출력) 메서드를 선언해준다
  2. finder.findAllMembers() (모든회원을 찾는다) 메서드를 호출하여 모든 회원 정보를 담고 있는 Member 배열을 반환한다
  3. for 루프를 통해 배열의 각 요소를 순회한다. Member 배열의 각 요소를 member 변수에 할당한다
  4. member 변수가 null이 아닌 경우에만 실행되는 조건문을 사용하여, 해당 회원 정보를 출력한다. member.getInformation()
    메서드를 호출하여 회원 정보를 문자열 형태로 반환하고, 이를 System.out.println()을 통해 출력한다
  • 이렇게 하면 showAllMembers 메서드는 MemberFinder 클래스를 사용하여 모든 회원 정보를 가져와서 출력한다. 이 코드는 회원 정보를 모두 출력하는 데 사용될 수 있으며, 일반적으로 회원 관리 시스템에서 모든 회원 정보를 조회하여 보여주는 데 활용될 수 있다.

다음은 호출된 MemberRegister 클랫스와 MemberFinder 클래스를 작성하러간다

  • MemberRegister
package uses;

public class MemberRegister {
    public void regist(Member[] members){
        System.out.println("회원을 등록합니다.");

        for(int i = 0; i< members.length; i++){
            System.out.println(members[i].getName() + "님이 회원 등록에 성공했습니다.");
        }

        if(MemberRepository.store(members)){
            System.out.println("총 " + members.length + "명의 회원 등록에 성공했습니다.");
        }
    }
}
  1. regist 메서드는 Member 배열을 매개변수로 받아 회원을 등록하는 역할을 한다
  2. 메서드가 실행되면 “회원을 등록합니다.”라는 메시지를 출력한다
  3. for 문의 루프를 통해 받은 회원 배열의 각 요소를 순회하면서 회원의 이름을 출력하고 회원 등록에 성공했음을 알리는 메시지를 출력한다
  4. emberRepository.store(members)를 호출하여 회원 정보를 저장하고 성공 여부를 반환한다
  5. 회원 정보 저장이 성공하면 “총 N명의 회원 등록에 성공했습니다.”라는 메시지를 출력한다
  • 이 클래스는 회원을 등록하는 데 사용한다. 주어진 회원 배열에 있는 회원들을 등록하고, 등록된 회원의 수와 성공 여부를 출력한다

  • MemberFinder

package uses;

public class MemberFinder {
    public Member[] findAllMembers(){

        return MemberRepository.findAllMembers();
    }
}
  1. 이 클래스에는 findAllMembers(모든회원을찾다) 라는 메서드가 정의한다
  2. findAllMembers 메서드는 Member[] 타입의 배열을 반환한다
  3. 이 메서드 내부에서는 MemberRepository.findAllMembers()를 호출하여 모든 회원 정보를 가져온다
  • 이렇게 함으로써 MemberFinder 클래스는 회원 데이터를 찾는 역할을 담당하고 있으며, 이를 호출하는 코드에서는 단순히 findAllMembers 메서드를 호출함으로써 모든 회원 정보를 얻을 수 있다

이제 마지막에 호출된 MemberRepository 클래스를 작성해본다

  • MemberRepository
package uses;

public class MemberRepository {
    private  final static Member[] member;

    public static int count;

    static {
        member = new Member[10];

    }

    public static boolean store(Member[] members) {

        for(int i= 0; i< members.length; i++){
            member[count++] = members[i];
        }
        return true;
    }
    public static Member[] findAllMembers() {
        return member;
    }
}
  1. MemberRepository 클래스에는 member 라는 static 으로 선언된 Member 배열이 있다. 이 배열은 클래스 레벨에서 한 번만 초기화되며 모든 객체가 공유한다. 초기화된 배열은 최대 10명의 회원 정보를 담을 수 있다.
  2. count는 static으로 선언된 정수형 변수이고 store 메서드에서 회원 정보를 저장할 때마다 이 변수가 증가된다
  3. static 초기화 블록 내부에서는 member 배열을 길이가 10인 새로운 배열로 초기화한다
  4. store 메서드는 회원 정보를 받아서 member 배열에 순차적으로 저장한다. 그리고 count 변수는 새로운 회원을 저장할 때마다 증가한다
  5. findAllMembers 메서드는 현재 저장된 모든 회원 정보를 반환한다
  • 이 클래스는 회원 정보를 저장하고 조회하는 데 사용된다. store 메서드를 통해 회원 정보를 저장하고, findAllMembers 메서드를 통해 저장된 모든 회원 정보를 조회할 수 있다

자, 여기까지 고생하셨습니다. 이제 실행을 해볼 차례다

========== 회원관리 프로그램 ==========
1. 회원등록
2. 회원전체조회
9. 프로그램 종료
메뉴 선택 :
1
회원을 등록합니다.
홍길동님이 회원 등록에 성공했습니다.
유관순님이 회원 등록에 성공했습니다.
이순신님이 회원 등록에 성공했습니다.
신사임당님이 회원 등록에 성공했습니다.
윤봉길님이 회원 등록에 성공했습니다.
총 5명의 회원 등록에 성공했습니다.
========== 회원관리 프로그램 ==========
1. 회원등록
2. 회원전체조회
9. 프로그램 종료
메뉴 선택 :
2
Member[ num =1, id=user01,pwd=pass01.name=홍길동,age=20,gender=남 ]
Member[ num =2, id=user02,pwd=pass02.name=유관순,age=13,gender=여 ]
Member[ num =3, id=user03,pwd=pass03.name=이순신,age=22,gender=남 ]
Member[ num =4, id=user04,pwd=pass04.name=신사임당,age=36,gender=여 ]
Member[ num =5, id=user05,pwd=pass05.name=윤봉길,age=22,gender=남 ]
========== 회원관리 프로그램 ==========
1. 회원등록
2. 회원전체조회
9. 프로그램 종료
메뉴 선택 :
9
프로그램을 종료합니다.

코드 리뷰를 하면서 블로그를 작성하다보니 작성하면서 공부도 되고 너무 좋다. 뭔가 많은 것을 작성한 것 같은데 기능은 생각보다 아직은 초라하다. 그렇지만 벌써 자바공부를 시작한지 얼마 되지않아 이정도의 프로그램을 설계하게 되었다 점점 어려워 지기도 하지만 재밌어 지고 심도 깊어지고 있다. 아직은 복잡하고 어렵지만 지금 처럼 하나하나 순서대로 짚어나가면서 코드를 짜다보면 나중에는 더 높은 수준의 코드를 짤 수 있을 것이다.

Java 카테고리 내 다른 글 보러가기

댓글 남기기