Skip to content

Latest commit

 

History

History
163 lines (142 loc) · 5.97 KB

21_11_27_TIL.md

File metadata and controls

163 lines (142 loc) · 5.97 KB

List Interface

  • 객체를 순서에 따라 저장하고 관리하는데 필요한 메소드가 선언되어 있는 Interface이다.
  • 배열의 기능을 구현하기 위한 메소드가 선언되어 있다.
  • ex) ArrayList, Vector, LinkedList

ArrayList와 Vector

  • 객체 배열 Class
  • Vector는 java 2부터 제공되어진 Class이다.
  • Vector는 Multi thread 프로그램에서 동기화를 지원한다. 동기화(Synchronization) : 두 개의 Thread가 동시에 하나의 리소스에 접근하는 경우 순서를 맞추어서 오류가 방지하지 않도록 하는 기법
  • Capacity : 배열의 용량, Size : 배열의 길이 (두 단어는 다른 정의이다.)

ArrayList와 LinkedList

  • ArrayList는 배열을 구현한 Class로 논리적 순서와 물리적 순서가 동일하다.
  • LinkedList는 논리적으로 순차적인 구조를 갖지만, 물리적으로는 순차적이지 않을 수 있다.

LinkedList의 구조

image

Set

  • Collection Interface의 하위 Interface이며, 요소의 저장 순서를 유지하지 않는다.
  • 같은 요소의 중복 저장을 허용하지 않는다.(중복된 데이터를 허용하지 않는다.)
  • 요소의 저장 순서(index)가 존재하지 않기 때문에 List와는 다르게 get() 메소드를 지원하지 않는다. 따라서 Iterator를 사용하여 데이터를 순회한다.)
  • 주로 유일한 값이나 객체(Id, 주민번호, 사번)를 관리할 때 사용한다.
  • 대표적으로는 HashSet, TreeSet이 존재한다.
  • Set으로 선언되는 클래스 내부에서 equals()와 hashCode()함수를 재정의하여 같은 요소를 판별하는 방식을 변경할 수 있다.

HashSet Example

public class Member {
    private int memberId;
    private String memberName;

    @Override
    public boolean equals(Object o) {
        if(o instanceof Member)    {
            Member member = (Member)o;

            return (this.memberId == member.memberId);
        }

        return false;
    }

    @Override
    public int hashCode() {
        return memberId;
    }
    
    ~~~
}

public class MemberHashSet  {
    ~~~~
}

public class MemberTest {
  public static void main(String[] args) {
        MemberHashSet memberHashSet =  new MemberHashSet();

        Member memberLee = new Member(100, "Lee");
        Member memberKim = new Member(200, "Kim");
        Member memberJohn = new Member(300, "John");
        Member memberpark = new Member(300, "Park");  
        // member Class에서 hashCode와 equals를 재정의하지 않으면 memberHashSet에 값이 추가된다.

        memberHashSet.addMemmber(memberLee);
        memberHashSet.addMemmber(memberKim);
        memberHashSet.addMemmber(memberJohn);
        memberHashSet.addMemmber(memberpark);

        memberHashSet.showAllMember();
        //Lee회원님의 아이디는 100
        //Kim회원님의 아이디는 200
        //John회원님의 아이디는 300
    }
}

TreeSet

  • HashSet과는 다르게 데이터가 정렬된 상태로 저장한다.
    (이진 검색 트리(binary search tree)의 형태로 요소를 저장))
  • 중복 데이터를 허용하지 않으면서 오름차순이나 내림차순(이는 정의에 따라 달라질 수 있다.)으로 객체를 정렬한다.

Comparable, Comparator

  • 특정 데이터를 정렬해야 하는 경우 구현해야 하는 Interface
  • Comparalbe은 compareTo()메소드를 구현한다. compareTo()의 경우 매개변수(Parameter)와 객체 자신(this)를 비교한다.
    (매개변수가 1개)
    ex) compareeTo(Integer a)
  • Comparator는 compare()메소드를 구현한다. compare()의 경우 두개의 매개변수를 비교한다.
    (매개변수가 2개)
    ex) compare(Integer a, Integer b)
  • 이미 Commparable이 구현되어 있는 경우, Comparator를 이용하여 별도의 정렬 방식을 정의할 수 있다.

TreeSet Example

public class Member implements Comparator<Member>{
  // 위의 Member와 동일하나 compare()를 선언한다.
  public int compare(Member member1, Member member2) {        // member1이 this, member2가 parameter
        return (member1.memberId - member2.memberId);
  }
}
public class Member implements Comparable<Member>{
  // 위의 Member와 동일하나 compareTo()를 선언한다.
  public int compareTo(Member member) {
        // return (this.memberId - member.memberId) * (-1); // memberId가 큰것부터 정렬(내림차순)
        // return (this.memberId - member.memberId);        // memberId가 작은것부터 정렬(오름차순)
        // memberName으로 정렬
        return this.memberName.compareTo(member.getMemberName());
  }
}

public class MemberTreeSet  {
  // Comparable를 사용한 경우
  public MemberTreeSet() {
        treeSet = new TreeSet<Member>();
    }
  ~~~
}

public class MemberTreeSet  {
  // Comparator를 사용한 경우
  public MemberTreeSet() {
        // compareTo()가 선언된 생성자를 선언해주어야 한다.
        treeSet = new TreeSet<Member>(new Member());
    }
  ~~~
}

public class treeSetTest  {
  public static void main(String[] args) {
    MemberTreeSet memberTreeSet = new MemberTreeSet();


    Member memberLee = new Member(100, "Lee");
    Member memberKim = new Member(200, "Kim");
    Member memberJohn = new Member(300, "John");
    Member memberAnn = new Member(400, "Ann");

    memberTreeSet.addMember(memberLee);
    memberTreeSet.addMember(memberKim);
    memberTreeSet.addMember(memberJohn);
    memberTreeSet.addMember(memberAnn);

    memberTreeSet.showAllMember();
    /*
    Comparable을 사용한 경우
    Ann회원님의 아이디는 400
    John회원님의 아이디는 300
    Kim회원님의 아이디는 200
    Lee회원님의 아이디는 100
    */
    /*
    Comparator을 사용한 경우
    Lee회원님의 아이디는 100
    Kim회원님의 아이디는 200
    John회원님의 아이디는 300
    Ann회원님의 아이디는 400
    */
  }
}