목록전체 글 (35)
성장기록지
State hoisting?Hoisting은 번역하자면 "끌어올림"이라는 뜻이다.그럼 상태를 끌어올린다는 뜻인데, 상태는 무엇인지, 어떻게 끌어올린다는건지 감이 안 올 수 있을것이다. 그럼 우선 상태에 대해 알아보고 가자. State란?상태를 이해하기 위해선 다음 예시코드를 읽어보자.앱을 실행시킨 후, 이 코드의 텍스트필드에 타이핑을 한다면 어떻게 될까?정답은 아무 일도 일어나지 않는다. 텍스트필드에는 아무런 텍스트가 표시되지 않는다.@Composableprivate fun HelloContent() { Column(modifier = Modifier.padding(16.dp)) { Text( text = "Hello!", modifier = Mo..
Clean ArchitectureRobert C. Martin (Uncle Bob)가 만든흔히 과녁모양으로 불리는 그림을 토대로 구성한 아키텍쳐를 의미한다.복잡한 소프트웨어 시스템을 보다 관리 가능하고 유지보수 가능한 형태로 구축하기 위한 지침을 제공한다.Clean Architecture의 모든것이 아래에 담겨있다고 볼 수 있다. Clean Architecture의 이점The Clean Code Blog에 의하면, Clean Architecture가 시스템에 주는 이점은 아래와 같다고 한다.영어로 읽기 쉽지 않으므로 하나씩 해석해보도록 하겠다.Independent of Frameworks. The architecture does not depend on the existence of some librar..
이전에 Data Class를 학습하며 ComponentN() 함수를 다뤘다.간단하게 알아봤던 구조분해를 조금 더 자세히 알아보고자 한다.디스트럭쳐링(Destructuring)객체가 가지고 있는 여러 값을 분해해서 여러 변수에 한꺼번에 초기화할 수 있다.data class Person(val name: String, val age: Int)fun main() { val person = Person("Hoon", 28) // 구조 분해 val (name, age) = person println("Name: $name, Age: $age")}위의 Data Class의 예시처럼 여러 변수를 괄호를 묶게 되면 내부에서는 각 변수를 초기화하기 위해 componentN이라는 함수를 호출하게 된다..
서론부스트캠프를 통하여 Compose 프로젝트를 진행하였지만, 제대로 된 xml 프로젝트가 없고, 실제 코딩 경험도 부족하다 여겨져새로운 프로젝트를 하나 해보기로 결정하였다.쇼핑앱 프로젝트를 진행하려고 마음먹었고, 개인 프로젝트지만 디테일하게 만들어야 한다 생각하여디자인도 볼만하게 만들고, 목업 데이터도 괜찮은 것을 사용하자고 생각하였다. 디자인 선정우선 작성자는 디자인을 엄청 못한다.따라서 디자인 키트를 구매하기로 생각하였다.우선 스마트스토어 할 때 많이 쓰던 크몽을 둘러보았다,하지만 커스텀 UI 이다보니 기본 가격부터 만만치 않았다.아래 첨부 사진처럼 2페이지에 10만원은 가볍게 넘는 경우가 많았다...취준생에게는 상당히 부담이 되는 가격이였기에 다른 방법을 찾아보기로 결정하였다. 그러던 중 커피챗을..
Sealed class의 기능적 특징sealed 클래스는 자기 자신이 추상 클래스이고, 자신을 상속받는 여러 서브 클래스들을 가질 수 있다.enum 클래스와 달리 상속을 지원하기 때문에, 상속을 활용한 풍부한 동작을 구현할 수 있다.제일 중요한 것은, 자신을 상속받는 서브 클래스의 종류를 제한할 수 있다.어떻게 자신을 상속받는 서브클래스를 제한할 수 있을까? 우선, sealed 클래스의 서브 클래스들은 반드시 같은 패키지 내에 선언되어야 한다.(sealed 클래스의 서브 클래스를 상속한 클래스들은 같은 패키지 내에 없어도 된다.)또한 sealed 클래스는 기본적으로 abstract 클래스이고,sealed 클래스는 private 생성자만 갖게 되기 때문이다.Sealed class의 등장 배경그렇다면 왜 s..
문제 풀이트리를 순회하며 각 노드의 번호를 구하는 문제이다.트리는 중위순회를 진행하라고 설명에서 작성되어 있다.(중위순회란? LEFT - ROOT - RIGHT 순서대로 순회하는것.) 재귀를 통하여 문제를 풀고자 하였다.한 노드의 왼쪽 자식노드 인덱스는 2^n+1 이고 오른쪽은 2^n+2 이기 때문이다.따라서 아래와 같이 재귀함수를 구성하였다.def back(n): if n>=max_count: return back(2*n + 1) ans[n] = lst.popleft() back(2*n + 2) 루트 노드들은 먼저 입력받은 숫자에서 가장 왼쪽 값을 빼서 넣어주며 정답 리스트인 ans를 완성하였다. 이후에 for문을 통해 각 레벨마다 값을 출력해주며 마무리하였다. ..
프로젝트 진행할 때 적용하였던 클린아키텍쳐를 설명하기 위해선먼저 안드로이드 권장 아키텍쳐를 설명하는것이 좋다고 생각하여서정리하는 글을 작성해보고자 한다. 일반적인 아키텍처 원칙앱 아키텍처는 앱의 부분과 그 각 부분에 필요한 기능 간의 경계를 정의하는 것이다. 따라서 몇가지 특정 원칙을 준수하여야 한다.1. 관심사 분리Activity,Fragment와 같은 UI 기반 클래스에는 UI 및 운영 체제 상호 작용을 처리하는 로직만 포함하여야 하는 것처럼각자의 관심사에 맞게 책임을 가진 코드를 분리하여야 함을 의미한다.Activity와 Fragment는 OS와 애플리케이션을 이어주는 클래스이므로, 메모리부족과 같은 경우에 프로세스 킬이 일어날 수 있다. 따라서 관심사 분리 없이 해당 컴포넌트에 모든 코드를 넣게..
네트워크 프로토콜이란?네트워크 통신을 하기 위해서 통신에 참여하는 주체들이 따라야하는 형식, 절차, 규약이다.프로토콜은 기능에 따라 여러 계층으로 분리가 돼서 동작을 한다. 네트워크 계층구조 대표적으로 OSI model (7 layer) , TCP/IP stack(4 layer) 가 있다.OSI model은 범용적인 네트워크 구조이고, TCP/IP stack은 인터넷에 특화된 네트워크 구조이다. OSI 7 LAYER아래 그림과 같이 7계층이 있다.아래에서부터 L1~L7이다.각 레이어에 맞게 프로토콜이 세분화되어 구현되어있다.각 레이어의 프로토콜은 하위 레이어의 프로토콜이 제공하는 기능을 사용하여 동작한다.Application Layer애플리케이션 목적에 맞는 통신 방법을 제공해준다.대표적 프로토콜로는 H..
공식문서의 말대로 Jetpack Navigation을 사용한다면 큰 의미가 없겠지만,프래그먼트를 사용하는 모든 앱은 어느 정도 FragmentManager를 사용하므로Fragment Manager가 무엇이고 어떻게 작동하는지 파악하는 것이 중요하다 생각하여 학습을 진행한다.FragmentManager앱 프래그먼트에서 프래그먼트를 추가, 삭제 또는 교체하고 백 스택에 추가하는 등의 작업을 실행하는 클래스이다.Activity, Fragment에서 접근가능하다. FragmentActivity 에서 구현하므로, 해당 및 서브클래스에서는getSupportFragmentManager() 메서드를 통해 FragmentManager에 액세스할 수 있다. 아래와 같은 Fragment Manager가 있다고 하자.Hos..
진행한 프로젝트의 콜백지옥을 해결하기 위해 여러 학습을 진행 중suspend 함수의 내부 구조에 대해 학습하게 되었다.많은 학습량이 있지만 우선 CPS에 대한 이론을 다뤄보겠다.Kotlin 컴파일러가 suspend 키워드를 만났을 때코루틴은 Continuation Passing Style(CPS) 형태로 동작한다.CPS는 호출되는 함수에 Continuation을 전달하고, 각 함수의 작업이 완료되는 대로 전달받은 Continuation을 호출하는 방식을 말한다.그렇다면 Continuation 이란 뭘까? Continuation 인터페이스를 한번 알아보도록 하겠다.Continuation 인터페이스에는 크게 context객체와 resumeWith() 함수가 있다.context는 각 Continuation이 ..