이 튜토리얼에서는 Android 앱에서 현재 국가 코드(country code)를 가져오고 변경하는 방법을 단계별로 알아봅니다. 위치 기반 서비스와 Geocoder를 활용해 사용자의 현재 위치에 해당하는 국가 코드를 조회하고, 원하는 값으로 설정해 화면에 표시하는 예제입니다.
1단계: 새 프로젝트 생성
Android Studio를 실행한 뒤, 상단 메뉴에서 File → New Project를 선택하고 필요한 정보를 모두 입력하여 새 프로젝트를 생성합니다.
2단계: 레이아웃 파일 작성 (res/layout/activity_main.xml)
아래 코드를 activity_main.xml에 추가합니다. 이 레이아웃에는 국가 코드 정보를 화면에 보여줄 TextView 하나가 포함되어 있습니다.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
xmlns:app="https://schemas.android.com/apk/res-auto"
xmlns:tools="https://schemas.android.com/tools"
android:layout_width="match_parent"
android:gravity="center"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/text"
android:textSize="30sp"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>위 코드에서는 화면 중앙에 배치된 TextView를 통해 국가 코드 정보를 출력하도록 구성했습니다.
3단계: MainActivity 작성 (src/MainActivity.java)
다음으로 MainActivity.java에 아래 코드를 추가합니다. 이 코드는 위치 권한을 요청한 후, 마지막으로 확인된 위치 좌표를 Geocoder로 변환하여 국가 코드를 얻고, 이를 "KR"로 변경해 TextView에 표시합니다.
package com.example.myapplication;
import android.Manifest;
import android.content.pm.PackageManager;
import android.location.Address;
import android.location.Geocoder;
import android.location.Location;
import android.location.LocationManager;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.RequiresApi;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView;
import java.io.IOException;
import java.util.List;
public class MainActivity extends AppCompatActivity {
TextView textView;
Location location;
double describeContents;
List<Address> addresses;
Geocoder geocoder;
@RequiresApi(api = Build.VERSION_CODES.P)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = findViewById(R.id.text);
// 위치 서비스 매니저 초기화
LocationManager locationManager =
(LocationManager) this.getSystemService(LOCATION_SERVICE);
// 위치 권한이 없는 경우 요청
if (ActivityCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
&& ActivityCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION}, 101);
}
// 네트워크 프로바이더 기반 마지막 위치 가져오기
location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
geocoder = new Geocoder(this);
}
@RequiresApi(api = Build.VERSION_CODES.O)
@Override
public void onRequestPermissionsResult(int requestCode,
String[] permissions, int[] grantResults) {
switch (requestCode) {
case 101:
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
if (ActivityCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
&& ActivityCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
return;
}
try {
// 위도·경도를 주소 목록으로 변환
addresses = geocoder.getFromLocation(
location.getLatitude(), location.getLongitude(), 10);
Address address = addresses.get(0);
// 국가 코드를 "KR"(대한민국)로 변경
address.setCountryCode("KR");
textView.setText("" + address.getCountryCode());
} catch (IOException e) {
e.printStackTrace();
}
} else {
// 권한이 거부된 경우 처리
}
break;
default:
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
}
@RequiresApi(api = Build.VERSION_CODES.O)
@Override
protected void onResume() {
super.onResume();
if (ActivityCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
&& ActivityCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
return;
}
try {
addresses = geocoder.getFromLocation(
location.getLatitude(), location.getLongitude(), 10);
Address address = addresses.get(0);
address.setCountryCode("KR");
textView.setText("" + address.getCountryCode());
} catch (IOException e) {
e.printStackTrace();
}
}
}핵심 로직을 살펴보면 다음과 같습니다.
- getLastKnownLocation() – 네트워크 프로바이더를 통해 마지막으로 확인된 위치를 가져옵니다.
- Geocoder.getFromLocation() – 위도와 경도 값을 실제 주소(국가, 도시 등) 정보로 변환합니다.
- setCountryCode("KR") – 조회된 주소 객체의 국가 코드를 원하는 값(예: 대한민국 "KR")으로 변경합니다.
4단계: 매니페스트 설정 (AndroidManifest.xml)
위치 및 인터넷 접근 권한을 사용하기 위해 AndroidManifest.xml에 아래 코드를 추가합니다.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
package="com.example.myapplication">
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>여기서 선언된 권한은 각각 다음과 같은 역할을 합니다.
- ACCESS_COARSE_LOCATION – 대략적인 위치 정보 접근 권한
- INTERNET – Geocoder가 온라인 지오코딩 서비스를 호출하기 위한 인터넷 권한
- READ_PHONE_STATE – SIM 카드 기반 국가 정보 참조 시 필요할 수 있는 권한
앱 실행 및 결과 확인
이제 애플리케이션을 실행해 결과를 확인해 보겠습니다. 실제 Android 스마트폰을 컴퓨터에 연결했다고 가정합니다. Android Studio에서 프로젝트의 액티비티 파일 중 하나를 연 뒤, 툴바의 Run(실행) 아이콘을 클릭하세요. 실행 옵션에서 자신의 모바일 기기를 선택하면, 앱이 설치되어 실행됩니다.
정상적으로 동작하면 화면에 변경된 국가 코드인 "KR"이 표시됩니다. 만약 위치 권한 팝업이 나타나면 허용을 눌러야 결과를 볼 수 있습니다.
실제 실행 결과는 아래 이미지와 같습니다.

참고 사항
- Geocoder는 백그라운드에서 외부 지오코딩 서비스를 사용하므로, 기기에 Google Play 서비스가 없거나 네트워크가 불안정하면 IOException이 발생할 수 있습니다.
- setCountryCode()는 Address 객체 내부의 값을 변경하는 것이며, 기기의 시스템 설정 자체를 바꾸지는 않습니다. 시스템 전체의 국가/지역 설정을 변경하려면 기기 설정 앱에서 직접 수정해야 합니다.
- API 23(마시멜로) 이상에서는 위치 권한이 런타임 권한으로 분류되므로, 반드시 사용자에게 동적으로 권한을 요청해야 합니다.