본문 바로가기

TIL

[TIL] 20230804 - 4일차

[오늘 배운 내용]

-1- 이미지뷰에 이미지 지정하기

  • 이미지 등 이미지 소스 관리는 res/drawable 에서 가능하다 때문에, drawable에 이미지 파일을 추가해 주어야 하는데, 이미지 파일을 추가할 때에는 jpg 파일 같은 경우는 배경이 껴있어서 불편하므로 png 파일이 권장된다고 한다.
  • 갖고 있는 jpg이미지 등도 구글링 통해서 쉽게 누끼딸 수 있는 사이트 많으니까 해당 사이트 이용해서 png 파일로 변환해서 사용할 수 있도록 하자.
  • 폴더에 직접 이미지파일을 넣어줘도 되나,  이미지 복사 후 Android studio프로그램안에 res/drawable를 누르고 붙여놓기 단축키 실행하면 쉽게 이미지 파일을 추가할 수 있다.

이렇게 파란색 줄로 된 상태에서 ctrl + v

  • xml 파일로 이동한 뒤 drawable에 넣어둔 파일명으로 해당 이미지가 출력되길 원하는 이미지뷰 src에 지정해줬다
<ImageView
	...
	tools:src="@drawable/log_in_page_logo"
    />
  • xml 에서 src를 지정해두면 Design탭에서 해당 이미지가 적용된 것을 확인할 수 있다. 확인 후 코드를 실행 시켜보았는데, 에뮬레이터에서는 해당 이미지가 정상적으로 출력이 되질 않는다.
    이미지가 출력되지 않는 이유는 xml에 해당하는 액티비티에는 이미지 리소스를 지정해주지 않아서 그렇다. 액티비티로 이동해서 findViewById로 이미지뷰를 연결한 뒤, 적용되길 원하는 이미지 리소스로 추가해주니 정상적으로 이미지가 확인되는 것을 볼 수 있었다.
// UI와 연결하기
        val logInPageLogo = findViewById<ImageView>(R.id.login_page_imageview)
        // 로그인 페이지 로고 이미지 설정
        logInPageLogo.setImageResource(R.drawable.log_in_page_logo)

이미지 뷰에 정상적으로 사진이 등록된 결과화면

-2- 액티비티의 생명주기 기초

  • 액티비티란?
    • 안드로이드에서 화면을 관리하고 사용자가 발생시키는 다양한 이벤트를 처리하는 컴포넌트를 말한다고 한다.
    • 사용자가 앱을 탐색하고, 앱에서 나가고, 앱으로 다시 돌아가는 등 앱의 Activity 인스턴스는 수명 주기 안에서 서로 다른 상태를 통해 전환된다고 한다.
  •  액티비티 생명주기를 알아야 하는 이유?
    • Activity 클래스는 활동의 상태변화를 알아차릴 수 있는 여러 콜백을 제공한다
    • 콜백이 실행되는 동안 내부에서 어떤 일이 일어나고, 그 과정에서 무엇을 구현해야 하는 지 알아낼 수 있다.
      (ex-앱 내에서 다운로드가 진행되는 도중에 앱을 나가게 되면 일시정지가 되는 기능 등)
    •  
  •  Activity 생명 주기 개념
    • 생명 주기 단계간의 전환을 위해 onCreate(), onStart(), onResume(), omPause(), onStop(), onDestroy() 6가지 핵심 집합의 콜백을 제공한다. 이는 활동이 새로운 상태에 들어가면 시스템이 각 콜백을 호출한다.

developer.android.com 에서 제공하는 생명주기 패러다임 표

  • 간략하게 표현한 그림이지만 부분적으로 이해할 수 없기도 한데, 사용자가 활동을 벗어나기 시작하면 시스템은 활동을 해체하는 메서드를 호출한다고 한다. 어떤 경우에는 부분적으로만 해체하기도 한다. 이때 기존 활동들은 여전히 메모리 안에 남아 있으며 포그라운드로 다시 돌아올 수 있다.
    •  포그라운드(Foreground process)란 화면에서 유저와 다소 직접적으로 상호작용을 하게 되는 프로세스라고 한다.
      포그라운드가 유저와 화면을 통해 상호작용을 하게 되는 프로세스라면 백그라운드 프로세스도 있다.
    •  백그라운드 프로세스는 직역하면 배경프로세스지만 포그라운드도 배경이라고 생각할 수 있어서 백그라운드는 뒷배경이라고 생각하면 편할 것 같다. 
    • 해당 프로세스 설명들은 생명주기를 보다가 나온 단어라 궁금해서 찾아봤는데 간략한 내용 이외에는 크게 상관 없는 부분 같아 간략하게만 알아보고 추후에 다시 정리할 수 있도록 해야겠다.
  • Activity 의 간단한 생명주기 패러다임 표 보는데 간단한 내용 같지만 내용을 한번 읽고 지나가면 잊혀지므로 이해를 할 수 있게 지속적으로 생각해야 할 부분인 것 같다.
  • 추가로 생명추기 콜백 내용은 다음 시간에 알아보도록 해야겠다.

 

 

 


 

[오늘 복습한 내용]

1. 깃허브 repository 생성

  • 개인과제 제출하는김에 깃허브 repository 생성해보면서 복습하는 시간을 갖았다.
    • git init
    • git add.
    • git commit -m "commit comment"
    • git remote add repository 주소
    • git push

해당 repository 창에 들어가면 url 주소를 복사할 수 있다.

  • Android Studio 상단 메뉴에 Git -> manage remotes... 클릭 후 추가하는 방법도 있다.
  • 깃 푸쉬까지 마쳐야 깃허브 래파지터리에서 정상적으로 확인할 수 있다.

 

 

2. 대, 소문자 변환 및 특수문자 출력

  • 소문자는 대문자로, 대문자는 소문자로 출력하는 알고리즘 문제 해답이다.
fun main(args: Array<String>) {
    val s1 = readLine()!!
    val upper = s1.toMutableList()
    for (i in upper.indices){
        if (upper[i].isUpperCase()){
            upper[i]=upper[i].lowercaseChar()
        }
        else{upper[i] = upper[i].uppercaseChar()}
    }
    println(upper.joinToString(""))
}

 

  • 특수문자 출력 
    • 키보드에 Enter 키와 백스페이스 키 사이에 원화로 보여지는 문자가 코드상에서는 역슬래쉬로 나옴.
fun main(){
 	// \뒤에 원하는 특수문자
	print("\"\\") 
    // 출력  :  "\   
}

 


[오류,에러 등등]

1. 토스트 중복처리 기능 오브젝트로 처리하기

  • 어제 토스트의 중복방지 기능에 대해서 배웠었는데 액티비티가 많아지고 수 많은 액티비티에 일일이 토스트 중복방지 함수를 넣어서 사용하기에 어렵다고 판단되어 클래스를 생성해서 처리하면 좋겠다고 생각했다.
  • 클래스를 생성해서 상속받을 수 있도록 처리하려고 했는데, 클래스를 생성하다가 해당 오류가 발생했다.

 

  • 오류 및 해결방법
    • context가 인자로 설정되어 있는데, 클래스내에 context가 존재하지 않아서 해당 오류가 발생한 것 같다라고 생각해서 인자로 받아올 수 있도록 인터페이스 생성,context를 인자로 받아올 수 있도록 추가하기 등 여러 방법을 시도 해보았는데, context 부분에 관련해서는 아직 제대로 공부해보지 못해서 튜터님에게 도움을 요청했다.
    • context를 인자로 maketoast에 추가하고 모든 액티비티에서 접근 가능하도록 클래스가 아닌 오브젝트로 구현하는 것으로 하면 좋을 것 같다는 의견을 듣고 코드도 수정되었다.
    • context를 변수로 지정해서, 해당 변수를 인자에 넣어보려고만 시도했는데 방식을 조금 바꾸니 쉽게 해결이 되어서 새로운 접근방법을 배웠다.
object ToastUtil{
    var toast: Toast? = null
    fun makeToast(context: Context,message: String) {
        toast?.cancel()
        toast = Toast.makeText(context, message, Toast.LENGTH_SHORT)
        toast?.show()
    }
}

 

  • 완성코드

 

 


[느낀 점]

1. 알고리즘 문제를 풀다보니까 기본적인 문법의 중요성을 다시 한번 느끼게 되었다. 여러 함수들을 조합해서 복잡한 기능을 구현할 수 있으므로 문법들을 꾸준히 누적복습할 수 있도록 해야겠다.

2. 위에 작성한 내용과 비슷한데, 문법에 대해서 공부할 때, 현재는 작동원리에 대해서 간략하게만 이해하고 넘어가는데 kotlin docs 등을 이용해 자세한 내용을 학습해서 정확하게 어떤 상황에 어떤식으로도 활용될 수 있는지를 이해하도록 해야겠다. 

3. 항상 집중하는 시간이나 학습하고 난 뒤 이해하게 되는 내용 또는 기억나는 내용이 적다는 느낌이 든다 타임테이블을 작성하는 시간을 늘리더라도 한번 더 고민하면서 하루를 계획할 수 있도록 해야겠다.

'TIL' 카테고리의 다른 글

[TIL] 20230809  (0) 2023.08.09
[TIL] 20230808 5일차  (0) 2023.08.08
[TIL]20230803 - 3일차  (0) 2023.08.03
[TIL] 20230802 - 2일차  (0) 2023.08.02
[TIL] 20230801 - 블로그 시작 등...  (0) 2023.08.01