와 너무 행복했다! 왜냐고? 이번 유닛에서는 컬렉션을 배웠는데 저번 유닛이 너무 어려워서 그런건지 상대적으로 난이도가 너무 쉽게 느껴졌다! 학습을 마치고 문제 푸는 시간을 주어서 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 (ExceptionType1 e1) {
// ExceptionType1 유형의 예외 발생 시 실행할 코드
}
catch (ExceptionType2 e2) {
// ExceptionType2 유형의 예외 발생 시 실행할 코드
}
finally {
// finally 블럭은 옵셔널
// 예외 발생 여부와 상관없이 항상 실행
}
컬렉션 프레임워크(Collection Framework)
컬렉션 프레임워크는 특정 자료 구조에 데이터를 추가하고, 삭제하고, 수정하고, 검색하는 등의 동작을 수행하는 편리한 메서드들을 제공한다
List와 Set은 서로 공통점이 많아 Collection이라는 인터페이스로 묶인다
ArrayList<타입 매개변수> 객체명 = new ArrayList<타입 매개변수>(초기 저장 용량); // 사용법
강점 - 데이터를 순차적으로 추가하거나 삭제하는 경우 , 데이터를 읽어들이는 경우
약점 - 중간에 데이터를 추가하거나, 중간에 위치하는 데이터를 삭제하는 경우
LinkedList<타입 매개변수> 객체명 = new LinkedList<타입 매개변수>(초기 저장 용량); // 사용법
강점 - 중간에 위치하는 데이터를 추가하거나 삭제하는 경우
컬렉션에 저장된 요소들을 순차적으로 읽어오는 역할을 한다
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<타입 매개변수> 객체명 = new HashSet<타입 매개변수>(초기 저장 용량); // 사용법
이진 탐색 트리 형태로 데이터를 저장하며. 데이터의 중복 저장을 허용하지 않고 저장 순서를 유지하지 않는다
TreeSet<타입 매개변수> 객체명 = new TreeSet<타입 매개변수>(초기 저장 용량); // 사용법
HashMap은 이름 그대로 해싱(Hashing)을 사용하기 때문에 많은 양의 데이터를 검색하는 데 있어서 뛰어난 성능을 보인다
HashMap<타입 매개변수(키), 타입 매개변수(값)> hashmap = new HashMap<>(초기 저장 용량); // 사용법
Hashtable은 HashMap과 내부 구조가 동일하며, 사용 방법 또한 매우 유사하다.
Hashtable<타입 매개변수(키), 타입 매개변수(값)> hashtable = new Hashtable<>(초기 저장 용량); // 사용법