ArrayList to Array, Array vs LinkedList, 캡슐화, OOP (항해일지 8일차)

김형준·2022년 5월 16일
0

TIL&WIL

목록 보기
8/45

1) 학습 일지


- 클릭✔ 알고리즘 자바 풀이 ~ 32번


- stream을 통해 ArrayList를 Array로 바꾸기

  • ArrayList.stream().mapToInt(integer -> int).toArray();
  • mapToInt()는 stream 데이터의 흐름으로 Integer를 int로 형 변환 해준다.

- 클릭✔ OOP 구현 과제

  • 오늘은 저번 주에 구현했던 OOP 코드에 새롭게 배웠던 캡슐화를 적용했다.
  • 전에는 각 Class의 field 영역이 public이었다면, 오늘로써 모든 필드 영역은 private으로 접근 제어되고 있다.
  • 따라서 해당 필드로의 접근은 Getter와 Setter 등의 메소드를 호출해야만 가능하다.
  • 즉 필드로의 직접적인 접근은 제어되고, 메서드를 통해 접근 타당성을 검토한 후 적합한 기능을 리턴해준다.
  • 저번 주에 배웠던 엘런 케이의 OOP 핵심가치 중 하나인 캡슐화를 구현한 것이다. (감격🤗)

- Array와 LinkedList의 차이


  • Array와 LinkedList는 각자 장,단점이 뚜렷해서 어떠한 기능을 더 많이 쓰는가를 생각하고 사용하면 된다.

  • 먼저 Array는 초기화 시 크기가 지정된다.
  • 따라서 특정 원소의 조회는 Array[index]로 O(1)의 시간복잡도를 통해 가능하다.
  • 하지만 크기가 지정됨으로써 중간에 데이터를 넣거나 뺄 경우 O(N)의 시간복잡도를 지녀 비효율적이다.
  • 또한 데이터 추가 시 모든 공간이 차있다면 새로운 메모리 공간을 받아야 한다..😅

  • 반면, LinkedList는 특정 크기가 지정되지 않으며, 크게 3가지로 구성된다. (Head와 Node, Pointer)
  • 헤드는 말 그대로 시작점이며, Node는 데이터와 포인터의 정보를 갖는 것, 포인터는 노드와 노드 간의 연결고리라고 생각하면 된다.
  • 즉 기차와 같이 모든 노드들은 연결고리로 연결되어 있는데, 하나의 노드는 하나의 포인터 정보만을 저장하고 있음을 주의해야한다.
  • 이게 무슨 말이냐면 특정 원소를 찾을 때, 처음 노드 부터 시작하여 포인터가 가리키는 다음 노드, 다음 노드, 다음 노드,,,,로 찾아다니며 값을 찾을 때 까지 일일이 모든 노드를 돌아야하는 순차탐색이라는 것이다.
  • 즉 LinkedList는 특정 원소 찾기에 O(N)의 시간복잡도를 지닌다.
  • 하지만 이러한 특성으로 새로운 원소를 넣거나 뺄 때에는, 포인터 정보(다음 노드의 정보) 만을 다루기 때문에 O(1)의 시간복잡도를 지닌다는 장점이 있다.
  • 또한 모든 공간이 찼어도 맨 뒤의 노드만 동적으로 추가하면 된다는 장점도 있다.

  • 따라서 특정 원소의 조회가 주된 기능이라면 Array를!
  • 특정 원소를 삽입하거나 삭제할 일이 빈번하다면 LinkedList를 사용하자!

클릭✔ 파이썬 class로 LinkedList 구현하기

  • 파이썬 언어로 class를 처음 만들어 봤다.
    • 생성자는 init(self) 라는 함수로 고정되어 있다.
    • 생성자에 파라미터 값 (매개변수)을 던져줄 수 있다.
    • Node클래스와 LinkedList클래스를 통해 append기능 모든 노드의 데이터를 출력하는 메서드를 구현했다.
  • 그 동안 LinkedList는 말로만 들었었는데, 직접 구현해보니 훨씬 이해가 잘됐다!
  • 참고로! 파이썬의 list는 Array라고 한다. 하지만 Java의 Array와 같이 제한적이지 않은 동적배열이라고 한다. (키워드: 동적배열)
  • 따라서 LinkedList로도 사용 가능하다고 한다.

1일 1로그 100일 완성 IT지식 (1,2장)

  • 프로세서(CPU): 컴퓨터의 두뇌
  • 주 기억장치: 프로세서가 현재 작업중인 데이터, 프로세스가 수행해야 하는 명령어를 저장함.
  • 1바이트는 W 나 @ 같은 단일 문자, 42 같은 작은 수, 또는 더 큰 값의 일부를 담을 정도의 메모리 크기이다.

2) 소소한 이슈

  • ArrayList를 Array로 변환하는 과정에서 stream을 통해 구현하려다 보니 익숙치 않아 한참 헤맸다.

  • 그렇게 발견한 것이 mapToInt(i -> i); 였다!

  • 나머지는 위에서 모두 언급한 것 같다. 😎


3) 코멘트

  • 오전에 머리가 잘 돌아갈 때, 알고리즘을 푸는건 적절한 선택이었다.
  • 하루 중 가장 머리가 빨리 돌아갈 때 알고리즘 문제 후딱 해치워버리자!
  • 오늘은 자바 알고리즘, OOP 캡슐화 구현, 파이썬 자료구조 학습 완료!
  • 내일은 조금 더 타이트하게 힘내보자! 월요병 잘 견뎠다 힘내자!
profile
BackEnd Developer

0개의 댓글