CodeNewbie
  • [Android] 개발공부 25일차 TIL - 전역변수 (lateinit, by lazy), onBackPressed, SharedPreferences, webView
    2023년 12월 22일 11시 14분 50초에 업로드 된 글입니다.
    작성자: 짧은 코딩끈

     

     

    일자 : 2023.12.22


    금일 공부 목록

    • 베이직 챌린지 문제 풀기
    • 홍드로이드 강의 수강, 실습
    • 입문과제 수정 , 빨간라인 도전
    • 셀렉터 기능 구현 연습

     

    다음 공부 목록

    • 미정

    📝TIL 정리

    💬전역변수 (lateinit, by lazy)


    전역변수 : 어떤 함수 영역내에서도 접근할 수 있는 변수 

    • 클래스 안에 전역변수를 선언하면, 클래스 내부 모든곳에서 접근가능하고 변수 사용 가능
    • 전역변수는 선언만 가능하며, 초기화할 수 없음
    • lateinit 과 by lazy를 통해 전역변수 사용 가능
    • lateinit은 'lateinit var xxxx : 타입' 선언하고, 이후에 사용하고 싶은 곳에서 변수 초기화 진행
    • lateinit은 var, 초기값 할당(초기화)전까지는 변수 사용할 수 없음(에러발생), 기본 자료형 사용불가(String 클래스 사용가능), 변수 초기화 확인은 (::변수.isIntialized)로 가능
    • by lazy는 람다함수로 표현 'val xxx : 타입 by lazy { 초기화 하고 싶은 내용 }'
    • by lazy는 val , 형태는 선언과 초기화를 띄지만 실제로 사용될 때 초기화가 되는것, 람다함수로 초기화 되기에 범위안에 여러 구문이 들어갈 수 있지만, 마지막 구문이 실제 초기화 되는 내용

     

    lateinit : 늦은 초기화

    평소 각 범위에서 따로따로 findViewById 를 할당한 모습
    lateinit 사용, 전역변수, 각 함수내에서 초기화 해주면 됨

    lateinit은 선언만하고 사용하고자 하는 곳에서 초기화를 진행해준다

     

    by lazy : 초기화의 지연

    선언과 초기화 모두 갖춘 형태이지만, 실제 onCreate에서 변수가 사용될 때, 초기화가 되는것

    그래서 변수명만 입력후 바로 관련 함수 , 기능 사용할 수 있다.

     

     

     

    💬뒤로가기버튼(onBackPressed)


    뒤로가기 버튼 클릭시 특정 이벤트 부여하고 싶을 때

    현재 있는 액태비티 코드 창에서 

    Ctrl+O를 하면 검색창이 뜬다.

     

    거기서 onBackPressed를 찾아서 클릭하면

    아래와 같이 기본적으로 override된 함수를 보여준다. (AppCompatActivity() 상속받았기 때문)

     

    이후에 중괄호 안에 원하는 이벤트를 작성해주면 된다.

    override fun onBackPressed() {
            if(layout_drawer.isDrawerOpen(GravityCompat.START)){
                layout_drawer.closeDrawers()
            } else super.onBackPressed() // 백버튼 기능 실행
        }

     

     

    💬SharedPreferences(앱 내부 DB)


    특정 서버를 가지고 있지 않을 때

    데이터를 저장하고 싶다면 앱 내부DB를 활용하여 저장가능

     

    Q : Shared Preferences를 이용하면,  A액티비티에서 저장한 데이터를 B액티비티의 B' 프래그먼트에서도 똑같은 방식으로 접근해서 데이터를 로드가능?

     

    A : yes, 쉐어드에서 저장된 데이터는 
    앱을 삭제 한다던지 앱설정~> 데이터 저장공간을 비우기 한다던지 하실때의 경우를 제외하고는 저장이후 항상 유지되는 데이터이기 때문에 자동 로그인같은 경우에서도 언제든지 사용가능

    대신 주의하셔야할 것은 지워지면 안될 중요한 데이터인 경우에는 쉐어드로 저장을 권장하지않음

     

     

    저장(saveData 함수)

    private fun saveData() {
            val pref = getSharedPreferences("pref",0)
            val edit = pref.edit() // 수정모드
            edit.putString("name", et_hello.text.toString()) // 1번째는 키값, 2번째는 실제 담을 값
            edit.apply() // 저장 완료
        }

     

    읽기(loadData 함수)

    private fun loadData() {
            val pref = getSharedPreferences("pref",0)
            et_hello.setText(pref.getString("name","")) // 1번째 저장당시의 키값, 2번째 키값에 데이터 없을 경우 대체값 출력
        }

     

    사용(각 함수 호출)

    class SharedActivity : AppCompatActivity() {
        val et_hello : EditText by lazy { findViewById(R.id.et_hello) }
    
        override fun onCreate(savedInstanceState: Bundle?) { // 해당 액티비티가 처음 실행될 때 한번 수행하는곳 (초기화)
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_shared)
    
    
            // TODO: 저장된 데이터를 로드
            loadData() // edit text에 저장된 값을 settext 해줌
        }
    
        override fun onDestroy() { // 해당 액티비티가 종료되는 시점에 호출
            super.onDestroy()
    
            saveData() // edit text 값을 저장
        }

     

    참고한 홍드로이드 강의

    💬webView(웹페이지 실행)


    WebView :특정 웹 페이지를 앱 형태로 보여주는 것

     

    웹페이지를 보여줄 때 미리 준비해야할것들이 있다.

    manifests 파일을 열고 아래 코드를 추가해줘야한다.

    <!-- 인터넷 퍼미션 (권한) -->
        <uses-permission android:name="android.permission.INTERNET"/>
        
          <application
            ......
            <!-- HTTPS 보안 관련 적용 -->
            android:usesCleartextTraffic="true"

    그리고 나서 레이아웃 안에

    웹뷰를 꽉 차게 만들어서 적용

     

    웹페이지를 띄울때는

    액티비티 에서 몇가지 설정을 해줘야한다.

    웹페이지는 자바스크립트 언어로 만들어진것이기에

    자바 스크립트 허용 해주는 설정을 적용해야한다.

     

    그리고, 안드로이드 자체 웹페이지로 새창을 띄위지 않도록

    사용할 클라이언트를 미리 지정해서 코드 작성한다.

     

    마지막으로 웹페이지가 뜨고 다른 창으로 넘어간 뒤에

    다시 안드로이드 뒤로가기 버튼을 클릭하면 처음에는 앱이 꺼진다

     

    기본 백버튼은 현재의 액티비티를 종료하도록 되어있기 때문이다.

     

    그렇기에

    웹페이지에 다음페이지가 열려있다면, 백버튼을 누를시 웹사이트 뒤로가기가 되도록 아래와 같이 코드 추가해야한다.

     

    WebViewActivity.kt

    class WebViewActivity : AppCompatActivity() {
    
        val webView:WebView by lazy { findViewById(R.id.webView) }
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_web_view)
    
            webView.settings.javaScriptEnabled = true // 자바 스크립트 허용
    
        // 웹뷰에서 새창이 뜨지 않도록  방지 하는 구문
            webView.webViewClient = WebViewClient()
            webView.webChromeClient = WebChromeClient()
    
            webView.loadUrl("http://www.naver.com") // 링크 주소를 로드 함
    
        }
    
    
        override fun onBackPressed() {
            if(webView.canGoBack()) {
                // 웹사이트 내에서 뒤로 갈 페이지가 존재한다면..
                webView.goBack() // 웹사이트 뒤로가기
            } else super.onBackPressed() // 본래의 안드로이드 액티비티 백 버튼 수행
        }
    }

     

    금일 회고

    상태:😁

    회고: 

    벌써 금요일이다.

    이번주도 이것저것 많이 배웠고, 복습했고, 실습도 했지만

    뭔가 시간 지나면 또 까먹을거같은 불안감이 있다.

     

    배운것에 확신이 없는것인지

    아직 제대로 써먹어본게 없어서 그런것인지 모르지만 

    하루 하루 지나갈수록 이전보다 더 많은 것을 배우고 써먹을 수 있는 상태이기를..ㅠ

     

    오늘 배운 내용 정리하면서

    lateinit과 bylazy를 계속 써먹어봤다.

     

    근데 다음에 배울 뷰바인딩을 알게되면, 다시 잘 쓸일이 없어진다고 하니.. ㅎㅎ

    새로운 기술이 나오면 이런 기분이지 않을까 생각이든다.

     

    오늘도 잘 마무리하고

    연휴기간동안 적당히 쉬면서 배운거 복습하고 공부해야지..🤥🤥

    ₒ₍₊˒₃˓₎ₒ▁▂▃▅▆▓▒░✩⃛

    댓글