ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • TECHIT 앱 스쿨 2기: Android 27일차 (23.06.02)
    [THEC!T] 앱 스쿨2기 : Android 2023. 6. 3. 01:26
    728x90

    자료 출처 : 안드로이드 앱스쿨 2기 윤재성 강사님 수업 내용

     

    오늘 안드로이드 교육과정에 대하여 간단한 설명 과 안드로이드 스튜디오 설치를 하는 것으로 시작하였습니다.
     
    안드로이드 스튜디오를 설치하면서 사람 별로 사용하는 인터넷에 따라 속도가 다를 수 있음을 감안하셨는지
    설치 중 파일 다운로드 과정에서 지금까지 모바일 시장 흐름에 대한 설명을 해주셨습니다.
     
    시작은 통신환경에 대한 설명 중 TDMA에서 CDMA로 변경되어 가는 과정부터 시작하여 WIPI(한국형 통합 모바일 플랫폼, 스마트폰X)에 대한 설명등을 해주시면서 피처폰 시절부터 지금까지 발전하게 된 과정을 말씀해 주셨습니다.
    해당 이야기를 강사님께서 흥미롭게 말씀해주셔서 메모를 해야지 라는 사실도 잊었던 것 같습니다.
    기억에 가장 남는 강사님의 말씀은 스티븐 잡스는 시장의 흐름을 읽은 것이 아니라 성공할 수 밖에 없는 시장을 만들어 낸 것이다 라고 말씀 해주신게 가장 기억에 남아 있습니다.
     
    그리고 개발 방식에 대하여 설명을 해주셨습니다.
     
    Native -> 애플과 구글에서 제공하는 개발방식
    EX) Android : Java, Kotln 
    IOS : Swift
     
    Hybrid -> 한 번만 만들어서 여러 운영체제에서 사용하며, 만들어지는 것은 Native앱이지만 해당 앱에서 웹브라우저를 띄워서 콘텐츠를 표시하는 방식이며, 비용에 대하여 절감 가능 하지만 특정os만 지원하는 기능은 모두 다 빠지며, 하드웨어가 가지는 특성들을 사용하지 못하고 성능이 Native 와 비교하여 떨어지고, 만들 수 있는 서비스가 제한됨.
     
    추후 추가적으로 개발 공부를 하게된다면 하이브리드 앱을 만드는 Flutter 이후로 IOS 순으로 공부하는 것을 추천해 주셨습니다. 
     
    이후로는 안드로이드 스튜디오의 설치를 완료하고 프로젝트 파일을 저장할 위치를 지정하는 등 기본 설정 값들을 설정 하였습니다.
     
    설정을 마친 후에는 안드로이드 운영체제의 구조에 대하여 설명해주셨습니다.
    강사님께서 쉽게 설명 해주셨지만, 저의 실력이 부족하여 서적을 참고하여 구조에 대하여 작성하였습니다.

     
    리눅스 커널 : 안드로이드는 리눅스에 기반을 둔 오픈소스 소프트웨어 스택
     
    하드웨어 추상화(HAL) : 리눅스 커널과 하드웨어 기기간의 인터페이스 부분으로 단말기 제조사가 드라이버를 구현할 수 있도록 제공되는 계층

    하드웨어 작동 코드 안드로이드
    제조사에서 안드로이드에서 제공하는 인터페이스를 이용하여
    작동 코드 작성
    제조사에서 작성한 작동코드를 이용하여 하드웨어의 특성들을 이용 EX) 카메라, 지문인식 등등

     
    안드로이드 런타임 : 흔히 ART라고 하며 앱을 실행하는 역할을 맡으며, 안드로이드 앱은 DEX 파일로 빌드 되는데
    DEX 파일을 해석해서 실행하는 주체
    안드로이드는 자바 클래스를 런타임 때 그대로 실행하지 않고 DEX 파일로 컴파일 하며  DEX 파일을 해석하는 ART에서 실행합니다. DEX 파일은 안드로이드 스튜디오에서 앱을 빌드할 때 자동으로 생성되기에 개발자가 직접 만들 필요는 없습니다.
     
    네이티브 C/C++ 라이브러리 :  안드로이드 OS가 애플리케이션 및 기능들을 구동하기 위해 사용하는 라이브러리.
    개발자가 Java 나 Kotlin 으로 만들어진 API를 이용하며 여기에 구현되어 있는 C코드가 작동하게 된다.
     
    자바/코틀린 API : 개발자가 애플리케이션을 제작할 때 사용하는 라이브러리
     
    다음으로는 안드로이드 버전에 대하여 설명해주셨습니다.
    버전이 변경되면 새로운 기능이 추가되거나 기존 API가 변경, 또는 제거되는 등 앱 개발에 영향을 미치므로, 개발자는 변경된 사항을 파악해서 앱에 적용해야 합니다.
    안드로이드 버전은 12.0. 13.0 처럼 운영체제 버전을 가리키지만 앱을 개발한때 사용하는 버전은 API레벨(SDK 버전) 
    운영체제 버전 별로 API레벨이 지정되 있어서 소스코드에서는 대부분 API 을 이용합니다.
     
    다음으로는 안드로이드 구성요소에 대하여 설명해주셨습니다.
     
    1. 액티비티 : 눈에 보이는 화면을 관리하는 실행 단위
     
    2. 서비스 :  화면을 가지지 않은 실행 단위. 백그라운드 작업을 담당하며, 현재는 실행되려면 사용자에게 권한을 받아야 한다.
     
    3. 콘텐츠 프로바이더 : 저장된 데이터를 제공하기 위해 실행되는 실행 단위, 예시로 카카오톡 앱에서 프로필을 변경 할 때 갤러리 앱의 사진을 이용할 수 있는데 이때 콘텐츠 프로바이더를 이용하여 데이터를 주고받는다.
     
    4. 브로드캐스트 리시버 : 시스템 이벤트가 발생할 때 실행되는 실행단위, 예시로 부팅완료, 배터리 방전 같은 상황.
     
    이후에는 프로젝트 구조에 대하여 알려주셨습니다.

    AndroidManifest.xml : 안드로이드 애플리케이션에 관련된 설정 파일
    java : 개발자가 작성하는 소스 코드
     
    res : 이미지, 사운드, 데이터 등 애플리케이션에서 필요한 리소스
     
     
    다음으로 안드로이드 애플리케이션 동작 순서에 대해서 말씀해주셨습니다.
     
    1. 사용자가 애플리케이션을 설치 후 실행한다.
     
    2. AndroidManifest.xml에 기록되어 있는 Activity 들 중 "android.intent.action.MAIN" 이름으로 설정되어 있는 intent filter가 있는 Activity를 찾는다.
     
    	<activity
                android:name=".MainActivity"
                android:exported="true">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
     
    3. 찾은 Activity에 name 에 설정되어있는 클래스 이름을 찾는다.
     
    4. 찾은 클래스의 객체를 생성하여 onCreate 메서드를 호출해준다.
     
     
     
    다음으로는 setContentView 에 대해서 설명을 해주셨습니다.
     
    setContentView(R.layout.activity_main)
     
    setContentView : Activity가 보여줄 화면을 설정하는 부분.
     
    R : res 폴더
     
    layout : res 폴더에 있는 layout 폴더를 의미
     
    activity_main > : layout 폴더에 있는 xml 파일 이름
     
    이후에는 간단하게 xml 화면에서 아이템을 넣는 방법과 xml에 있는 아이템을 클릭했을 때 텍스트 뷰의 텍스트가 변경되는 간단한 예제를 알려주셨습니다. 코드에 대한 것과 xml에서의 자세한 내용은 시간관계상 생략하고 다음 수업 때 해주시기로 하셨습니다.
     
    알려주신 간단한 코드를 바탕으로 여러 버튼을 생성하여 버튼을 누를 때마다 지정한 텍스트와 결과가 나오도록 작성하였습니다.
     
     
    MainActivity
    package com.test.android02_ex01
    
    import androidx.appcompat.app.AppCompatActivity
    import android.os.Bundle
    import android.view.View
    import android.view.View.OnClickListener
    import android.widget.Button
    import android.widget.TextView
    
    class MainActivity : AppCompatActivity() {
    
        lateinit var textView: TextView
        lateinit var button1: Button
        lateinit var button2: Button
        lateinit var button3: Button
        lateinit var button4: Button
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
    
            textView = findViewById(R.id.textView)
            button1 = findViewById(R.id.button1)
            button2 = findViewById(R.id.button2)
            button3 = findViewById(R.id.button3)
            button4 = findViewById(R.id.button4)
    
            val button1ClickListener = Button1ClickListener()
            button1.setOnClickListener(button1ClickListener)
    
            val button2ClickListener = Button2ClickListener()
            button2.setOnClickListener(button2ClickListener)
    
            val button3ClickListener = Button3ClickListener()
            button3.setOnClickListener(button3ClickListener)
    
            val button4ClickListener = Button4ClickListener()
            button4.setOnClickListener(button4ClickListener)
    
        }
    
        inner class Button1ClickListener : OnClickListener{
            override fun onClick(v: View?) {
                textView.text = "10 + 10 = ${10 + 10}"
            }
        }
    
        inner class Button2ClickListener : OnClickListener{
            override fun onClick(v: View?) {
                textView.text = "10 - 10 = ${10 - 10}"
            }
    
        }
    
        inner class Button3ClickListener : OnClickListener{
            override fun onClick(v: View?) {
                textView.text = "10 * 10 = ${10 * 10}"
            }
    
        }
    
        inner class Button4ClickListener : OnClickListener{
            override fun onClick(v: View?) {
                textView.text = "10 / 10 = ${10 / 10}"
            }
    
        }
    }
     
     
    XML 파일
    텍스트 사이즈, gravity, margin 등은 따로 알려주시지 않으셨었으나, 조금 알고 있었기에 그냥 조금 편하게 보기 위하여 추가 하였습니다.
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context=".MainActivity">
    
        <TextView
            android:id="@+id/textView"
            android:layout_width="match_parent"
            android:layout_height="70dp"
            android:layout_marginTop="20dp"
            android:gravity="center"
            android:textSize="25dp"
            android:textStyle="bold"
            android:text="TextView" />
    
        <Button
            android:id="@+id/button1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="20dp"
            android:text="Button" />
    
        <Button
            android:id="@+id/button2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="20dp"
            android:text="Button" />
    
        <Button
            android:id="@+id/button3"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="20dp"
            android:text="Button" />
    
        <Button
            android:id="@+id/button4"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="20dp"
            android:text="Button" />
    </LinearLayout>

     
    마무리
    해당 코드를 작성한 후에는 조원들과 다들 어떤 공부를 했는지 혹은 어떻게 공부를 하고 있는지 등 시시콜콜한 이야기들을 하면서 시간을 보냈습니다. 확실히 의지가 넘치는 조원분들이라 공부를 열심히 하고 계셨었습니다. 뭔가 이번 조원분들하고는 정말 잘 만났구나 라는 생각을 다시금 하게 되었었습니다.
    그리고 오늘 정말 가볍게 안드로이드 프로그래밍 수업을 하였는데 뭔가 강사님께서 설명을 잘 해주시면서 진행을 하니 과거 자바를 배울때 처럼 점점 부족했던 부분이 채워지면서 익숙해지지 않을까? 라는 생각이 듭니다.
    다음 수업은 이제 다음주 수요일 부터 시작입니다. 이번에 쉬는 기간이 긴 만큼 예습과 복습, 정보처리기사 공부, 알고리즘 문제 작성 등 여러공부를 진행 할 수 있도록 하겠습니다.
     
    오늘의 마음가짐
    아직 일어나지 않은일이 걱정된다면 걱정이 되지 않도록 대비를 하는 사람이 되자
     

Designed by Tistory.