'자바'에 해당되는 글 16건

  1. 2015.08.07 자바 객체로 구성된 리스트 정렬하기
  2. 2015.06.01 이클립스 자바 프로젝트 설정하기~ (1)
  3. 2015.05.27 자바 URL과 URLConnection을 활용한 POST 방식 데이터 보내고 받기~ (1)
  4. 2012.08.19 임시 비밀번호 생성하는 간단한 자바 소스
  5. 2012.08.02 자바 컴파일러 버그로 인한 Ant Build 오류 처리~
  6. 2012.07.18 Java에서 표준시(Global Time)와 지방시(Local time)를 상호 변경하는 함수
  7. 2012.07.11 java에서 날짜 형식 변경을 위한 SimpleDateFormat에 대한 간략한 정리~ (4)
  8. 2012.05.24 Proxy를 이용한 HTML 소스 가져오기
  9. 2012.04.24 구글 앱 엔진(Google App Engine) 자바 버전 설치 및 프로젝트 생성/실행/배포 ~
  10. 2011.11.01 float와 double 타입..

자바 객체로 구성된 리스트 정렬하기

|



자바에서 리스트의 정렬은 Collections.sort() 메소드를 이용해서 쉽게 수행할 수 있다. 

리스트의 값이 기본 타입일 경우에는 바로 Collection.sort(list)를 적용하면 된다. 


만약 리스트의 값의 자체적으로 만든 객체(Object)일 경우, 어떻게 처리해야 할까? 

우선 Comparator 인터페이스를 구현해서 내부에 compare 메소드로 정렬할 방식을 정한다. 

그리고 Collection.sort를 호출할 때 Comparator 인터페이스를 구현한 클래스의 객체를 전달하면 된다. 


예제를 통해서 살펴보도록 하자~

먼저 name과 volume의 멤버 변수를 가진 MiniVo 객체를 다음과 같이 만든다. 


volume을 기준으로 정렬을 해 볼 예정이며, 좀 더 다양한 경우를 고려해서 실제값은 숫자형이지만 String으로 선언했다. 


이어서 정렬을 위한 리스트를 다음과 같이 구성한다. 

ArrayList를 활용해서 3개의 데이터를 입력하고 순서대로 출력하는 부분까지 포함했다. 


그리고 Comparator 인터페이스를 구현한 클래스의 객체를 생성하고, Collections.sort를 통해 정렬한 뒤 결과 값을 확인하는 소스다.



마지막으로 MiniComparator 클래스를 구현한 부분을 살펴보자. 

여기서 중요한 부분은 compare 메소드를 처리하는 부분이다. 


compare 메소드는 MiniVo 객체를 두개 받아서 voulme 값을 Double 형으로 변환하고 

두 수를 비교해서 결과값을 0, 1, -1로 리턴하는 함수이다. 

이 예제에서는 내림차순으로 정렬했다. 오름차순이 필요하면 1과 -1의 리턴값을 바꾸면 될 것이다. 


실행 결과를 살펴보면 다음과 같이 내림차순으로 객체들이 정렬된 것을 확인할 수 있다. 


실행하기 위한 전체 소스는 다음과 같다. 






Trackback 0 And Comment 0

이클립스 자바 프로젝트 설정하기~

|



이클립스를 사용하다보면 가끔 자바 프로젝트인데도 일반 프로젝트로 인식해서 자바 관련 설정 항목들이 프로퍼티에서 나오지 않는 경우가 있다. 

이런 경우, SVN 서버에 접속해서 프로젝트를 다시 신규로 Check out 하기도 하는데

아예 .project 파일을 수정해서 해당 항목이 제대로 나오도록 구성하는 방법을 정리해 보려고 한다. 


자바 프로젝트의 경우, 아래와 같이 프로퍼티 또는 속성에서 Java Build Path 등 설정항목이 보인다. 


다음은 이런 설정 항목이 사라졌을 때 처리하는 방법이다. 

일반 프로젝트를 자바 프로젝트로 변경하는 것도 동일하게 처리하면 된다. 


프로젝트 폴더의 .project 파일을 텍스트 편집기로 연다. 

숨김 파일로 되어 있으므로 숨김 파일을 볼 수 있도록 설정을 바꾸거나 ls -al 과 같은 옵션을 줘야 한다. 


.project 파일에서 buildCommand 태그와 nature 태그에 다음과 같이 추가하면 이클립스에서 위와 같은 자바 설정이 나타나게 된다. 




Trackback 0 And Comment 1

자바 URL과 URLConnection을 활용한 POST 방식 데이터 보내고 받기~

|



자바 URL과 URLConnection 클래스

자바에는 java.net.URL 클래스를 통해 URL 주소를 인식할 수 있으며, 프로토콜, 도메인, 포트, 경로 등을 지정할 수 있다.

URLConnection을 통해 자바에서 웹페이지에 접속하기 위해서는 URL 주소를 java.net.URL 클래스로 변경할 필요가 있다.  


다음 두 가지 방법으로 URL 클래스를 생성할 수 있는데, 일반적으로 문자열을 받아서 처리하는 2번째 방법을 많이 사용한다. 

URL url = new URL("http", "blog.acronym.co.kr", 80, "537");
URL url = new URL("http://blog.acronym.co.kr/537");


해당 URL에서 페이지 정보를 가져오기 위해서 다음과 같이 URLConnection을 사용한다. 

URLConnection conn = url.openConnection();


URL 클래스와 URLConnection 클래스를 사용할 때는 각각 MalformedURLException과 IOException을 처리해줘야 한다. 

기본적인 소스의 형태는 다음과 같다. 


자바에서 웹 페이지 가져오기

위에서 설명한 대로 해당 URL에 접속한 다음 웹 페이지의 HTML을 가져오면 된다. 

데이터를 읽어오기 위해 예전에는 BufferedReader 클래스를 사용했지만, 최근에는 Scanner 클래스를 더 많이 사용하는 편이다. 

Scanner 클래스는 데이터의 타입에 따라 읽어올 수 있다는 장점이 있지만 웹 페이지 읽는데는 큰 차이는 없다. 

BufferedReader의 예제는 많으므로 여기에서는 Scanner로 읽어보도록 하자. 


17-24 라인을 보면, scan.nextLine() 메소드로 해당 URL의 값을 한줄씩 읽어와서 화면에 다음과 같이 출력한다. 



자바에서 GET 방식으로 데이터 보내기

Get 방식은 URL에 다음과 같이 매개변수를 붙여넣으면 된다. 

http://www.word.pe.kr/url.php?name=mini&age=18&email=...


그래서 Get 방식으로 데이터 보내는 것은 앞의 웹 페이지 가져오는 부분에서 URL만 변경하면 된다. 

단, 웹으로 데이터를 전송하는 것이기 때문에 URLEncoder를 통해 인코딩을 한 후 전달하면 된다. 


14번째 줄과 16번째 줄만 변경되었으므로 확인하면 된다. 

그리고 웹에서 캐시를 사용하지 않도록 할 경우, 19번째 줄에 conn.setUseCache()메소드를 통해 false로 넣으면 된다. 


자바에서 POST 방식으로 데이터 보내기 

POST 방식으로 처리하기 위해서는 먼저 URLConnection 객체에 몇가지 설정을 해야 한다. 

먼저 setDoOutput() 메소드를 true로 설정해서 URL을 연결하고 데이터를 기록한다고 알려줘야 한다. 

그리고 나서 setRequestProperty() 메소드로 ContentType 등을 지정해준다. 


데이터를 쓰기 위해서는 DataOutputStream을 이용해 URLEncoding 된 문자열을 쓰면 된다. 

전체 소스를 살펴보자. 


최종 결과는 화면은 다음과 같다. 




Trackback 0 And Comment 1

임시 비밀번호 생성하는 간단한 자바 소스

|



비밀번호 찾기 기능에서 임시 비밀번호 생성이나 

키 값을 만들 때, 일련번호 뒤에 붙이고 싶은 문자들을 랜덤하게 생성할 때 사용할 수 있는 소스입니다. 


기본적으로 charSet을 숫자, 알파벳 등으로 설정하구요.. 

java의 random함수인 Math.random() 을 사용해서 처리했습니다. 


Math.random() 함수는 0 ~ 1 사이의 임시 값을 제공합니다. 

정확하게는 0.0 이상 1.0 미만의 double 형의 실수값을 반환합니다. 

즉, 1.0의 값은 절대로 나올 수가 없습니다. 


그래서 만약 1 ~ 10 사이의 임시값을 구하려면 다음과 같은 코드를 사용하죠.. 


int n = (int) (Math.random() * 10) + 1;


(int) (Math.random() * 10) 을 통해서 0 ~ 9 사이의 임시값이 나오게 됩니다. 

여기에 1을 더함으로써 1 ~ 10 사이의 임시값이 정해 지겠죠.. 


우리가 사용할 charSet 배열은 0 부터 시작하므로 이렇게 계산할 필요는 없을 것입니다. 

그럼.. 소스를 보시죠.. 



실행 결과는 다음과 같습니다. 


임시비밀번호: GPZJfmJ9Kd


간단하면서도 유용한 팁이었습니다.~




Trackback 0 And Comment 0

자바 컴파일러 버그로 인한 Ant Build 오류 처리~

|



혹시 다음과 같은 오류 메시지를 보신 적이 있으신가요? 

type parameters of <T>T cannot be determined; no unique maximal instance exists for type variable T with upper bounds int,java.lang.Object


Eclipse에서는 이런 메시지가 나타나지 않지만 Ant Build로 서버에서 컴파일하려고 하면 나타나는 경우가 있습니다 

에러 메시지를 살펴보면 매개변수의 타입이 정의되지 않았다는 것 같은데요. 

int, java.lang.Object와  같이 명확하게 사용하라는 것 같습니다. 


해당 오류를 찾아보니 자바 컴파일러의 버그 라고 하네요. 

http://bugs.sun.com/view_bug.do;jsessionid=b25465a8a4d3cffffffffdd0a31aeee673b4?bug_id=6973465


위 글을 참고하면 우회할 수 있는 해결책(workaround)을 제시해 주고 있는데요. 

Workaround is to cast return value to appropriate wrapper type before performing assignment:


바로 Cast 연산자를 통해서 리턴 타입을 다음과 같이 명시하면 된다고 합니다. 

int i2 = (Integer)getValue();

float f2 = (Float)getValue();


테스트 해보니 잘 되네요. 

이클립스에서는 컴파일이 오류 없이 되다가 서버에 Ant Build로 적용할 때 나타날 수 있는 오류이니 알아두시면 도움이 될 것 같습니다. 





Trackback 0 And Comment 0

Java에서 표준시(Global Time)와 지방시(Local time)를 상호 변경하는 함수

|



Global 서비스를 준비하다보면 고려해야 하는 것 중 하나가 시간대와 관련된 이슈입니다. 

보통 UCT 또는 GMT라고 하는 표준 시간대가 있구요. 그리고 국내에서 사용하는 Local 시간대(지방시)가 있습니다. 

표준시 기준으로 국내는 GMT+9라고 표시하는데요. 표준시보다는 9시간이 빠르다고 합니다. 


표준시는 영국왕립 그리니치 천문대를 기준으로 동쪽으로 경도 15도씩 갈때마다 1시간씩 빠르고

반대로 서쪽으로 경도 15도씩 갈때마다 1시간씩 늦어진다고 합니다. 

이런 이슈로 얼마전 TV에서 아프리카의 한 집에서 경계선을 중심으로 오늘과 내일이 공존하는 것을 본 기억이 있네요.. ^^


UTC/GMT와 Local Time 시간 변환 함수


가끔은 Global  서비스를 준비할 때 표준시와 지방시를 상호 변환하는 기능이 필요할 수 있습니다. 

이와 관련되어 잘 만들어진 소스가 있어 소개해 보려고 합니다. (http://donghunl.tistory.com/40)



위 소스에서 다른 부분은 쉽게 이해가 될 것 같습니다. 

다만, 파라미터로 넘어가는 long 타입은 Date 포맷의 변수에서 getTime() 메소드를 통해 반환된 값입니다.


Date Format을 활용해서 UCT/GMT를 LocalTime으로 변환하기


실제로 사용할 때는 "20120713064755"와 같은 형태로 된 시간을 변경해야 하는 경우가 있을 듯 합니다. 

이럴때는 지난번에 설명한 SimpleDateFormat 을 활용하면 되는데요. 

간단하게 표준시를 LocalTime으로 변경하는 소스를 정리해 봤습니다. 



중간에 주석을 달아놨으니 그리 어렵지 않게 이해할 수 있을 듯 합니다. 





Trackback 0 And Comment 0

java에서 날짜 형식 변경을 위한 SimpleDateFormat에 대한 간략한 정리~

|



간혹 프로그래밍을 하다보면 날짜 포맷을 특정 형태로 변경해야 하는 경우가 있습니다. 

Java에서는 SimpleDateFormat으로 쉽게 해결할 수 있는데요. 

SimpleDateFormat의 사용 예제를 간략히 살펴보고 각 기호들에 대해 정리하려고 합니다. 


SimpleDateFormat 사용 예제

예를 들어, 날짜 정보를 가져왔는데 "2012년 7월 11일 (수)"과 같은 형태로 되어 있다고 가정해 보죠. 

다음은 이런 포맷을 "2012-07-11"의 형태로 변경하고자 할 때 사용할 수 있는 예제입니다. 

먼저 소스를 보여드리고 간략히 설명하죠. 



주석을 첨부했으니 별로 어렵지 않게 이해할 수 있을 듯 합니다. 

주의깊게 보셔야 할 것은 문자열로 주어진 내용을 날짜 타입으로 변환하고 난 후, 원하는 날짜 타입으로 변경한다는 것이죠. 

그래서 original_date와 new_date라는 SimpleDateFormat 클래스의 객체를 두 개 선언하고 있습니다. 


여기에서 항상 레퍼런스를 찾아보는 것이 SimpleDateFormat에 매개변수로 전달하는 년, 월, 일, 시, 분, 초 등의 기호들인 것 같습니다. 

그래서 해당 기호들을 한번에 정리해 볼께요. 



SimpleDateFormat 패턴

아래는 패턴들을 정리한 내용입니다. 

만약 7월의 경우, 월을 'M'만 사용하면 7이 나오게 되겠죠.. 07로 표시하려면 'MM'과 같이 사용하면 됩니다. 

기호 의미 보기
G 연대(BC,AD) AD
y 년도 2012
M 월(1~12월) 7
w 년의 몇 번째 주(1~53) 28
W 월의 몇 번째 주(1~5) 2
D 년의 몇 번째 일(1~366) 194
d 월의 몇 번째 일(1~31) 11
F 월의 몇 번째 요일(1~5) 3
E 요일
a 오전/오후(AM,PM) PM
H 시간(0~23) 0
k 시간(1~24) 24
K 시간(0~11) 10
h 시간(1~12) 10
m 분(0~59) 22
s 초(0~59) 7
S 천분의 1초(0~999) 253
z Time zone(General Time Zone) GMT+9:00
Z Time zone(RFC 822 time zone) +0900


오늘날짜 가져오는 예제 하나 더~


예제를 하나 더 넣어봅니다. 



더 알아보기

이클립스 단축키 모음

이클립스 개발 툴의 단축키를 알아두세요.  

jsoup을 활용한 HTML 파싱하기

컴포넌트로 쉽게 HTML을 파싱할 수 있는 예제입니다. 

정규식을 활용한 HTML 태그 제거하기

Java에서 간단한 정규식으로 HTML 태그만을 제거하는 소스입니다.


QR 코드 생성하는 Java 소스

URL 기반의 QR코드를 생성할 수 있는 Java 예제입니다. 

웹에서 엑셀 파일 다운로드하는 Java 서블릿 소스

웹에서 엑셀 파일을 생성하고 바로 다운로드 할 수 있는 Java 소스입니다. 

네이버블로그 글쓰기 연동 API 예제

JSP에서 네이버 블로그로 글쓰기 할 수 있는 API 예제입니다. 


프록시를 활용한 HTML 소스 가져오기

직접 연결 뿐만 아니라 프록시를 통해 HTML 소스 가져오는 예제입니다. 

URL Connection 사용시 인코등 구분하는 예제

URL Connection에서 EUC-KR과 UTF-8의 인코딩을 구분하는 예제입니다. 

HTTP 헤더를 이용한 국가별 분기 예제

국가별 페이지 개발시 HTML 헤더 정보로  구분할 수 있는 예제입니다. 




Trackback 0 And Comment 4

Proxy를 이용한 HTML 소스 가져오기

|



Proxy를 이용해서 HTML 소스를 가져와야 하는 경우가 있을 때 유용할 것 같습니다. 

개발 세상만사님의 스프링노트에서 가져왔습니다. 

나중을 위해 소스를 옮겨 봅니다. 중간에 "아이피", "포트"는 public proxy를 검색하셔서 지정해 주면 될 것 같네요. 

단, Proxy는 확실히 속도가 느린 것 같습니다. 

또한 Proxy 서버를 통할 경우, HTTP 프로토콜로 주고받은 데이터가 모두 Proxy 서버에 저장되므로 주의하셔야 합니다. 







Trackback 0 And Comment 0

구글 앱 엔진(Google App Engine) 자바 버전 설치 및 프로젝트 생성/실행/배포 ~

|



클라우드 컴퓨팅 환경에서 PaaS(Platform as a Service)의 선두주자인 구글 앱 엔진에 대해서 정리해 보려고 합니다. 

아래 글에서 설명한 것처럼 일정 용량을 무료로 제공하기 때문에 처음 시작하는데 부담 없이 테스트할 수 있는 것 같네요. 

2012/02/06 - [리뷰/도서] - [도서] GAE로 시작하는 클라우드 컴퓨팅 - 구글 앱 엔진 활용하기

특히 자바 버전의 경우, 이클립스에 플러그인으로 제공해서 설치 및 실행 환경이 기존 자바 프로그래머에게 친숙하다는 것도 하나의 장점입니다. 

그럼 구글 앱 엔진의 설치부터 하나씩 살펴보도록 하죠~~


1. 이클립스용 구글 플러그인 설치하기 

이클립스 플러그인을 설치하는 방법은 많은 곳에서 이야기 하고 있으니 간단하게만 이야기 하도록 하죠. 

플러그인을 설치하기 위해서 Help 메뉴에서 "Install New Software"를 선택하면 됩니다. 

그리고 Work with: 입력창에 다음과 같이 입력하면 됩니다. 

http://dl.google.com/eclipse/plugin/3.7

참고로 마지막 뒷자리의 3.7은 이클립스의 버전을 나타냅니다. 

사용하는 이클립스가 Ganymede 버전일 경우 3.4이구요. Galieo 버전은 3.5이고, Helios 버전은 3.6입니다. 

저는 Indigo를 사용하고 있어 3.7로 했습니다. 

리스트에 나와있는 플러그인 중에서 다음 항목을 설치하면 됩니다. 

Google App Engine Java SDK 1.6.4

Google Plugin for Eclipse 3.7

Google Web Toolkit SDK 2.4.0

이제 이클립스를 재시작하면 Google App Engine을 사용할 수 있는 환경세팅이 마무리됩니다. (Welcome to Google App Engine!!)


2. 구글 앱 엔진 프로젝트 생성

구글 앱 엔진의 첫 프로젝트를 생성해 보도록 하겠습니다. 

이클립스의 툴 바에 보면 아래 그림과 같은 Google 아이콘이 하나 생긴 것을 확인할 수 있습니다. 

해당 아이콘을 누르면 Google App Engine 프로젝트를 관리할 수 있는 메뉴들이 나타납니다. 

여기에서 "New Web Application Project..."을 선택해서 새로운 프로젝트를 만들어 보겠습니다. 

프로젝트 명은 "Mini"로 패키지는 "kr.co.acronym"으로 설정했습니다. 

특히 하단의 Sample Code를 보시면 "Generate project sample code"가 체크되어 있는 것을 볼 수 있습니다. 

기본적인 소스가 포함되어 있어 바로 실행해 볼 수 있도록 구성되어 있습니다. 

바로 프로젝트를 실행해 보도록 하죠. 


3. 구글 앱 엔진 프로젝트 실행

프로젝트 이름("Mini")를 선택한 후, 마우스 오른쪽 버튼을 클릭하고 "Run As"에서 "3 Web Application"을 선택하면 해당 프로젝트가 바로 샐행이 됩니다.

Console 창에 실행되는 내용이 나타나고 실행이 완료되면 Development Mode 창에 다음과 같이 나타납니다. 

해당 URL을 더블클릭하면 처음 만든 (아니 클릭만 한) 구글 앱 엔진 어플리케이션이 바로 나타납니다. 

처음 실행할때는 오래 걸리거나 실행 여부를 물어볼 수 있으니 차분히 기다려 주시면 됩니다. ^^

텍스트를 입력하고 "Send" 버튼을 클릭하면 다음과 같이 나타납니다. 


단지 클릭만 했는데 깔끔하게 생긴 어플리케이션이 하나 만들어졌네요. ^^


4. 구글 앱 엔진 프로젝트 배포

만들어진 Google App Engine 프로젝트를 배포하기 위해서는 구글 계정이 있어야 하고 App Engine에 가입되어 있어야 합니다. 

회원 가입은 http://appengine.google.com에서 진행하면 됩니다. 

회원 가입 후 Create Application을 통해서 애플리케이션을 하나 생성하도록 되어 있습니다. 

이때 Application Identifier는 유일해야 하므로 반드시 "Check Availability"로 확인하셔야 합니다. 

이제 배포를 시작해 보도록 하겠습니다. 

이클립스 좌측 하단에 보면 구글 계정을 설정하는 부분이 있습니다. 

구글 앱 엔진 예전버전에서는 이 부분이 배포하면서 설정했었는데요. 최근에는 하단에 로그인하는 형태로 변경되었으니 참고하시기 바랍니다. 

"Sign in to Google.."을 선택하면 다음과 같은 로그인 화면이 나타납니다. 

본인의 구글 계정으로 로그인하면 구글 앱 엔진으로 배포할 수 있습니다. 

배포는 프로젝트 생성할 때 사용한 구글 툴바를 활용합니다.  

"Deploy to App Engine.."을 클릭해서 배포할 수 있습니다. 

다음과 같이 "Browse.."를 눌러 해당 프로젝트를 설정했는데 오류 메시지가 보입니다. 

이때는 하단의 "App engine project settings..."를 선택해 프로젝트 세팅을 해줘야 합니다. 

다음 그림의 App Engine 세팅에서 Application ID는 구글에서 생성했던 Application Identifier를 적어주면 되구요. 버전은 순차적으로 올려주면 됩니다. 

나중에 버전별로 관리툴에서 변경할 수 있어서 버전 관리도 잘 해놓으시면 도움이 될 것 같네요. 

이제 OK를 선택하고 Deploy를 시작하면 서버로 업로드가 됩니다. 

제 사이트에서도 로컬과 동일한 화면을 볼 수 있네요~

가끔 배포중에 권한이 없다고 나오는 경우가 있습니다. (404 Not Found)

저의 경우에는 계정을 잘못되어서 그런 것이었는데요. 

혹시 그런 경우가 나오면 먼저 계정 설정을 확인해 보시구요. 

다음 링크( https://appengine.google.com/promo/java_runtime )를 눌러서 자바 런타임을 활성화 해보는 것도 방법일 것 같네요. 

다음에는 Google App Engine의 기본 구조를 소스를 중심으로 한번 정리해 보도록 할께요. 







Trackback 0 And Comment 0

float와 double 타입..

|



Effective Java란 책을 보면..

정확한 계산에 float이나 double 타입을 사용하지 말라고 나와 있습니다. 
java 프로그래밍에서 돈과 같이 중요한 계산에 float이나 double을 사용하면 원하는 값이 나오지 않는다는 것인데요..

예를 들어 1.03 달러에서 42센트를 사용했다면 61센트가 남아야겠죠..
그래서 다음과 같이 자바 프로그래밍으로 실행하면..

System.out.println(1.03 - .42);

---------- Execute ----------
0.6100000000000001

출력 완료 (0초 경과) - 정상 종료

원하지 않는 값이 나오게 된다고 하네요~~

float와 double이 과학과 공학 계산용으로 만들어서 매우 넓은 범위의 수에 대한 정확한 근사값을 빨리 계산하기 때문이라고 합니다.

그럼.. 무얼 사용해야 할까요? 
int, long 또는 BigDecimal을 사용하면 된다고 합니다. 

요 Effective Java란 책을 보면 괜찮은 내용이 많이 있습니다.
다만, 번역이 좀 매끄럽지 못해서 안타까움이 좀 있네요..



Trackback 0 And Comment 0
prev | 1 | 2 | next