언어 자료구조 알고리즘/Escort C#

[C#] 7.4 프로젝트 구현 - 초점 이동

언제나휴일 2016. 5. 3. 13:40
반응형

7.4 프로젝트 구현

 

초점 이동



초점 이동 시퀀스 다이어그램

[그림] 초점 이동 시퀀스 다이어그램


 이번에는 초점 이동 기능에 해당하는 MoveFocus 메서드를 구현해 보기로 합시다. 마찬가지로 초점 이동에 관한 시퀀스 다이어그램을 보면서 작성을 하시면 되겠죠.

 

 초점 이동에서는 먼저, 어디로 초점을 이동할 것인지를 선택한 후에 해당 장소에서 수행할 수 있는 메뉴에 의해 진행이 된 후에 다시 초점이 캠퍼스 생활로 올 때 사용자가 선택한 학생들을 캠퍼스로 복귀시키면 됩니다. 이에 다음과 같이 MoveFocus 메서드를 구현해 보았습니다.

 

class CampusLife

{

    ... 중략 ...

    private void MoveFocus()

    {

        Console.WriteLine("초점 이동 기능을 선택하였습니다.");

        Place place = SelectPlace();

        if (place == null)

        {

            Console.WriteLine("잘못 선택하였습니다.");

            return;

        }

        MoveFocusAt(place);

        ComeBack(place);

    }

}

  

 이미 MoveStudent 메서드를 구현하면서 장소를 선택하는 SelectPlace는 구현하였기 때문에 그대로 호출해서 사용하면 되겠죠. MoveFocusAt 메서드와 ComeBack은 새로 추가하여 만들어야 할 것입니다. 그리고 각 장소에 포커스가 왔을 때의 작업은 장소별로 별도의 시퀀스로 작성하였으니 여기에서는 메서드를 비어있는 상태로 만들기만 하겠습니다. 테스트하기 위해 예외처리 구문은 주석으로 처리하였습니다.

 

class CampusLife

{

    ... 중략 ...

    private void MoveFocusAt(Place place)

    {

        //throw new NotImplementedException();

    }

}

 

 캠퍼스로 복귀하는 과정은 해당 장소에 있는 학생 정보를 보여주고 복귀시키고자 하는 학생 번호를 입력받아 해당 장소에서는 나오게 하고 해당 학생을 캠퍼스에 들어가게 하면 될 것입니다. 그런데 시퀀스 다이어그램을 보시면 해당 장소에 있는 학생을 나오게 하는 메서드에 대한 약속이 없네요. 여러분은 해당 시퀀스에서 학생을 나오는 메서드를 추가하시기 바랍니다. 저는 해당 메서드 이름을 OutStudent라고 정하였습니다. 이를 위해 캠퍼스 생활의 ComeBack 메서드는 다음과 같이 구현할 수 있을 것입니다.

 

class CampusLife

{

    ... 중략 ...

    private void ComeBack(Place place)

    {

        while (true)

        {

            ViewStuInfoInPlace(place);

            Console.WriteLine("복귀할 학생 번호를 입력하세요. 없을 때는 0을 입력");

            int num = EHLib.GetNum();

            if (num == 0)

            {

                return;

            }

            Student student = place[num];

            if (student == null)

            {

                Console.WriteLine("잘못 선택하였습니다.");

                return;

            }

            place.OutStudent(student);

            campus.InStudent(student);

        }

    }

}

 

 먼저, 해당 장소에 있는 학생 중에 복귀할 학생을 선택하기 전에 해당 장소에 있는 학생들의 정보를 화면에 보여주는 ViewStuInfoInPlace 메서드를 구현해 봅시다.

 

class CampusLife

{

    ... 중략 ...

    private void ViewStuInfoInPlace(Place place)

    {

        int scnt = place.GetStuCount();

        for (int i = 0; i < scnt; i++)

        {

            Console.WriteLine(place.GetStuInfo(i));

        }

    }

}

 

 Place 클래스에 GetStuCount GetStuInfo 메서드를 구현해야겠지요. GetStuCount 메서드는 학생을 보관하는 배열에 처음으로 빈 자리가 나올 때까지 카운팅을 해서 반환하면 되겠죠. GetStuInfo에서는 특정 인덱스에 있는 학생 정보를 문자열로 반환하면 될 것입니다.

 

abstract class Place

{

    ... 중략 ...

    internal int GetStuCount()

    {

        int cnt = 0;

        while(students[cnt] != null)

        {

            cnt++;

        }

        return cnt;

    }

    internal string GetStuInfo(int nth)

    {

        int cnt = GetStuCount();

        if ((nth >= 0) && (nth < cnt))

        {

            return students[nth].ToString();

        }

        return "해당 학생 정보 없음";

    }

}

  

 그리고 캠퍼스 생활의 ComeBack 메서드에서 장소 개체에 있는 인덱서와 OutStudent 메서드를 구현해야겠지요. 인덱서에서는 학생을 보관하는 배열에서 입력 인자로 전달된 번화와 같은 번호를 갖는 학생을 찾아 해당 학생을 반환하면 될 것입니다. 없다면 null을 반환하면 되겠죠. OutStudent 메서드에서는 입력 인자로 전달된 학생이 있는 인덱스 위치에 맨 뒤에 있는 학생으로 바꾸면 되겠죠.

 

abstract class Place

{

    ... 중략 ...

 

    internal Student this[int snum]

    {

        get

        {

            for (int i = 0; i < students.Length; i++)

            {

                if (students[i] == null)

                {

                    return null;

                }

 

                if (students[i].Num == snum)

                {

                    return students[i];

                }

 

            }

            return null;

        }

    }

 

    internal void OutStudent(Student student)

    {

        int cnt = GetStuCount();

 

        for (int i = 0; i < cnt; i++)

        {

            if (students[i] == null)

            {

                break;

            }

            if (students[i] == student)

            {

                students[i] = students[cnt-1];

                students[cnt - 1] = null;

                return;

            }

        }

    }

}

 

 이상으로 초점 이동에 대한 구현을 마치겠습니다.

너와 나의 연결고리 "공감"

 

반응형