주완 님의 블로그
Android study(1) 본문
📝 학습 목표
- Platform에 대해서 설명할 수 있다.
- Android의 개발 방식과 Layout에 대해 설명할 수 있다.
이번 주차에서는 안드로이드의 구성요소를 중심으로 공부합니다. 본격적으로 Activity와 Fragment를 다루기 전에 안드로이드 개발이 어떤 방식으로 흘러가는지 흐름을 느끼시는 챕터라고 생각하시면 됩니다.
한 번 공부하신 적이 있거나 쉽다고 느껴지시는 분들께서는 아래의 내용을 추가로 공부해 보시는 것을 추천해 드립니다.
- NestedScrollView
- FloatingActionButton
- FrameLayout
🎯 키워드 Essential
- 플랫폼
- 플랫폼은 서비스 공급자와 수용자 등 이해관계자간 상호작용을 통해 창출된 가치를 교환하는 데 기반을 둔 비즈니스 형태를 말한다. 개념이 진화하며 약간의 의미가 변형되었으며, IT의 역사에서는 앱스토어를 지칭하기도 한다. 콘텐츠를 사고파는 장터로 볼 수 있으며 , 콘텐츠 관리, 구매관리, 결제시스템과 같은 단위 시스템으로 이루어져 있다.
- Android OS
- 정의: 스마트폰 모바일 운영체제
- 특징: 리눅스를 기반으로 한 운영체제와 미들웨어, 사용자 인터페이스, 어플리케이션, MMS 서비스 등을 하나로 묶어 제공하는 소프트웨어 플랫폼이다.
- Android의 Architecture
- 안드로이드의 권장 아키텍쳐는 무엇일까요?
- 안드로이드 앱을 확장할 때 앱의 견고성을 높이며, 앱을 더쉽게 테스트할 수 있는 아키텍처를 정의해야 한다. 일반적인 아키텍처 원칙을 고려하였을 때, 안드로이드 어플리케이션에는 레이어가 두 개 이상 있어야한다. (1. 화면에 어플리케이션 데이터를 표시하는 UI 레이어, 2. 앱의 비즈니스 로직을 포함하고 애플리케이션 데이터를 노출하는 데이터 레이어) 3. + 도메인 레이어는 자유롭게
- 안드로이드 아키텍쳐 컴포넌트 (AAC)는 무엇일까요?
- Android 아키텍처 구성요소는 강력하고 테스트와 유지관리가 쉬운 앱을 디자인하도록 돕는 라이브러리의 모음이다. 이러한 AAC의 구성요스 중 하나는 ViewModel 이며 이는 생명주기에 관련없이 데이터를 유지할 수 있게 해준다.
- 안드로이드의 권장 아키텍쳐는 무엇일까요?
- Manifest의 주요 속성
- Manifest : androidmanifest 파일의 루트요소
- application : 애플리케이션의 선언, 애플리케이션의 각 구성요소를 선언하는 하위 요소를 포함
- activity : 애플리케이션의 시각적 사용자 인터페이스 요소를 구현하는 활동을 선언
- intent-filter : 활동, 서비스, broadcast receiver 가 응답할 수 있는 인텐트의 유형을 지정, 상위 구성요소의 기능, 즉 활동이나 서비스가 할 수 있는 작업과 수신기가 처리할 수 있느 브로드 캐스트의 유형을 선언
- action : 인텐트 필터에 작업을 추가. 인텐트 필터에 action 요소가 없으면 필터가 intent 객체를 허용하지 않음
- permission : 이 애플리케이션이나 다른 애플리케이션의 특정 구성요소 또는 기능에 대한 액세스를 제한하는 데 사용되는 보안 권한을 선언
- user-permission : 앱이 올바르게 작동하기 위해 사용자가 반드시 부여해야 하는 시스템 권한
- provider : 콘텐츠 제공자 구성요소를 선언, 애플리케이션에서 사용하는 다른 애플리케이션의 콘텐츠 제공자를 선언하면 안됨
- receiver : broadcast receiver 를 애플리케이션의 구성요소 중 하나로 선언
- service : 서비스를 애플리케이션의 구성요소 중 하나로 선언. 활동과 달리 서비스는 시각적 사용자 인터페이스가 없음
- Manifest의 4대 컴포넌트
- 액티비티 : 사용자 인터페이스 화면을 가지는 하나의 작업을 표시하는 컴포넌트
- 서비스 : 백그라운드에서 실행되는 컴포넌트로서 오랫동안 실행되는 작업이나 원격 프로세스를 위한 작업
- 방송 수신자 : 방송을 받고 반응하는 컴포넌트
- 콘텐츠 제공자 : 데이터를 관리하고 다른 애플리케이션으로 제공하는 컴포넌트, 데이터 베이스와 같은
- Intent
- Intent의 역할은 무엇일까요? 각각의 화면은 별도의 액티비티로 구성되며 해당 액티비티 사이의 시작과 실행 시 필요로 하는 정보들을 실어 보내는 역할을 한다.
- 명시적 Intent와 암시적 Intent의 차이는 무엇일까요? ex) 애플리케이션 A의 컴포넌트 B를 구동시켜라’ 와 같은 명확한 지정이 명시적 intent 라면 ‘해당 기능을 보여줄수 있는 컴포넌트 면 어떤 것이라도 좋다.’ 이 의미가 암시적 intent 이다. 코드 작성시에 실행하고자 하는 액티비티의 이름을 적어주는 것이 명시적 intent 라고 볼 수 있다.
- 인텐트 activity 사이 연결? 컴포넌트 연결 (4개 컴포넌트 끼리의) ++ 굳이 actiivity 간이 아니라도 컴포넌트 연결( 갤러리를 선택하는 거에 있어서 인텐트, 외부 broadcast 간의 연결을 할때) 명시적 ,암시적 <화면을 정확하게 참조해서 하는 것이다. ← 명시적 , 인터넷, 갤러리 ←(크롬,엣지 등의 브라우저 어플들 모호… 직접적인 것이 아니라 암시적 인텐트 라고 한다.)
- Android Layout
- TextView : 텍스트를 입력할 수 있는 공간을 생성한다.
- Button : 기본적인 버튼 기능을 하며 이벤트 처리로 추가적인 사용이 가능하다.
- ImageView: 이미지를 첨부하는 뷰로 간단한 참조를 통해 외부 이미지를 불러오는 것이 가능하다.
- RecyclerView :좌우 및 상하로 움직이는 위젯으로 뷰를 재활용해서 사용하기 때문에 빠른 실행이 가능하다.
- ScrollView : 추가된 뷰의 영역이 한눈에 다 보이지 않을때 사용한다. 스크롤뷰 안에 뷰를 넣는 방식으로만 스크롤이 가능하다. 리소스가 많이 듦 굉장히,
- NestedScrollView : 보통 recycleview 만 스크롤 되다가 더 이상recycleview 에서 스크롤을 할 수 없을 때 scrollview사 사용되는데, 이벤트 처리, ui 상 문제가 생길 수 있고, 아이템이 많은 경우에 메모리 효율을 높힐 수 있다. 스크롤 종합? 결합 시 오류가 덜 날 수 있기 때문에, 좋다
- BottomNavigationView : 하단 바 형태의 디자인위젯을 나타내며 , 메뉴 항목에 따라 화면을 전화하는 역할을 수행하는데 전환되는 화면을 fragment로 구성한다.
- TabLayout : 안드로이드에서 탭으로 구분하는 화면에서 탭 버튼을 배치하는 레이아웃이다. 탭 버튼을 선택했을 때 버튼에 맞는 탭 화면을 뿌려줄 수 있다.
- FloatingActionButton : 플로팅 액션 버튼은 스크린에서 가장 주요하거나 공통되는 기능을 수행한다. 이 버튼은 모든 화면 위에 떠있으며 나뉠 수 있다.
- margin : 생성한 텍스트, 이미지 공간과 화면 사이의 공백크기로 조절하여 넓히고 좁힐 수 있다.
- padding : 텍스트. 이미지와 해당 공간 사이의 공백으로 크기를 조절해 너비를 넓힐 수 있다.
- chainStyle : 뷰간의 상호 참조 연결을 할 때, 뷰들을 어떤 방식으로 연결 시켜 표현 할지를 결정한다. 정렬
- id 네이밍 : 임의적으로 부여 할 수 있는 각 개체에 대한 id 로 참조를 통해 해당 개체를 불러올 수 있다.@id/왈랄라

요즘에는 compose를 통한 kt,xml 통합 코드 관리를 한다고 한다. 근데 필자느 아직 compose 를 배운적이 없어서... 일단은 기본적으로 사용하는 방식으로 스터디를 진행했다.
실습

원래 기본적으로 constrainlayout 을 많이 사용하긴 하는데, 해당 실습떄는 imageview와 textview의 일정한 간격을 맞추기 위해 linearlayout을 사용했다. (구성요소가 몇개 없을 땐 이게 margin, padding 맞추기 편했다.) UI를 배치했다.

이후에 있을 fragment 전환때 사용하기 위해 mainactivity 에 대응하는 xml을 framelayout 으로 감싸고 + UI 배치때 linearlayout 을 사용했다.
후에 이미지 클릭시 화면 전환은 각각 image에 대응하는 fragment로 구성했다 (이미지가 5개니까 5개의 추가 fragment)
<Mainactivity>
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val imageView0: ImageView = findViewById(R.id.imageView0)
val imageView1: ImageView = findViewById(R.id.imageView1)
val imageView2: ImageView = findViewById(R.id.imageView2)
val imageView3: ImageView = findViewById(R.id.imageView3)
val imageView4: ImageView = findViewById(R.id.imageView4)
viewbinding 형식도 있는데 일단, 기본적은 findviewById로 참조하였다. xml에서 id를 참조하여 사용하는건데 아직까지는 구성요소가 많지 않아서 하나하나 id를 참조했다.
imageView0.setOnClickListener {
replaceFragment(fragment1())
}
-> 그럼 선언한 해당 view에 대해서 setOnclickListener 을 통해 event를 추가 할 수 있다. 여기서는 클릭시 화면이 전환되는 replaceFragment 함수를 이용해서 관리했다.
private fun replaceFragment(fragment: Fragment) {
val transaction = supportFragmentManager.beginTransaction()
transaction.replace(R.id.fragment_container, fragment)
transaction.addToBackStack(null)
transaction.commit()
}
-> 가장 기본이 되는 fragment 전환으로 transaction을 val로선언 (supportFragmentManager.beginTransaction()이라는 기존 함수를 사용한다.
transaction.replace : 화면 즉, fragment에 대한 전환이 이루어지는 것인데 이때 fragment 들을 관리할 "container"역할의 view가 필요하다. 앞서 말했듯이 기준이 되는(main) framelayout에 id를 선언하여 해당 layout을 container로 관리하는것인데, 보통 1) 전체를 감싸서 관리 2) container 자체를 xml로 만들어서 관리 한다.
기본 문법은 transaction.replace(R.id.fragment_container, fragment)
이 형식이다. addToBackStack(null) 은 뒤로가기
'Android' 카테고리의 다른 글
| DI - koin & Hilt (0) | 2025.05.25 |
|---|---|
| MVVM , repository 패턴 (1) | 2025.05.11 |
| Kotlin Study (kotlin in action) (0) | 2025.04.29 |
| Android Studio - Jetpack Compose (0) | 2025.04.28 |
| Android 개발 (0) (0) | 2025.02.28 |