[내배캠/17일차] TIL - Lv.5 키오스크 리팩토링, 자바의 메모리

euphony·2025년 1월 16일
0

내일배움캠프

목록 보기
32/66

✅오늘의 한 일

  • Lv.5 키오스크 리팩토링
  • 자바 중급2편 섹션6 완료
  • 메모리 세션 & 챌린지 OT

💻오늘의 학습

특강 - static & 자바의 메모리 구조

메모리와 변수

  • 변수를 선언한다는 것은 변수가 메모리에 올라갔다는 뜻이다.
  • 메서드는 변수를 감싸는 구조이며, 일반적으로 클래스는 객체로 생성해야 메서드를 사용할 수 있다.
  • 클래스를 인스턴스화하지 않고 직접 사용하면 에러가 발생한다. 이는 클래스가 메모리에 올라가지 않았기 때문이다.

static의 역할

  • static 키워드를 사용하면 클래스를 인스턴스화하지 않고도 메서드와 변수를 사용할 수 있다.
  • 왜? -> static은 클래스가 로드될 때 메모리에 올라가며, 프로그램이 종료될 때까지 유지된다.
    • 예: main() 메서드가 실행 가능한 이유는 static이기 때문.
  • static의 특징
    • static 변수는 모든 인스턴스가 공유한다.
    • Stack이나 Heap이 아닌 Static 메모리 영역(native 메모리, 메서드 영역)에 저장된다.
    • 유틸리티 메서드(예: Math.random())나 상수 선언 시 주로 사용한다.
    • 의도적으로 static을 사용하는 경우는 드물며, 신중히 사용해야한다.

자바의 메모리 구조

  • Stack 메모리
    • 메서드가 호출될 때마다 스택 프레임이 쌓이고, 메서드의 지역 변수와 매개 변수를 저장한다.
  • Heap 메모리
    • 객체를 저장한다.
  • Static 메모리
    • static 변수와 메서드가 저장되며, 프로그램이 종료될 때까지 유지된다.

다음 예시를 보자.

public class App() {
    public static void main(String[] args) {
        Human human = new Human();
        a();
        b();
    }
}

public static void a() {
    b();
}

public static void b() {


}

public static void c() {

}
  • main() -> a() -> b() 호출 시 스택 메모리에 쌓인다.
  • Human 객체는 Heap 메모리에 저장된다.
  • static 메서드는 Static 메모리에 존재하여 언제든 호출이 가능하다.

Lv.5 키오스크 리팩토링

Kiosk 클래스의 start() 메서드에 너무 많은 기능이 있다고 느꼈다. 그래서 일단 다음과 같이 메인 메뉴를 선택하라는 메시지와 입력값이 숫자가 맞는지 확인 하는 부분을 분리했다.

원래 코드는 다음과 같다. while문 안에 있는 코드 중 일부이다.

System.out.print("메인 메뉴를 선택하세요: ");
if (!sc.hasNextInt()) {
    System.out.println("숫자를 입력해주세요.");
    sc.next();
    continue;
}

위 코드를 메서드로 빼서 getUserInput()를 구현해보았다.

// 메시지 출력 후 사용자 입력이 숫자인지 검사
private int getUserInput(Scanner sc, String message) {
    System.out.print(message);
    while (!sc.hasNextInt()) {
        System.out.println("숫자를 입력해주세요.");
        sc.next();
        System.out.print(message);
    }
    return sc.nextInt();
}

while문 안에 있던 코드가 조금은 간결해졌다.

// 메인 메뉴 입력
int selectedMenu = getUserInput(sc, "메인 메뉴를 선택하세요: ");

...

// 메뉴 아이템 입력 받기
int selectedMenuItem = getUserInput(sc, "메뉴를 선택하세요: ");

자바 중급2편 강의

List vs Set

  • List : 순서를 유지하며, 중복을 허용하는 자료구조. 인덱스를 통해 각 요소에 접근할 수 있다.
    • ex. 장바구니 목록, 순서가 중요한 일련의 이벤트 목록.
  • Set : 순서를 유지하지 않으며, 중복을 허용하지 않는 자료구조. 요소의 유무를 빠르게 확인할 수 있도록 최적화 되어있어서 빠른 조회가 가능하다.
    • ex. 회원 ID 집합, 고유한 항목의 집합.

Set 구현하기

public class MyHashSetV0 {

    private int[] elementData = new int[10];
    private int size = 0;

    // O(n) - contains() 메서드 때문
    public boolean add(int value) {
        // 중복 값 체크
        if (contains(value)) {
            return false;
        }
        elementData[size] = value;
        size++;
        return true;
    }

    // O(n) - for문으로 하나하나 찾아야 함
    public boolean contains(int value) {
        for (int data : elementData) {
            if (data == value) {
                return true;
            }
        }
        return false;
    }

    public int size() {
        return size;
    }

    @Override
    public String toString() {
        return "MyHashSetV0{" +
                "elementData=" + Arrays.toString(Arrays.copyOf(elementData, size)) +
                ", size=" + size +
                '}';
    }
}

📝오늘의 회고

원래 오늘 Lv.6 키오스크를 시작하려고 했는데, Lv.5 키오스크를 좀 더 리팩토링 하고 싶어서 내일로 미뤘다. 그렇지만 오늘은 자바 강의를 주로 듣느라 많이 하진 못했다. 그리고 메모리 세션과 챌린지 OT까지 있어 시간이 빠르게 지나간 것 같다. 내일 모든걸 끝내겠다는 생각으로(이런 생각을 매일 하는 것 같긴 하지만...?) 불태워야겠다.🔥

📌내일의 할 일

  • Lv.6 키오스크 완성
  • 트러블 슈팅 및 몰랐던 내용 정리
  • 자바 중급2편 섹션7 완료
  • 자바 중급2편 섹션6 ~ 7 정리 시작

0개의 댓글

관련 채용 정보