JAVA에서 리스트를 정렬하고자 할 때는 java.util.Collections의 static method인 sort를 활용할 수 있다.


일반적으로 문자나 숫자를 오름차순 또는 내림차순으로 정렬할시에는 

Collections.sort(ArrayList<T> list) 와 Collections.reverse(ArrayList<T> list) 를 활용하여 쉽게 정렬된 결과를 얻을수 있다.


이는 아래 String 클래스처럼 T클래스가 Comparable<T> 을 상속받아 구현해 놓았기 때문이다.

(정확히는 Comparable 인터페이스의 compareTo 메서드를 오버라이딩)











하지만, 일반적인 케이스에서 벗어나서 특정한 규칙에 따라 정렬하고자 하면 다음 두가지 방법으로 할 수 있다.


1. 정렬하고자 하는 객체의 클래스에 Comparable 인터페이스를 implements 하고 compareTo 메서드를 오버라이드하여 Collections.sort(ArratList<T> list) 로 정렬한다.


Human 클래스의 객체List를 정렬하고자 하는 경우, Human 클래스를 다음과 같이 정의하고 Collections.sort(List<Human> list) 를 사용한다.

Human 클래스 선언 예)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Human implements Comparable<Human>{
    public int age;
    public String name;
 
    // ... 기타 선언 생략
 
    public int compareTo(Human human){
 
        // 정렬규칙에 따라 this와 human의 변수를 비교 후 
        // -1,0,1 반환
        // this가 큰 조건에서 1
 
    }
 
}
cs



2. Collections.sort(ArrayList<T> list, Comparator<T> c) 를 활용하여 정렬한다.


Human 클래스는 건들지 않고 Comparator 인터페이스를 구현한 클래스를 만들어 그 객체를 sort 메서드에 함께 전달한다.

Collections.sort(List<human> list, new HumanComparator()) 으로 사용한다.


이 때, Comparator에는 compare()와 equals() 메서드가 있으며 equlas()메서드는 Object클래스에서 정의가 되어있으므로, 

compare()만 오버라이드해서 사용하면 된다.


Collections.sort 메서드에 같이 인자로 전달되는 Comparator 선언 예)

1
2
3
4
5
6
7
8
9
10
class HumanComparator implements Comparator<Human>{
 
    @Override
    public int compare(Human o1, Human o2) {
 
        // 정렬 규칙에 따라 -1,0,1 반환
        // 첫번째 인자(o1)이 크면 1 반환
    }
        
}
cs




정리한다면, 클래스를 정렬가능(Comparable)하게 하던가 정렬시킬수 있는 도구(Comparator)를 같이 던져주던가

두가지 방법으로 정렬시킬수 있다.


끝.


 

'개발 > JAVA' 카테고리의 다른 글

Comparator, Comparable 어떻게 사용할까?  (0) 2020.11.29
LocalDateTime, ZonedDateTime  (0) 2019.10.11
BigDecimal & BigInteger  (0) 2017.04.18
Array 와 ArrayList 사이의 변환  (0) 2017.03.28
9. 생성자와 가비지 컬렉션  (0) 2017.02.22


BigDecimal, BigInteger 클래스는 java.math 패키지에 포함되어 있다.


1. 사용하고자 하는경우 

 - 사용하고자 하는 값이 int, float 등으로 표현하는 범위를 넘을 경우

 - float 이나 double 실수 연산시 정확한 결과값이 나오지 않는 경우


2. 생성자 및 사칙연산 함수

 - 반환형이 String 처럼 객체인 것에 유의한다.(자신의 값이 변하지 않음)

1
2
3
4
5
6
7
BigDecimal input = new BigDecimal("25");
BigDecimal value = new BigDecimal(String.valueOf(25));
 
BigDecimal rslt1 = value.add(new BigDecimal("10"));            // 덧셈
BigDecimal rslt2 = value.multiply(new BigDecimal("10"));     // 곱하기
BigDecimal rslt3 = value.subtract(new BigDecimal("10"));       // 빼기
BigDecimal rslt4 = value.remainder(new BigDecimal("10"));      // 나누기
cs


Array 와 ArrayList 사이의 변환


1. Array -> ArrayList 변환시 유의할 점

 - Arrays.asList() 를 사용한다.

 - 하지만 Arrays.asList() 의 리턴형은 fixed-size의 List이므로 add()를 사용할 수 없다.(get(), set(), contains()는 사용가능) 

 - 리턴되는 객체가 java.util.ArrayList가 아니라 java.util.Arrays.ArrayList 이기 때문이다.

 - 그러므로 다음 예시처럼 사용해야 한다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Test01 {
    public static void main(String[] args) {
        
        String strArr[] = {"가","나","다"};
        ArrayList<String> strArrayList = new ArrayList<String>();

        // 1. Array -> ArrayList
        strArrayList = new ArrayList<String>(Arrays.asList(strArr));
        System.out.println(strArrayList);
        
        // 2. ArrayList -> Array
        String strArr2[] = strArrayList.toArray(new String[strArrayList.size()]);
        for(int i=0;i<strArr2.length;i++){
            System.out.print(strArr2[i] + " ");
        }
        
    }
}
cs


'개발 > JAVA' 카테고리의 다른 글

LocalDateTime, ZonedDateTime  (0) 2019.10.11
Collections를 이용한 정렬(sort method) 활용  (0) 2017.05.09
BigDecimal & BigInteger  (0) 2017.04.18
9. 생성자와 가비지 컬렉션  (0) 2017.02.22
8. 인터페이스와 추상 클래스  (0) 2017.02.21

인스턴스(instance) 변수와 지역(local) 변수

 - 인스턴스 변수 : 클래스 내에 선언한 변수 > 변수가 들어있는 객체안에(Heap)에 저장된다.

 - 지역 변수 : 메서드 내에 선언한 변수, 매서드의 매개변수도 지역변수에 해당한다. > 변수가 들어있는 매서드안에(Stack)에 저장된다.


스택(stack)과 힙(heap)

 - 스택 : 매서드의 호출과 지역변수가 사는 곳

 - 힙 : 모든 객체가 사는 곳(객체가 가지고 있는 인스턴스 변수도 포함한다.) > 가비지 컬렉션의 대상이 된다.


생성자

 - Student yang = new Student();

    1. Student yang : 레퍼런스 변수를 선언한다.

    2. new Student() : Student 클래스의 생성자를 실행한다. (객체의 초기화, heap 영역에 생성)

    3. = : 래퍼런스 변수와 생성된 객체를 연결한다.

- 반드시 new 라는 키워드로 생성자를 실행한다.

- 생성자는 반환형이 없으며 파라미터가 없는 기본생성자는 컴파일러가 자동으로 생성한다.

  ex) public Student(){  }  >> 접근제한자는 public,private,default 모두 가능하다.

- 생성자 오버로딩이 가능하며 이때 기본생성자는 개발자가 임의로 추가해야 한다.


상속관계에서의 생성자

 - new 키워드로 어떤 객체가 만들어지면 그 객체의 상위클래스들의 모든 생성자가 실행된다.

   최초의 클래스인 Object 클래스까지 거슬러 올라가며 이를 생성자 연쇄(constructor chaining)라 한다. (상위 클래스의 생성자부터 실행)


super(), this()

 - 임의로 상위클래스의 생성자를 호출할 경우 사용하며 컴파일러가 기본으로 생성하여 준다.

 - 생성자의 첫번째 선언문에 꼭 위치하여야 한다.

 - this() 로는 본인 클래스의 오버라이드된 다른 생성자를 호출할수 있으며 첫번째 선언문에 사용되어야 한다. 즉, super() 와 this() 중 하나만 사용가능하다.


객체 life cycle

 - 객체는 그 객체의 레퍼런스변수가 살아있는 동안만 살아있으며 객체에 접근할 방법이 사라지면(레퍼런스 변수가 사라지면), GC에 의해 제거된다.

 - 객체가 GC에 의해 제거되는 3가지 경우

   1. void 메서드가 종료될 때 제거된다.

      void go(){

          Life z = new Life();

      } 

   2. 레퍼런스 변수에 다른 객체를 대입하면 제거된다.

       Life z = new Life();

       z = new Life();  // 윗 줄에서 생성된 객체는 제거된다.

   3. 레퍼런스 변수에 null을 대입하면 제거된다.

       Life z = new Life();

       z = null; // 윗 줄에서 생성된 객체는 제거된다.

 


 

'개발 > JAVA' 카테고리의 다른 글

LocalDateTime, ZonedDateTime  (0) 2019.10.11
Collections를 이용한 정렬(sort method) 활용  (0) 2017.05.09
BigDecimal & BigInteger  (0) 2017.04.18
Array 와 ArrayList 사이의 변환  (0) 2017.03.28
8. 인터페이스와 추상 클래스  (0) 2017.02.21

1.abstract 추상클래스

 - abstract public class Animal{ }

 - new 키워드를 통해서 instance를 생성할수 없다.(compile error)

 - 추상class를 제외한 클래스를 '구상' class라 한다.

 - 반드시 확장(extends) 해야하는 class


2.abstract method 추상 메소드

 - 몸통(중괄호)가 없는 형태이다. ex) public abstract void eat();

 - 세미콜론(;)으로 선언을 끝내는 형태이다.

 - abstract class 이내에서만 선언되어야 한다. (추상 클래스안에 일반메서드와 추상메서드의 혼용은 가능하다.)

 - 왜 사용할까? 

    1. 실제 메서드에 코드를 집어넣지 않았더라도 하위클래스를 위한 일종의 규약(protocol)의 일부를 정의한다.

    2. 다형성의 장점이 있다.(오버라이드)

 

3.구상class를 처음 만들때는 상위에서 선언된 추상메서드를 모두 구현해야 한다.

 - 확장관계 중간에 이미 구현된 추상메서드는 구현할 필요가 없다.


'개발 > JAVA' 카테고리의 다른 글

LocalDateTime, ZonedDateTime  (0) 2019.10.11
Collections를 이용한 정렬(sort method) 활용  (0) 2017.05.09
BigDecimal & BigInteger  (0) 2017.04.18
Array 와 ArrayList 사이의 변환  (0) 2017.03.28
9. 생성자와 가비지 컬렉션  (0) 2017.02.22

+ Recent posts