---
title: "Android 2.x → 3.x 마이그레이션 "
slug: "naveropenapiv3-maps-android-sdk-v3-migration"
tags: ["Mobile Dynamic Map"]
updated: 2026-05-21T09:01:23Z
published: 2026-05-21T09:03:03Z
canonical: "guide-gov.ncloud-docs.com/naveropenapiv3-maps-android-sdk-v3-migration"
---

> ## Documentation Index
> Fetch the complete documentation index at: https://guide-gov.ncloud-docs.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Android 2.x → 3.x 마이그레이션

<p class="platform-info type-classic-vpc">Classic/VPC 환경에서 이용 가능합니다.</p>

## 2.x → 3.x 마이그레이션 가이드 <a name="2x3x마이그레이션가이드"></a>

이 문서는 네이버 지도 Android SDK 버전 2.x를 [버전 3.x](/docs/naveropenapiv3-maps-android-sdk-v3-start)로 마이그레이션하는 방법을 설명합니다.

## 더 이상 제공되지 않는 기능 <a name="더이상제공되지않는기능"></a>


다음 기능은 3.x SDK에 포함되어 제공되지 않으므로 별도로 제공되는 대체 수단을 사용해 앱에서 구현해야 합니다.

### 좌표-주소 변환 기능 <a name="좌표주소변환기능"></a>


3.x SDK는 2.x SDK에서 `NMapActivity.findPlacemarkAtLocation()`을 호출해 사용할 수 있었던 좌표-주소 변환(Reverse geocoding) 기능을 제공하지 않습니다. 대신 NAVER CLOUD PLATFORM에서 제공하는 Reverse Geocoding API를 사용할 수 있습니다. 자세한 내용은 [Reverse Geocoding](/docs/naveropenapiv3-maps-reverse-geocoding-reverse-geocoding)을 참고하세요.

### "네이버 지도앱 실행" 버튼 <a name="네이버지도앱실행버튼"></a>


3.x SDK는 2.x SDK에서 `NMapView.setBuiltInAppControls()`를 호출해 활성화할 수 있었던 "네이버 지도앱 실행" 버튼을 제공하지 않습니다. 대신 앱에서 직접 버튼을 배치하고 NAVER CLOUD PLATFORM에서 제공하는 지도앱 연동 URL Scheme 기능을 사용할 수 있습니다. 자세한 내용은 [지도앱 연동 URL Scheme](/docs/naveropenapiv3-maps-url-scheme-url-scheme)을 참고하세요.

### 마커 드래그 <a name="마커드래그"></a>


3.x SDK는 2.x SDK에서 `NMapPOIitem.setFloatingMode()`를 호출해 사용할 수 있었던 마커 드래그 기능을 제공하지 않습니다. 마커를 드래그하는 대신 화면의 중심에 마커 역할을 하는 뷰를 고정하고 지도를 움직여 위치를 지정하는 것을 권장합니다. 자세한 내용은 데모 앱의 [CameraEventActivity](https://github.com/navermaps/android-map-sdk/blob/master/app/src/main/java/com/naver/maps/map/demo/java/camera/CameraEventActivity.java){target="_blank"} 예제를 참고하세요.

## 환경 설정 <a name="환경설정"></a>


### 의존성 추가 <a name="의존성추가"></a>


3.x SDK의 라이브러리 그룹 ID는 `com.naver.maps.open`에서 `com.naver.maps`로, 아티팩트 ID는 `naver-map-ncp-api`에서 `map-sdk`로 변경되었습니다. 따라서 의존성 선언을 `com.naver.maps.open:naver-map-ncp-api:2.1.x`에서 `com.naver.maps:map-sdk:3.11.0`으로 변경합니다.

또한 3.x SDK는 별도의 Bintray 저장소를 통해 배포됩니다. 저장소 목록에 `https://naver.jfrog.io/artifactory/maven/`을 추가합니다.

#### 2.x <a name="2x1"></a>


```Gradle
// 앱 모듈 build.gradle
dependencies {
    implementation 'com.naver.maps.open:naver-map-ncp-api:2.1.7'
}
```

#### 3.x <a name="3x1"></a>


```Gradle
// 루트 프로젝트 build.gradle
allprojects {
    repositories {
        maven {
            url 'https://naver.jfrog.io/artifactory/maven/'
        }
    }
}

// 앱 모듈 build.gradle
dependencies {
    implementation 'com.naver.maps:map-sdk:3.11.0'
}
```

자세한 내용은 [시작하기](https://navermaps.github.io/android-map-sdk/guide-ko/1.html){target="_blank"} 문서의 [의존성 추가](https://navermaps.github.io/android-map-sdk/guide-ko/1.html#%EC%9D%98%EC%A1%B4%EC%84%B1-%EC%B6%94%EA%B0%80){target="_blank"} 절을 참고하세요.

### 클라이언트 ID 지정 <a name="클라이언트ID지정"></a>


3.x SDK는 `NMapView.setNcpClientId()`를 호출하는 대신 [AndroidManifest.xml](https://developer.android.com/guide/topics/manifest/manifest-intro){target="_blank"}의 [`<meta-data>`](https://developer.android.com/guide/topics/manifest/meta-data-element){target="_blank"}를 지정하거나 [NaverMapSdk.setClient()](https://navermaps.github.io/android-map-sdk/reference/com/naver/maps/map/NaverMapSdk.html#setClient-com.naver.maps.map.NaverMapSdk.Client-){target="_blank"}를 호출해 클라이언트 ID를 지정합니다.

다음은 클라이언트 ID를 지정하는 예제입니다.

#### 2.x <a name="2x2"></a>


```Java
public class YourActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        NMapView mapView = findViewById(...);
        mapView.setNcpClientId("YOUR_CLIENT_ID_HERE");
    }
}
```

#### 3.x <a name="3x2"></a>


```Java
public class YourApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();

        NaverMapSdk.getInstance(this).setClient(
           new NaverMapSdk.NaverCloudPlatformClient("YOUR_CLIENT_ID_HERE"));
    }
}
```

자세한 내용은 [시작하기](https://navermaps.github.io/android-map-sdk/guide-ko/1.html){target="_blank"} 문서의 [클라이언트 ID 지정](https://navermaps.github.io/android-map-sdk/guide-ko/1.html#%ED%81%B4%EB%9D%BC%EC%9D%B4%EC%96%B8%ED%8A%B8-id-%EC%A7%80%EC%A0%95){target="_blank"} 절을 참고하세요.

## 지도 객체 <a name="지도객체"></a>


### 지도 표시 <a name="지도표시"></a>


3.x SDK는 [MapFragment](https://navermaps.github.io/android-map-sdk/reference/com/naver/maps/map/MapFragment.html){target="_blank"} 또는 [MapView](https://navermaps.github.io/android-map-sdk/reference/com/naver/maps/map/MapView.html){target="_blank"} 가 `NMapView`를 대신해 지도에 대한 뷰 역할을 합니다.

다음은 레이아웃 XML을 사용해 지도를 화면에 나타내는 예제입니다.

#### 2.x <a name="2x3"></a>


```XML
<com.nhn.android.maps.NMapView
    android:id="@+id/map_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />
```

#### 3.x <a name="3x3"></a>


```XML
<fragment
    android:id="@+id/map_fragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:name="com.naver.maps.map.MapFragment" />
```

자세한 내용은 [지도 객체](https://navermaps.github.io/android-map-sdk/guide-ko/2-1.html){target="_blank"} 문서의 [MapFragment](https://navermaps.github.io/android-map-sdk/guide-ko/2-1.html#mapfragment){target="_blank"} 또는 [MapView](https://navermaps.github.io/android-map-sdk/guide-ko/2-1.html#mapview){target="_blank"} 절을 참고하세요.

### 인터페이스 객체 <a name="인터페이스객체"></a>


3.x SDK는 [NaverMap](https://navermaps.github.io/android-map-sdk/reference/com/naver/maps/map/NaverMap.html){target="_blank"}이 `NMapController`를 대신해 지도에 대한 인터페이스 역할을 합니다. `NMapView.getMapController()` 대신 `MapFragment` 또는 `MapView`의 [getMapAsync()](https://navermaps.github.io/android-map-sdk/reference/com/naver/maps/map/MapFragment.html#getMapAsync-com.naver.maps.map.OnMapReadyCallback-){target="_blank"}를 호출해 객체를 얻을 수 있습니다.

다음은 지도 뷰에 대한 인터페이스 객체를 얻어오는 예제입니다.

#### 2.x <a name="2x4"></a>


```Java
NMapController mapController = mapView.getMapController();
// ...
```

#### 3.x <a name="3x4"></a>


```Java
mapFragment.getMapAsync(naverMap -> {
    // ...
});
```

자세한 내용은 [지도 객체](https://navermaps.github.io/android-map-sdk/guide-ko/2-1.html){target="_blank"} 문서의 [NaverMap 객체 얻어오기](https://navermaps.github.io/android-map-sdk/guide-ko/2-1.html#navermap-%EA%B0%9D%EC%B2%B4-%EC%96%BB%EC%96%B4%EC%98%A4%EA%B8%B0){target="_blank"} 절을 참고하세요.

### 좌표 <a name="좌표"></a>


3.x SDK는 LatLng가 `NGeoPoint`를 대신해 좌표를 나타냅니다. `LatLng`와 `NGeoPoint`는 생성자 파라미터의 경위도 순서가 반대이므로 주의해야 합니다.

다음은 좌표 객체를 생성하고 토스트로 위도와 경도를 출력하는 예제입니다.

#### 2.x <a name="2x5"></a>


```Java
NGeoPoint coord = new NGeoPoint(126.9783740, 37.5670135); // 경도, 위도순

Toast.makeText(context, "위도: " + coord.latitude + ", 경도: " + coord.longitude, Toast.LENGTH_SHORT).show();
```

#### 3.x <a name="3x5"></a>


```Java
LatLng coord = new LatLng(37.5670135, 126.9783740); // 위도, 경도순

Toast.makeText(context, "위도: " + coord.latitude + ", 경도: " + coord.longitude, Toast.LENGTH_SHORT).show();
```

자세한 내용은 [좌표 객체](https://navermaps.github.io/android-map-sdk/guide-ko/2-2.html){target="_blank"} 문서의 LatLng 절을 참고하세요.

### 지도 유형 지정 <a name="지도유형지정"></a>


지도의 유형을 지정하려면 `NMapController.setMapViewMode()` 대신 [NaverMap.setMapType()](https://navermaps.github.io/android-map-sdk/reference/com/naver/maps/map/NaverMap.html#setMapType-com.naver.maps.map.NaverMap.MapType-){target="_blank"}을 호출합니다.

다음은 지도의 유형을 하이브리드로 지정하는 예제입니다.

#### 2.x <a name="2x6"></a>


```Java
mapController.setMapViewMode(NMapView.VIEW_MODE_HYBRID);
```

#### 3.x <a name="3x6"></a>


```Java
naverMap.setMapType(NaverMap.MapType.Hybrid);
```

자세한 내용은 [지도 옵션](https://navermaps.github.io/android-map-sdk/guide-ko/2-3.html){target="_blank"} 문서의 [지도 유형](https://navermaps.github.io/android-map-sdk/guide-ko/2-3.html#%EC%A7%80%EB%8F%84-%EC%9C%A0%ED%98%95){target="_blank"} 절을 참고하세요.

### 레이어 그룹 지정 <a name="레이어그룹지정"></a>


특정 레이어 그룹을 활성화하려면 `NMapController.setMapViewTrafficMode()`, `NMapController.setMapViewBicycleMode()`와 같은 개별 메서드 대신 [NaverMap.setLayerGroupEnabled()](https://navermaps.github.io/android-map-sdk/reference/com/naver/maps/map/NaverMap.html#setLayerGroupEnabled-java.lang.String-boolean-){target="_blank"}를 호출합니다.

다음은 실시간 교통정보, 자전거 레이어 그룹을 활성화하는 예제입니다.

#### 2.x <a name="2x7"></a>


```Java
mapController.setMapViewTrafficMode(true);
mapController.setMapViewBicycleMode(true);
```

#### 3.x <a name="3x7"></a>


```Java
naverMap.setLayerGroupEnabled(NaverMap.LAYER_GROUP_TRAFFIC, true);
naverMap.setLayerGroupEnabled(NaverMap.LAYER_GROUP_BICYCLE, true);
```

자세한 내용은 [지도 옵션](https://navermaps.github.io/android-map-sdk/guide-ko/2-3.html){target="_blank"} 문서의 [레이어 그룹](https://navermaps.github.io/android-map-sdk/guide-ko/2-3.html#%EB%A0%88%EC%9D%B4%EC%96%B4-%EA%B7%B8%EB%A3%B9){target="_blank"} 절을 참고하세요.

## 카메라와 투영 <a name="카메라와투영"></a>


### 카메라의 위치 <a name="카메라의위치"></a>


3.x SDK는 2.x SDK와 다른 줌 레벨 체계를 사용합니다. 동일한 축척일 때 3.x SDK의 줌 레벨이 2.x SDK보다 4 정도 큽니다. 또한 줌 레벨의 타입이 `int`에서 `double`로 변경되었습니다.

3.x SDK는 좌표, 줌 레벨 등 카메라와 관련된 값을 낱개로 사용하는 2.x SDK와 달리 이러한 값을 묶은 [CameraPosition](https://navermaps.github.io/android-map-sdk/reference/com/naver/maps/map/CameraPosition.html){target="_blank"} 클래스를 사용합니다.

자세한 내용은 [카메라와 투영](https://navermaps.github.io/android-map-sdk/guide-ko/3-1.html){target="_blank"} 문서의 [카메라의 위치](https://navermaps.github.io/android-map-sdk/guide-ko/3-1.html#%EC%B9%B4%EB%A9%94%EB%9D%BC%EC%9D%98%20%EC%9C%84%EC%B9%98){target="_blank"} 절을 참고하세요.

### 카메라의 현재 위치 <a name="카메라의현재위치"></a>


카메라의 현재 위치를 얻어오려면 `NMapController.getMapCenter()` 및 `NMapController.getZoomLevel()`을 호출하는 대신 [NaverMap.getCameraPosition()](https://navermaps.github.io/android-map-sdk/reference/com/naver/maps/map/NaverMap.html#getCameraPosition--){target="_blank"}을 호출합니다.

다음은 카메라의 현재 위치를 얻고 토스트로 각 속성을 출력하는 예제입니다.

#### 2.x <a name="2x8"></a>


```Java
NGeoPoint center = mapController.getMapCenter();
int zoom = mapController.getZoomLevel();

Toast.makeText(context, "중심 위도: " + center.latitude + ", " +
    "중심 경도: " + center.longitude + ", " +
    "줌 레벨: " + zoom,
    Toast.LENGTH_SHORT).show();
```

#### 3.x <a name="3x8"></a>


```Java
CameraPosition cameraPosition = naverMap.getCameraPosition();

Toast.makeText(context, "대상 지점 위도: " + cameraPosition.target.latitude + ", " +
    "대상 지점 경도: " + cameraPosition.target.longitude + ", " +
    "줌 레벨: " + cameraPosition.zoom + ", " +
    "기울임 각도: " + cameraPosition.tilt + ", " +
    "베어링 각도: " + cameraPosition.bearing,
    Toast.LENGTH_SHORT).show();
```

자세한 내용은 [카메라와 투영](https://navermaps.github.io/android-map-sdk/guide-ko/3-1.html){target="_blank"} 문서의 [카메라의 현재 위치](https://navermaps.github.io/android-map-sdk/guide-ko/3-1.html#%EC%B9%B4%EB%A9%94%EB%9D%BC%EC%9D%98-%ED%98%84%EC%9E%AC-%EC%9C%84%EC%B9%98){target="_blank"} 절을 참고하세요.

### 카메라 이동 <a name="카메라이동"></a>


카메라를 이동하려면 `NMapController.setMapCenter()`를 호출하는 대신 [CameraUpdate](https://navermaps.github.io/android-map-sdk/reference/com/naver/maps/map/CameraUpdate.html){target="_blank"} 객체를 생성해 [moveCamera()](https://navermaps.github.io/android-map-sdk/reference/com/naver/maps/map/NaverMap.html#moveCamera-com.naver.maps.map.CameraUpdate-){target="_blank"}를 호출합니다.

다음은 카메라의 대상 좌표를 `(37.5666102, 126.9783881)` 지점으로, 줌 레벨을 15(2.x SDK 기준 11)로 변경하는 예제입니다.

#### 2.x <a name="2x9"></a>


```Java
mapController.setMapCenter(new NGeoPoint(126.9783881, 37.5666102), 11);
```

#### 3.x <a name="3x9"></a>


```Java
CameraUpdate cameraUpdate = CameraUpdate.scrollAndZoomTo(new LatLng(37.5666102, 126.9783881), 15);
```

자세한 내용은 [카메라 이동](https://navermaps.github.io/android-map-sdk/guide-ko/3-2.html){target="_blank"} 문서의 [API 호출로 카메라 이동하기](https://navermaps.github.io/android-map-sdk/guide-ko/3-2.html#api-%ED%98%B8%EC%B6%9C%EB%A1%9C-%EC%B9%B4%EB%A9%94%EB%9D%BC-%EC%9D%B4%EB%8F%99%ED%95%98%EA%B8%B0){target="_blank"} 절을 참고하세요.

### 카메라 변경 이벤트 <a name="카메라변경이벤트"></a>

카메라 변경 이벤트를 받으려면 `NMapView.setOnMapStateChangeListener()` 대신 [NaverMap.addOnCameraChangeListener()](https://navermaps.github.io/android-map-sdk/reference/com/naver/maps/map/NaverMap.html#addOnCameraChangeListener-com.naver.maps.map.NaverMap.OnCameraChangeListener-){target="_blank"}를 호출해 이벤트 리스너를 등록합니다.

다음은 카메라 변경 이벤트를 받아 변경된 위치를 로깅하는 예제입니다.

#### 2.x <a name="2x10"></a>

```Java
mapView.setOnMapStateChangeListener(new NMapView.OnMapStateChangeListener() {
    @Override
    public void onMapInitHandler(NMapView mapView, NMapError errorInfo) {
        // 미사용
    }

    @Override
    public void onAnimationStateChange(NMapView mapView, int animType, int animState) {
        // 미사용
    }

    @Override
    public void onMapCenterChange(NMapView mapView, NGeoPoint center) {
        Log.i("NaverMap", "중심 변경 - 위도: " + center.latitude + ", 경도: " + center.longitude);
    }

    @Override
    public void onZoomLevelChange(NMapView mapView, int level) {
        Log.i("NaverMap", "줌 레벨 변경: " + level);
    }
});
```

#### 3.x <a name="3x10"></a>

```Java
naverMap.addOnCameraChangeListener((reason, animated) -> {
    CameraPosition cameraPosition = naverMap.getCameraPosition();

    Log.i("NaverMap", "카메라 변경 - 대상 지점 위도: " + cameraPosition.target.latitude + ", " +
        "대상 지점 경도: " + cameraPosition.target.longitude + ", " +
        "줌 레벨: " + cameraPosition.zoom + ", " +
        "기울임 각도: " + cameraPosition.tilt + ", " +
        "베어링 각도: " + cameraPosition.bearing);
});
```

자세한 내용은 [카메라 이동](https://navermaps.github.io/android-map-sdk/guide-ko/3-2.html){target="_blank"} 문서의 [카메라 변경 이벤트](https://navermaps.github.io/android-map-sdk/guide-ko/3-2.html#%EC%B9%B4%EB%A9%94%EB%9D%BC-%EB%B3%80%EA%B2%BD-%EC%9D%B4%EB%B2%A4%ED%8A%B8){target="_blank"} 절을 참고하세요.

### 투영 <a name="투영"></a>

화면 좌표와 지도 좌표를 상호 변환하려면 `NMapProjection` 대신 [Projection](https://navermaps.github.io/android-map-sdk/reference/com/naver/maps/map/Projection.html){target="_blank"} 클래스를 사용합니다. [NaverMap.getProjection()](https://navermaps.github.io/android-map-sdk/reference/com/naver/maps/map/NaverMap.html#getProjection--){target="_blank"}을 호출해 인스턴스에 접근할 수 있습니다.

화면 좌표를 지도 좌표로 변환하려면 `NMapProjection.fromPixels()` 대신 [Projection.fromScreenLocation()](https://navermaps.github.io/android-map-sdk/reference/com/naver/maps/map/Projection.html#fromScreenLocation-android.graphics.PointF-){target="_blank"}을, 지도 좌표를 화면 좌표로 변환하려면 `NMapProjection.toPixels()` 대신 [toScreenLocation()](https://navermaps.github.io/android-map-sdk/reference/com/naver/maps/map/Projection.html#toScreenLocation-com.naver.maps.geometry.LatLng-){target="_blank"}을 호출합니다.

다음은 화면의 `(100, 100)` 지점을 지도 좌표로 변환하는 예제입니다.

#### 2.x <a name="2x11"></a>

```Java
mapView.getMapProjection().fromPixels(100, 100);
```

#### 3.x <a name="3x11"></a>

```Java
LatLng coord = naverMap.getProjection().fromScreenLocation(new PointF(100, 100));
```

다음은 지도의 `(37.5666102, 126.9783881)` 지점을 화면 좌표로 변환하는 예제입니다.

#### 2.x <a name="2x12"></a>

```Java
Point point = new Point();
mapView.getMapProjection().toPixels(new NGeoPoint(126.9783881, 37.5666102), point);
```

#### 3.x <a name="3x12"></a>

```Java
PointF point = naverMap.getProjection().toScreenLocation(new LatLng(37.5666102, 126.9783881));
```

자세한 내용은 [카메라와 투영](https://navermaps.github.io/android-map-sdk/guide-ko/3-1.html){target="_blank"} 문서의 [화면 좌표와 지도 좌표 간 변환](https://navermaps.github.io/android-map-sdk/guide-ko/3-1.html#%ED%99%94%EB%A9%B4-%EC%A2%8C%ED%91%9C%EC%99%80-%EC%A7%80%EB%8F%84-%EC%A2%8C%ED%91%9C-%EA%B0%84-%EB%B3%80%ED%99%98){target="_blank"} 절을 참고하세요.

## 상호작용 <a name="상호작용"></a>

### 컨트롤 <a name="컨트롤"></a>

3.x SDK에는 줌 컨트롤을 비롯한 여러 가지 컨트롤이 내장되어 있습니다. 2.x SDK에서 `NMapView.setBuiltInZoomControls()`를 호출해 활성화하는 줌 컨트롤은 기본적으로 활성화되며, 비활성화하려면 [UiSettings.setZoomButtonEnabled()](https://navermaps.github.io/android-map-sdk/reference/com/naver/maps/map/UiSettings.html#setZoomButtonEnabled-boolean-){target="_blank"}를 호출합니다. `UiSettings` 객체는 [NaverMap.getUiSettings()](https://navermaps.github.io/android-map-sdk/reference/com/naver/maps/map/NaverMap.html#getUiSettings--){target="_blank"}를 호출해 얻을 수 있습니다.

#### 2.x <a name="2x13"></a>

```Java
mapController.setBuiltInZoomControls(true, null);
```

#### 3.x <a name="3x13"></a>

```Java
naverMap.getUiSettings().setZoomButtonEnabled(true);
```

자세한 내용은 [사용자 인터페이스](https://navermaps.github.io/android-map-sdk/guide-ko/4-1.html){target="_blank"} 문서의 [컨트롤](https://navermaps.github.io/android-map-sdk/guide-ko/4-1.html#%EC%BB%A8%ED%8A%B8%EB%A1%A4){target="_blank"} 절을 참고하세요.

### UI 이벤트 <a name="UI이벤트"></a>

지도의 클릭, 롱 클릭 이벤트를 받으려면 `NMapView.setOnMapViewTouchEventListener()` 대신 [NaverMap.setOnMapClickListener()](https://navermaps.github.io/android-map-sdk/reference/com/naver/maps/map/NaverMap.html#setOnMapClickListener-com.naver.maps.map.NaverMap.OnMapClickListener-){target="_blank"} 및 [NaverMap.setOnMapLongClickListener()](https://navermaps.github.io/android-map-sdk/reference/com/naver/maps/map/NaverMap.html#setOnMapLongClickListener-com.naver.maps.map.NaverMap.OnMapLongClickListener-){target="_blank"}를 호출해 이벤트 리스너를 등록합니다.

다음은 지도의 클릭, 롱 클릭 이벤트를 받아 토스트로 클릭된 좌표를 출력하는 예제입니다.

#### 2.x <a name="2x14"></a>

```Java
mapView.setOnMapViewTouchEventListener(new NMapView.OnMapViewTouchEventListener() {
    @Override
    public void onLongPress(NMapView mapView, MotionEvent ev) {
        NGeoPoint coord = mapView.getMapProjection().fromPixels((int)ev.getX(), (int)ev.getY());
        Toast.makeText(this, "롱 클릭: " + coord.latitude + ", " + coord.longitude, Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onLongPressCanceled(NMapView mapView) {
        // 미사용
    }

    @Override
    public void onTouchDown(NMapView mapView, MotionEvent ev) {
        // 미사용
    }

    @Override
    public void onTouchUp(NMapView mapView, MotionEvent ev) {
        // 미사용
    }

    @Override
    public void onScroll(NMapView mapView, MotionEvent e1, MotionEvent e2) {
        // 미사용
    }

    @Override
    public void onSingleTapUp(NMapView mapView, MotionEvent ev) {
        NGeoPoint coord = mapView.getMapProjection().fromPixels((int)ev.getX(), (int)ev.getY());
        Toast.makeText(this, "클릭: " + coord.latitude + ", " + coord.longitude, Toast.LENGTH_SHORT).show();
    }
});
```

#### 3.x <a name="3x14"></a>

```Java
naverMap.setOnMapClickListener((point, coord) ->
    Toast.makeText(this, "클릭: " +  coord.latitude + ", " + coord.longitude, Toast.LENGTH_SHORT).show());

naverMap.setOnMapLongClickListener((point, coord) ->
    Toast.makeText(this, "롱 클릭: " + coord.latitude + ", " + coord.longitude, Toast.LENGTH_SHORT).show());
```

자세한 내용은 [사용자 인터페이스](https://navermaps.github.io/android-map-sdk/guide-ko/4-1.html){target="_blank"} 문서의 [UI 이벤트](https://navermaps.github.io/android-map-sdk/guide-ko/4-1.html#ui-%EC%9D%B4%EB%B2%A4%ED%8A%B8){target="_blank"} 절을 참고하세요.

### 위치 <a name="위치"></a>

2.x SDK는 위치 추적 기능을 사용하려면 `NMapLocationManager`, `NMapCompassManager`, `NMapMyLocationOverlay`를 생성하고 기능을 활성화하는 메서드를 각각 호출해야 했습니다.

3.x SDK에는 위치 추적 기능이 내장되어 있으므로 [NaverMap.setLocationSource()](https://navermaps.github.io/android-map-sdk/reference/com/naver/maps/map/NaverMap.html#setLocationSource-com.naver.maps.map.LocationSource-){target="_blank"}를 호출해 [LocationSource](https://navermaps.github.io/android-map-sdk/reference/com/naver/maps/map/LocationSource.html){target="_blank"} 구현체를 지정하고 [NaverMap.setLocationTrackingMode()](https://navermaps.github.io/android-map-sdk/reference/com/naver/maps/map/NaverMap.html#setLocationTrackingMode-com.naver.maps.map.LocationTrackingMode-){target="_blank"}를 호출하면 위치 추적 기능이 활성화됩니다.

다음은 위치 추적 기능을 활성화하는 예제입니다.

#### 2.x <a name="2x15"></a>

```Java
NMapController mapController = mapView.getMapController();

NMapLocationManager mapLocationManager = new NMapLocationManager(context);
mapLocationManager.setOnLocationChangeListener(onMyLocationChangeListener);
mapLocationManager.enableMyLocation(new NMapLocationManager.OnLocationChangeListener() {
    @Override
    public boolean onLocationChanged(NMapLocationManager locationManager, NGeoPoint myLocation) {
        mapController.animateTo(myLocation);
        return true;
    }

    @Override
    public void onLocationUpdateTimeout(NMapLocationManager locationManager) {
        // 미사용
    }

    @Override
    public void onLocationUnavailableArea(NMapLocationManager locationManager, NGeoPoint myLocation) {
        // 미사용
    }
});

NMapCompassManager mapCompassManager = new NMapCompassManager(context);
mapCompassManager.enableCompass();

NMapViewerResourceProvider mapViewerResourceProvider = new NMapViewerResourceProvider(context);
NMapOverlayManager overlayManager = new NMapOverlayManager(context, mapView, mapViewerResourceProvider);
NMapMyLocationOverlay myLocationOverlay = mapOverlayManager.createMyLocationOverlay(mapLocationManager, mapCompassManager);
myLocationOverlay.setCompassHeadingVisible(true);

mapView.setAutoRotateEnabled(true, false);
```

#### 3.x <a name="3x15"></a>

```Java
naverMap.setLocationSource(new FusedLocationSource(activity, LOCATION_PERMISSION_REQUEST_CODE));
naverMap.setLocationTrackingMode(LocationTrackingMode.Face);
```

자세한 내용은 [위치](https://navermaps.github.io/android-map-sdk/guide-ko/4-2.html){target="_blank"} 문서를 참고하세요.

## 오버레이 <a name="오버레이"></a>

### 사용 준비 <a name="사용준비"></a>

2.x SDK에서 오버레이 기능을 사용하려면 먼저 `NMapViewerResourceProvider`와 `NMapOverlayManager`를 생성하고, 각 오버레이에 `NMapXXXdata`를 생성한 후 `NMapOverlayManager.createXXX()` 메서드를 호출해야 했습니다.

3.x SDK에서는 오버레이 객체 각각이 기능을 독립적으로 완결성 있게 수행하므로 이러한 준비 과정이 필요하지 않습니다. 필요한 오버레이 객체를 생성하고 속성을 객체에 직접 지정한 후 `setMap()`을 호출하면 오버레이가 지도에 나타납니다.

다음은 오버레이 기능을 사용하기 위해 관련 객체를 준비하는 예제입니다.

#### 2.x <a name="2x16"></a>

```Java
NMapViewerResourceProvider mapViewerResourceProvider = new NMapViewerResourceProvider(context);
NMapOverlayManager overlayManager = new NMapOverlayManager(context, mapView, mapViewerResourceProvider);
```

#### 3.x <a name="3x16"></a>

```Java
// 준비 과정 불필요
```

### 클릭 이벤트 <a name="클릭이벤트"></a>

2.x SDK에서는 오버레이의 클릭 이벤트를 받으려면 오버레이 유형별로 `setOnFocusChangeListener()`, `setOnStateChangeListener()` 같은 메서드를 각각 호출해야 했습니다.

3.x SDK에서는 [Overlay.setOnClickListener()](https://navermaps.github.io/android-map-sdk/reference/com/naver/maps/map/overlay/Overlay.html#setOnClickListener-com.naver.maps.map.overlay.Overlay.OnClickListener-){target="_blank"} 메서드로 [Overlay.OnClickListener](https://navermaps.github.io/android-map-sdk/reference/com/naver/maps/map/overlay/Overlay.OnClickListener.html){target="_blank"}를 지정합니다.

#### 2.x <a name="2x17"></a>

```Java
NMapPOIdataOverlay overlay = ...
overlay.setOnStateChangeListener(new NMapPOIdataOverlay.OnStateChangeListener() {
    @Override
    public void onCalloutClick(NMapPOIdataOverlay poiDataOverlay, NMapPOIitem item) {
        Toast.makeText(context, "정보 창 클릭", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onFocusChanged(NMapPOIdataOverlay poiDataOverlay, NMapPOIitem item) {
        if (item != null) {
            Toast.makeText(context, "오버레이 클릭", Toast.LENGTH_SHORT).show();
        }
    }
});
```

#### 3.x <a name="3x17"></a>

```Java
Overlay overlay = ...
overlay.setOnClickListener(o -> {
    Toast.makeText(context, "오버레이 클릭", Toast.LENGTH_SHORT).show();
    return true;
});
```

자세한 내용은 [오버레이 공통](https://navermaps.github.io/android-map-sdk/guide-ko/5-1.html){target="_blank"} 문서의 [이벤트](https://navermaps.github.io/android-map-sdk/guide-ko/5-1.html#%EC%9D%B4%EB%B2%A4%ED%8A%B8){target="_blank"} 절을 참고하세요.

### 마커 <a name="마커"></a>

2.x SDK에서는 마커를 지도에 추가하려면 `NMapPOIdata`를 생성하고 `NMapOverlayManager.createPOIdataOverlay()`를 호출해야 했습니다.

3.x SDK에서는 [Marker](https://navermaps.github.io/android-map-sdk/reference/com/naver/maps/map/overlay/Marker.html){target="_blank"} 객체를 생성하고 필요한 속성을 객체에 직접 지정한 후 `setMap()`을 호출합니다.

마커 드래그 기능은 더 이상 제공되지 않습니다.

다음은 마커를 지도에 추가하는 예제입니다.

#### 2.x <a name="2x18"></a>

```Java
NMapPOIdata poiData = new NMapPOIdata(1, mapViewerResourceProvider);
poiData.beginPOIdata(1);
poiData.addPOIitem(126.9783740, 37.5670135, null, NMapPOIflagType.PIN, 0);
poiData.endPOIdata();

NMapPOIdataOverlay marker = mapOverlayManager.createPOIdataOverlay(poiData, null);
marker.showAllPOIdata(0);
```

#### 3.x <a name="3x18"></a>

```Java
Marker marker = new Marker();
marker.setPosition(new LatLng(37.5670135, 126.9783740));
marker.setMap(naverMap);
```

자세한 내용은 [마커](https://navermaps.github.io/android-map-sdk/guide-ko/5-2.html){target="_blank"} 문서를 참고하세요.

### 정보 창 <a name="정보창"></a>

2.x SDK에서는 마커의 제목을 지정한 경우 마커를 클릭하면 자동으로 마커 위에 정보 창이 나타났습니다. 정보 창을 별도로 생성하거나 동시에 한 개 이상 노출할 수 없었습니다.

3.x SDK에서는 정보 창도 마커처럼 독립적인 객체이므로 자유롭게 생성하고 추가할 수 있습니다. 정보 창을 지도에 추가하려면 [InfoWindow](https://navermaps.github.io/android-map-sdk/reference/com/naver/maps/map/overlay/InfoWindow.html){target="_blank"} 객체를 생성하고 필요한 속성을 객체에 직접 지정한 후 `setMap()`을 호출합니다.

다음은 마커를 클릭하면 정보 창을 지도에 추가하는 예제입니다.

#### 2.x <a name="2x19"></a>

```Java
NMapPOIdata poiData = new NMapPOIdata(1, mapViewerResourceProvider);
poiData.beginPOIdata(1);
poiData.addPOIitem(126.9783740, 37.5670135, "정보 창 내용", NMapPOIflagType.PIN, 0);
poiData.endPOIdata();

NMapPOIdataOverlay marker = mapOverlayManager.createPOIdataOverlay(poiData, null);
marker.setOnStateChangeListener(new NMapPOIdataOverlay.OnStateChangeListener() {
    @Override
    public void onCalloutClick(NMapPOIdataOverlay poiDataOverlay, NMapPOIitem item) {
        Toast.makeText(context, "정보 창 클릭", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onFocusChanged(NMapPOIdataOverlay poiDataOverlay, NMapPOIitem item) {
        // 미사용
    }
});
marker.showAllPOIdata(0);
```

#### 3.x <a name="3x19"></a>

```Java
InfoWindow infoWindow = new InfoWindow();
infoWindow.setAdapter(new InfoWindow.DefaultTextAdapter(context) {
    @NonNull
    @Override
    public CharSequence getText(@NonNull InfoWindow infoWindow) {
        return (CharSequence)infoWindow.getMarker().getTag();
    }
});
infoWindow.setOnClickListener(overlay -> {
    Toast.makeText(context, "정보 창 클릭", Toast.LENGTH_SHORT).show();
    return true;
});

Marker marker = new Marker();
marker.setPosition(new LatLng(37.5670135, 126.9783740));
marker.setTag("정보 창 내용");
marker.setOnClickListener(overlay -> {
    infoWindow.open((Marker)overlay);
    return true;
});
marker.setMap(naverMap);
```

자세한 내용은 [정보 창](https://navermaps.github.io/android-map-sdk/guide-ko/5-3.html){target="_blank"} 문서를 참고하세요.

### 셰이프 <a name="셰이프"></a>


2.x SDK에서는 셰이프를 지도에 추가하려면 `NMapPathData`에 셰이프의 좌표를, `NMapPathLineStyle` 또는 `NMapCircleStyle` 객체를 이용해 셰이프의 스타일을 지정하고 `NMapOverlayManager.createPathDataOverlay()`를 호출해야 했습니다.

3.x SDK에서는 [PolylineOverlay](https://navermaps.github.io/android-map-sdk/reference/com/naver/maps/map/overlay/PolylineOverlay.html){target="_blank"}, [PolygonOverlay](https://navermaps.github.io/android-map-sdk/reference/com/naver/maps/map/overlay/PolygonOverlay.html){target="_blank"}, [CircleOverlay](https://navermaps.github.io/android-map-sdk/reference/com/naver/maps/map/overlay/CircleOverlay.html){target="_blank"} 등 유형별 셰이프 객체를 생성하고 필요한 속성을 객체에 직접 지정한 후 `setMap()`을 호출합니다.

다음은 폴리라인을 지도에 추가하는 예제입니다.

#### 2.x <a name="2x20"></a>

```Java
NMapPathLineStyle pathLineStyle = new NMapPathLineStyle(context);
pathLineStyle.setPataDataType(NMapPathLineStyle.DATA_TYPE_POLYLINE);
pathLineStyle.setLineColor(0x00FF00, 0xFF);

NMapPathData pathData = new NMapPathData(9);
pathData.initPathData();
pathData.addPathPoint(126.97714, 37.57152, NMapPathLineStyle.TYPE_SOLID);
pathData.addPathPoint(126.98268, 37.56607, 0);
pathData.addPathPoint(126.97707, 37.56445, 0);
pathData.addPathPoint(126.97822, 37.55855, 0);
pathData.endPathData();

NMapPathDataOverlay polyline = mapOverlayManager.createPathDataOverlay(pathData);
polyline.showAllPathData(0);
```

#### 3.x <a name="3x20"></a>

```Java
PolylineOverlay polyline = new PolylineOverlay();
polyline.setCoords(Arrays.asList(
    new LatLng(37.57152, 126.97714),
    new LatLng(37.56607, 126.98268),
    new LatLng(37.56445, 126.97707),
    new LatLng(37.55855, 126.97822)
));
polyline.setColor(0xFF00FF00);
polyline.setMap(naverMap);
```

다음은 폴리곤을 지도에 추가하는 예제입니다.

#### 2.x <a name="2x21"></a>

```Java
NMapPathLineStyle pathLineStyle = new NMapPathLineStyle(context);
pathLineStyle.setPataDataType(NMapPathLineStyle.DATA_TYPE_POLYGON);
pathLineStyle.setFillColor(0xFFFFFF, 0xFF);
pathLineStyle.setLineColor(0x00FF00, 0xFF);

NMapPathData pathData = new NMapPathData(5);
pathData.initPathData();
pathData.addPathPoint126.9712268, 37.5640984, NMapPathLineStyle.TYPE_SOLID);
pathData.addPathPoint126.9767904, 37.5651279, 0);
pathData.addPathPoint126.9832241, 37.5625365, 0);
pathData.addPathPoint126.9809297, 37.5585305, 0);
pathData.addPathPoint126.974617, 37.5590777, 0);
pathData.endPathData();
pathData.setPathLineStyle(pathLineStyle);

NMapPathDataOverlay polygon = mapOverlayManager.createPathDataOverlay(pathData);
polygon.showAllPathData(0);
```

#### 3.x <a name="3x21"></a>

```Java
PolygonOverlay polygon = new PolygonOverlay();
polygon.setCoords(Arrays.asList(
    new LatLng(37.5640984, 126.9712268),
    new LatLng(37.5651279, 126.9767904),
    new LatLng(37.5625365, 126.9832241),
    new LatLng(37.5585305, 126.9809297),
    new LatLng(37.5590777, 126.974617)
));
polygon.setColor(0xFFFFFFFF);
polygon.setOutlineColor(0xFF00FF00);
polygon.setMap(naverMap);
```

다음은 서클을 지도에 추가하는 예제입니다.

#### 2.x <a name="2x22"></a>

```Java
NMapCircleStyle circleStyle = new NMapCircleStyle(context);
circleStyle.setFillColor(0xFFFFFF, 0xFF);
circleStyle.setStrokeColor(0x00FF00, 0xFF);

NMapCircleData circleData = new NMapCircleData(1);
circleData.initCircleData();
circleData.addCirclePoint(126.9783881, 37.5666102, 50f);
circleData.endCircleData();
circleData.setCircleStyle(circleStyle);

NMapPathDataOverlay circle = mapOverlayManager.createPathDataOverlay(pathData);
circle.showAllPathData(0);
```

#### 3.x <a name="3x22"></a>


```Java
CircleOverlay circle = new CircleOverlay();
circle.setCenter(new LatLng(37.5666102, 126.9783881));
circle.setRadius(50);
circle.setColor(0xFFFFFFFF);
circle.setOutlineColor(0xFF00FF00);
circle.setMap(naverMap);
```

자세한 내용은 [셰이프](https://navermaps.github.io/android-map-sdk/guide-ko/5-4.html){target="_blank"} 문서를 참고하세요.

### 위치 오버레이 <a name="위치오버레이"></a>

2.x SDK는 위치 오버레이와 위치 추적 기능이 분리되지 않아 `NMapLocationManager`, `NMapCompassManager`를 생성해야만 위치 오버레이를 생성할 수 있었습니다. 또한 오버레이의 위치 등을 임의로 지정할 수 없었습니다.

3.x SDK는 위치 오버레이가 위치 추적 기능과 독립적으로 동작하므로 [NaverMap.getLocationOverlay()](https://navermaps.github.io/android-map-sdk/reference/com/naver/maps/map/NaverMap.html#getLocationOverlay--){target="_blank"}를 호출해 인스턴스에 접근한 후 필요한 속성을 직접 지정할 수 있습니다.

#### 2.x <a name="2x23"></a>

```Java
NMapLocationManager mapLocationManager = new NMapLocationManager(context);
NMapCompassManager mapCompassManager = new NMapCompassManager(context);
NMapMyLocationOverlay myLocationOverlay = mapOverlayManager.createMyLocationOverlay(mapLocationManager, mapCompassManager);
```

#### 3.x <a name="3x23"></a>

```Java
LocationOverlay locationOverlay = naverMap.getLocationOverlay();
locationOverlay.setVisible(true);
```

자세한 내용은 [위치 오버레이](https://navermaps.github.io/android-map-sdk/guide-ko/5-5.html){target="_blank"} 문서를 참고하세요.
