최종 팀프로젝트 TIL(14)

jxxn_a·2023년 10월 27일
0

팀프로젝트

목록 보기
19/33
post-custom-banner

🐱 With All My Animal 🐶

💡 [ 14일차 10/27일 ] 💡

📌 오늘의 기술면접 질문 Q&A

1) 객체란 무엇일까요?

  • 객체(Object)는 객체지향 프로그래밍(OOP)의 핵심 개념 중 하나이다.

  • 객체는 상태와 행동을 통해 실제 세계의 개체를 코드 내에서 표현하게 되는데 이런 방식은 실제 세계의 복잡성을 관리 가능한 수준으로 단순시키는데 도움을 준다.

  • 각 객체는 독립된 엔티티로, 특정 상태와 행동을 캡슐화하여 그 상태와 행동이 외부에 노출되지 않도록 보호하는 특징도 가지고 있다.

  • 객체는 상태(State)와 행동(Behavior)를 가진다.
    🌺 상태(State): 객체의 상태는 그 객체가 가지고 있는 속성 값으로 구성된다.
    예시)
    '자동차'라는 객체가 있다면 그 상태는 자동차의 색상/모델/브랜드 등으로 나타낼 수 있다.

    🌺 행동(Behavior): 객체의 행동은 그 객체가 수행할 수 있는 작업을 나타낸다.
    예시)
    '자동차' 객체의 경우, 달리기/멈추기/방향 전환하기 등이 그 행동이 될 수 있다.


2) 안드로이드 activity와 fragment의 차이점을 설명하세요

✨ Activity

  • 안드로이드 앱에서 사용자가 상호작용하는 화면 하나를 나타낸다.
  • 사용자가 앱과 상호작용하는 모든 것은 Activity 내에서 발생한다.
  • Activity는 독립적으로 존재하며, 자체 수명주기를 가진다.

✨ Fragment

  • Activity 내에서 사용자 인터페이스의 일부분을 나타낸다.
  • Fragment는 Activity 내에 배치되며, 자체 수명주기를 가지고 있지만 그 수명주기는 호스팅하는 Activity의 수명주기에 의존한다.

🫧 Activity와 Fragment의 차이점

  • Activity는 독립적인 화면을 나타내는 반면, Fragment는 Activity 내의 화면 일부를 나타내며 재사용 가능한 모듈처럼 작동한다.
  • Activity는 Fragment에 의존하지 않지만, Fragment는 Activity에 의존을 하며 독립적으로 존재할 수 없다.
  • Activity는 사용자의 인터페이스를 제공하는 프로그램 구성요소이지만 Fragment는 해당 Activity의 고유한 UI를 제공하는 Activity의 일부입니다.

📌 NullPointerException 수정

  • Mypage에서 유저의 프로필을 불러오는 과정에서 NullPointerException이 발생했다.

  • 프로필을 변경하면 재시작을 해야 프로필이 적용되는 오류도 있었다.

  • 이것 저것 시도해보았지만 해결 방안이 보이지 않아서 튜터님께 여쭤보았는데 튜터님이 주신 해결 방안은 다음과 같다.

1) 튜터님이 주신 예시 코드를 적용해보기(예제 코드에 좀 더 덧붙여서 수정해야함)

override fun onDataChange(dataSnapshot: DataSnapshot) {
if (isAdded && !isDetached && !isRemoving) {
// Fragment가 활성 상태임
// 원하는 작업 수행
 }
}

2) 정보 불러오는 방법을 바꿔보기

  • 싱글인스턴스에 저장 하는 방법
  • Activity ViewModel에 유저 정보 저장하는 것이 좋다(MVVM)
  • Room

3) 파이어베이스 캐싱하는 방법도 찾아보기

  • 시간 설정해서 그 시간 동안 지켜주는 방법

-> 나는 이 방법 중에서 1번을 선택해서 변경해보았다.

private fun loadUserData() {
        val userId = Firebase.auth.currentUser?.uid
        if (userId != null) {
            userProfileRef =
                FirebaseDatabase.getInstance().getReference("users").child(userId).child("profile")

            valueEventListener = userProfileRef.addValueEventListener(object : ValueEventListener {
            // 추가된 부분
                override fun onDataChange(snapshot: DataSnapshot) {
                    if (isAdded && !isDetached && !isRemoving) {
                        val userIdname = snapshot.child("userIdname").getValue(String::class.java)
                        val petName = snapshot.child("petName").getValue(String::class.java)
                        val birth = snapshot.child("birth").getValue(String::class.java)
                        // val statsMessage = snapshot.child("statusMessage").getValue(String::class.java)

                        binding.tvMypage.text = petName
                        binding.tvMypageNickname.text = userIdname
                        binding.tvMypageBirth.text = birth
                        // binding.tvMypageMessage.text = statsMessage
                    }
                }

                override fun onCancelled(error: DatabaseError) {
                    Log.e("MypageFragment", "Error loading user data: ${error.message}")
                }
            })
        }
    }
post-custom-banner

0개의 댓글