✔️ 객체지향 프로그래밍의 4대 특성
1. 캡슐화 : 외부의 접근을 제어하는 것
2. 상속 : 부모 클래스의 속성과 기능을 자식 클래스가 물려 받는 것
3. 추상화 : 중요한 정보만을 표현하고 불필요한 사항은 숨기는 것
4. 다형성 : 같은 타입의 참조 변수가 여러가지 형태를 가질 수 있는 것
항상 어려운 다형성..! 영상 자료를 다시 보며 복습해 봐야겠다.
연결 리스트에서 데이터를 추가할 때는 추가할 데이터의 위치를 노드를 타고 들어가 찾아야 한다. 따라서 만약 100개의 데이터 중 99번째에 데이터를 추가한다고 하면, 99번째 노드까지 타고 들어가야하는 것이다. 따라서 맨 앞에 추가하는 것이 아니라면 추가할 위치는 O(n)으로 느리게 찾게 된다.
✔️ 첫 번째 위치에 데이터 추가 - O(1)
첫 번째 위치에 데이터를 추가하는 경우,
1) 신규 노드를 생성한다.
2) 신규 노드와 다음 노드(기존 첫 번째 노드)를 연결한다.
3) 첫 번째 노드를 가리키는 first에 신규 노드를 연결한다.
public void add(int index, Object e) {
Node newNode = new Node(e);
if (index == 0) { // 맨 앞에 추가되는 경우
newNode.next = first;
first = newNode;
} else {
Node prev = getNode(index - 1);
newNode.next = prev.next;
prev.next = newNode;
}
}
만약 배열이라면 데이터를 추가할 경우 모든 데이터를 오른쪽으로 밀어야 한다. 하지만 연결 리스트는 새로 생성한 노드의 참조만 변경하면 된다.
✔️ 중간 위치에 데이터 추가 - O(n)
중간 위치에 데이터를 추가하는 경우,
1) 신규 노드를 생성하고 노드가 입력될 위치의 직전 노드(prev)를 찾는다.
2) 신규 노드와 직전 노드(prev)의 다음 노드를 연결한다.
3) 직전 노드(prev)에 신규 노드를 연결한다.
public void add(int index, Object e) {
Node newNode = new Node(e);
if (index == 0) {
newNode.next = first;
first = newNode;
} else { // 중간에 추가되는 경우
Node prev = getNode(index - 1);
newNode.next = prev.next;
prev.next = newNode;
}
}
데이터를 추가할 때, 연결 리스트는 새로 생성한 노드의 참조만 변경하면 되지만 신규 노드가 중간에 들어갈 때는 위치를 찾는 것이 오래 걸린다. 노드를 추가하는 것은 O(1)이지만, 노드를 추가할 위치를 찾는데 O(n)이 걸리므로 둘을 합하면 O(n)이 걸린다.
✔️ 마지막 위치에 데이터 추가 - O(n)
마지막 위치에 데이터를 추가하는 것 역시 중간에 데이터를 추가하는 것과 비슷하다. 노드를 마지막까지 순회해야 마지막 노드를 찾을 수 있으므로 O(n)의 시간이 걸린다.
public void add(Object e) {
Node newNode = new Node(e);
if (first == null) {
first = newNode;
} else {
Node lastNode = getLastNode();
lastNode.next = newNode;
}
size++;
}
✔️ 배열 리스트 vs 연결 리스트
리스트에 저장한 메뉴들을 출력할 때, 기존에는 다음과 같이 출력했다. 하지만 코드도 길고 뭔가 지저분해 보여서 마음에 들지 않았다.
private static void showMenu() {
for (int i = 0; i < menus.size(); i++) {
String name = menus.get(i).getName();
double price = menus.get(i).getPrice();
String description = menus.get(i).getDescription();
System.out.println(i+1 + ". " +
name + " | W " + price + " | " + description);
}
System.out.println("0. 종료 | 종료");
}
해결 방법을 찾아보다가 서식지정자를 통해 더 깔끔하게 출력하도록 수정했다. 서식지정자는 알고는 있지만 잘 쓰지 않아서 쓸 때마다 까먹는다.
private static void showMenu() {
for (int i = 0; i < menus.size(); i++) {
MenuItem menu = menus.get(i);
System.out.printf("%d. %s | W %.1f | %s%n",
i + 1, menu.getName(), menu.getPrice(), menu.getDescription());
}
System.out.println("0. 종료 | 종료");
}
✔️ 자주 사용되는 서식 지정자
메뉴를 선택할 때, 정수가 아닌 문자열을 입력할 경우 InputMismatchException
이 발생했다.
Scanner
로 입력 스트림에서 데이터를 읽을 때, sc.hasNextInt()
를 이용해 다음 값이 정수로 해석 가능한지 확인할 수 있다.
if (!sc.hasNextInt()) {
System.out.println("숫자를 입력해주세요.");
sc.next();
continue;
}
키오스크 과제 시작! Lv.5까지 있긴 하지만 기능이 잘게 나뉘어져 있어서 빠르게 끝낼 수 있을 것 같다. 하지만 밀린 자바 강의를 듣느라 오늘은 Lv.3까지만 했다. 내일은 정말 초집중해서 Lv.5까지 끝내고 강의도 많이 들어야 겠다..