객체지향 프로그래밍4 - 실습 코딩

김소희·2023년 3월 2일
1

오늘과 내일은 그동안 자바와 객체지향 프로그래밍에서 배운 모든 내용을 사용하여 햄버거 주문 프로그램을 만든다고 한다. 이론공부보다 실습에서 배우는 것이 더 많다고 생각이 되서 열심히 하기로 마음 먹었는데 클래스이름과 메소드이름들이 머릿속에 뒤섞이고, 계속해서 새로운 오류가 발생하고 결국 코드를 해석하며 따라 치는것에 급급한 수업시간이였다. 이틀동안 하루종일 매달렸는데도 어떤 클래스안의 코드들은 어떤 흐름을 따라가는지조차 모르는 경우도 더러 있었다.
오전과 오후에 1시간씩 DI(의존성 주입)을 적용하는 방법을 3차례나 들었는데 기본적으로 메소드와 클래스를 다루는 것이 익숙하지 않은터라 DI적용전 코드도 제대로 실행되지 않는 상태이기에 구체적인 클래스 타입의 참조변수가 아니라, 추상메서드를 호출하게 만든다고 알고있더라도 코드의 어느 부분부터 고쳐야하는지 감이 잡히지 않았다. 진도를 따라가지 못한 것이다.

나는 수업이 끝나고 이번에는 아무것도 보지 않고 내 방식대로 다시 한번 도전하기로 마음먹었다.
제대로 된 코드가 아니더라도 끝까지 동작하게 완성시킨다음 수정하면서 공부하는 것이 더 도움이 될 것 같았기 때문이다.


새롭게 알게된 내용 1

처음 마주한 문제는 클래스타입의 배열이였다. 이건 왜 이렇게 생겼지? 그렇다면 배열안에는 뭐를 할당할 수 있는거야? 다른클래스에서 이걸 사용하려면 어떻게 해야해?

public class ProductRepository {
    private Product[] products = {
            new Side(3,"감자튀김",1000,300,1),
            new Side(4,"어니언링",1000,300,1),
            new Hamburger(1,"새우버거",3500,500,false,4500),
            new Hamburger(2,"치킨버거",4000,600,false,5000),
            new Drink(5,"코카콜라",1000,200,true),
            new Drink(6,"제로콜라",1000,0,true),
    };

    public Product[] getProducts() {
        return this.products;
    }

}

하나씩 생각해보면 배열의 구조는 데이터 타입[ ] 인스턴스이름 = {요소할당};이다.
클래스도 데이터타입이 될 수 있다는 것을 알게 되었고, 다른 클래스에서 필드값을 사용하고 싶다면 Static필드가 아니기 때문에 ProductRepository클래스를 인스턴스화하고 getter()로 접근할 수 있다.

위의 배열은 Product클래스타입의 배열이고 요소들은 Product생성자로 각각의 객체가 할당되고 있다. 다만 하위 클래스 타입의 객체를 참조하여 Side,Hambur,Drink로 업캐스팅하여 다형성을 활용했다.


새롭게 알게된 내용 2

Product[ ]을 활용해서 Menu클래스에 printMenu()를 만들고있었는데 처음 작성한 코드는 내가 배열의 순서를 다 알고있기 때문에 작성 가능한 코드였다.


이런걸 하드코딩이라고 부를 수 있는데, 만약 메뉴가 추가된다면 또는 배열의 요소들이 순서가 바뀐다면 메뉴 클래스도 전부 바꿔야 하는 상황이 벌어지겠지.
그래서 실행결과는 완전히 똑같았지만 for문과 instanceof연산자를 사용하여 더 유연한 코드로 다시 만들었다.


새롭게 알게된 내용 3


배열의 길이에서 벗어난 것을 참조하려고 할 때 생기는 오류를 보고 배열의 길이를 수정했다.

public void addToBaguni(Product item) { //단품
        int length = baguni.length;
        Product[] newbaguni = new Product[length+1];
        System.arraycopy(baguni,0,newbaguni,0,baguni.length);
        newbaguni[length]=item;
        this.baguni=newbaguni;
        this.printCart(); //테스트용
    }

int랑 String을 비교하려고하니 if문이 false가 되고,
그래서 중괄호안의 setItem[1]=p1; 코드는 실행되지 않게 되었다.
맨아랫줄 ((Side) setItem[1]).setKepchup(Integer.parseInt(input));의
setItem[1]에 p1이 담기지 않아서 비어있는(null) 배열을 참조했기에 발생한 오류였다.


새롭게 알게된 내용 4

장바구니 클래스를 어떻게 만들어야할지 도무지 생각나질 않아서 더이상 진도가 나가질 않았다. 수업자료를 참고해서 코드를 작성했지만 역시 코드만을 이해할 뿐 방법을 체득할 순 없어서 전부 지우고 스스로 생각해내기로 했다. 하지만 몇시간이 지나도 방법이 떠오르지 않았고 결국 남자친구에게 sos를 요청하게 되었다.

c: "마트에서 물건을 담을땐 어디에 담지?",
s: "바구니?"
c: "그럼 우리도 바구니를 만들어볼까?"
s: "바구니를 만들다니?"

처음엔 무슨말인지 의아했지만 이내 상품 객체들을 담을 수 있는 바구니 배열을 만들었고, 담는다는 행위를 담당하는 메소드도 만들어냈다.
메소드를 만들땐 바구니에 담긴 상품들을 유지한 채로 새로운 상품을 바구니에 담는다는 규칙을 생각했고, 한번에 여러개의 상품을 바구니에 담을 수도 있어야 할 것 같아서 세트용 메소드도 만들었다.

나는 이 사건이 객체지향 프로그래밍을 몸소 느끼게 된 계기로서 엄청난 충격을 받았다.
진짜로 바구니를 만들줄이야. 이런게 객체지향프로그래밍이구나...
오랫동안 고민하던 문제가 풀려서 기뻤고, 오늘도 프로그래밍에 대한 생각에 푹 빠진 하루를 보냈구나 생각하니 행복했다. 다음번엔 스스로 생각해서 만들어내야지.
그리고 언제나 날 도와주는 남자친구에게 정말 고마운 마음이다. ❤️

private Product[] baguni = new Product[0]; //바구니

  
    public void addToBaguni(Product item) { //단품담기용
        int length = baguni.length;
        Product[] newbaguni = new Product[length+1];
        System.arraycopy(baguni,0,newbaguni,0,baguni.length);
        newbaguni[length]=item;
        this.baguni=newbaguni;
        this.printCart(); //테스트확인용 임시메소드
    }

    public void addToBaguni(Product[] items) { //세트담기용
        int length = baguni.length;
        Product[] newbaguni = new Product[length+items.length];
        System.arraycopy(baguni,0,newbaguni,0,baguni.length);
        System.arraycopy(items,0,newbaguni,baguni.length,items.length);
        this.baguni=newbaguni;
        this.printCart(); //테스트용
    }

profile
백엔드 개발자 소희의 모험

1개의 댓글

comment-user-thumbnail
2023년 3월 8일

글 내용이 너무 재밌어요 ㅋㅅㅋ

답글 달기