새소식

Reflections/Daily

19일차 - 자바의 신 22~23장, Collection, ArrayList, Vactor, Stack, LinkedList, Queue, Deque, Spring CRUD 클래스 구조와 테이블 구상

  • -

 

🚀 학습 목표 & 예상 결과

 

  • 자바의 신 22,23장 읽기 3시간 30분 -> 3시간 30분
  • Spring CRUD 클래스 구조와 테이블 구상하기 50분 -> 1시간 30분
  • 4주차 멘토링 문제 3개 풀기 30분 -> 15분

 

 

📌TIL 

 

22장 - 컬렉션 파트 1 (List)

  • Collection
    • Collection<E> 인터페이스는 Iterable<E>라는 인터페이스를 확장했다. (상속)
      • Iterable 인터페이스는 Iterator라는 인터페이스를 리턴하며, Iterator의 메소드는 총 3개다.
        • hasNext() - 추가 데이터 여부 확인
        • next() - 현재 위치를 다음 요소로 넘기고 값 리턴
        • remove() - 데이터 삭제
      • 즉, Collection 인터페이스는 Iterator 인터페이스를 사용해 데이터를 순차적으로 가져올 수 있다.
  • List
    • 기본적으로 몇몇 메소드를 제외하곤 Collection 인터페이스와 같으며, 순서가 있다는 것이 가장 큰 특징이다.
    • ArrayList = Not Thread safe / Vector = Thread safe
    • Stack은 Vecotr를 확장하여 만들었으며, LIFO이다. (Last In First Out)
  • 자바 개발에 있어서 상속 관계를 확인하는 습관을 들이는 것이 좋다. (부모 클래스 메소드도 사용 가능하므로.)
  • ArrayList
    • 초기크기 10으로 설정되며 가변적인 공간을 가진 배열.
    • 상속관계 : java.lang.Object <- java.util.AbstrctCollection<E> <- java.util.AbstractList<E> <- java.util.ArrayList<E>
    • 구현 인터페이스 : Serializable, Cloneable, Iterable<E>, Collection<E>, List<E>, RandomAccess
      • Serializable : 원격으로 객체 전송, 파일 저장
      • Cloneable : clone() 동작 가능 (복제 가능 객체를 의미)
      • Iterable<E> : 객체가 foreact 문장 사용 가능
      • List<E> : 목록형 데이터 처리하는 것과 관련된 메소드 지정
      • RandomAccess : 목록형 데이터에 빠르게 접근할 수 있도록 선형적인 순차접근 외에, 인덱스를 사용한 직접 접근을 할 수 있다고 지정
    • 생성자 : ArrayList(), ArrayList(Collection<? extends E> c), ArrayList(int initialCapacity)
      • ArrayList(Collection c) : 매개 변수로 넘어온 컬렉션 객체가 저장된 ArrayList 생성
      • ArrayList(int initialCapacity) : 매개 변수로 넘어온 initialCapactity 개수만큼의 저장 공간을 갖는 ArrayList 생성
    • add로 중간 인덱스에 값을 추가하게 되면, index값에 내용이 추가되고 뒤의 값들은 하나씩 뒤로 밀린다.
    • Collection 객체를 복사할 때는, 생성자를 사용하거나 addAll() 메소드를 사용하자.
      • list2 = list를 사용할 경우, list2는 list의 참조 주소값을 사용하게 된다. (얕은 복사 : Shallow copy)
    • toArray() 사용 시, 기존 어레이 크기보다 크다면 나머지가 null로, 작다면 전체가 null로 들어간다. 0을 적자.
  • Stack
    • LIFO 기능을 구현하려고 할 때 필요한 클래스. (Last In First Out)
    • LIFO 기능을 위해서만 사용한다면 ArrayDeque라는 클래스가 더 빠르게 사용가능하다.  단지 스레드 안전 하지 않을 뿐.
    • 상속관계 :  java.lang.Object <- java.util.AbstrctCollection<E> <- java.util.AbstractList<E> <- Vector<E> <- java.util.Stack<E>

 

 

23장 - 컬렉션 파트2 (Set, Queue)

  • Set 
    • 순서에 상관없이, 원하는 값이 포함되어 있는지를 확인하는 용도로 많이 사용된다. (중복 X)
    • Set을 구현한 주요 클래스는 3개로, HashSet, TreeSet, LinkedHashSet이다.
    • 각 Set들은 데이터 정렬 여부로 인한  성능 차이가 존재한다.
  • HashSet
    • 순서가 전혀 필요 없는 데이터를 해시 테이블에 저장하며 초기크기는 16으로 고정이다. (Set 중 가장 빠르다.)
    • equals()와 hashCode() 메소드를 구현하는 것이 매우 중요하다.
    • 상속 관계 : java.lang.Object <- java.util.AbstrctCollection<E> <- java.util.AbstractSet<E> <- java.util.HashSet<E>
    • 구현 인터페이스 : Serializable, Cloneable, Iterable<E>, Collection<E>, Set<E>
    • 생성자 : HashSet(), HashSet(Collection<? extends E> c), HashSet(int initialCapacity), HashSet( int initialCapacity, float loadFactor)
      • HashSet() : 데이터를 저장할 수 있는 16개의 공간과 0.75의 로드 팩터(load fac-tor)를 갖는 객체 생성
        • 0.75 로드팩터 : 해시 테이블이 75% 채워졌을 때, 해시 테이블의 크기를 자동으로 조정한다는 뜻
        • 로드팩터가 클수록 공간은 넓어지지만, 데이터를 찾는 시간은 증가한다. (해시 함수의 범위보다 많은 데이터를 포함할 확률이 높아져 해시 충돌 가능성이 높아지기 때문)
      • HashSet(Collection c) : 컬렉션 객체의 데이터를 HashSet에 담는다
      • HashSet(int initialCapacity) : 매개 변수로 받는 개수만큼의 데이터 공간과 0.75의 로드 팩터를 갖는 객체 생성
      • HashSet( int initialCapacity, float loadFactor) : 데이터 공간, 로드 팩터를 갖는 객체 생성
  • Queue
    • FIFO 구조로 요청이 들어온 순서대로 처리할 때 사용한다. (Frist In Frist Out)
    • Deque는 Double Ended Queue의 약자로 맨 앞에 값을 넣거나 빼는 작업, 맨뒤에 값을 넣거나 빼는 작업이 수월해진 Queue라고 보면 된다. (참고로 디큐가 아니라 deck라고 읽는다.)
  • LinkedList
    • 데이터가 자신의 앞 자료위치, 뒤 자료위치만을 기억하는 배열. (열차를 생각해 보자)
    • 공간을 미리 지정해두지 않는다. 
    • List는 Queue와 Deque 인터페이스를 구현하고 있다. 즉, List이자 Queue, Deque도 된다.
    • 상속관계 :  java.lang.Object <- java.util.AbstrctCollection<E> <- java.util.AbstractList<E> <- java.util.AbstractSequentialList<E> <- java.util.LinkedList<E>
      • AbstractList와 AbstractSequentialList의 차이는 add(), set(), romeve()등의 메소드에 대한 구현이 다르다는 것이다.
    • 인터페이스 : Serializable, Cloneable, Iterable<E>, Collection<E>, Deque<E>, List<E>, Queue<E>
    • 생성자 : LinkedList(), LinkedList(Collection<? extends E> c)
    • 값을 추가할 때는 add와 addLast를, 맨 앞 값을 꺼내올 때는 getFirst를 권장한다. 
      • add가 익숙하기 때문.
      • 맨 앞 값을 가져오는 메소드는 내부에서 전부 getFirst를 호출하기 때문.
    • 맨 앞 데이터 삭제는 removeFirst를, 맨 뒤 삭제는 removeLast를 권장한다. (내부 호출)

 

  • 요약
    • 순서 중요 + 크기 안다 = 배열
    • 순서 중요 + 크기 모른다 = ArrayList
    • 순서 중요 + 수정이 많다 or 선입선출 = Queue(LinkedList)
    • 순서 중요 X + 데이터 존재여부 = Set
    • 후입선출 = Stack

 

 

 

Spring CRUD 클래스 구조와 테이블 구상

  • Table (sqlDBM 사용)

클래스 구조도는 어떤 느낌인지 잘 기억이 나지 않아서, 일단은 여기서 마무리했다.

 

 

 

🔗 Feedback

◾ 예상 결과 <> 실제 결과

 

  • 예상 결과 >= 실제 결과

테이블 작성 시에 고려해야 할 것들이 무엇이 있을지 찾고, 네이밍 규칙이 어떻게 되는지 찾느라 오래 걸렸다.

사실 제대로 작성했는지는 아직도 잘 모르겠다...ㅎㅎ

그 외에는 예상과 비슷한 속도였다.

(사실은 오늘 공부를 너무너무 하기 싫었어서 오래 걸렸으나, 이것마저도 예측에 성공했다!)

 

ㅋㅋㅋ 25/5 뽀모도로에서 쉬는 시간이 되는 족족 낮잠을 자거나 운동을 하거나, 그것도 안되면 긍정확언을 하면서 강제로 마인드컨트롤을 진행했다. (집중되는 주파수도 틀어보고 휴식 주파수도 틀어보고 다 해봤다.)

하기 싫어질 때마다 나는 공부하는 게 재미있다고 주입했기에 성공한 듯하다.(사실이기도 하다.)

 

◾ 성공 비결 & 실패 이유

 

  • 성공 비결

마인드컨트롤, 목표량을 채우겠단 의지, 어느 정도 돌아온 루틴, 새로운 스케줄 제작

 

  • 실패 이유

놀고 싶다는 욕구

 

◾ 좋았던 것, 부족했던 것, 개선할 것, 긍정 한마디

 

  • 좋았던 것: 아무튼 끝까지 진행한 것, 마인드 컨트롤을 시도한 것, 루틴을 되찾아가고 있는 것, 새로운 스케줄을 만든 것
  • 부족했던 것: 마인드 컨트롤. 현재를 즐기질 못하고 자꾸 다른 데에 얽매인다.
  • 개선할 것: 현재를 살아갈 것!
  • 긍정 한마디: 오늘 공부 너무 재밌었다, 그치! 오늘도 수고했어~~

 

 

◾ 결론

 

  • 현재를 살자
  • 내일 자바의 신 24장 공부하고, 알고리즘 문제 1개 풀기
  • 루틴 계속 유지하기
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.