CODING/스파르타 내일배움캠프 TIL

23_나누어 떨어지는 숫자 배열_키오스크 필수과제 레벨 3,4,5 구현_계산기 과제 피드백 내용_25.1.14(화)

codingTrip 2025. 1. 14. 21:26

코트카타

25) 나누어 떨어지는 숫자 배열

나의 풀이

 static class Solution {
        public int[] solution(int[] arr, int divisor) {
            int[] answer = {};
            List<Integer> answerList = new ArrayList<>();

            for (int i=0; i<arr.length;i++) {
                if(arr[i] % divisor == 0){
                    answerList.add(arr[i]);
                }
            }

            if (answerList.isEmpty()){
                return new int[]{-1};
            }

            answer = new int[answerList.size()];

            for (int i=0; i<answer.length;i++) {
                answer[i] = answerList.get(i);
            }

            Arrays.sort(answer);

            return answer;
        }
    }

리스트를 생성하고 리스트에 조건에 부합하는 값을 넣었다.(add)

그런 다음 리스트의 크기만큼 배열 크기를 만들어주었다.

 

처음에는 if (arr.length==0){ answer[0]=-1; }로 하려고 했으나

arr 배열이 비어 있는 경우는 이미 메서드 초기에 처리해야 하며,

answer[0] = -1과 같은 접근은 빈 배열에서 발생할 수 없는 오류가 되어

answerList가 비어 있는 경우를 체크하는 것으로 바꿨다.

 

Stream을 사용할까도 생각했지만

일단은 최대한 사용하지 않고 생각해보고 싶어서

오늘은 그 방법은 찾지 않기로 했다.

 


개인 과제 진행

Lv3 트러블슈팅

튜터님 피드백 final 활용

private final List<MenuItem> menuItems;

 

 

그런데 참조 대상의 객체 값은 변경할 수 있다.

참조형 변수 `data` 에 `final` 이 붙었다. 이 경우 참조형 변수에 들어있는 참조값을 다른 값으로 변경하지 못한

다. 쉽게 이야기해서 이제 다른 객체를 참조할 수 없다. 그런데 이것의 정확한 뜻을 잘 이해해야 한다. 참조형 변수

에 들어있는 참조값만 변경하지 못한다는 뜻이다. 이 변수 이외에 다른 곳에 영향을 주는 것이 아니다.

`Data.value` 는 `final` 이 아니다. 따라서 값을 변경할 수 있다

 

정리하면 참조형 변수에 `final` 이 붙으면 참조 대상을 자체를 다른 대상으로 변경하지 못하는 것이지, 참조하는 대상

의 값은 변경할 수 있다.

 

Lv4 트러블슈팅

각 클래스의 역할 구분

Menu 클래스에서 MenuItem 클래스를 관리해야 한다.

클래스가 4개가 되다보니 각 클래스의 역할이 정리가 되지 않아서 처음에 힘들었다.

 

Main클래스에서 생성한 Menu의 각 객체를 어떻게 Kiosk 클래스에 값을 넘겨줄지에 대해서 가장 큰 고민을 했다.

클래스간 흐름 설명 도식도(직접 그림)

// Menu 객체 생성을 통해 이름 설정
        Menu burgers = new Menu("Burgers");
        Menu drinks = new Menu("Drinks");
        Menu desserts = new Menu("Desserts");
        List<Menu> menuList = List.of(burgers,drinks,desserts);

        // Menu 클래스 내 있는 List<MenuItem> 에 MenuItem 객체 생성하면서 삽입
        MenuItem shackBurger = new MenuItem("ShackBurger",6.9,"토마토, 양상추, 쉑소스가 토핑된 치즈버거");
        MenuItem SmokeShack = new MenuItem("SmokeShack",8.9,"베이컨, 체리 페퍼에 쉑소스가 토핑된 치즈버거");
        MenuItem Cheeseburger = new MenuItem("Cheeseburger",6.9,"포테이토 번과 비프패티, 치즈가 토핑된 치즈버거");
        MenuItem Hamburger = new MenuItem("Hamburger",5.4,"비프패티를 기반으로 야채가 들어간 기본버거");
        burgers.setMenuItems(List.of(shackBurger,SmokeShack,Cheeseburger,Hamburger));

        // Kiosk 객체 생성
        Kiosk kiosk = new Kiosk(menuList);

        // Kiosk 내 시작하는 함수 호출
        kiosk.start();

각 Menu 클래스의 참조값을 menuList라는 리스트에 넣어준 후,

Kiosk 클래스 객체 생성 시, 생성자에 menuList를 매개변수로 넘겨주었다.

 

public class Kiosk {

    private final List<Menu> menuList;

    public Kiosk(List<Menu> menuList) {
        this.menuList = menuList;
    }
    
    /* 중략 */
    
}

 

Kiosk 클래스에서도 리스트를 생성하여

위에서 매개변수로 받은 menuList를 생성자를 통해 넣어주었다.

 

Lv5 트러블슈팅

사실 이전부터 캡슐화에 대해 신경쓰면서 구현했기 때문에

Lv4와 차이점이 없다.


계산기 과제 피드백 내용

 

 

아쉬운 점 부분이 공란이어서 튜터님께 문의드렸더니

아쉬운 점이 없어서 공란으로 남겨둔 것이라고 답변을 주셨다.😊

 

전체적으로 균형있게 잘 했고,

지금은 클래스와 메소드 필드 관련 개념을 잡아가는 주차여서

이해도, 개념 숙지 등을 위주로 피드백을 주셨다고 하셨다.

앞으로는 피드백이 더 디테일 해질 예정이라고도 하셨다.

 

첫 과제였는데 그래도 나름 잘 수행한 것 같아 기쁘다.

도전 과제도 완벽하지는 않지만 다 구현은 해서 그런지 좋은 점수를 주셨다.

 

스파르타 시작이 쉽지 않았지만

잘 적응하고 잘하고 있다는 메시지를 받은 것 같아 행복하다.