다른 분들이 쓰신 유용한 개발 팁을 링크해 둔 글입니다. 계속해서 업데이트 됩니다.



XML 레이아웃을 작성하다 보니 중복되는 내용도 많고, 한 파일에 너무 많은 코드가 들어가니 가독성도 떨어져서

XML 코드를 재사용할 수 있는 방법을 찾아봤다.


Include 태그를 활용하거나, styles.xml, themes.xml 파일을 활용하는 방법이 있다.


1. Include 태그 활용

Include 태그는 다른 XML 파일을 읽어와 레이아웃에 포함합니다. 자주 쓰는 XML 코드를 파일로 분리해두고

Include 태그를 이용하여 불러와 재사용할 수 있습니다.

제 경우에는 모든 액티비티의 상단에 타이틀 바를 두었는데, 이를 파일로 분리하고 불러와서 사용했습니다.

자세한 내용은 아래 링크를 참조하세요.

http://croute.me/435



2. Styles & Themes

values 폴더의 styles.xml파일과 themes.xml 파일에 스타일이나 테마를 추가하여 애트리뷰트에 대한 값을 지정하여 이를 스타일로 묶어 불러와 사용하는 방식입니다.

CSS에서 클래스를 정의해서 사용하는 것과 유사하다고 보시면 됩니다.

아래 링크는 안드로이드 개발자 사이트의 가이드입니다.

http://developer.android.com/guide/topics/ui/themes.html

이클립스의 수많은 프로젝트 중에서 Babel 프로젝트란게 있습니다.

자국의 언어로 사용할 수 있게끔 하는 플러그인입니다. 

글을 쓰는 지금은 기준으로 약 40여개국의 언어에 대해 지원한다고 합니다.


Babel 프로젝트 링크 : http://www.eclipse.org/babel/


설치에 앞서 자신의 이클립스 버전을 확인해야 합니다. 이클립스 실행 시 나타나는 로딩창이나,

이클립스를 켠 후 [Help] >> [About Eclipse] 를 통해 사용하고 있는 이클립스의 버전을 확인할 수 있습니다.



각 버전별 업데이트 주소는 아래와 같습니다. 이 중 자신의 버전에 맞는 것을 복사합니다.

Babel Language Pack Update Site for Indigo
http://download.eclipse.org/technology/babel/update-site/R0.9.1/indigo
Babel Language Pack Update Site for Helios
http://download.eclipse.org/technology/babel/update-site/R0.9.1/helios
Babel Language Pack Update Site for Galileo
http://download.eclipse.org/technology/babel/update-site/R0.9.1/galileo


R0.10.0으로 업데이트 되었습니다. (12/07/21 부)

Babel Language Pack Update Site for Juno
http://download.eclipse.org/technology/babel/update-site/R0.10.0/juno
Zipped p2 repository (117 MB)
Babel Language Pack Update Site for Indigo
http://download.eclipse.org/technology/babel/update-site/R0.10.0/indigo
Zipped p2 repository (109 MB)
Babel Language Pack Update Site for Helios
http://download.eclipse.org/technology/babel/update-site/R0.10.0/helios
Zipped p2 repository (131 MB)


※  Babel 프로젝트가 업데이트 되면서 이전 버전의 저장소 경로로는 접근이 안되네요.

현재 최신 버전으로 수정했으나 혹시 접근이 안된다면 아래의 Babel 프로젝트 다운로드 페이지에서

최근에 릴리즈된 버전의 다운로드 주소를 확인하시기 바랍니다.

http://www.eclipse.org/babel/downloads.php




이제 이클립스로 돌아가서 [Help] >> [Install New Software...] 을 선택하여 Install 대화상자를 띄웁니다.


[그림 1] Install 대화상자 열기



[그림 2] Install 대화상자





Install 대화상자에서 [Add...] 버튼을 눌러 새 저장소를 추가합니다.

Name에는 적당한 이름을 넣으시고, Location에 아까 복사한 주소를 붙여넣고 [OK]버튼을 눌러 완료합니다.


[그림 3] Add Repository 대화상자




[OK]를 누르고 나면 Pending... 이라는 글자가 보이면서 서버에서 저장소내의 목록을 읽어오게 됩니다.

조금 기다리면 Babel 프로젝트의 목록들이 보이는데 이 중에서

Babel Language Packs for eclipse 항목 왼쪽의 ▷ 버튼을 눌러 하위 항목이 나타나면

Babel Language Pack for eclipse in Korean 항목에 체크합니다.


[그림 4] 한국어 언어팩 선택




선택을 완료하였으면 [Next] 버튼을 눌러 다음 화면으로 넘어가면 설치할 목록을 보여줍니다.

여기서 다시 [Next] 버튼을 클릭하여 다음으로 넘어갑니다.


[그림 5] 설치 목록 확인 대화상자





라이센스에 동의하겠냐는 확인 대화상자가 나타납니다.

I accept the terms of the license agreement 를 선택한 후 [Finish]를 선택하여 설치를 시작합니다.


[그림 6] 라이센스 동의 대화상자





설치가 시작되었습니다. [Run in Background] 버튼을 클릭하시면

백그라운드에서 설치를 계속 하도록 할 수 있습니다. 그럼 계속해서 이클립스로 작업을 하실 수 있습니다.


[그림 7] 설치 중..




설치 하시다 보면 Security Warning 이라는 대화상자가 나타납니다.

서명이 되어있지 않은 소프트웨어를 설치하려고 하는데 계속 할거냐? 라고 묻는 내용입니다.

물론 문제는 없으므로 [OK]버튼을 눌러 설치를 계속 합니다.


[그림 8] Security Warning 대화상자





설치가 완료되면 이클립스를 재시작할 것인지를 물어봅니다.

[Restart Now]를 선택하시면 바로 재시작이 되고 [Not Now]를 선택하시면 재시작하지 않습니다.

[Apply Changes Now]를 선택하면 재시작하지 않고 변경내용을 적용합니다.

[Apply Changes Now]는 오류가 발생할 수도 있으므로 한글화를 확인하려면 [Restart Now]를 선택합니다.


[그림 9] 재시작 확인 대화상자




이클립스를 재시작하면 메뉴가 한글화 된 것을 확인할 수 있습니다.


[그림 10] 한글화된 이클립스


인공지능 과제에서 인덱싱을 하면서 무심코 HashMap을 사용했는데,

다른 조의 시연을 보니 인덱싱에 상당한 시간이 소요되었다.


갑자기 궁금증이 생겨서 세 컬렉션의 속도를 비교하게 되었다.

테스트 엘리먼트는 Integer 인스턴스 5,000,000(5백만개)를 이용하여 수행하였다.

탐색과 삭제에서는 균등하게 떨어진 4990개의 데이터를 이용하였다.


테스트 결과 :

5000000개의 인스턴스 생성 시간 0.548829807초


HashMap Test

입력 소요 시간  2.415268645초

탐색 소요 시간 0.002399381초

삭제 소요 시간 0.002615092초


ArrayList

입력 소요 시간  0.381054002초

탐색 소요 시간 1.99475E-4초

삭제 소요 시간 137.231368119초


LinkedList

입력 소요 시간  1.503839756초

탐색 소요 시간 52.905209243초

삭제 소요 시간 52.587791295초



HashMap의 경우는 입력되는 시간을 제외하면 우수한 성능을 보였고,

(탐색과 삭제 시에 인덱스가 아닌 키값으로 하였음)


ArrayList 의 경우에는 내부적으로 배열을 쓰는 컬렉션 답게 탐색에서는 매우 우수한 속도를 보였지만

삭제 시에 배열의 구조가 변경되므로 매우 느린 속도를 보였다.


LinkedList는.. 탐색, 삭제 모두 순차 탐색을 하므로(실제로 이중 연결 링크드리스트로 되어있고, Head, Rear 포인터를 이용해서, 탐색하려고 하는 인덱스와 리스트 크기의 반과 비교해서 인덱스가 작은 경우 앞에서부터 탐색하고, 큰 경우 뒤에서부터 탐색하도록 되어있어 평균적으로 n / 2의 시간 복잡도를 가진다.) 많이 느렸다. -_-



따라서 HashMap은 Key, Value 쌍을 가지는 데이터를 관리할 때 용이하고,

ArrayList는 데이터가 입력 되고 삭제가 빈번하지 않은 경우에 사용하면 되고,

Linkedlist는 Queue와 같이 Head와 Read와 가까이에서 탐색, 삭제가 이뤄지는 경우에 쓰면 좋을 듯 하다.



테스트에 사용한 코드는 아래와 같습니다. 참고 하실 분은 아래의 소스를 사용하시면 됩니다.

import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;

public class TestCode {
	static Integer[] testArray = new Integer[5000000];
	Integer[] values = new Integer[4990];

	public void hashMapTest() {
		long start = System.nanoTime();

		HashMap hashmap = new HashMap();
		for(Integer integer : testArray){
			hashmap.put(integer, integer);
		}
		
		long end = System.nanoTime();
		
		System.out.println("\nHashMap Test");
		System.out.println("\t입력 소요 시간  " + second(start, end) + "초");
		
		start = System.nanoTime();
		for(Integer value : values){
			hashmap.get(value);
		}		
		end = System.nanoTime();
		System.out.println("\t탐색 소요 시간 " + second(start, end) + "초");
		
		start = System.nanoTime();
		for(Integer value : values){
			hashmap.remove(value);
		}
		end = System.nanoTime();
		System.out.println("\t삭제 소요 시간 " + second(start, end) + "초");
	}
	
	public void arrayListTest(){
		long start = System.nanoTime();
		
		ArrayList arrayList = new ArrayList();
		for(Integer integer : testArray){
			arrayList.add(integer);
		}
		
		long end = System.nanoTime();
		
		System.out.println("\nArrayList");
		System.out.println("\t입력 소요 시간  " + second(start, end) + "초");
		
		start = System.nanoTime();
		for(Integer value : values){
			arrayList.get(value);
		}		
		end = System.nanoTime();
		System.out.println("\t탐색 소요 시간 " + second(start, end) + "초");
		
		start = System.nanoTime();
		for(Integer value : values){
			arrayList.remove(value);
		}
		end = System.nanoTime();
		System.out.println("\t삭제 소요 시간 " + second(start, end) + "초");
	}
	
	public void linkedListTest(){
		long start = System.nanoTime();
		
		List linkedList = new LinkedList();
		for(Integer integer : testArray){
			linkedList.add(integer);
		}
		
		long end = System.nanoTime();
		
		System.out.println("\nLinkedList");
		System.out.println("\t입력 소요 시간  " + second(start, end) + "초");
		start = System.nanoTime();
		for(int value : values){
			linkedList.get(value);
		}		
		end = System.nanoTime();
		System.out.println("\t탐색 소요 시간 " + second(start, end) + "초");
		
		start = System.nanoTime();
		for(int value : values){
			linkedList.remove(value);
		}
		end = System.nanoTime();
		System.out.println("\t삭제 소요 시간 " + second(start, end) + "초");
	}


	private void prepare() {
		long start = System.nanoTime();
		for (int i = 0; i < testArray.length; i++) {
			testArray[i] = i;
		}
		long end = System.nanoTime();
		
		ArrayList temp = new ArrayList(1000);
		for(int i = 0 ; i < 4990 ; i++){
			temp.add(i * 1000);
		}
		temp.toArray(values);
		
		
		System.out.println(testArray.length + "개의 인스턴스 생성 시간 " +
				second(start, end) + "초");
		
	}
	
	private double second(long start, long end){
		return (end - start) / Math.pow(10, 9);
	}

	public void start() {
		prepare();
		hashMapTest();
		arrayListTest();
		linkedListTest();
	}

	public static void main(String[] args) {
		TestCode test = new TestCode();
		test.start();
	}
}


네이트온을 사용하면서 네이트온 메인창의 광고와 시작 시

자동으로 뜨는 팝업창을 제거하는 방법입니다.

공짜로 사용하면서 광고정도는 봐줘야 인지상정이지만..! 그래도 걸리적 거리는게 현실 -_ -ㅋ

양심의 가책을 쪼금(;) 느끼면서 팁을 올려봅니다. (윈도우 XP 기준입니다.)

 

1. 메인창 하단 광고 없애기



시작메뉴 >> 실행에서 위와 같이 입력하고 확인을 눌러줍니다.

 

 

 

연결 프로그램 창이 뜨면 Notepad(메모장)을 선택합니다.

 

 

 

메모장이 뜨면 빨간색으로 쓴 부분과 같이 쓰고 저장해주고 종료하면 됩니다.(아래 복사)

127.0.0.1 adimg.nate.com

127.0.0.1 cyad.nate.com

127.0.0.1 nateonevent.nate.com

127.0.0.1 nateon.nate.com

127.0.0.1 nokw.nate.com

 


2. 팝업 광고 없애기

네이트온 창 메뉴에서 설정(S) >> 환경 설정(S)를 들어갑니다. 단축키 F11을 누르셔도 됩니다.

 

 

 

보기 탭에서 로그인시 보기 설정을 모두 보지 않기를 하시면 팝업 창이 뜨지 않습니다.

 

이상입니다. 좀 더 네이트온을 가볍게 써봅시다 :)

'밤을 지새다' 카테고리의 다른 글

Linux Kernel Map  (0) 2013.03.24
C# ListBox Double Click 이벤트  (0) 2012.06.08
파일의 확장자를 보는 방법  (0) 2012.05.16
Gmail 실행파일 첨부 문제  (0) 2012.05.16
정규표현식 요약  (0) 2012.04.15

※ 윈도우 7 환경 기준으로 설명했습니다.


보통 윈도우에서 기본 값으로 "알려진 확장자를 보이지 않음"으로 되어있어서

연결프로그램이 있는 확장자의 경우에는 확장자가 보이지 않습니다.


가끔씩 확장자를 봐야할 때가 있는데, 아래와 같이 설정하면 확장자를 확인할 수 있습니다.


먼저 아무 폴더나 열고, 왼쪽 상단에서 [구성 ▼] 를 눌러 메뉴가 보이면 [폴더 및 검색 옵션]을 클릭합니다.






[폴더 옵션] 대화상자가 열리면 [보기] 탭으로 이동하신 후 고급 설정란에서 조금 스크롤을 내리면

알려진 파일 형식의 파일 확장명 숨기기 항목이 보일겁니다.

이 항목의 체크를 해제 해 주시고 확인을 누르시면 파일 이름에서 확장자가 보이는 것을 확인할 수 있습니다.





'밤을 지새다' 카테고리의 다른 글

Linux Kernel Map  (0) 2013.03.24
C# ListBox Double Click 이벤트  (0) 2012.06.08
네이트온 광고와 팝업 없애기  (3) 2012.05.16
Gmail 실행파일 첨부 문제  (0) 2012.05.16
정규표현식 요약  (0) 2012.04.15




Gmail을 이용해서 데모 프로그램을 보낼 일이 있어서 해당 실행파일을 첨부했더니 이게 뭔가..?


"보안상의 이유로 Gmail에서는 해당 형식의 파일을 보낼 수 없습니다."


다른 메일로 보내려고 했더니 이상하게 계속해서 반송이 되는 바람에 그냥 지메일로 보내기로 했다.



팁이랄 것도 없지만 해결 방법은 확장자를 exe에서 다른 확장자로 바꾸어주면 된다.

단, 완전히 다른 확장자로 변경하는 경우 원래의 확장자를 유추하기 힘들수 있으므로

가장 끝의 글자만 언더바(_)로 바꿔주는 것과 같이 원래의 확장자를 반쯤 유지해주면 좋다.


exe -> ex_ 로 확장자 변경 후 첨부하여 전송

'밤을 지새다' 카테고리의 다른 글

Linux Kernel Map  (0) 2013.03.24
C# ListBox Double Click 이벤트  (0) 2012.06.08
네이트온 광고와 팝업 없애기  (3) 2012.05.16
파일의 확장자를 보는 방법  (0) 2012.05.16
정규표현식 요약  (0) 2012.04.15


[그림 1] AWT에서 한글이 깨져서 나오는 현상


AWT에서 한글 입력 시에 네모 글자로 나올 때가 있습니다. 정확한 이유는 모르겠지만 프로젝트의 인코딩과

컴파일시의 인코딩이 일치하지 않아서 발생하는 문제인 듯 합니다.


제 경우에는 프로젝트의 기본 인코딩이 UTF-8 인 경우였습니다.


보통은 Inherited Character Encoding 이라고 해서 디폴트 인코딩을 사용해서

문제 없이 사용할 수 있었는데, UTF-8로 지정하니 한글이 깨져버리네요.


이럴 때는 -Dfile.encoding=MS949 라는 VM Arguments를 추가해주면 됩니다.


상세한 설정 방법을 알아보도록 하겠습니다.


먼저 이클립스의 Package Explorer에서 프로젝트를 선택한 후 Alt + Enter 키 또는 마우스 오른쪽 버튼을 눌러

Properties for Project 대화상자를 엽니다. 제 경우의 프로젝트 이름은  GUI_MathML이군요.


[그림 2] Package Explorer에서 프로젝트 선택





[Properties for Project] 대화 상자가 열리면 Run/Debug Settings 탭으로 이동합니다.

그리고 Launch configurations for 'Project name': 항목을 보면 최근에 실행한 메인 클래스가 보이는데,

AWT의 메인이 되는 클래스를 클릭하고 [Edit...] 버튼을 누르시거나 더블클릭 해서 실행 설정 편집창을 엽니다.


※ 만약 아무런 클래스도 보이지 않는다면 [New...] 버튼을 눌러 Java Application을 선택하고 Main class를 선택하고, 이 후에 나오는 내용을 동일하게 적용하면 됩니다.


[그림 3] 프로젝트 속성 대화상자의 Run/Debug Settings 탭




[Edit configuration] 창이 열리면 Arguments 탭으로 이동하여 VM arguments: 란에

-Dfile.encoding=MS949 라고 입력해 준 후 [OK]버튼을 눌러 모든 설정을 완료하고 닫아줍니다.

[그림 4] Edit Configuration 대화상자의 Arguments 탭의 VM arguments 항목 수정





여기까지 설정을 마쳤으면 다시 프로그램을 실행해 봅니다.


[그림 5] 설정 완료 후  AWT 프로그램 재실행



이제 한글이 정상적으로 나옵니다. :D




'밤을 지새다 > Java' 카테고리의 다른 글

int 와 long 의 해시 값은 다르다?  (0) 2014.03.15
HashMap, ArrayList, LinkedList 속도 비교  (5) 2012.05.16
Java PriorityQueue  (0) 2012.05.07
Java StAX Event  (0) 2012.05.01
Java StAX: XMLStreamWriter - The Cursor Writer API  (0) 2012.04.30

힙을 구현하기는 귀찮아서 '혹시나' 싶어서 찾아보니 '역시나' 고맙게도 자바에 PriorityQueue가 있네요.


먼저 PriortyQueue는 java.util 패키지에 있고, 여러 형태의 생성자가 오버로딩되어 있는데,

주요한 두가지만 알아보면 아래와 같습니다.


  • PriortyQueue<E>()
  • PriorityQueue<E>(int initialCapacity, Comparator<? super E> comparator)


둘을 비교하자면 전자는 기본 생성자를 이용해서 심플하게 생성하는 방법이고,

후자는 초기 큐 내부의 배열 크기와 Comparator 객체를 전달하면서 객체를 생성하는 방법입니다.

(어째서인지 initialCapacity 없이 Comparator만 전달하는 생성자는 없더군요.)


※ initialCapacity?

큐 내부에서 사용하는 배열의 초기 크기를 결정하는 값입니다.

기본적으로 11의 크기를 사용하고 임의로 전달할 경우에는 그 크기를 사용하는데 1보다 작은 경우

IllegalArgumentException 예외가 발생합니다. 전달 인자가 잘못되었단 얘기죠.

배열의 크기는 initialCapacity로 고정되는 것이 아니라, 요소의 수가 배열의 크기에 도달하면

크기를 늘립니다. 재밌는 것은 배열의 크기가 커질 때 규칙을 보면 배열의 크기가 64 미만일 때는 2씩 커지고,

그 이후로는 이전 크기의 1/2 씩 증가하도록 되어있습니다.

왜 이런 룰이 적용되었는지는 잘 모르겠네요.

큐 내의 배열의 최대크기는 private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;

이렇게 정의되어 있으니, 값으로 보면 2147483639 까지입니다. 왠만한 경우엔 다 들어갈 수 있겠죠?

다만, 힙 메모리가 부족해서 최대 크기가 되기 전에 OutOfMemoryError가 먼저 발생하겠네요.



큐에서 중요한 두 메서드, 큐에 넣고(add), 큐에서 빼는(poll) 메서드에 대해 간단하게 설명하겠습니다.

덤으로 가장 우선순위가 높은 요소를 확인하는 peek 메서드도요.

  • boolean add(E e) : 큐에 요소를 추가합니다. 반환값은 성공 여부입니다.
  • E poll() : 큐에서 우선순위가 가장 높은 요소를 빼냅니다. 즉 반환 후에 큐에서 삭제됩니다.
  • E peek() : poll과 달리 큐에서 삭제하지 않고 가장 우선순위가 높은 요소를 얻습니다.



1. PriorityQueue()

기본 생성자를 이용하는 경우는 제너릭 타입 E의 compareTo 메서드를 이용하여 정렬에 사용합니다.

compareTo 메서드는 그냥 compareTo메서드를 만들어 쓰는 것이 아니라, 

Comparable 인터페이스를 구현해서 만듭니다.


만약 Comparable 인터페이스를 구현하지 않은 클래스를 큐의 엘리먼트로 사용하는 경우에는

java.lang.ClassCastException을 만나게 될 겁니다. PriorityQueue 내부에서 Comparable 타입으로 캐스팅해서

compareTo 메서드를 호출하기 때문입니다.


기본 생성자를 이용하여 큐의 객체를 생성하는 경우를 소스코드로 작성해볼까요.


먼저 요소로 사용할 Element 클래스를 작성해 보겠습니다.

class Element implements Comparable<Element>{
	private int num; // 정렬의 기준이 될 값
	
	public Element(int num){
		this.num = num;
	}
	
	public int getNum(){
		return num;
	}

	@Override // Comparable 인터페이스의 compareTo 메서드 구현
	public int compareTo(Element o) {
		return num <= o.num ? -1 : 1;
	}
}


compareTo 메서드의 기능은 현재 객체와 다른 Element 객체를 비교하여 우선순위를 판단하는 것입니다.

우선순위의 판단은 반환값으로 하는데 음수인 경우에는 현재 객체가 우선임을 의미하고,

양수인 경우에는 대상 객체(위의 소스코드에서는 Element o)가 우선임을 의미합니다.

간편하게 return num - o.num; 을 해도 됩니다.


다음으로 PriorityQueue를 사용해 볼 클래스 PriorityQueueTest 를 작성해 보겠습니다.

public class PriorityQueueTest {
	public static void main(String[] args) {
		PriorityQueue<Element> q =
				new PriorityQueue<Element>();
		
		Random random = new Random(System.nanoTime());
		
		// 0~49의 난수를 생성하여 큐에 넣습니다.
		for(int i = 0 ; i < 10 ; i++){
			q.add(new Element(random.nextInt(50)));
		}
		
		// 큐에서 값을 빼면서 정렬이 되었는지 출력해봅니다.
		int size = q.size();
		for(int i = 0 ; i<size ; i++){
			System.out.println(q.poll().getNum());
		}
	}
}

[출력결과]

4

14

19

19

30

33

42

42

46

49



2. PriorityQueue(int initialCapacity, Comparator<? super E> comparator)

복잡해 보이는 생성자지만 간단합니다. 초기 배열 크기와 Comparator를 구현한 객체를 전달해 주면 되는데,

Comparator<? super E> 가 조금 거슬리는 분도 있을 거라고 생각합니다.

Java 5 부터 제너릭 개념이 들어가면서 컬렉션 관련 API에는 제너릭이 들어가도록 모두 바뀌었습니다.

제너릭이라고 말하는게 꺽쇠 괄호 < > 를 이용해 타입을 지정해 주는 것을 말합니다.


제너릭에 관해서는 다른 글에서 얘기하기로 하고, 위의 <? super E>가 의미하는 것만 알아보면

Comparator 선언 시, 혹은 구현시에 Comparator<타입> 의 형태로 적어줘야 합니다.

이때 ? super E 가 의미하는 게 위에 들어가는 타입은 E를 상속받은 하위 클래스여야 한다는 의미가 됩니다.

풀어보면 어떤 타입(?)의 부모(super)가 E여야 한다. 라고 볼 수 있겠네요.


복잡하게 생각할 것 없이 여기서는 "타입"의 위치에 Element를 적어주도록 합시다.


Comparator 인터페이스를 구현하는 방법은 여러가지가 있겠지만 여기서는 그냥 익명 이너 클래스로 구현하여

전달하도록 하겠습니다. Element 클래스는 위의 클래스 그대로 사용합니다.


class PriorityQueueTest {
	public static void main(String[] args) {
		PriorityQueue<Element> q =
			new PriorityQueue<Element>(50, new Comparator<Element>() {
				@Override
				// Comparator 인터페이스의 compare 메서드를 구현합니다.
				// 여기서는 이전과 반대로 내림차순 정렬을 하도록 했습니다.
				public int compare(Element o1, Element o2) {
					return o2.getNum() - o1.getNum(); 
				}
			});
		
		Random random = new Random(System.nanoTime());
		
		// 0~49의 난수를 생성하여 큐에 넣습니다.
		for(int i = 0 ; i < 10 ; i++){
			q.add(new Element(random.nextInt(50)));
		}
		
		// 큐에서 값을 빼면서 정렬이 되었는지 출력해봅니다.
		int size = q.size();
		for(int i = 0 ; i<size ; i++){
			System.out.println(q.poll().getNum());
		}
	}
}

[출력 결과]

42

36

33

28

26

18

14

4

3

0


내림차순으로 정렬이 되었습니다. 여기서 조금 의아한 점을 찾으신 분도 있을 것 같습니다.

이미 Element는 Comparable 인터페이스를 구현해서 오름차순으로 정렬하도록 되어있는데,

내림차순으로 정렬되었기 때문입니다. 그 의문점의 결과는 위의 출력결과가 말해줍니다.


즉 compareTo 메서드보다 compare 메서드가 우선한다는 말이지요.

(그냥 내부적으로는 if(comparator != null){ ... } 이렇게 되어있어서 문장상에서 우선하게끔 되어있습니다.)



자바의 PriorityQueue 클래스를 사용해 봤습니다.

Comparator나 Comparable인터페이스에 대한 개념이 확실하게 잡힌다면 크게 무리 없이 사용할 수 있을 것 같습니다.

1. MySQL 설치


2. JDK 설치 및 환경변수 설정


3. JRUBY 설치 및 환경 변수 설정

gem 파일에 아래 추가

platform :jruby do
  gem 'jruby-openssl'
end


4. Rails 설치


5. ActiveRecord-JDBC 설치


6. openssl 설치

gem install jruby-openssl -y


7. 시작하기

rails new Path

+ Recent posts