ㅇTL

14- ArrayList , Generics 본문

2-1/객체지향 - java

14- ArrayList , Generics

정노르레기 2022. 6. 13. 00:31

ArrayList Class

- java의 standard library class (java.util.ArrayList 에 있음) (lang이 기본으로 되는거고, 저거는 임포트 해줘야됨 ^^)

 

= 동적 데이터 구조 -> 아이템이 리스트에서 추가되거나 삭제될 수 있고, 이때 배열 길이가 늘어나거나 줄어든다!

-> 실행동안 배열의 길이를 변경할 수 있다는 점 을 제외하면 일반 배열과 동일한 용도로 사용됨!

( 일반적인 array : 초기 크기가 고정되어있으므로 정적 데이터 구조)

 

• 구현 ; array를 private 멤버로 만들어 구현. 꽉차면 새로운 배열에 데이터를 옮기는 방식!

- base type은 class type! (그래서 기본 자료형(primitive type)으로 배열 만들면 Integer 이런식으로 boxing 해줘야함^^)

 

• 사용할 때

import java.util.ArrayList;

 

ArrayList<BaseType> aList = new ArrayList<BaseType>() ; // () 있는 것만 주의하자!!

크기 지정은 저기 가로에다가 함

ArrayList<BaseType> aList = new ArrayList<BaseType>(20) ;  //이런식으로!

 

• operations

- 인덱스 접근 -> [ ] 표기법 제공 x -> get

aList.get(index) -> 해당 인덱스의 값을 반환

 

- 값 넣을때 -> add(obj), set(i, obj)함수

맨첨에 리스트에 값 추가하려면 aList.add("Hi"); 이렇게 add함 그럼 뒤에 추가됨

인덱스 설정도 가능

aList(3,"Hi"!);

** add는 새로 값 추가하는 거, set은 존재하는 값 수정하는거! 초기화는 안됨 

-> aList.set(3,"dd"); 하면 인덱스3에 있는 값이 수정됨!! replace

 

- aList.size() -> 저장되어있는 element 수 반환!!

 

- 삭제 : aList.remove(index) -> 인덱스 친구 삭제 가능

 

* for each loop ? 당연히 사용 가능~~

for(Integer a:aList){

    a어쩌구

}

 

• 왜 항상 ArrayList 를 사용하지는 않는겅미?

- [] 표기법 제공 x

- 그냥 array보다 less effecient

- base type이 무조건 class 이어야함 (근데 자동 박싱 언박싱 해줘서 글케 큰문제는 아니에영)

 

https://codechacha.com/ko/java-collections-arraylist-remove/

 

Java - ArrayList.remove() 사용 방법 및 예제

ArrayList의 remove()는 리스트의 객체를 삭제하는데 사용되는 메소드입니다. ArrayList.remove(int index)는 인자로 전달된 인덱스의 아이템을 리스트에서 삭제합니다. ArrayList.remove(Object o)는 인자와 동일한

codechacha.com

 

마지막 요소 지우기는

.remove(aList.size()-1);


Generics

: 일반적인 코드를 작성하고, 이 코드를 다양한 타입의 객체에 재사용하는 기법~ ~

-> 클래스에서 사용할 타입을 클래스 외부에서 설정함 . type parameter 가 존재해서 !

( type -> 무조건 class type ~~ primitive 노노)

 

1. Class

: type parameter가 있는 class 를 정의합니당

public class className<T> { ~~ } 

이렇게 선언부에 <T> 적어줌. 여러개 할꺼면 <T, U> 이런식으로

 

클래스 내부에서 이 타입을 사용하면 됨 ! 필요한 곳에 

ex)

private T data;

public void setData(T data){

     this.data=data;

}

public T getData(){

     return data;

}

 

그리고 이거 사용할 때

className<Integer> a = new className<Integer> () ;  (constructor ~ )

이런식으로 해줍니다앙! 걍 이름옆에 <타입>을 꼭 붙여준다

 

2. Method

- 위에서처럼 class에 generic썼으면 거기 자식 메소드에 T갖다 쓸 수 있음

- 그냥 일반 메소드에도 가능 ! -> 함수 호출할 때마다 type을 넣어주는 방식 (당연히 해당 mehod에만 적용. not class)

 

선언시

public //여기적어줌// void name(~){ ~ }

ex)

public static <T> T fname(T a){

    ~ return a;

}

호출시

<type>fname()

<String>fname(parameter) 이런식으로

obj.<Integer>fname()

 

** Type parameter에 bound를 걸 수 있다**

• <T extends otherClass> 해서 해당 클래스를 상속한 클래스만 타입으로 올 수 있도록 함.

여러개면 <T extends A&B, U extends C > 이런식으로

(&=둘중하나인듯) 인터페이스도 extends 로 씀!!

ex) <T extends Comparable> 으로 적어서 Comparable을 상속한 클래스들만 올 수 있도록 함!

 

 

** 이 generic형태 인터페이스도 가능!

 

 

'2-1 > 객체지향 - java' 카테고리의 다른 글

디자인패턴 2 - Observer & Decorator  (0) 2022.06.18
Design pattern - Singleton  (0) 2022.06.13
Interfaces and Inner Classes  (0) 2022.06.02
19- Threads  (0) 2022.05.31
Chap 9. Exception handling  (0) 2022.05.30