

ArrayList
- 장점
- 저장된 인스턴스의 참조와 검색이 빠르다.
- [5]하면 그 주소로 cpu가 다이렉트로 찾아감
- 단점
- 저장 공간을 늘리는 과정에서 시간이 비교적 많이 소요 된다.
- 인스턴스의 삭제 과정에서 (엄청) 많은 연산이 필요 할 수 있다.
- 중간에 하나 삭제하면 하나씩 땡겨야 해서 오래걸리며 공간을 늘릴 때도 새로 만들어서 복사해야하기 때문에 시간 소요가 되어 느리다.
LinkedList
- 장점
- 저장 공간을 늘리는 과정이 간단하다.
- 공간 하나 만들고 주소 연결하면 된다.
- 저장된 인스턴스의 삭제 과정이 단순하며 빠르다.
- 하나 지우고 참조와 주소만 변경해주면 된다.
- 단점
- 저장된 인스턴스의 참조 과정이 배열보다 복잡하여 검색이 느리다.
- 하나씩 연결되어 주소를 가리키고 있어서 해당 주소를 하나씩 다 찾아가야한다.
✅코드 작성
import java.util.HashSet;
import java.util.Set;
public class SetLotto {
public static void main(String[] args) {
Set<Integer> lottoSet = new HashSet<>();
final int LOTTO = 6;
while(lottoSet.size() < LOTTO) {
int num = (int)((Math.random()*45)+1);
lottoSet.add(num);
}
System.out.println(lottoSet);
for(Integer s : lottoSet ) {
System.out.println(s);
}
}
}
- 집합의 개념을 구현해 놓은 것이 set이다. (수학으로 set 집합)
- Set 인터페이스를 구현하는 제네릭 클래스이 갖는 중요한 특징!
- 저장 순서가 유지 되지 않는다.
- 데이터의 중복 저장을 허용하지 않는다.
- set을 사용하면 중복 체크를 할 필요가 없다.
HashSet<Num> set = new HashSet<>(); set.add(new Num(7799)); set.add(new Num(9955)); set.add(new Num(7799)); System.out.println("인스턴스 수: " + set.size()); for(Num n : set) System.out.print(n.toString() + '\t'); System.out.println(); /* ====출력 인스턴스 수: 2 7799 9955 */
✅코드 작성
- set은 집합을 구현한 것으로 저장 순서가 유지되지 않고, 데이터의 중복 저장을 허용하지 않는다. 이를 구현하기 위해서는 동일 인스턴스가 중복 저장되지 않도록 해야한다. 그러므로 set을 호출하기 위해서 다음 두 개가 호출되어야 한다는 것을 반드시 이해해야 한다. 아래의 두 개가 다 같아야 동일 인스턴스이다.
- 해시알고리즘은 동일인스턴스가 있는지 검사를 하기위한 속도를 획기적으로 향상시킬 수 있는 방법!
- ① hash code 호출 (두 개 객체 주소-hash code가 같은지 비교)
hashCode 는 Object에 있다. 아래의 예시와 같이 오버라이드 한 함수를 통과해 리턴 되는 값으로 군집(집합, 캐비넷)을 만든다. 그리고 그 다음 equals를 호출한다.- ② equals 호출 (문자열 비교 걸러냄)
hash code의 호출로 군집히 형성되면 그 군집 내의 요소들을 비교해 나간다.- 따라서 Set은 hashCode를 기반으로 분류된 데이터 속에서 탐색을 하면 되기 때문에 탐색 속도가 높다.
① List: 순서가 있으며, 데이터(값) 중복 허용, 인덱스를 통해 저장 데이터에 접근이 가능
② Set: 순서가 없으며, 데이터(값) 중복을 허용하지 않음, 인덱스가 따로 존재하지 않기 때문에 Iterator를 사용하여 조회
10번 부서 또는 20번부서 또는 30번 부서에 속하는 사원은?
select * from emp where deptno in ( 10,20,30);
10번 및 30번 부서에 속하는 모든 사원의 이름과 부서 번호를 출력하되,이름을 알파벳순으로 정렬하여 출력하라.
select * from emp where deptno in (10,30) order by ename;
1981년 2월 20일 ~ 1981년 5월 1일에 입사한 사원의 이름,직업 및 입사일을 출력하라.
select * from emp where hiredate between '81/02/20' and '81/05/01' ;
사원중 82년도에 입사한 사원은?
select * from emp where '82/01/01' <= hiredate and hiredate <= '82/12/31' ;
select * from emp where hiredate between '82/01/01' and '82/12/31';
각 사원의 연봉 계산을 하는 쿼리문(NVL 함수)
select ename,sal,comm, sal*12 + comm as "연봉",sal*12+nvl(comm,0) as 연봉2 from emp;
이번달 마지막날을 구하시오.
select last_day(sysdate) from dual;
오늘을 기준으로 가장 가까운 다음 수요일은 언제인지 알아보는 쿼리문
select sysdate, next_day(sysdate,'수요일') as "다음주 수요일" from dual;
각 직원들이 근무한 개월 수를 구하는 쿼리문
select ename,sysdate,round(months_between(sysdate,hiredate)) 근무개월수 from emp;
어제 오늘 내일 날짜를 구하시오.
select sysdate-1 어제, sysdate 오늘, sysdate +1 as "내일" from dual;
사원들의 입사일에서 입사 년도와 입사 달, 입사 일자를 각각 컬럼으로 출력하는 쿼리문
select ename, substr(hiredate,1,2) as "년도", substr(hiredate,4,2) as "달", substr(hiredate,7,2) as "일" from emp;