배열이 돌아가는 구조 (?)

배열은 선형 자료구조이다.

앞 뒤의 요소가 1:1의 관계를 맺어서 선 (----- < 이렇게)의 구조를 갖고있다.

배열같은 경우에는 처음에 그 배열의 사이즈를 정해주어야 한다.

나름 객체지향적인 방식으로 배열을 구현해보자!

배열 구현


사진으로 일단 배열이 어떤 구조인지 살펴보자.

배열은 이렇게 선의 구조를 갖고 있다. 예를 들자면, 우리가 평소에 생각하는 명품관 오픈런 😶‍🌫️ 혹은 음식점 웨이팅.. 와 비슷한 구조라고 생각하면 쉽다

배열을 내 방식대로 구현해보기

위에서 말했듯이, 배열을 그나마 좀 쉽게 표현하자면, 음식점 웨이팅이라고 할 수 있다고 적어놓았다.

그러면 ? 그냥 배열을 숫자로 표현해보지 말고 내 기준 가장 이해하기 쉽게

놀이공원에서 기구를 타려고 기다릴때의 상황을 갖고 배열을 구현해보자.
(이 경우에는 객체지향 프로그래밍의 좋은 예를 들 수도 있다는 생각을 갖고 있다.🤣)

클래스 작성하고 객체 생성해보기

사람 설계도 만들기

일단 우리가 놀이공원을 만들기 이전에, 사람이라는 객체가 존재해야 한다. 사람이 없으면 놀이공원도 없고 기구도 없고 기구를 탈 생물이 없기 때문이다.

People 클래스를 작성해보자.

class People{
    private int age; // 나이라는 속성을 가진다
    private char gender; //마찬가지로 성별이라는 속성을 가진다.

    public People(int age, char gender) { //생성자로 사람이 생성될때 그 사람마다 
    // 지정할 속성을 설정해주자.
        this.age = age;
        this.gender = gender;
    }

    @Override
    public String toString() { // 객체를 그냥 출력하면 해당 객체의 속성이 출력되는게 
    // 아니니 투스트링 메소드로 해당 객체의 속성을 어떻게 표현할지 정해주자.
        return "People{" +
                "age=" + age +
                ", gender=" + gender +
                '}';
    }
}

이렇게 클래스를 작성해주면 우리는 한 객체(사람) 의 나이와 성별을 설정 할 수 있고, 그 객체를 출력하면 객체의 성별과 나이를 출력한다.

기구 설계도 만들기

우리가 객체지향적 프로그래밍을 하려면 , 최대한 쪼갤 수 있는걸 쪼개 낮은 결합도를 가진 구조를 설계해야 한다.

그러기 위해서는 사람이라는 객체가 놀이공원을 건설 해 기구를 만들어 어쩌구저쩌구.. 거기까지 가야하지만 우리의 핵심은 배열을 어떻게 가장 쉽게 이해하느냐!
(객체지향적인 프로그래밍은 내 나름대로 정리해서 작성했던 글이 있다.)
객체지향 프로그래밍으로 테스트코드 작성해보기

사람이라는 객체가 탑승할 기구를 만들어주자.

class Park{
    private People[] people; 
    private int index; 

    public Park(int size) { //기구에 입장 가능한 인원수를 설정한다.
        this.people = new People[size];
        this.index = 0;
    }

    public void add(People people){ //기구에 사람을 태운다.
        this.people[index] = people;
        index++;
    }
        public People get(){ //기구에서 사람이 내린다.
        index--;
        return people[index];
    }

해당 주석을 살펴보면, 기구에 사람을 태우면 해당 기구에 몇명이 타고 있는지 , 몇명이 내렸는지, 객체를 생성할때 몇명의 사람을 태울 수 있는지를 설정 할 수 있다.

실제 사람이 놀이기구를 탑승한다고 생각하고 큐를 구현해보기

대충 놀이기구의 설계도와 사람의 설계도를 작성해보았으면 이제 그 설계도로 사람과 기구를 만들어 기구에 태우고 줄을 세워보고 줄에서 나가게 해보자.

큐와 스택의 가장 큰 차이점은
큐는 선입선출 방식으로 가장 먼저 들어간 요소가 가장 먼저 빠진다는 것이고,
스택은 후입선출 방식으로 가장 뒤에 들어간 요소가 가장 먼저 빠진다는 것이다.

놀이기구의 대기줄 또한 가장 먼저 줄을 서있는 사람이 제일 먼저 탑승하므로 선입선출이라고 할 수 있다.

이게 바로 배열이자 큐이다......................ㅋ

사람 줄 세워서 큐 구현해보기

본론으로 들어가 직접 작성한 코드로 큐를 구현해보자!

public class Main {
    public static void main(String[] args) {
        //배열을 구현해보자!
        //간단하게 놀이기구에 탑승하는 사람을 예시로 들어보자


        People[] waiting = new People[20]; // 최대 대기 가능한 인원 20명
        Park park = new Park(5); // 기구에 입장 가능한 인원수는 5명이다.
        int index=0;

대기줄의 의미를 갖고 있는 배열을 생성해주자. 앞에 붙을 타입은 사람이 들어갈 대기줄이니 People 객체를 갖고있어야한다.
그리고 기구라는 객체를 만들어 몇명의 인원이 탑승이 가능할지도 정해주자.

        waiting[index]= new People(10, 'M'); // 대기줄에 10살 남자가 한명 들어왔다.
        System.out.println("대기줄에 "+waiting[index]+"이(가) 들어왔습니다.");
        index++;
        waiting[index]= new People(20, 'F'); // 대기줄에 20살 여자가 한명 들어왔다.
        System.out.println("대기줄에 "+waiting[index]+"이(가) 들어왔습니다.");
        index++;
        ...
        waiting[index]= new People(100, 'F'); // 대기줄에 100살 여자가 한명 들어왔다.
        System.out.println("대기줄에 "+waiting[index]+"이(가) 들어왔습니다.");

이렇게 10살부터 100살까지의 다양한 성별을 가진 인간 객체를 생성해 대기줄에 넣어주자.

대기줄에 사람이 늘어날수록 배열은 미리 생성된 사이즈 안에 객체라는 요소를 집어넣어야 하기 때문에 반복문 혹은 인덱스를 이용해 들어갈 자리를 정해주어야한다.

기구에 사람 태워보기

기구에 사람을 태우면 대기줄에 가장 맨 앞에 있던 인간 5명은 기구에 탑승하게 되고 대기줄의 앞 5자리 만큼의 공간은 비어있게 된다.

야속하게도 이 프로그램은 무에서 유를 혼자서 창조하지 않는다. 우리가 직접 뒤에 5+ 번째부터 서있던 인간들을 앞으로 끌어와줘야한다. 롤러코스터 타이쿤 한다고 생각하세요

       for(int i=0; i<5;i++){ //기구에 5명이 탑승 가능하다.
            park.add(waiting[i]); // 기구에 5명 태웠다.
            System.out.println(waiting[i]+ " 가 탑승했습니다.");
        }
        for(int i=0; i<5;i++){
            waiting[i] = waiting[i+5]; // 기구에 탑승한 5명을 대기열에서 제거한다.
            System.out.println(i+"번째 대기자가"+waiting[i+5]+"로 변경되었습니다.");
        }

기구에 5명이 탑승하면, 대기줄에 앞 5자리의 객체 정보를 뒤에서 끌어온다.

이게 바로 배열과 링크드 리스트의 가장 큰 차이점이라고 볼 수 있다.

배열은 이렇게 뒤에서 요소를 끌어오거나 빈 자리에 새로운 요소가 직접 추가되어야 하지만, 링크드 리스트는 각각 연결되어있는 선을 끊고 새로 선을 연결한다.

대기줄에서 사람이 빠진다면 ?

대기줄에서 중간에 사람이 한명이 빠진다면 ? 마찬가지로 뒤에서 끌어와주어야 한다.

    public static void removeList(People[] waiting, int index){
        for(int i=index; i<waiting.length-1;i++){
            if(waiting[i+1]!=null) {
                waiting[i] = waiting[i + 1];
                System.out.println(i + "번째 대기자가" + waiting[i + 1] + "로 변경되었습니다.");
            }
        }
    }

중간에 사람만 쏙 빠지면 되는게 아니라 배열은 야속하게도 뒤에서 그 사람들을 내 힘으로 앞으로 데려와주어야한다...

대략 이렇게 큐를 실 생활에 대입해 구현해보았다.

마무리

작성한 코드를 동작시킨다면 ?

이렇게 대충 진행상황을 출력해준다.

이렇게 단순히 공부했던 것들을 그냥 눈으로만 보고 넘기는게 아니라 내가 직접 그걸로 코드를 작성해보면서 간단하게라도 내가 개발을 한다는 생각을 가지고 공부에 임하면 너무 재미있다.

profile
자스코드훔쳐보는변태

0개의 댓글