2014.05.17 16:07


설계한 클래스를 혼자 사용하거나,

1회성으로 사용할 경우는 필요가 없습니다( 바람직하다고 생각지는 않지만 )

저는 private, protected 역시 const 와 쓰는 마찬가지인 이유로 쓴다고 생각합니다.

그런것들은 코드상에서 잠재적인 버그를 만들 수 있는 확률을 확실하게 줄여주며, 컴파일시에 잡을 수 있게 도와줍니다.


코드를 짤 때는 

"내가 만든 코드는 항상 누군가 보고 이용( 재활용 ) 될 수 있다 "

라는 생각을 갖고 해야합니다.


자신이 짠 코드를 이용하는 사람들이 항상 자신이 원하는대로

이용할 거라고 생각하지 마십시오.

자세한 메뉴얼도 도움이 되겠지만 해당 언어에서 제공하는

키워드를 이용하여 코드의 이용을 제한하는것이 효과적입니다.


그런면에서 private, protected, const 등등은 인터페이스, 자원 등을 단일화, 강제화 시킬 수 있으며 이러한 코딩 습관은 발생 가능 한 수 많은 버그의 경우의 수를 줄여 줍니다.


출처 : https://kldp.org/node/48605



[ class 의 경우 ]

public     : 모든 패키지에서 이 클래스를 참조할 수 있다.

private    : 자신을 포함한 클래스에서만 참조가능

protected : 자신을 포함하는 클래스에서 상속받은 클래스에서도 참조가능

default    : 동일 패키지 내에서 이 클래스를 참조할 수 있다.

 

[ 메소드의 경우 ]

public     : 이 클래스밖에서도 이 메소드를 참조할 수 있다.

private    : 이 클래스내에서만 참조가능

protected : 상속받은 클래스와 이 클래스내에서만 참조할 수 있다.

default    : 동일 패키지 내에서만 참조할 수 있다.



사실 private나 protected, default 접근자의 차이점은 제껴두고라도


코드를 짜면서 나는 정작 왜 이 접근자를 선언하고 있는가 생각할 때가 있었습니다.


어짜피 짜는거 걍 public이나 default로 통일하면 되는거 아니야? 라면서 말이죠.


윗글은 서핑하다 찾아낸 명답입니다. 


결과적으로 'private나 protected는 다른 코더를 위한 배려' 였다는 거죠 ^^



신고
Posted by 그린블로그 DEV그린
2014.05.08 15:09

pixel과 dp를 자연스럽게 바꿀 수 있는 코드입니다.


예를 들어 이미지를 코드로 넣을 경우 매우 유용하게 사용될 것입니다. ^^


    /**

    * This method converts dp unit to equivalent pixels, depending on device density.

    *

    * @param dp A value in dp (density independent pixels) unit. Which we need to convert into pixels

    * @param context Context to get resources and device specific display metrics

    * @return A float value to represent px equivalent to dp depending on device density

    */

    public static float convertDpToPixel(float dp, Context context){

        Resources resources = context.getResources();

        DisplayMetrics metrics = resources.getDisplayMetrics();

        float px = dp * (metrics.densityDpi / 160f);

        return px;

    }

 

    /**

     * This method converts device specific pixels to density independent pixels.

     *

     * @param px A value in px (pixels) unit. Which we need to convert into db

     * @param context Context to get resources and device specific display metrics

     * @return A float value to represent dp equivalent to px value

     */

    public static float convertPixelsToDp(float px, Context context){

        Resources resources = context.getResources();

        DisplayMetrics metrics = resources.getDisplayMetrics();

        float dp = px / (metrics.densityDpi / 160f);

        return dp;

    }


출처 : http://stackoverflow.com/questions/4605527/converting-pixels-to-dp



신고
Posted by 그린블로그 DEV그린
2014.05.08 14:59

개발하면서 Drawable과 Bitmap을 왔다갔다 할 경우가 있습니다.


이 둘을 자유 자재로 바꾸는 방법을 알아봅시다.


1. Bitmap to Drawable


 Drawable d = new BitmapDrawable(getResources(), bitmap);



2. Drawable to Bitmap


public static Bitmap drawableToBitmap (Drawable drawable) {

        if (drawable instanceof BitmapDrawable) {

            return ((BitmapDrawable)drawable).getBitmap();

        }

 

        Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Config.ARGB_8888);

        Canvas canvas = new Canvas(bitmap);

        drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());

        drawable.draw(canvas);

 

        return bitmap;

    }



신고
Posted by 그린블로그 DEV그린
2014.03.12 22:29

안드로이드 SQL은 따로 지원하는 API가 있습니다.


그래서 직접 다 쿼리를 치지 않아도 메소드로 대신 할 수 있지요.


 db.query(table, columns, selection, selectionArgs, groupBy, having, orderBy);


대충 이런 식으로 많이 짭니다.


그런데 어떤 컬럼이 중복되지 않게 SELECT하고 싶을 때 distinct를 넣어야 할 때가 있습니다.


안드로이드 API는 그것 또한 고려한 메소드를 제공합니다.


 db.query(distinct, table, columns, selection, selectionArgs, groupBy, having, orderBy, limit);


위의 것과 동일하지만 여기서 새로 추가된 distinct의 값을 true로 주면 중복을 걸러내겠다는 말입니다.


limit에는 null을 주면 됩니다.



신고
Posted by 그린블로그 DEV그린
2013.12.26 15:49

이클립스 Graphical layout에서 


This version of the rendering library is more recent than your version of ADT plug-in. Please update ADT plug-in


이런 말이 뜨면서 안보이는 경우가 있습니다.


이럴땐 말그대로 ADT 업데이트를 해주어야 하는데요,


이클립스 Help - Install New SoftWare.. 를 클릭하신 후 


Work With에 https://dl-ssl.google.com/android/eclipse/ 를 입력하면 뜨는


Android Development Tools를 인스톨한 후 재실행하면 제대로 보입니다.



신고
Posted by 그린블로그 DEV그린
2013.11.21 22:22

시간을 표현할 때는 HH:mm:ss 를 많이 쓰는데요,


때에 따라 AM/PM, 오전/오후로 표기해주어야 할 때가 있습니다.


그럴 땐 다음과 같은 방식으로 코딩합니다. ^^


 Calendar now = Calendar.getInstance();

 now.setTime(StringUtil.parseDate(row.getDate()));

 int isAMorPM = now.get(Calendar.AM_PM);

 switch (isAMorPM) {

 case Calendar.AM:

 ((TextView)dialog.findViewById(R.id.title)).setText("오 "+now.get(Calendar.HOUR)+" "+now.get(Calendar.MINUTE)+"");

    break;

 case Calendar.PM:

 ((TextView)dialog.findViewById(R.id.title)).setText("오후 "+now.get(Calendar.HOUR)+" "+now.get(Calendar.MINUTE)+"");

    break;

 }


참 쉽죠?


신고
Posted by 그린블로그 DEV그린
2013.11.16 01:02

일반적으로 퍼센트 구하는 공식은 다음과 같습니다.


예 : 1000에서 100은 몇 %인가?

공식 : (일부값 ÷ 전체값) ×100

풀이 : (100 ÷1000) ×100 = 10%


이것을 자바프로그래밍에 도입해봤을 때는 int 값으로 계산하겠죠.


그런데 이렇게 하면 값이 0이 나올 때가 나오고 맙니다.


항상 100 나누기 1000이 아니고 356 나누기 6578 같은 경우도 있으니까요.


그럴 때는 적절하게 double을 써주어야 하는데요~ 이 방법이 가장 좋은 방법 같습니다.


percent = (int)( (double)part/ (double)all * 100.0 );

//percent는 전체값에서 일부값의 퍼센트를 나타낸다. 


신고
Posted by 그린블로그 DEV그린
2013.10.08 19:21

안드로이드의 unzip 예제는 많지만 zipping 예제는 찾기가 어렵죠!


그래서 간단한 zip 압축 만들기 방법을 직접 씁니다. ^^


1. 

일단 Zip4j 사이트로 들어가서 jar 파일을 받습니다.


http://www.lingala.net/zip4j/download.php




2. 

그리고 프로젝트의 lib 폴더에 다운받은 jar파일을 넣어줍니다. 

이 시점에선 zip4j_1.3.1.jar가 최신이네요. ^^ 

귀찮으시다면 첨부한 파일을 받으시고..~


zip4j_1.3.1.jar



3. 

Properties - Libraries 에서 Add JARs... 를 클릭하여 zip4j_1.3.1.jar을 등록한 후 



Order and Export에서 체크박스 클릭 후 Clean을 해주십니다.




4. 

Environment.getExternalStorageDirectory().getAbsolutePath()는 sdcard를 의미합니다.

즉 이 코드는 압축할폴더이름을 압축하여 압축할파일이름.zip으로 만드는 코드입니다.

라이브러리를 이용하니 간단하게 압축 끝~ 참 쉽죠? ^^


 try {

 ZipFile zipfile = new ZipFile(Environment.getExternalStorageDirectory().getAbsolutePath() + "압축할파일이름.zip");

 ZipParameters parameters = new ZipParameters();

 parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);

 parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);

 zipfile.addFolder(Environment.getExternalStorageDirectory().getAbsolutePath() + "/압축할폴더이름", parameters);

 } catch (Exception e) {

  // TODO: handle exception

 }



PS.

제가 압축을 사용한 이유는 

4.3부터 gmail로 이미지 다중첨부 시 알 수 없는 퍼미션 에러가 났기 때문입니다. ㅡㅜ

혹시 해결하신 분 댓글좀 남겨주세요~ ㅎㅎ

근데 압축 라이브러리를 사용하고 보니 이게 훨씬 간단하고 유저입장에서도 편하겠더군요. ^^

앞으론 다중 이미지 첨부보단 zip파일로 하나로 묶어보내는게 나아보입니다.



신고
Posted by 그린블로그 DEV그린
2013.10.08 19:02

EditText에 password 모드를 주려면 어떻게 해야될까요?


안드로이드 xml에서는 password="true" 하나로 해되지만


한 xml을 여러 클래스에서 다른 용도로 쓰게 될 때는 어쩔 수 없이 해당 클래스에서만 따로 password모드를 부여해줄 수 밖에 없습니다.


그럴 땐 아래 코드를 사용해보세요!


 EditText edt = (EditText)findViewById(R.id.edt);

 PasswordTransformationMethod pass = new PasswordTransformationMethod();

 edt.setTransformationMethod(pass);



신고
Posted by 그린블로그 DEV그린
2013.08.10 16:59

http://www.slipp.net/wiki/pages/viewpage.action?pageId=5177633


이 사이트가 망하지 않는 한 이클립스의 최적화 정보를 손쉽게 볼 수 있답니다.




이클립스의 heap status 정보를 보려면


Window - Preference 에 가셔서


Show heap status에 체크해주시면 




이렇게 이클립스 오른쪽 하단에 heap status가 뜬답니다.


꽉찬다 싶으면 휴지통 아이콘을 클릭해주시면 알아서 정리가 됩니다.


근데 사실 그렇게 효과가 있는지는 모르겠군요 ㅎㅎ


신고
Posted by 그린블로그 DEV그린
2013.08.09 12:23

Webview는 꾸준히 CPU를 좀먹는 위젯인데요,


그나마 쉽게 CPU를 낮출 수 있는 방법이있습니다.


onResume 에서 로드하고


onPause 에서 clearHistory(); 와 loadUrl(""); 을 선언해주고


작업관리자의 CPU 점유율을 확인해보면 확연하게 줄어든 CPU점유량을 확인해 보실 수 있습니다.

신고
Posted by 그린블로그 DEV그린
2013.08.08 14:52
요즘엔 이클립스랑 Android SDK를 한번에 묶어 주는군요~

http://developer.android.com/sdk/index.html


이곳에서 SDK를 받아줍니다.



Download the SDK 버튼 클릭!



자신의 OS에 맞는 bit를 체크해주시고


Download the SDK ADT Bundel for WIndows 버튼 클릭!


다운받은 .zip 파일을 C: 아무 폴더를 만드셔서 압축을 풉니다.


저같은 경우는 C:\Android 에 그냥 깔아버렸습니다 ㅎㅎ


이제 ecliplse 폴더에서 ecliplse.exe 만 실행해주시면


안드로이드 SDK와 개발자 툴이 설치되어있는 이클립스를 실행하게 됩니다.



이 이클립스는 아이콘이 안드로이드 전용입니다 ㅎㅎ


멋지네요~


예전에는 이클립스 따로 안드로이드 SDK 따로 설치 했었는데


이젠 훨씬 간편하게 개발환경 세팅이 가능해졌습니다. ^^


신고
Posted by 그린블로그 DEV그린
2013.07.31 20:49
Shape path too large to be rendered into a texture


코딩하다 주황색으로 이런 에러가 뜨길래 찾아보니


AndroidManifest.xml의 해당 액티비티에 


android:hardwareAccelerated="false"


이 옵션을 추가해줘야 하더군요. 다만 이걸 추가했을 때 bitmap draw형식이면 뭔가 잔상이 남는 버그가 있네요.


그건 좀 더 연구해봐야겠습니다..

신고
Posted by 그린블로그 DEV그린
2013.07.31 18:19

try catch 문에서 Exception이 걸렸을 때 로그캣으로 찍어보는 방법입니다.


 try { 

   //todo          

 } catch (Exception e) {

    StringWriter sw = new StringWriter();

    e.printStackTrace(new PrintWriter(sw));

    String exceptionAsStrting = sw.toString();

    Log.e("GODK", exceptionAsStrting);

    e.printStackTrace();

 }


신고
Posted by 그린블로그 DEV그린
2013.07.25 00:08

코딩을 하다가 갤럭시S에서만 setHint가 안먹히는 버그를 발견했습니다.


android:gravity="center" 와 android:hint 를 같이 쓰면 주로 안보이는 것 같더군요.



이 버그는 


android:ellipsize="end"


이 옵션을 함께 추가해주시면 수정됩니다.



참 이상한 버그였습니다.


신고
Posted by 그린블로그 DEV그린
2013.07.24 17:02

ImageView를 반투명 처리하는 방법입니다.


코드는 매우 간단합니다.




XML에서 src에 선언했을 경우


 Drawable alpha = ((ImageView)findViewById(R.id.img)).getDrawable();

 alpha.setAlpha(50);



XML에서 background에 선언했을 경우


 Drawable alpha = ((ImageView)findViewById(R.id.img)).getBackground();

 alpha.setAlpha(50);






레이아웃을 반투명 처리할 경우 (주로 도움말 에서 배경을 반투명 처리할 때 사용합니다)


 Paint paint = new Paint();

 paint.setColor(Color.BLACK);

 paint.setAlpha(70);

 ((RelativeLayout)findViewById(R.id.layout)).setBackgroundColor(paint.getColor());



신고
Posted by 그린블로그 DEV그린
2013.07.15 21:49

일련번호를 표시할 때 자릿수를 정해서 세팅하는 방법입니다.


001, 002... 010 이런식으로 표현하고 싶을 때 아래 코드를 사용합니다.


 int serial = 3;

 String number = String.format("%03d", serial);

 Log.i("INFO""number : "+number);

신고
Posted by 그린블로그 DEV그린
2013.07.04 16:41

저번 글에선 Sqlite에서 NULL값을 걸러내는 방법을 알아보았는데요~


이번엔 NULL값을 제외한 값들을 추려내는 방법을 알아봅시다.


B테이블A컬럼의 값이 NULL이 아닌 것만 SELECT 하려면 아래와 같은 쿼리를 날립니다.


 SELECT A컬럼 FROM B테이블 WHERE NOT A컬럼 is NULL;


이것도 참~ 쉽죠? :)

신고
Posted by 그린블로그 DEV그린
2013.07.04 16:38

Sqlite에서 NULL값을 SELECT 해보는 방법을 알아봅시다.


B테이블A컬럼의 값이 NULL인 것만 SELECT 하려면 아래와 같은 쿼리를 날립니다.


SELECT A컬럼 FROM B테이블 WHERE A컬럼 is NULL;


참~ 쉽죠? :)

신고
Posted by 그린블로그 DEV그린
2013.05.30 14:37

Calendar c1 = Calendar.getInstance();

Calendar c2 = Calendar.getInstance();

c1.setTime(StringUtil.parseDate(시작시간));

c2.setTime(StringUtil.parseDate(종료시간));

long a = 0;

long b = (c2.getTimeInMillis() - c1.getTimeInMillis()) /1000;

a = b/(60 * 60); //시간 구하기

                                   

long hourToMinute = a * 60; //구해진 시간을 분으로 변환

                                   

long ultimateMinute = ( b/(60) ) - hourToMinute; //날짜간 차를 분으로 변환 한 것에 구해진 시간을 분으로 변환한 것을 뺌

                                   

Log.i("INFO", "a : "+a+"시간///"+ultimateMinute+"");





덤) 분을 시간과 분으로 나타내기


예를들어 150분


int h = 150 / 60 = 3(시간)

int m = 150 % 60 = 30(분)


신고
Posted by 그린블로그 DEV그린