[코드스테이츠] S1.Unit8 회고

JinYoung Choi·2023년 1월 6일
0

와 너무 행복했다! 왜냐고? 이번 유닛에서는 컬렉션을 배웠는데 저번 유닛이 너무 어려워서 그런건지 상대적으로 난이도가 너무 쉽게 느껴졌다! 학습을 마치고 문제 푸는 시간을 주어서 24문제를 코딩 해보았는데 부트 캠프를 시작하고 나서 처음으로 문제를 시간내에 다 풀었다. 어쩌면 내가 성장한거 일지도?..

시간적으로 여유가 생기다 보니 이틀 간 객체지향에 대하여 유튜브도 많이 찾아보고 문서로 복습도 많이 했다. 이젠 어느정도 이해 가능한 단계가 됐다. 하지만 아직은 완벽한게 아니니 내 것을 만들때 까지 계속 할 것이다!

페어매칭도 새롭게 해서 새로운 페어분도 만났다. 서로 E성향의 MBTI를 가져서 그런지 수다도 많이 떨었다. 다음주 화요일까지 같이 활동 한다고 하니, 최대한 열정적으로 해야겠다!

그나저나 부트캠프의 수업 시간이 끝난 후에도 밥 먹고 자습시간을 꾸준히 가졌더니 이젠 안하면 불안해지는 좋은 습관도 생겼다. 지금 쓰는 이 블로그도 얼른 작성하고 복습이랑 예습하러 가야지!

열거형(enum; enumerated type)

열거형(enum)은 서로 연관된 상수들의 집합을 의미

enum 열거형이름 { 상수명1, 상수명2, 상수명3, ...} // 사용법
interface Seasons {
	int SPRING = 1, SUMMER = 2, FALL = 3, WINTER = 4;
}

열거형은 여러 상수들을 보다 편리하게 선언하고 관리할 수 있게하며, 상수명의 중복을 피하고, 타입에 대한 안정성을 보장하고 간결하고 가독성이 좋은 코드를 작성할 수 있다

제네릭(Generic)

클래스나 메서드의 코드를 작성할 때, 타입을 구체적으로 지정하는 것이 아니라, 추후에 지정할 수 있도록 일반화해두는 것을 의미, 즉, 작성한 클래스 또는 메서드의 코드가 특정 데이터 타입에 얽매이지 않게 해둔 것을 의미한다.

제네릭이 사용된 클래스를 제네릭 클래스

class Basket<T> {
    private T item;

    ...
}

클래스 변수에는 타입 매개변수를 사용할 수 없다. ex) static T item1 (x)

Basket<String>  basket1 = new Basket<>("Hello"); //제네릭 클래스 사용법

클래스 전체를 제네릭으로 선언할 수도 있지만, 클래스 내부의 특정 메서드만 제네릭으로 선언할 수 있습니다. 이를 제네릭 메서드라고 한다

class Basket {
		...
		public <T> void add(T element) {
				...
		}
}

클래스 타입 매개변수와 달리 메서드 타입 매개변수는 static 메서드에서도 선언하여 사용할 수 있다.

와일드카드

와일드카드는 어떠한 타입으로든 대체될 수 있는 타입 파라미터를 의미하며, 기호 ?로 와일드카드를 사용할 수 있다

<? extends T>
<? super T>

<.? extends T> 는 와일드카드에 상한 제한을 두는 것으로서, T와 T를 상속받는 하위 클래스 타입만 타입 파라미터로 받을 수 있도록 지정

반면, <? super T>는 와일드카드에 하한 제한을 두는 것으로, T와 T의 상위 클래스만 타입 파라미터로 받도록 한다

예외 처리(Exception Handling)

예외 처리 - 예기치 않게 발생하는 에러에 대응할 수 있는 코드를 미리 사전에 작성하여 프로그램의 비정상적인 종료를 방지하고, 정상적인 실행 상태를 유지하기 위한 것

컴파일 에러

이름 그대로 “컴파일 할 때" 발생하는 에러

주로 세미콜론 생략, 오탈자, 잘못된 자료형, 잘못된 포맷 등 문법적인 문제를 가리키는 신택스(syntax) 오류로부터 발생하기 때문에 신택스 에러(Systax Errors)라고 부르기도 한다

런타임 에러

런타임 시에 발생하는 에러

런타임 에러는 주로 개발자가 컴퓨터가 수행할 수 없는 특정한 작업을 요청할 때 발생

에러란 한번 발생하면 복구하기 어려운 수준의 심각한 오류를 의미

예외는 잘못된 사용 또는 코딩으로 인한 상대적으로 미약한 수준의 오류로서 코드 수정 등을 통해 수습이 가능한 오류를 지칭

try - catch문

try {
    // 예외가 발생할 가능성이 있는 코드를 삽입
} 
catch (ExceptionType1 e1) {
    // ExceptionType1 유형의 예외 발생 시 실행할 코드
} 
catch (ExceptionType2 e2) {
    // ExceptionType2 유형의 예외 발생 시 실행할 코드
} 
finally {
    // finally 블럭은 옵셔널
    // 예외 발생 여부와 상관없이 항상 실행
}

컬렉션 프레임워크(Collection Framework)

컬렉션 프레임워크는 특정 자료 구조에 데이터를 추가하고, 삭제하고, 수정하고, 검색하는 등의 동작을 수행하는 편리한 메서드들을 제공한다

List

  • List는 데이터의 순서가 유지되며, 중복 저장이 가능하다
  • ArrayList, Vector, Stack, LinkedList 등이 List 인터페이스를 구현

Set

  • Set은 데이터의 순서가 유지되지 않으며, 중복 저장이 불가능하다
  • HashSet, TreeSet 등이 Set 인터페이스를 구현

Map

  • Map은 키(key)와 값(value)의 쌍으로 데이터를 저장하는 컬렉션을 구현하는 데에 사용한다
  • 데이터의 순서가 유지되지 않으며, 키는 값을 식별하기 위해 사용되므로 중복 저장이 불가능하지만, 값은 중복 저장이 가능하다
  • HashMap, HashTable, TreeMap, Properties 등이 Map 인터페이스를 구현

List와 Set은 서로 공통점이 많아 Collection이라는 인터페이스로 묶인다

ArrayList

  • 객체를 추가하면 객체가 인덱스로 관리된다는 점에서는 배열과 유사
  • 저장 용량을 초과하여 객체들이 추가되면, 자동으로 저장용량이 늘어나게 된다
  • 데이터가 연속적으로 존재 ( 순서 유지 )
ArrayList<타입 매개변수> 객체명 = new ArrayList<타입 매개변수>(초기 저장 용량); // 사용법

강점 - 데이터를 순차적으로 추가하거나 삭제하는 경우 , 데이터를 읽어들이는 경우
약점 - 중간에 데이터를 추가하거나, 중간에 위치하는 데이터를 삭제하는 경우

LinkedList

  • 데이터를 효율적으로 추가, 삭제, 변경하기 위해 사용한다
  • 배열에는 모든 데이터가 연속적으로 존재하지만, LinkedList에는 불연속적으로 존재한다
LinkedList<타입 매개변수> 객체명 = new LinkedList<타입 매개변수>(초기 저장 용량); // 사용법

강점 - 중간에 위치하는 데이터를 추가하거나 삭제하는 경우

Iterator

컬렉션에 저장된 요소들을 순차적으로 읽어오는 역할을 한다

iterator()를 통해 만들어진 인스턴스는 아래의 메서드를 사용할 수 있다

hasNext() - 읽어올 객체가 남아 있으면 true를 리턴하고, 없으면 false를 리턴

next() - 컬렉션에서 하나의 객체를 읽어오고. 이 때, next()를 호출하기 전에 hasNext()를 통해 읽어올 다음 요소가 있는지 먼저 확인해야 한다

remove() - next()를 통해 읽어온 객체를 삭제합니다. next()를 호출한 다음에 remove()를 호출해야 한다

ArrayList<String> list = ...;
Iterator<String> iterator = list.iterator();

while(iterator.hasNext()){        // 다음 객체가 있다면
	String str = iterator.next();   // 객체를 읽어오고,
	if(str.equals("str과 같은 단어")){ // 조건에 부합한다면
		iterator.remove();            // 해당 객체를 컬렉션에서 제거합니다. 
	}
}

HashSet

중복된 값을 허용하지 않으며, 저장 순서를 유지하지 않는다

HashSet<타입 매개변수> 객체명 = new HashSet<타입 매개변수>(초기 저장 용량); // 사용법

TreeSet

이진 탐색 트리 형태로 데이터를 저장하며. 데이터의 중복 저장을 허용하지 않고 저장 순서를 유지하지 않는다

TreeSet<타입 매개변수> 객체명 = new TreeSet<타입 매개변수>(초기 저장 용량); // 사용법

HashMap

HashMap은 이름 그대로 해싱(Hashing)을 사용하기 때문에 많은 양의 데이터를 검색하는 데 있어서 뛰어난 성능을 보인다

HashMap<타입 매개변수(키), 타입 매개변수(값)> hashmap = new HashMap<>(초기 저장 용량); // 사용법

Hashtable

Hashtable은 HashMap과 내부 구조가 동일하며, 사용 방법 또한 매우 유사하다.

Hashtable<타입 매개변수(키), 타입 매개변수(값)> hashtable = new Hashtable<>(초기 저장 용량); // 사용법
profile
백엔드 취준생

0개의 댓글