Study/수업 내용 정리

Array / Collection - List < 2021-10-04 >

뱅코더 2021. 10. 4. 22:13

목차

  • Array(배열)
  • Collection(컬렉션) - List(리스트)
  • Generics (제네릭) 
  • 컬렉션과 다형성

 

 

Array (배열)

- 같은 자료형의 변수 여러 개를 묶어 다루는 것

 

* 단점

- 한 번 지정된 크기를 변경할 수 없음

- 배열의 중간 부분에 데이터를 추가, 삭제하기 어렵다.

- 한 타입의 데이터만 저장할 수 있음

// * 매개 변수로 전달 받은 Student 객체 주소를 stdList에 순서대로 추가
// * 배열 공간이 꽉차면 2배 크기로 늘리기

private Student[] stdList = new Student[3]; // Student 객체 배열 3개 선언
private int index = 0;						// 메서드 호출 시 추가할 index 변수 선언
public boolean add(Student std){
	if(index == stdList.length){			// 만일 index가 배열 길이만큼 꽉차면
    	Student[] newList = new Student[stdList.length * 2];
        // 기존 배열의 2배 크기의 newList라는 새로운 객체 배열을 생성
        System.arraycopy(stdList , 0 , newList , 0 , stdList.length);
        // 깊은 복사 (기존 배열이 가진 데이터를 새로운 배열에 모두 복사)
        stdList = newList;
        // 얖은 복사 (기존 배열에 새로운 배열주소를 덮어씀)
    }
    stdList[index] = std;
    index ++;
    return true;
}

Collection(컬렉션)

- 컬렉션(Collection)은 자바에서 제공하는 자료구조를 담당하는 프레임워크

 

* 장점

- 추가 , 삭제 , 정렬 등의 기능 처리를 간단하게 해결할 수 있음

- 저장 크기의 제약이 없음

- 여러 가지 데이터 타입 저장 가능 ( 객체만 저장 가능, But 제네릭을 통해 데이터 타입을 제한하는 것이 좋음 )

 

Collection의 주요 Interface - List , Set , Map


List

- 자료들을 순차적으로 나열한 자료구조 

- 인덱스로 관리된다

- 중복해서 객체 저장 가능

- ArrayList , Vector , LinkedList

 

ArrayList 

- List의 후손 클래스

- 배열과 비슷한 형태의 List ( 가장 기본 적이고 많이 사용함 )

- 초기 저장 용량은 10 ( 따로 지정 가능 )

- 저장 용량을 초과한 객체가 들어오면 자동으로 늘어나며 크기 고정 가능

- 동기화 제공 X

- 검색에 효율적인 구조

 

LinkedList

- 요소 하나하나가 줄로 연결된 모양으로 추가와 삭제 기능에 효율적임

ArrayList list = new ArrayList();		// 기본 생성자로 생성하면 초기 용량 10
ArrayList stdList = new ArrayList(3);	// 초기 용량 3

// 1. add (E e) : 리스트 맨 끝에 추가
stdList.add(new Student("이름" , 나이 , 학년 ) )

// 2. toString()
System.out.println(stdList.toString());

// 3. add(int index , E e) : 지정된 index에 삽입
stdList.add( 2 , new Student ( "홍길동" , 15 , 2 ) )

// 4. size() : 리스트에 저장된 데이터 개수 반환
System.out.println(stdList.size());

// 5. get(int index) : 리스트에 저장된 index번 요소를 반환함
System.out.println(stdList.get(0));
System.out.println(stdList.get(1));
...

// 6. Object set(int index , E e) : 리스트 index번 요소를 e로 변경하고 기존 값을 반환
Object obj = stdList.set(0 , new Student("홍길동" , 19 , 3));

// 7. Object remove(int index) : 리스트의 index번 요소를 삭제하고 기존 값을 반환
Object obj = stdList.remove(1);

 

* 향상된 for문 (for each문)

- 컬렉션이나 배열의 모든 요소를 처음부터 끝까지 순서대로 접근하는 용도의 for문

 

for ( 값을 담을 변수 : 컬렉션 또는 배열명 )

 


Generics (제네릭)

- 간단한 개념만 찍먹...

- 컬렉션 타입의 제한 기능의 제네릭부터 천천히 공부하기

- Generics : <E>

- 클래스, 메서드 , 컬렉션 내부에 사용되는 클래스 타입을 제한하는 기능

 

* 장점 

1) 하나의 타입으로 제한하므로 instanceof를 이용한 검사 , 다운캐스팅 등의 작업이 필요 없음

 ==> 컴파일 단계에서 강력한 타입 체크

 

2) 하나의 코드로 여러 타입을 처리할 수 있음 (다형성)

 

// generic(제네릭)을 사용하여 Student로 타입을 제한한 ArrayList 생성

ArrayList<Student> stdList = new ArrayList<Student>();


- 생성된 ArrayList에는 Student만 저장 가능
- 다른 타입의 자료가 섞여있을 경우 Student 객체만 찾기 위해서는 
  instanceof 검사를 해야함
- 제네릭을 통해 해결

컬렉션과 다형성

* 다형성 : 부모 타입의 참조 변수로 상속 관계에 있는 자식 객체를 참조하는 것

* 인터페이스의 특징 

- 상속 받은 자식에게 동일한 이름의 기능을 강제로 오버라이딩

-> 상속 받은 자식의 형태가 비슷해짐

- 인터페이스는 객체를 생성할 수 없다 , 참조 변수로는 사용 가능함

// 컬렉션에 다형성 적용

List<String> list2 = new LinkedList<String>();
// 부모 타입(List)로 자식 타입(LinkedList) 참조

// 나중에 다른 종류의 자식 타입으로 변경해도 유지 및 보수가 쉬움


// 매개 변수의 다형성
public void example1(List<String> list){
	System.out.println(list);
}
// 매개 변수가 부모 타입인 List<String> == 매개변수의 다형성

public List<String> example2(){
	return new ArrayList<String>();
}
// 반환형이 부모 타입인 List<String> == 반환형의 다형성

// 제네릭의 다형성 적용
// => 하나의 코드로 여러 타입 처리가 가능함

// 예) Person 클래스를 상속 받은 Student 클래스
public void example3(){
	List<Person> list = new ArrayList<Person>();
    
    list.add( new Person() );	
    list.add( new Student() );	
    
    for(Person p : list){
    	System.out.println(p.toString());
        // 코드 실행 중 동적 바인딩 -> 자식 객체의 toString() 실행
    }
}