Geocoder를 이용한 주소 및 위도/경도 변환 예제

|

안드로이드에서는 위도/경도를 이용해서 주소값을 획득하거나 반대로 주소값을 이용해서 위도/경도를 획득할 수 있는 Geocoder라는 클래스를 제공하고 있습니다.

에제 코드는 다음과 같습니다.

먼저 인터넷이 되어야 하기 때문에 AndroidManifest.xml에 다음 권한을 추가합니다.

Permission 추가

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


GeocodeUtil.java

package snowdeer.utils;

import android.content.Context;
import android.location.Address;
import android.location.Geocoder;
import java.util.ArrayList;
import java.util.List;

public class GeocodeUtil {
  final Geocoder geocoder;

  public static class GeoLocation {

    double latitude;
    double longitude;

    public GeoLocation(double latitude, double longitude) {
      this.latitude = latitude;
      this.longitude = longitude;
    }
  }

  public GeocodeUtil(Context context) {
    geocoder = new Geocoder(context);
  }

  public ArrayList<GeoLocation> getGeoLocationListUsingAddress(String address) {
    ArrayList<GeoLocation> resultList = new ArrayList<>();


    try {
      List<Address> list = geocoder.getFromLocationName(address, 10);

      for (Address addr : list) {
        resultList.add(new GeoLocation(addr.getLatitude(), addr.getLongitude());
      }
    } catch (Exception e) {
      e.printStackTrace();
    }

    return resultList;
  }

  public ArrayList<String> getAddressListUsingGeolocation(GeoLocation location) {
    ArrayList<String> resultList = new ArrayList<>();

    try {
      List<Address> list = geocoder.getFromLocation(location.latitude, location.longitude, 10);

      for (Address addr : list) {
        resultList.add(addr.toString());
      }
    } catch (Exception e) {
      e.printStackTrace();
    }

    return resultList;
  }
}

Git 설명서 - (9) 브랜치 관리

|

브랜치 관리

git branch 명령어는 아무런 옵션없이 실행할 경우 브랜치의 리스트 및 현재 checkout 되어 있는 브랜치를 보여줍니다.

$ git branch
  iss53
* master
  testing

-v 옵션을 붙여서 실행할 경우에는 각 브랜치의 마지막 commit 메세지를 보여줍니다.

$ git branch -v
  iss53   93b412c fix javascript issue
* master  7a98805 Merge branch 'iss53'
  testing 782fd34 add scott to the author list in the readmes

--merged 옵션이나 --no-merged 옵션을 이용해서 현재 checkout 한 브랜치 기준으로 정합 작업이 이루어진 브랜치 또는 그렇지 않은 브랜치 리스트를 볼 수 있습니다.

$ git branch --merged
  iss53
* master

위에서 ‘*’ 가 붙지 않은 브랜치는 이미 정합 작업이 끝난 브랜치이기 때문에 삭제를 해도 되는 브랜치입니다. git branch -d 명령어로 해당 브랜치를 삭제할 수도 있습니다.

정합이 되지 않은 브랜치의 경우에는 -d 옵션으로 삭제가 되지 않습니다. 이 경우에는 -D 옵션으로 강제적으로 삭제를 할 수도 있습니다.

Git 설명서 - (8) 브랜치와 Merge

|

브랜치와 Merge 진행 단계

일반적으로 브랜치를 생성하고 소스를 Merge 하는 단계는 다음과 같습니다.

  1. 현재 진행중인 프로젝트에서 새로운 작업을 위해 신규 브랜치를 생성
  2. 새로운 브랜치에서 작업을 진행함
  3. 그런데 갑자기 기존 브랜치에서 큰 버그가 발생해서 긴급 대처를 해야 함
  4. 기존 브랜치로 checkout
  5. 기존 브랜치에서 ‘Hotfix’ 브랜치를 새로 생성
  6. ‘Hotfix’ 브랜치에서 작업한 결과를 기존 브랜치에 정합함


새로운 브랜치 생성

실제 브랜치를 생성하고 정합하는 단계를 조금 더 자세히 살펴보도록 하겠습니다.

$ git branch iss53

$ git checkout iss53
Switched to a new branch 'iss53'

현재 브랜치에서 ‘iss53’이라는 새로운 브랜치를 생성하고 checkout을 하면 소스 트리는 다음 그림과 같은 상태가 됩니다.

image

이 상태에서 ‘iss53’에서 작업을 계속 진행하고 commit도 하게 되면 다음 그림과 같은 상태가 됩니다.

image


기존 브랜치에 Hotfix 브랜치를 생성

이 때, 기존 브랜치에서 급한 문제가 발생해서 Hotfix를 적용해야 할 상황이 발생했습니다. master 브랜치로 checkout 한 다음 ‘hotfix’ 브랜치를 새로 생성하고 checkout 합니다.

$ git checkout master

$ git branch hotfix

$ git checkout hotfix
Switched to a new branch 'hotfix'

image

‘hotfix’에서 작업을 수행하고 해당 내용을 master 브랜치에 반영하기 위해서는 먼저 master 브랜치로 checkout 한 다음 merge를 해줍니다.

$ git checkout master

$ git merge hotfix
Updating f42c576..3a0874c
Fast-forward
 README | 1 -
 1 file changed, 1 deletion(-)

그러면 아래 그림과 같이 자동으로 정합이 되면서 master 브랜치도 가장 마지막 브랜치로 이동이 됩니다.

image

여기서 git branch 명령어에 -d 옵션을 줘서 ‘hotfix’ 브랜치를 삭제합니다.

$ git branch -d hotfix
Deleted branch hotfix (was 3a0874c).

image

그리고 원래 브랜치를 분리해서 작업을 하던 ‘iss53’ 브랜치로 이동을 해서 다시 작업을 계속합니다.

작업이 다 끝난 후 다시 master 브랜치로 checkout 한 다음 ‘iss53’ 브랜치의 내용을 정합합니다.

$ git checkout master
$ git merge iss53
Auto-merging README
Merge made by the 'recursive' strategy.
 README | 1 +
 1 file changed, 1 insertion(+)
 

image


Merge 작업 도중 충돌 발생한 경우

여러 명의 개발자가 동시에 소스를 수정하다보면 충돌(Conflict)이 발생하기도 합니다. 이 때는 다른 버전 관리 시스템들과 마찬가지로 Git도 자동으로 Merge를 해주지 못합니다. 개발자가 직접 Merge 작업을 해주어야 합니다.

git status 명령어를 이용하면 어떤 파일이 충돌났는지 알 수가 있습니다.

$ git status
On branch master
You have unmerged paths.
  (fix conflicts and run "git commit")

Unmerged paths:
  (use "git add ..." to mark resolution)

        both modified:      snowdeer.cpp

no changes added to commit (use "git add" and/or "git commit -a")
</pre>

충돌이 난 파일은 프로그래머가 직접 수정을 해주어야 하며, 수정이 다 된 후에는 `git add` 명령어로 Staged 한 상태로 만들어 주면 됩니다. 물론 그 이후에 commit 까지 해주어야 합니다.

Git 설명서 - (7) 브랜치의 개념

|

브랜치

Git을 사용하는 가장 큰 이유 중 하나는 ‘브랜치(Branch)’ 때문이라고 할 수 있습니다. 사실 저도 브랜치 사용하는 법은 익숙하지 않아서 잘 사용하지 못하는데, Git에서는 브랜치 활용을 적극적으로 추천하고 있습니다.

심지어 혼자서 개발을 하더라도, 하루에 수십 번씩 브랜치를 생성하더라도 브랜치 활용을 적극적으로 하기를 추천하고 있습니다.


Git의 브랜치

Git은 소스 관리를 이전 버전과 현재 버전과의 차이점(Diff)으로 저장하는 것이 아닌, 해당 시점의 스냅샷(Snapshot)으로 저장하고 있습니다.

그리고 소스를 commit 하게 되면 이전 commit과의 연결 포인터를 저장하고 있습니다. 따라서 다음 그림처럼 각 commit 간의 이동이 자유롭습니다.

image

Git에서의 브랜치는 각 commit 간 이동을 쉽게 해줄 수 있는 포인터라고 생각하면 됩니다. Git은 기본적으로 master 브랜치를 만들어줍니다.

image

master 브랜치는 가장 마지막 commit을 가리키고 있습니다.


브랜치 생성

새로운 브랜치를 생성해봅니다.

$ git branch testing

image

위 그림처럼 새로 만든 브랜치도 기본적으로 가장 마지막의 commit을 가리키게 됩니다.


HEAD 브랜치

Git에서 HEAD 브랜치는 현재 작업중인(checkout 상태인) 브랜치를 가리키는 특수한 포인터입니다.

위에서 ‘testing’ 이라는 브랜치를 새로 생성하긴 했지만, ‘checkout’을 하지 않았기 때문에 HEAD 브랜치는 여전히 master 브랜치를 가리키고 있습니다.

image

여기서 ‘testing’ 브랜치로 checkout을 하게 되면 다음과 같이 HEAD 브랜치의 위치가 옮겨가게 됩니다.

image

여기서 ‘testing’ 브랜치에 새로운 commit을 하면 소스 트리는 다음과 같은 형태가 됩니다.

image

이 상태에서 다시 master 브랜치로 checkout을 하면 HEAD 브랜치의 위치가 옮겨집니다.

image

즉, 이렇게 checkout을 이용해서 각 브랜치간 이동을 자유롭고 간편하게 할 수 있습니다.

만약, 이 상태에서 master 브랜치에서 새로운 작업을 commit 하게 되면 소스 트리는 다음과 같은 형태가 될 것입니다.

image


Git 브랜치의 장점

보통 다른 버전 관리 시스템에서는 브랜치를 생성하게 되면 해당 버전의 파일들을 통째로 복사하기 때문에 속도도 느리고 용량도 많이 차지하게 됩니다.

하지만, Git에서 브랜치는 각 commit을 가리키는 40 글자의 SHA-1 체크섬 파일에 불과합니다. 즉, 아주 가볍습니다. 그래서 브랜치 생성이나 브랜치간 이동도 아주 자유롭고 빠릅니다. 또한 Git의 브랜치는 이전 버전의 commit 포인터를 갖고 있기 때문에 나중에 소스 정합(Merge)를 할 때도 수월하고 편하게 작업할 수 있는 장점이 있습니다.

최근 실행 이력(Multitask)에서 내 앱 숨기기

|

안드로이드에서 멀티태스킹 버튼을 누르면 최근 실행한 앱들 이력이 좌르르 나옵니다.

여기에 표시되는 내 앱이 표시되지 않도록 하는 방법은 다음과 같습니다.

AndroidManifest.xml 파일의 액티비티 속성에 다음과 같은 항목을 추가해주면 됩니다.

<activity
      android:label="@string/app_name"
      android:excludeFromRecents="true">
</activity>