티스토리 뷰
2024.02.20_List, ArrayList<E> & LinkedList<E>, Collection(Set<E>,HashSet,TreeSet),Map<K, V>, 연락처 ver.03(배열 -> 리스트)
Ji@n 2024. 2. 20. 17:44
List<> 클래스
- 배열과 같은 역할을 Generic 클래스 ( <> ) 로 생성한 형태
- 배열은 저장되는 크기를 지정해야하지만, List 는 저장의 한계가 없음
- 추가하는 만큼 저장 공간을 늘려줌
- < > 안에는 클래스만 넣어야함! (int (X) , Integer(O) ... )
* 주요 메소드 :
add() : 원소 추가
get() : 원소 읽기
set() : 원소 변경
remove() :원소삭제
Q ) Java Generic 에 대해 설명해라. (면접용)
제네릭은 자바 프로그래밍 언어의 한 기능으로,
타입 안정성(type safety)를 제공하고코드의 재사용성을 높이는 데 사용된다.
제네릭을 사용하면 클래스나 메서드를 작성할 때
일반적인 타입이나 메서드를 정의하고, 실제 사용될 때 타입을 지정할 수 있다.
제네릭을 사용할 때의 이점은
1) 타입안정성(Type safety) : 제네릭을 사용하면 컴파일러가 코드를 검사하여 타입에 대한 안정성을 보장한다, 이로 인해 잘못된 타입이 사용되는 오류를 컴파일 시간에 발견할 수 있다.
2) 코드 재사용성(Reusability) : 제네릭을 사용하면 동일한 클래스나 메서드를 다양한 타입에 대해 재사용할 수 있습니다. 따라서 코드의 재사용성이 높아진다.
3) 타입 변환(Type Casting) 필요 최소화 : 제네릭을 사용하면 컴파일러가 타입 변환을 자동으로 처리하므로, 개발자가 타입 캐스팅을 명시적으로 수행할 필요가 없어진다, 이로써 코드가 간결해지고 가독성이 향상된다,
List<String> stringList = new ArrayList<String>();
위의 코드에서 List와 ArrayList는 일반적인 제네릭 클래스이고, <String>은 해당 컬렉션에 저장될 요소의 타입을 지정하는 타입 매개변수입니다. 이렇게 함으로써 해당 리스트에는 문자열만 저장할 수 있게 되며, 다른 타입의 요소는 컴파일 시간에 오류로 감지됩니다.
이러한 이유로, 제네릭은 자바 프로그래밍에서 매우 중요한 개념 중 하나이며, 코드의 안정성과 유지보수성을 높이는 데 큰 도움을 줍니다.
배열 - > 개수를 미리 고정 & 저장된 데이터의 개수 확인하기 어려움
ArrayList : 배열 기반의 동적 크기를 가지는 리스트
ArrayList에 원소(element) 추가 : add() 메소드 사용함
Collection<E> : 자료(데이터)를 저장하기 위한 Generic 클래스
|_ List<E> , Set<E>
Map<K, V> : 자료를 key-value로 저장하기 위한 Generic 클래스
List<E>
1. 자료들이 저장되는 순서가 중요 -> 인덱스 사용
2. 중복된 값들의 저장을 허용
List<E>
|_ ArrayList<E>, LinkedList<E>
ArrayList<E>
1. 내부적으로 배열 자료구조를 사용
2. 저장 용량을 늘리는데 많은 시간이 소요됨 - 단점
3. 저장된 데이터를 삭제하는데 많은 시간이 소요됨 - 단점
4. 데이터 참조(검색)할 때 매우 빠름 - 장점
-> 추가 삭제가 느리고 검색이 빠름
0 1 2 ... 가 있을 때, 1 번이 빠지면 뒤에 번호가 다 앞으로 당겨지기 때문에
LinkedList<E>
1. 내부적으로 LinkedList 자료구조를 사용
2. 저장 용량을 늘리는 과정이 매우 간단 - 장점
3. 저장된 데이터를 삭제하는 과정이 매우 간단 - 장점
4. 데이터를 참조(검색)하는 시간이 매우 느림 - 단점
-> 추가 삭제는 빠른데 검색이 느림
줄서기 할 때 앞사람의 뒷통수만 보고 있는 것과 같다. 한 명이 빠지면 그 뒷사람만 바라보는 앞사람이 바뀌는 것.
빠진 사람 뒷 줄이 당겨지는 일 없음.
퀴즈
0번 인덱스에 접근하는 과정이 어려웠음
풀이 :
0번 인덱스 학생의 영어 점수만 변경하는 경우는 new 로 전체 변경을 하면 안되고,
list.get(0) => student 인덱스에 접근
list.get(0).getScore() => get으로 Score에 접근한다
list.get(0).getScore().setEng(50); => setEng으로 영어점수만 변경한다
Collection<E>
|_ Set<E>
HashSet<E>, TreeSet<E>
Set<E>
1. 데이터의 저장 순서가 중요하지 않음 -> 인덱스가 없음
2. 중복된 데이터의 저장을 허용하지 않음
예) {1, 2, 2, 3, 3, 3} = {1, 2, 3}
HashSet<E> : *검색*을 빠르게 하기 위한 Hash 알고리즘이 적용된 Set
TreeSet<E> : *정렬*을 빠르게 하기 위한 Tree 알고리즘이 적용된 Set
Set<Integer> set = new HashSet<>(); // 다형성
Set<Integer>은 인터페이스인 Set을 참조하고 있다.
HashSet<>은 Set 인터페이스를 구현한 클래스 중 하나.
따라서 이 코드는 HashSet 객체를 Set 인터페이스의 참조로 참조하는 다형성의 예
연락처 프로그램 ver0.3
연락처 프로그램 ver0.2를 이용하여 아래 기능 구현
1. ContactVO[] list -> ArrayList<ContactVO> list 로 변경
2. 연락처 삭제 기능 추가
VO or DTO 라서
ContactDTO[] list -> ArrayList<ContactDTO> list 로 변경
배열을 리스트로 바꾸는 과정이라 아래 연결된 override 메소드 또한 바꿔줌
2. 삭제 기능 추가하기
부모한테 입력하면
자식도 있어야함
list를 어쩌지?
null말고 무슨 값을 넣어야할지 모르겠음...
문제풀이
delete 부터 문제 풀이 보면 됨.
delete에서 오류난 첫 번째, 배열과 다르게 리스트는 크기가 정해지지 않았다.
그래서 count 변수 선언을 없애고
list.size()를 리턴한다.
그리고 deleteContact() 메소드에서 새로운 변수 result 를 선언하고
dto.delete(index) 를 해준다.
return == 1로 설정한 이유는 다음 다음 강의에서.. 설명해주시실듯
회원정보 2를 없앨 것
에러 안나고 잘 삭제되었다
'백엔드 교육과정 > 2월' 카테고리의 다른 글
2024.02.22_Thread, File, HW6 (0) | 2024.02.22 |
---|---|
2024.02.21_Inner Class(익명 클래스(Anonymous class)), Lambda,Exception(예외처리) (0) | 2024.02.21 |
2024.02.19 _ String API (Wrapper,Date) (0) | 2024.02.19 |
2024.2.16. Interface , 상속/다형성 (복습) (0) | 2024.02.16 |
2024.02.15.싱글톤 디자인 패턴 , static , 상속(Inheritance) , 생성자 , override , Object 클래스와 toString() (0) | 2024.02.15 |