진형아빠이야기

안녕하세요.

진형아빠입니다.


JAVA 자바에서 가끔...가끔...오라클의 LPAD와 같이 왼쪽에 0을 채우거나 하는등의 작업을 해야할때가 있습니다.

물론 가장 간단하게는 자리수를 체크 후 1자리면...스트링을 더하는 등의 작업을 하면 되지만...왠지 최적화 문제나 코드가 길어지는 등 마음에 들지 않아서 검색을 해보았더니 괜찮은 방법이 있어서 공유합니다. 

오라클의 자바7 부터는 DecimalFormat이라는 클래스를 제공해서 이 클래스를 사용해서 간단하게 처리할 수 있습니다.


예를 들자면...100%적합한 예제는 아닐수 있습니다. ㅎㅎㅎ

월, 또는 일을 표시하는 것에서...1,2,3월 등에서 앞자리에 0을 붙여야 한다면 다음과 같이 사용할 수 있습니다.

Calendar cal= Calendar.getInstance();

System.out.println("Calendar.DATE..."+ cal.get(Calendar.DATE)); 

System.out.println("Calendar.MONTH...."+ (cal.get(Calendar.MONTH) + 1));

DecimalFormat nf = new DecimalFormat("00");

System.out.println(nf.format((cal.get(Calendar.MONTH) + 1)));


https://docs.oracle.com/javase/7/docs/api/java/text/DecimalFormat.html

이것은 오라클 API DOC의 예제.

// Print out a number using the localized number, integer, currency,
 // and percent format for each locale
 Locale[] locales = NumberFormat.getAvailableLocales();
 double myNumber = -1234.56;
 NumberFormat form;
 for (int j=0; j<4; ++j) {
     System.out.println("FORMAT");
     for (int i = 0; i < locales.length; ++i) {
         if (locales[i].getCountry().length() == 0) {
            continue; // Skip language-only locales
         }
         System.out.print(locales[i].getDisplayName());
         switch (j) {
         case 0:
             form = NumberFormat.getInstance(locales[i]); break;
         case 1:
             form = NumberFormat.getIntegerInstance(locales[i]); break;
         case 2:
             form = NumberFormat.getCurrencyInstance(locales[i]); break;
         default:
             form = NumberFormat.getPercentInstance(locales[i]); break;
         }
         if (form instanceof DecimalFormat) {
             System.out.print(": " + ((DecimalFormat) form).toPattern());
         }
         System.out.print(" -> " + form.format(myNumber));
         try {
             System.out.println(" -> " + form.parse(form.format(myNumber)));
         } catch (ParseException e) {}
     } 

 }


신고

Comment +0

안녕하세요.

진형아빠입니다.


이번에는 너무 간단해서 뭥미? 하실수 있는 자바의 삼항연산자입니다.


이런 코드가 있다고 생각해보죠~

if( a > b) {

a = 111;

System.out.println("a의 값은::"+a);

}else{

b = 222;

System.out.println("b의 값은:::"+b);

}

이런 식이 있다고 하면 삼항연산자를 이용해서 다음과 같이 간단히 코드를 구성할 수있습니다.


result = (a>b)?111:222;

System.out.println("result의 값은:::"+ result);


한번 자바코드를 만드시고 실행해보세요~~

결과는 동일할 겁니다. 

6~7줄이 한줄로 간단히 변경되었죠?

약간 기존의 if코드가 억지가 좀 있긴하지만 이해해주세요~~just sample이니까요~~^^


추가적으로 2개의 분기가 아니라...3개를 한다고 가정을 해볼까요?

result=(a>b)?111:(b>c)?222:333;

이런식으로도 사용이 가능합니다. 


신고

Comment +0

안녕하세요.

진형아빠입니다.


int형의 변수 에서 자리수에 해당하는 각각의 숫자들을 추출할 필요가 있어서 생각하는거 자체가 귀찮아서 검색을 해보았지만...맘에 드는것들이 없어서 만들어 봅니다.


사실 너무 간단한건데요. 제가 기억력이 가물해서...치매예방에서 적어놓습니다.



public static void main(String[] args) throws Exception {
	int bp = 1234;	
	System.out.println(bp/1000);
	System.out.println(bp/100%10);
	System.out.println(bp/10%10);
	System.out.println(bp%10);
}
신고

Comment +2

안녕하세요.

진형아빠입니다.

저는 로또번호 같은 중복없는 난수를 만드는 코드를 고민을 했습니다.

for loop를 두번 세번 돌리는등의 코드는 너무 번거로워 보여서 찾아보니 shuffle이라는 메서드가 있네요.

문답무용!

바로 아래의 코드를 살펴보시죠.


ArrayList<Integer> ranNumber = new ArrayList<Integer>();

for(int i=0; i <25;i++){

ranNumber.add(i);

}

Collections.shuffle(ranNumber);

System.out.println(ranNumber);


이렇게 하시면 ArrayList안에서 Random으로 배치된 숫자들을 확인하실수 있을겁니다.



신고

Comment +0

안녕하세요.

이번에는 이클립스의 파일 경로에 대해서 이야기 해보려고 합니다.

개인적으로 사용할 때는 아무 문제가 없을겁니다.


예를들어 제가 개발을 한다고 할때 단순하게 C:\DEV 라는 폴더 밑에 넣고 절대 경로로 넣게 되시면 간단하겠죠.

하지만 여러명이 개발한다고 하거나 개발자각각 폴더의 위치가 틀릴경우를 감안해서 이런 상대 경로를 설정해보았습니다.


저는 develop폴더를 만들고 그 밑에 이클립스와 workspace를 동일 레벨로 폴더를 만들었습니다.

구조는 다음과 같이 나오겠죠.



위와 같이 나올겁니다.

jdk역시 같은 레벨에 넣고 압축파일 내지는 Installer로 제공할 생각입니다.


그렇다면 이클립스의 workspace 경로는 어떻게 설정해야 할까요? 

설치하고 매번 클릭해서 경로 설정은 뭔가 부자연스러워 보입니다.


아래 그림과 같이 설정해주세요.

이클립스의 defalut 경로는 eclipse폴더를 한 단계 들어간 폴더 입니다. 

따라서 "../ "와 같이 사용해서 한 단계 위에 workspace를 만들었습니다.



위와 같이 하면 정상적으로 workspace가 상대 경로로 만들어 질겁니다. ㅎㅎㅎ



필요하시다면 eclipse/configuration/.settings/org.eclipse.ui.ide.prefs의 파일을 오픈해서

RECENT_WORKSPACES=../workspace/myProject와 같이 변경하시면 됩니다.


이러한 경로는 JDK설정이나 기타 등등의 설정에서 유용하게 사용하실수 있을겁니다.


감사합니다.


신고

Comment +0

안녕하세요.

이번에 알려드릴 내용은 import static을 사용하는 방법입니다.

사실 예전부터 java 1.5부터 있었던 기능입니다만...꼼꼼히 안보고 맨날 하는 방식대로 사용하는지라...ㅜㅜ

정말 무식하면 몸이 고생인듯 싶습니다.

'내몸아 미안해~~~' 주인이 무식해서 니가 한타라도 더 고생하면서 타이핑을 해야하는 군아. ㅜㅜ



사용하는 이유에 대해서 알아본다면...

정적 변수 및 상수의 사용입니다. 

왜 사용하냐고 물으신다면...답은 이렇습니다.

상수 혹은 정적인 변수의 경우 변하는것도 없는데 매번 객체를 생성해서 만들게 된다면 자원의 낭비가 작게 나마 있을겁니다. 그런 문제들을 회피하기도 하고요. 편리함도 있습니다.

메서드의 경우는 메서드 객체를 생성하면서 불필요한 객체의 생성을 피하는 장점도 있습니다.


다음은 예제 입니다. 다음과 같이 사용해서 SERVER URL을 간단하게 사용할 수 있습니다.

import static com.example.gcm_mytest.CommonUtilities.SERVER_URL;

import static com.example.gcm_mytest.CommonUtilities.SENDER_ID;

public class MainActivity extends Activity {

    @Override

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        checkNotNull(SERVER_URL, "SERVER_URL");

        checkNotNull(SENDER_ID, "SENDER_ID");

        setContentView(R.layout.activity_main);

    }

}


저같은 경우 상수들을 static을 이용해서 정의해서 "클래스명.상수명" 이런식으로 사용하는것을 즐겨 합니다.

이런경우 편리함 + 성능의 두마리 토끼를 잡으실수 있을겁니다.


추가적으로 자세한 기술적인 내용을 알고 싶으시다면 다음의 블로그를 참고해보세요.

참고: http://blog.naver.com/fantaxis/120121594514


신고

Comment +0

안녕하세요. 

이번에 소개해 드릴 패턴은 Iterator패턴입니다.


SampleIterator.zip

첨부된 파일을 압축풀어서 import 하면 예제가 나타납니다. import하는 방법은 여기서는 다루지 않겠습니다.


Iterator 패턴은 반복자라고 해서 어떤 내용들을 반복해서 사용할때 쓰게 됩니다.

그런데 왜!!!

for문도 있는데 이런것을 사용하는걸까요? 그것도 번거롭게 클래스들을 추가로 만들어 가면서 사용하는걸까요?

이것은 구현과 분리해서 for문을 돌릴수 있기 때문입니다.

예제코드에 나와있는 다음의 코드

while (it.hasNext()) {

System.out.println(((Book)it.next()).getName());

}

를 살펴보신다면 while루프는 BookShelf의 구현과 상관없이 루프를 사용하는것을 알수 있습니다.


BookShelf가 어떻게 수전되더라고 Iterator객체만 준다면 문제없이 루프를 사용할 수 있는 장점이 있는것이죠.

이렇게 되면 While문은 변경하지 않아도 됩니다. 

유후~~좋네요.

물론 세상의 모든일이 그렇지만 이런 좋은면 뒤에는 인터페이스와 그 구현등 구현해야할 것들이 많아지는것이 귀찮아지는 단점이 있습니다.

신고

Comment +0

안녕하세요.

앞으로 몇일에 걸쳐서 java의 패턴에 관한 내용을 포스팅하려고 합니다.

물론 실무를 하면서 본능적으로 또는 다른 사람의 코드를 보고 무의식 중에 사용을 해왔지만 이번 기회에 정리한다는 느낌으로 공부를 하면서 포스팅을 하려고 합니다.

사실 GOF의 디자인 패턴은 C로 되어 있지만 저는 자바개발자다 보니 자바로 공부를 하고 정리하겠습니다.

앞으로 블로그에서 차례대로 패턴을 올리고 정리놓도록 하겠습니다.

No.1 Iterator 패턴 (이동을 원하시면 클릭하세요.)



신고

Comment +0


자바에서 사용하는 접근 변경자에 대해서 알아보겟습니다.

시작은 default가 protected로 알고 있는데 차이가 잇는다는 이야기를 듣고 좀 조사해보았네요.

저같은 경우 거의 public 아니면 

접근 허용 범위

- public > protected > default >private


- public : 클래스, 변수, 메소드 생성자 등의 모든 접근을 허용한다.

             보통 상수(static final 변수), 메소드(get/set) 등에 많이 사용.


- protected : default와 같으나 추가적으로, 다른 패키지의 하위클래스에서도 상속 가능.

               

- default : 같은 패키지에 있는 (클래스, 변수, 메소드, 내부클래스)에서 접근 가능하다.

              접근 변경자가 없는 선언되지 않은 것이 default


- private : 같은 클래스에서만 접근이 가능하다. 

              보통 인스턴스 변수, 외부에서 호출해서는 안되는 메소드


default와 protected의 차이는 다른 패키지에서 접근이 가능하냐 또는 불가능하냐의 차이만 이다.

흔히들 default가 protected라고 알고 있는 사람들이 많아서 이렇게 정리해보았습니다.

그 많은 사람이 저입니다만...ㅎㅎ

신고

Comment +0

금일 코딩을 하는데 다음과 같은 에러가 발생했습니다.

java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory


구글링을 해보니 해결책은 다음과 같습니다.

commons-logging-1.1.1.jar 라이브러리를 임포트 하면 됩니다. 


commons-logging-1.1.1.jar

이 jar파일을 다운로드 받으시면 될듯 합니다.


관련 자세한 아파치 프로젝트의 내용은 다음을 참조하시면 좋을듯 합니다.

http://commons.apache.org/logging/download_logging.cgi

신고

Comment +4