레이블이 Java인 게시물을 표시합니다. 모든 게시물 표시
레이블이 Java인 게시물을 표시합니다. 모든 게시물 표시

2022년 12월 17일 토요일

Java LTrim RTrim 처리 방법

 Java 언어는 많은 지원 함수를 제공합니다.

그런데 trim 함수는 전체 trim 함수 밖에 제공을 안하네요

해서 LeftTrim 만 또는 RightTrim만 처리 하는 방법을 알아 보겠습니다.

<처리방법 1>

문자열을 뒤에서 부터 또는 앞에서 부터 공백을 찾아 지우는 방법입니다.

//Left Trim
String sLTemp = " Left Trim";
int nIdx = 0;
while(nIdx < sLTemp.length() && Character.isWhitespace(sLTemp.charAt(nIdx)))
{
  nIdx++;
}

String sLResult = sLTemp.substring(nIdx);
System.out.println(String.format("Left Trim [%s] ==> [%s]", sLTemp, sLResult));

//Right Trim
String sRTemp = "Right Trim ";
nIdx = sRTemp.length() - 1;
while(nIdx >= sRTemp .length() && Character.isWhitespace(sRTemp .charAt(nIdx)))
{
  nIdx--;
}

String sRResult = sRTemp.substring(0, nIdx+1);
System.out.println(String.format("Right Trim [%s] ==> [%s]", sRTemp, sRResult));

<처리방법 2>

regex 를 이용하여 전체 바꾸는 방법입니다.

String sLTemp = " Left Trim", sRTemp = "Right Trim";
String sLResult = sLTemp.replaceAll("^\\s+", "");
String sRResult = sRTemp .replaceAll("\\s+$", "");

System.out.println(String.format("Left Trim [%s] ==> [%s]", sLTemp, sLResult));
System.out.println(String.format("Right Trim [%s] ==> [%s]", sRTemp, sRResult));

그외에도 다른 방법(Pattern 등)을 사용할수 있습니다.

그럼 ^^

2022년 8월 27일 토요일

Android 절전모드 사용 체크

 Android 폰을 절전모드를 기본을 사용하는 폰을 위해 체크 하는 코드를 가이드 합니다.

절전모드를 쓰는 폰들은 앱이 백그라운드로 내려갈때 일부 자원(네트워크 등)이 바로 다시 회수 되지 않기 떄문에

문제가 발생할 소지가 있습니다.

그에 따른 적절한 조치를 하기 위해서는 해당 모드를 쓰고 있는지 체크 하고 그것에 따른 예외 처리를 추가 해야 합니다.


PowerManager oPM = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
if (oPM != null)
{
	if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && oPM.isPowerSaveMode())
	{
		//절전모드 사용.
	}
}

그럼 ^^

Android 갤러리 이미지 가져오기

 Android 앱 개발시 자신의 갤러리 이미지를 가져오는 기능을 개발하는 경우가 있습니다.

Android O/S 버젼이 올라가면서 접근 제한이 많이 일어나고 갤러리 프로그램도 로컬 방식이 아닌

클라우드 방식(구글포토) 을 쓰는것들도 있기 때문에 그것들에 대한 처리 가이드를 안내하려 합니다.

코드는 Java로 구성 되어 있습니다.

일단 Android 주 앱 소스에 AndroidManifest.xml 에 권한을 추가 합니다.

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

갤러리 호출은 Intent 를 통해서 호출하여 가져 올수 있습니다.

아래 코드를 Activity Content 를 통해서 호출 합니다.

Intent i = new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
 ((Activity)m_oContext).startActivityForResult(i, 1);

startActivityForResult 호출시 두번째 인자는 호출후 돌려받는 리턴 코드값입니다.

편의상 1 로 설정 했습니다.

갤러리 호출후 리턴받는 곳은 활성화된 Activity 에서 돌려 받아 처리 합니다.

코드는 아래와 같습니다.


@Override
protected void onActivityResult(int nReqCode, int nRetCode, @Nullable Intent data)
{
    super.onActivityResult(nReqCode, nRetCode, data);

    switch (nReqCode)
    {
        case 1://Gallery
        {
            if (nRetCode == RESULT_OK && data != null)
            {
                Bitmap bmImage = null;
                try
                {
                    Uri oSelectImg = data.getData();
                    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.P)
                    {
                        bmImage = MediaStore.Images.Media.getBitmap(this.getContentResolver(), oSelectImg);
                    }
                    else
                    {
                        ImageDecoder.Source oSrc = ImageDecoder.createSource(this.getContentResolver(), oSelectImg);
                        bmImage = ImageDecoder.decodeBitmap(oSrc);
                    }

                    if(m_oTestMainView != null)
                    {
                        m_oTestMainView.m_oImgGallery.setImageBitmap(bmImage);
                    }
                }
                catch (Exception e)
                {
                    e.printStackTrace();
                }
            }
            else if(nRetCode == RESULT_CANCELED)
            {
                Toast.makeText(this, "사진 선택 취소", Toast.LENGTH_LONG).show();
            }
        }break;
    }
}

"m_oTestMainView" 는 별도로 구성된 LinearLayout 입니다. 그 안에 ImageVIew m_oImgGallery 를 만들어 놓고 불러들인 갤러리 이미지를 비트맵 으로 셋팅하면 이미지가 나옵니다.

갤러리 이미지는 직접 Uri 경로로 접근해서 읽어 들일수도 있으나 위에서 언급한것처럼 클라우드 기반 갤러리는 경로를 가져올수 없습니다.

그래서 범용적으로 처리를 하시려면 Bitmap 을 자기 앱 경로에 직접 이미지 파일로 저장하여 처리 하는것을 권장합니다.

Bitmap 을 이미지 파일로 저장 하시려면

저장할 File의 OutputStream 을 만들고 아래 코드를 호출하여 저장하시면 됩니다.


File oFile = new File(context.getFilesDir(), '저장상대경로');
OutputStream osFile = new FileOutputStream(oFile);
bmImage.compress(Bitmap.CompressFormat.PNG, 100, osFile);

그럼 ^^

2022년 2월 20일 일요일

Java 문자열 분리 방법

 오늘 포스팅 할 내용은 Java 에서 문자열을 특정 기호로 분리 하여 별도 클래스로 저장하고

출력하는것을 알아 보겠습니다.

기본적인 Java 콘솔 개발 환경 구축은 아래 링크에서 확인 하시기 바랍니다.

Visual Studio Code Java Console 개발환경 구축(Windows)


작성을 위해서 기본적인 문자열 예시를 들겠습니다.

"Title=Blog@Writer=Berdo@PostDate=20220120"

기본 문자열은 위와 같습니다.

그냥 읽어보면 3개의 항목으로 키/값으로 분리 된것으로 보일겁니다.

Java 특성상 두개의 클래스 java 파일로 분리 되어 코드가 작성 될것입니다.

두개의 코드를 먼저 보시고 나머지 설명을 이어 가겠습니다.


public class Java_StrParseSam01 {
    public static void main(String[] args)
    {
        String sOrgSrc = "Title=Blog@Writer=Berdo@PostDate=20220120";
        PostItem item = new PostItem();
        item.doMakePostItem(sOrgSrc);

        System.out.println("==============================");
        System.out.println(String.format("BlogItem Title: %s", item.sTitle));
        System.out.println(String.format("BlogItem Writer: %s", item.sID));
        System.out.println(String.format("BlogItem Date: %s", item.sDate));
        System.out.println("==============================");
    }
}
<Java_StrParseSam01.java>


public class PostItem
{
    String sTitle;
    String sID;
    String sDate;

    public void doMakePostItem(String sOrgStr)
    {
        String[] arrParse = sOrgStr.split("@");

        for(Integer i=0; i<arrParse.length; i++)
        {
            String arrItem[] = arrParse[i].split("=");

            if(arrItem[0].equals("Title"))
                sTitle = arrItem[1];
            else if(arrItem[0].equals("Writer"))
                sID = arrItem[1];
            else if(arrItem[0].equals("PostDate"))
                sDate = arrItem[1];
        }
    }
}
<PostItem.java>

java 시작은 main 함수에서 시작 되기 때문에 main 함수에서

PostItem 클래스에 인스턴스를 생성합니다.

생성한 PostItem 에 문자열을 파싱하여 클래스 내부 아이템에 할당하는 코드가 들어 갑니다.

함수명은 doMakePostItem 이라고 명명 하였습니다.

java 기본 클래스 String에서 문자열을 분리하기 위함 함수가 제공 됩니다.

split 이라는 함수이고 리턴값은 String[] Array 형태로 리턴됩니다.

위 doMakePostItem 에서 '@' 문자로 선분리 하고 개별 아이템을 다시 '=' 문자로 분리 하여

PostItem 클래스 내부 변수에 담는 로직이 들어가 있습니다.

기본적인 java 문자열 분리 방법을 알아 봤습니다.

그럼 이만. ^^

2022년 1월 23일 일요일

Visual Studio Code Java Console 개발환경 구축(Windows)

 간단히 Java Console 개발환경 구축하는 법을 설명할까 합니다.

일단 첫번째로 Visual Studio Code 를 설치 합니다.

https://code.visualstudio.com/download

위 링크로 가셔서 설치 하세요.

두번째 Java SDK 를 설치 합니다.

https://www.oracle.com/java/technologies/downloads/#jdk17-windows

위링크로 가셔서 Windows 탭을 선택 하신후 x64 Installer 를 다운로드 받아서 설치 하세요.














설치 하실때에는 기본 경로로 설치 하신후 마지막에 Next Step 은 안하셔도 되니 Close 누르고 빠져 나오면 됩니다.

기본적인 프로그램들은 다 설치 되었으니 이제 "Hello World" 를 출력하여 프린트 하는 프로그램을 만들어 보겠습니다.

저는 소스 경로를

문서/Source/Java/Test01 으로 만들어 놓았습니다.

이제 Visual Studio Code(이후 VSCode라 명칭 하겠습니다) 를 실행합니다.


















실행하고 나면 위 그림과 같은 화면이 나올겁니다.

거기서 "폴더열기" 를 클릭하고 아까 만들어 놓은 폴더를 지정하여 오픈 하세요.


















오픈하고 나면 위 화면 같은 화면이 나올겁니다.

거기에서 폴더 옆에 빨간색 동그라미 아이콘을 클릭하여 새파일을 생성하면

입력창이 뜰거고 거기에 Hello.java 라는 파일을 생성합니다.

java 파일을 생성했기 때문에 VSCode 에서 java 프로젝트 활성화를 진행 할겁니다.

파일 안에 아래와 같은 코드를 입력하세요.


public class Hello {
    public static void main(String[] args) {
        System.out.println("Hello World");
    }
}

코드 입력이 끝나고 나면 저장을 합니다. (Ctrl + S)

입력된 코드를 간단히 실행하여 결과를 확인 하려면 VSCode 왼쪽 하단에 추가된 "JAVA PROJECT" 를 눌러 트리를 펼칩니다.




















펼치고 나면 위화면 같이 나올겁니다. 거기서 프로젝트 명이 Test01 로 나올거고 그 옆에 실행 버튼이 보일겁니다.

그것을 실행하면 Compile 후 실행하여 결과가 콘솔에 나오는것을 확인할수 있습니다.

2020년 9월 16일 수요일

Android Souce Inspect 사용예

 Android 개발을 하다 보면 기준 API를 지정하고 지정된 API 이상 사용되지 않게 작업을 합니다.

하지만 여러 개발자가 같이 작업을 하다 보면 이 기준이 어긋날때가 있기 때문에 이걸 검증하고 수정하는

방법을 이야기 할까 합니다.

첫번째로 minsdk 를 지정하고 이것보다 높은 함수를 사용할때 개발을 하고 나면 빌드는 되지만 조건이 충족되지 않는 폰에서는 에러가 발생하며 앱이 크래쉬가 일어 날겁니다.

검증하는 방법은

Android Studio Menu에서 "Analyze" -> "Inspect Code" 를 누릅니다.

누르고 나면 한참동안 작업을 한후 결과창에 Inspect된 내용이 보일겁니다.

위 내용에 해당하는것은 아래 경로로 가시면 확인할수 있습니다.

Android -> Lint -> Correctness -> Calling new methods on older versions

두번쨰로는 depercate 된 API를 처리하는 찾아내어 수정하는 방법입니다.

첫번쨰와 마찬가지로 Inspect Code 를 누르시고나서 결과창에

Java -> Code maturity -> Deprecated API usage

위 내용으로 걸러지는 내용을 수정하시면 됩니다.

그럼 ~~

2019년 11월 9일 토요일

Java HashMap 활용법.

오늘 포스팅 할 내용은 Java 에서 주로 쓰이는 HashMap 활용법에 대한 강좌 입니다.

HashMap key/value 성 데이터를 관리의 목적으로 만들어진 Template Class 중 하나 입니다.

HashMap<class Key, class Value> variable; 과 같이 선언 하여 씁니다.

간단히 문자열 "A" ~ "Z" 까지 실제 ASCII 코드값을 매칭 하는 샘플을 만들어 보겠습니다.


package process;

import java.util.HashMap;
import java.util.Iterator;

public class HashMapSample
{
 public static void main(String[] args) throws Exception
 {
  HashMap<String, Integer> mapAlphaASCII = new HashMap<String, Integer>();

  //값 할당.
  for (int i = 65; i <= 90; i++)
  {
   String sKey;
   sKey = String.format("%c", i);
   
   mapAlphaASCII.put(sKey, Integer.valueOf(i));
  }

  // entrySet을 이용한 접근방법. 
  System.out.println("entrySet 이용한 접근...");
  for( HashMap.Entry<String, Integer> item : mapAlphaASCII.entrySet() )
  { 
   System.out.println(String.format("Key[%s]=Value[%d]", item.getKey(), item.getValue())); 
  } 

  // keySet을 이용한 접근방법.
  System.out.println("keySet을 이용한 접근...");
  for( String key : mapAlphaASCII.keySet() )
  { 
   System.out.println(String.format("Key[%s]=Value[%d]", key, mapAlphaASCII.get(key))); 
  } 

  // Iterator를 이용한 접근방법. 
  System.out.println("Iterator를 이용한 접근...");
  Iterator<String> keys = mapAlphaASCII.keySet().iterator(); 
  while( keys.hasNext() )
  { 
   String key = keys.next(); 
   System.out.println(String.format("Key[%s]=Value[%d]", key, mapAlphaASCII.get(key))); 
  }
 }
}
< 위 코드는 우분투 환경에서 javac 1.8.0_232-ea 에서 빌드 되었습니다 >

코드는 중복값 체크 없이 무조건 삽입 하는 코드 입니다.

멤버를 접근 하는 방법은 entrySet / keySet / Iterator 를 이용하는 방법으로 구현 하였습니다.

코드의 간결성을 위해 보통은 두번째 keySet을 저는 보통 사용합니다.

Key와 Value는 Object 를 상속 받은 객체형 타입이어야 합니다.

HashMap 관련 상세한 인터페이스는 https://cr.openjdk.java.net/~iris/se/11/latestSpec/api/java.base/java/util/HashMap.html 여기서 확인 하실수 있습니다.

​제가 여기서 추가로 설명하고자 하는것은 제가 자주 사용하던 패턴과 사용함에 있어 필요로 생각하는 요소들만 정리해서 안내 해드리겠습니다.

a. put : HashMap 에 멤버를 추가 해주는 메소드 입니다.
b. size : HashMap 에 저장된 멤버에 대한 갯수를 리턴해주는 메소드 입니다.
c. clear : HashMap 에 저장된 멤버를 모두 지우는 메소드 입니다.
d. remove : HashMap 에 저장된 멤버중 하나를 지우는 메소드 입니다.
e. keySet : HashMap 의 키셋을 반환 합니다.
f. get : 특정 키에 해당하는 값을 리턴합니다.

위 설명된 항목들을 활용한 샘플 코드를 만들어 보겠습니다.


package process;

import java.util.HashMap;
import java.util.Iterator;

public class HashMapSample2
{
 public static void main(String[] args) throws Exception
 {
  HashMap<String, Integer> mapAlphaASCII = new HashMap<String, Integer>();

  //값 할당.
  for (int i = 65; i <= 90; i++)
  {
   String sKey;
   sKey = String.format("%c", i);
   
   mapAlphaASCII.put(sKey, Integer.valueOf(i));
  }

  System.out.println(String.format("mapAlphaASCII Member Count %d", mapAlphaASCII.size()));

  // keySet을 이용한 멤버 출력..
  for( String key : mapAlphaASCII.keySet() )
  { 
   System.out.println(String.format("Key[%s]=Value[%d]", key, mapAlphaASCII.get(key))); 
  } 

  // B 값을 찾아 삭제.
  if (mapAlphaASCII.get("B") != null)
  {
   mapAlphaASCII.remove("B"); 
  }
  else
   System.out.println(String.format("Not Found B"));

  System.out.println(String.format("mapAlphaASCII Member Count %d", mapAlphaASCII.size()));

  //전체 멤버 삭제.
  mapAlphaASCII.clear();

  System.out.println(String.format("mapAlphaASCII Member Count %d", mapAlphaASCII.size()));  
 }
}

HashMap 의 기능은 제가 링크를 걸은 곳에서 더 많은 기능을 확인 하실수 있습니다.

2019년 11월 6일 수요일

Java ArrayList 활용법

오늘 포스팅 할 내용은 Java 에서 주로 쓰이는 ArrayList 활용법에 대한 강좌 입니다.

ArrayList 는 가변 리스트 배열을 관리 하는 클래스 입니다.

ArrayList<DataType> variable = new ArrayList<DataType>(); 과 같이 선언 하여 씁니다.

간단히 1부터 100까지 변수를 추가하여 값을 출력하는 코드를 만들면서 멤버를 접근 하는 방법은 전통적인 방식/Iterator 를 이용하는 방법/고속 접근 방법을 이용하는 법을 샘플에 적용하여 만들어 보겠습니다.


package process;

import java.util.ArrayList;
import java.util.Iterator;

public class ArraySample
{
 public static void main(String[] args) throws Exception
 {
  ArrayList<Integer> arrTest = new ArrayList<Integer>();

  for (int i=0; i<100; i++)
  {
   arrTest.add(Integer.valueOf(i));
  }

  //전통적인 접근 방법.
  for (int i=0; i<arrTest.size(); i++)
  {
   System.out.println(String.format("Normal i(%d)=[%d]", i, arrTest.get(i)));
  }

  //iterator 를 통한 접근 방법.
  Iterator<Integer> iteLoop = arrTest.iterator();
  while(iteLoop.hasNext())
  {
   System.out.println(String.format("iterator [%d]", iteLoop.next())); 
  }

  //진보된 접근 방법.
  for (Integer nTemp : arrTest )
  {
   System.out.println(String.format("Advance Access [%d]", nTemp));  
  }
 }
}
< 위 코드는 우분투 환경에서 javac 1.8.0_232-ea 에서 빌드 되었습니다 >

ArrayList 관련 상세한 인터페이스는 https://cr.openjdk.java.net/~iris/se/11/latestSpec/api/java.base/java/util/ArrayList.html#%3Cinit%3E() 여기서 확인 하실수 있습니다.

​제가 여기서 추가로 설명하고자 하는것은 제가 자주 사용하던 패턴과 사용함에 있어 필요로 생각하는 요소들만 정리해서 안내 해드리겠습니다.

​a. add(E) : ArrayList 에 순차적으로 멤버를 추가 해주는 메소드 입니다. 위 샘플에서도 확인 하실수 있듯이 멤버에 대한 순차적 추가로 쓰실수 있습니다.
b. size : ArrayList 에 저장된 멤버에 대한 갯수를 리턴해주는 메소드 입니다.
c. clear : ArrayList 에 저장된 멤버를 모두 지우는 메소드 입니다.
d. remove : ArrayList 에 저장된 멤버중 하나 지우는 메소드 입니다.
e. add(index, E) : ArrayList 에 멤버를 추가 할때 순서가 아닌 특정 위치에 추가 할수 있는 메소드 입니다.
f. get : index 를 이용하여 위치에 해당하는 멤버를 리턴합니다.
g. set : index 를 이용하여 위치에 해당하는 멤버를 변경합니다.
h. indexOf : 멤버중 입력으로 파라메터와 동일한 값을 가진 멤버의 인덱스를 리턴합니다.

위 설명된 항목들을 활용한 샘플 코드를 만들어 보겠습니다.


package process;

import java.util.ArrayList;
import java.util.Iterator;

public class ArraySample2
{
 public static void main(String[] args) throws Exception
 {
  ArrayList<Integer> arrTest = new ArrayList<Integer>();

  for (int i=0; i<100; i++)
  {
   arrTest.add(Integer.valueOf(i));
  }

  //추가된 멤버의 갯수 출력.
  System.out.println(String.format("arrTest Count : %d", arrTest.size()));

  //20번쨰 위치에 200 엠버 추가.
     arrTest.add(20, Integer.valueOf(200));

     System.out.println(String.format("arrTest Count : %d, arrTest[20]=%d", arrTest.size(), arrTest.get(20)));

     //20번째 삽입한 200 멤버 제거.
     arrTest.remove(20);

     System.out.println(String.format("arrTest Count : %d, arrTest[20]=%d", arrTest.size(), arrTest.get(20)));

     // 멤버 값중 88 값 있는지 체크.
     if (arrTest.indexOf(Integer.valueOf(88)) > 0)
      System.out.println(String.format("arrTest has 88 as a member."));      
     else
      System.out.println(String.format("arrTest does not have 88 as a member."));      

     //50 ~ 99 멤버 삭제.
     for (int i=50; i<100; i++)
      arrTest.remove(50);

     System.out.println(String.format("arrTest Count : %d", arrTest.size()));
     for (Integer nTemp : arrTest )
  {
   System.out.println(String.format("arrTest Member [%d]", nTemp));  
  }

  //전체 멤버 삭제.
  arrTest.clear();

  System.out.println(String.format("arrTest Count : %d", arrTest.size()));  
 }
}

ArrayList 의 기능은 제가 링크를 걸은 곳에서 더 많은 기능을 확인 하실수 있습니다.

위 코드 중에 구간 삭제시에 ArrayList 에서 removeRange 라는 멤버 함수를 제공 하는데 이것은 protected 로 제공 되기 때문에 클래스를 상속하여 구현 하는 방법입니다.

구간 삭제시 50번째를 지속적으로 지우는것은 하나를 지울때 마다 인덱스 값이 변하기 때문에 해당 값을 지우면서 동일한 효과를 볼수 있습니다.