본문 바로가기

카테고리 없음

패스트 캠퍼스 안드로이드

안드로이드의 이론을 ai에게 검색해보면서 공부

 

1. constraintlayout

ConstraintLayout은 Android에서 강력하고 유연한 레이아웃 시스템을 제공하는 레이아웃 컨테이너입니다. ConstraintLayout을 사용하면 복잡한 레이아웃을 더 쉽고 효율적으로 구성할 수 있으며, 다양한 화면 크기와 밀도를 가진 장치에서 일관된 UI를 제공할 수 있습니다.

주요 특징

  • 유연성과 표현력: ConstraintLayout은 다른 뷰에 대한 상대적인 위치 지정, 비율 기반 크기 조정, 체인(chain)을 사용한 뷰 그룹핑 등 다양한 레이아웃 기능을 제공합니다. 이를 통해 복잡한 레이아웃도 손쉽게 구성할 수 있습니다.
  • 플랫 레이아웃 구조: 전통적으로 복잡한 레이아웃을 구성하기 위해서는 여러 겹의 레이아웃 컨테이너(LinearLayout, RelativeLayout 등)를 중첩해서 사용해야 했습니다. 하지만 ConstraintLayout을 사용하면 대부분의 경우 단일 레벨의 레이아웃으로 구성할 수 있으므로, 레이아웃 계층이 단순해지고 성능이 향상됩니다.
  • 디자인 도구와의 호환성: ConstraintLayout은 Android Studio의 레이아웃 에디터와 긴밀하게 통합되어 있어, 시각적으로 레이아웃을 구성하고 미세 조정할 수 있습니다. 드래그 앤 드롭, 가이드라인, 바이어스(bias) 조정 등 다양한 도구를 제공합니다.

기본 구성 요소

  • 제약(Constraints): ConstraintLayout에서는 뷰 간의 관계를 정의하는 제약을 사용합니다. 예를 들어, 한 뷰의 위쪽을 다른 뷰의 아래쪽에 연결하거나, 뷰를 부모 컨테이너의 특정 위치에 고정하는 등의 제약을 설정할 수 있습니다.
  • 가이드라인(Guidelines): 화면을 특정 비율이나 거리로 나누어 뷰를 정렬할 수 있는 보이지 않는 줄입니다. 디자인에서 일관된 간격과 정렬을 유지하는 데 유용합니다.
  • 체인(Chains): 여러 뷰를 그룹으로 묶어서 동일한 공간에 분배하거나 비율에 따라 크기를 조정할 수 있습니다. 수평 체인과 수직 체인이 있으며, 뷰들 사이의 관계를 유연하게 설정할 수 있습니다.

2. viewBinding

iew Binding은 Android Jetpack 라이브러리의 일부로서, 안드로이드 뷰와 상호작용하는 코드를 더 쉽고 안전하게 작성할 수 있게 해주는 기능입니다. 이 기능을 사용하면 findViewById와 같은 메서드를 사용하지 않고도 UI 컴포넌트에 접근할 수 있으며, 결과적으로 코드가 더 깔끔해지고 타입 안정성이 향상됩니다.

주요 특징

  • 타입 안정성: View Binding은 레이아웃 파일에서 정의된 뷰에 대해 정확한 타입의 참조를 제공합니다. 이로 인해 잘못된 타입으로의 캐스팅으로 인한 오류를 컴파일 시간에 잡을 수 있습니다.
  • Null 안정성: View Binding을 사용하면 null 체크가 필요 없습니다. 레이아웃에 있는 뷰가 nullable 타입으로 선언되어 있지 않은 이상, View Binding은 항상 non-null 타입의 참조를 반환합니다.
  • 성능: View Binding은 findViewById보다 성능적으로 우수합니다. View Binding 객체는 한 번만 생성되며, 뷰를 찾기 위한 계산이 미리 수행되어 있어 실행 시간에 뷰를 찾는 작업이 필요 없습니다.

설정 방법

View Binding을 사용하려면 먼저 모듈 수준의 build.gradle 파일에서 View Binding을 활성화해야 합니다.

gradle

android {
    ...
    viewBinding {
        enabled = true
    }
}

사용 예제

View Binding을 활성화하면, Android Studio는 각 XML 레이아웃 파일에 대해 바인딩 클래스를 자동으로 생성합니다. 이 클래스의 이름은 XML 파일의 이름을 기반으로 만들어지며, 각 단어의 첫 글자를 대문자로 변경하고 "Binding"을 끝에 붙입니다. 예를 들어, activity_main.xml 레이아웃 파일에 대해서는 ActivityMainBinding 클래스가 생성됩니다.

액티비티에서 View Binding을 사용하는 예는 다음과 같습니다.

kotlin

class MainActivity : AppCompatActivity() {
    private lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        val view = binding.root
        setContentView(view)

        binding.myButton.setOnClickListener {
            // 버튼 클릭 시 수행할 작업
        }
    }
}

이 예제에서는 ActivityMainBinding.inflate 메서드를 사용하여 레이아웃을 인플레이트하고, root 프로퍼티를 통해 루트 뷰를 얻습니다. 이후 setContentView에 루트 뷰를 전달하여 화면에 표시합니다. 뷰에 접근할 때는 binding 객체를 통해 직접 접근할 수 있으며, 각 뷰는 정확한 타입으로 제공됩니다.

결론

View Binding은 코드의 간결성, 타입 안정성, 성능 면에서 여러 장점을 제공합니다. findViewById의 사용을 줄이면서 안드로이드 애플리케이션의 UI 코드를 더 안전하고 유지보수하기 쉽게 만들고 싶다면, View Binding을 활용하는 것이 좋은 선택입니다.

 

3. onSaveInstanceState

onSaveInstanceState() 메서드는 Android에서 액티비티의 상태를 저장하기 위해 사용됩니다. 사용자의 장치 구성 변경(예: 화면 회전)이 발생하거나 시스템이 메모리를 확보하기 위해 액티비티를 파괴할 때, 액티비티의 현재 상태를 저장하고 복원하는 메커니즘을 제공합니다. 이렇게 함으로써 사용자가 애플리케이션을 사용하는 동안 발생할 수 있는 예기치 않은 상황에서도 유저 인터페이스의 일관성을 유지할 수 있습니다.

작동 방식

  • 상태 저장: 액티비티가 시스템에 의해 파괴되기 전에 onSaveInstanceState()가 호출됩니다. 이 메서드에 전달되는 Bundle 객체에 액티비티의 상태 정보를 저장할 수 있습니다. Bundle은 key-value 쌍의 형태로 데이터를 저장하는데, 여기에는 사용자가 입력한 텍스트, 선택한 항목의 상태 등 사용자 인터페이스 상태를 재구성하는 데 필요한 모든 정보를 저장할 수 있습니다.
  • 상태 복원: 액티비티가 다시 생성될 때, 시스템은 onCreate() 및 onRestoreInstanceState() 메서드에 동일한 Bundle 객체를 전달하여 액티비티의 이전 상태를 복원할 수 있도록 합니다. onCreate() 메서드 내에서 상태를 복원할 수도 있고, onRestoreInstanceState()에서 복원할 수도 있지만, onRestoreInstanceState()는 onStart() 메서드 이후에 호출되므로 UI 상태 복원에 더 적합할 수 있습니다.

예제 코드

kotlin

class MyActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_my)

        savedInstanceState?.let {
            // 여기에서 저장된 상태 복원
            val myValue = it.getString("MY_KEY")
            // 이 값을 사용하여 UI 업데이트 등을 수행
        }
    }

    override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)
        // 상태 저장
        outState.putString("MY_KEY", "저장할 값")
    }
}

주의사항

  • onSaveInstanceState()는 액티비티가 사용자에 의해 명시적으로 종료되는 경우에는 호출되지 않습니다. 예를 들어, 사용자가 뒤로 가기 버튼을 누르거나 finish() 메서드가 호출되는 경우에는 이 메서드가 호출되지 않습니다.
  • 저장할 수 있는 데이터의 양에는 제한이 있으므로, 큰 데이터를 저장하기보다는 액티비티의 UI 상태를 복원하는 데 필요한 최소한의 정보만 저장해야 합니다.
  • onSaveInstanceState()는 주로 임시 상태 저장에 사용됩니다. 영구적인 데이터 저장이 필요한 경우에는 데이터베이스, 파일, Shared Preferences 등 다른 저장 메커니즘을 사용해야 합니다.

onSaveInstanceState()를 통해 Android 액티비티에서 동적인 UI 상태를 관리하고 사용자에게 일관된 사용 경험을 제공할 수 있습니다.