Right now do !

[JAVA] C#개발자를 위한 JAVA: Collection

by 지금당장해

프로그램 요소중에 가장 많이 활용되는 것중에 1~2등 안에 드는 것이 바로 자료구조일 것이다. 연속되는 데이터 여기서 자료를 보관하고 지우고 꺼내는 작용, 요약하자면 이렇다. 이 역시도 C#과 거의 비슷한데 조금씩 틀리다. 관련된 내용을 별도로 정리 하고자 한다.


#List<T>

C#은 언어스팩 2.0부터 JAVA는 언어스팩 5부터 제네릭을 지원하였다. C++시절에는 템플릿 클래스라고 했던것이 두 언어에서 동일한 용어로 지원되기 시작했다. 순차를 갖는 즉 인덱스로 제어가 가능한 자료구조인 점에서는 C#과 동일하나 JAVA는 List<>가 인터페이스이다. 해서 ArrayList, LinkedList, Vector중에 하나를 용도에 맞게 골라서 사용해야 한다.

List lstOfString = new ArrayList(int:필요에 때라 Capacity지정);

#ArrayList<T>

내부적으로 자료구조가 배열같은 구조로 중간에 뭐하나가 빠지면 뒤에 있는 것들이 그 자리를 메우기 위해서 앞으로 복사되는 구조라고 한다. 그러다 보니 자주 그런 연산이 이루어지는 경우에는 성능이 좋지 않다.


#Arrays.asList(T... params)

ArrayList를 선언하지 않고 간단하게 ... Static하게 ... List를 만들어 사용하는 방법이다. 아래 코드를 참고 한다.

List lstInteger = Arrays.asList(1,2,3);


근데 보다 보니 JAVA는 가변 파라미터를 어떻게 쓰지??? 위 예제 코드에서 asList가 가변 파라미터 인거 같은데.. 찾아 보니 그렇다. 아래 코드는 가변 파라미터로 구현된 함수 예시이다. (C#은 명시적으로 params라는 지시자를 앞에 쓰고 배열로 선언한다.)

public void myMethod(String... strings){
    for(String s : strings){
        
    }

    // 위의 코드와 동일 각각 접근가능 
    for( int i = 0; i < strings.length; i++){
        String s = strings[i]
    }
}


#Vector<T>

ArrayList와 동일한 성격의 자료구조이며 단지 이는 Thread Safety를 보장하는 차이가 있다. 즉 여러 Thread의 동시접근을 알아서 잘 제어해서 Thread간 충돌이 일어나지 않게 하려면 이 자료구조를 선택해야 한다.



#LinkedList<T>

양방향 레퍼런스를 물고 있는 자료구조, 즉 하나가 사라지면 앞뒤 객체간에 Link를 재 설정 하는 방식으로 순서를 유지 한다.


#Set<T>

Set도 List와 마찬가지로 Interface이며 이를 활용하려면 여러 Class중 하나를 용도에 맞게 사용해야 한다. List와 Set의 차이점은 순서가 없다는 것이다. 책에서는 구술 자료에 비교하는데 구술을 구술 자루에 넣고 꺼낼때와 같은 현상이 일어난다는 것이다. 넣은 순서와 무관하게 튀어나온다. 그리고 또 하나의 차이는 List는 동일 항목의 추가가 불가능 하다는 것이다. (반대로 List<>는 동일 항목의 추가가 가능하다.)


#HashSet<T>

Set<> Interface의 구현체이다. hashCode()에서 반환되는 값을 equals()로 비교하여 같으면 같은 객체로 판단하여 추가를 거부하는 동작을 하는 Set이다. 결국 비교대상 객체의 hashCode()와 equals()가 어떻게 구현이 되어 있느냐에 따라 동일 객체 여부가 판단되는 것이다.


#Map<T,V>

Key,Value쌍을 관리하는 자료구조이다. C#에 Dictionary에 대응된다. JAVA도 Dictionary가 존재한다. 그건 뭐 나중에 다시 언급 하기로 하고 지나가자. 당연한 이야기지만 Key는 유일해야 한다. 


#HashMap<T,V>

Map<T> Interface를 구현한 대표적인 Class이다. HashSet<> Hash값의 동일 여부로 판단하여 관리하듯이 HashMap<> Key가 같은지를 판단하여 자료구조를 유지 한다. 자 근데 책에서 예제를 보다보니 C#과의 차이점을 발견했다. HashSet도 그렇고 HashMap도 그렇고 JAVA는 같은 것이 들어오면 그냥 넣어준다. 결론은 마지막에 들어간 자료로 이전 것을 뭉갠다고 봐야 한다. (C#은 Exception이 발생하지 아마.....) 따라서 값을 보호하려면 Map<> Interface에 정의되어 있는 contains 함수로 중복 값을 사전에 잘 검사 해야 한다.


#HashTable<T,V>

HashMap과 동일한 작용을하는데 Vector와 같이 Thread Safety를 구현한 Class이다.


#Properties

HashTable<T,V>를 상속하여 구현한(하위) Class 이다. 단 Key와 Value를 String으로 고정했다.  주로 ~.properties파일을 로딩하여 사용하는 목적으로 쓰인단다. (리소스, 프로퍼티에 대한 자세한 내용은 별도로 정리 하자)





블로그의 정보

지금 당장 해!!!

지금당장해

활동하기