전체 글

전체 글

    [우아한테크코스] 📚 레벨로그 - 레벨1 인터뷰

    📚 레벨로그 원시값, 컬렉션을 왜 포장해야 하는가? 원시값, 컬렉션을 하나의 클래스로 감싼 형태를 래퍼 클래스, 일급 컬렉션이라고 한다. 원시값과 컬렉션을 포장하면 상태에 대한 처리를 외부가 아닌 내부에서 할 수 있다. 즉, 상태를 외부에 노출시키지 않고, 객체에게 메시지를 던지는 구조로 만들면서 객체지향적이고 응집도 높은 설계가 가능하다. Wrapping한 상태에 대한 로직을 여러 곳에서 중복적으로 작성할 필요가 없다. 하나의 클래스 내에서 행위를 관리하므로, 상태에 대한 로직이 변경되었을 때 단 하나의 클래스만 수정하면 된다. (높은 유지보수성을 보장한다.) TDD(Test Driven Development)란? TDD는 테스트 주도 개발로, 매우 짧은 개발 사이클을 반복하는 소프트웨어 개발 방법론이..

    [학습로그] 최신 Android에서는 왜 MVC 패턴을 사용하지 않는가?

    지금까지 우아한테크코스 미션들은 모두 Console 환경이었습니다. 대부분 매 미션별로 MVC 패턴을 반복적으로 적용하면서, 어느 정도 익숙해짐에 따라 비교적 코드를 수월하게 작성할 수 있었을 것입니다. 하지만 이번 주차에 들어서면서 새로운 요구사항이 추가되었습니다. 기존 Domain은 그대로 유지한 채로, Console 환경을 Android로 옮기는 순간 문제가 발생하였습니다. "앱 UI를 적용할 때 도메인 객체의 변경을 최소화해야 한다." 처음에는 몰랐지만 아래와 같은 상황에서 문제가 발생했습니다. Console에서 Custom Listener를 사용한 경우 Console은 I/O 기반으로 이루어져 있습니다. 별도로 Event listener interface를 만든다면, 마치 이벤트 기반 프로그래..

    [Design Pattern] 상태 패턴(State Pattern)

    State 패턴 하나의 객체가 다양한 상태를 가질 때가 있습니다. 또한, 상태가 변화함에 따라 행위가 달라질 수 있습니다. 만약 어떤 상태에 대한 `행위를 클래스별로 구현`해주어야 한다면 상당한 `보일러플레이트 코드`가 발생할 것입니다. 이는 곧 프로젝트의 유지보수성을 떨어뜨리는 것과 동일합니다. 이러한 상황을 쉽게 관리하기 위해 State 패턴을 사용할 수 있습니다. State 패턴은 `상태에 따른 비즈니스 로직`, `상태 전이`를 상태 클래스 내에서 관리합니다. 이러한 상태를 가지고 있는 객체를 `Context`라고 부릅니다. State 패턴을 적용하면 Context는 각 상태에 따라 어떤 기능을 수행할지 고려하지 않아도 됩니다. State 패턴을 적용하지 않은 사례 // 자동차는 아래와 같은 상태를..

    [우아한테크코스] 함수형 프로그래밍(Functional Programming)이란?

    프로그래밍 패러다임은 프로그래머에게 프로그램을 어떻게 바라볼지에 대한 관점을 제공합니다. 명령형 프로그래밍 프로그래밍의 상태와 상태를 변경시키는 구문의 관점으로 접근하는 프로그래밍 방식. 명령형 프로그래밍은 컴퓨터가 실행할 명령들을 실행 순서대로 구현해야 한다. 대부분의 객체 지향 프로그래밍 언어가 명령형 프로그래밍 언어이다. 알고리즘 처리 작업에 적합한 언어이다. 절차지향 프로그래밍, 객체지향 프로그래밍이 이에 속한다. 예시) point를 얻기 위해 실행할 명령들을 순서대로 구현 fun getPoint(customer: Customer): Int { for (i in 0..customers.size) { val c = customers[i] if (customer == c) { return c.poin..

    [IntelliJ] Live Templates을 활용한 쉬운 코드 작성

    동일한 코드를 매번 작성해줘야 할 때 귀찮음을 느끼는 경우가 있습니다. 예를 들어 아래와 같은 상황들이 있습니다. 1. Android의 findViewById() 메서드를 매번 직접 타이핑 2. Test 코드를 작성하기 위해 어노테이션과 메서드명 및 given, when, then 주석을 일일이 작성 이러한 반복은 프로그래밍에 피로감을 느끼게 할 수 있습니다. 위와 같은 상황을 피하기 위해 IntelliJ에서는 Live Templates이라는 유용한 기능을 제공합니다. 경로 : Preferences -> Editor -> Live Templates 위 경로로 이동하였다면, 그림과 같이 다양한 환경에서의 코드 템플릿을 작성할 수 있습니다. 사용법을 익히기 위해, 이미 정의되어 있는 템플릿을 먼저 사용해 보..

    [우아한테크코스] 우아한테크코스 한 달 생활기

    정신없이 살다 보니 우테코를 시작한 지 어느덧 한 달이라는 시간이 지났다. 왕복 3시간 거리를 통학하는 것은 생각보다 쉽지 않았다. 정신을 차려보면 선릉역에 도착한 모습에 헛웃음이 나오기도 한다. 이렇게 어느 크루의 하루가 시작된다. 우테코 전에는 10시가 넘어서 일어나는 경우가 많았다. 눈을 떠도 1시간은 침대에 누워서 휴대폰을 하기 일쑤였다. 그러나, 한 달 사이에 늦잠은 하나의 과거가 되었다. 이제는 적어도 "출석"이라는 목적이 있기 때문이다. 이 또한 내면의 과업을 이룬 것으로 생각하며 소소한 뿌듯함을 느낀다. 사실 첫 주가 시작되기 전에 걱정이 이만저만이 아니었다. 내성적인 성격 탓에 사람들과 잘 어울릴 수 있을지 걱정이 많았기 때문이다. 하지만 쓸데없는 걱정이었다. 대부분의 크루들이 서로 배려..

    [우아한테크코스] 원시값 포장과 일급컬렉션은 무엇이고, 어디까지 감싸야 할까?

    원시값 포장과 일급컬렉션의 사용은 소트웍스 앤솔로지의 객체지향 생활체조로부터 시작되었습니다. 1. 모든 원시값과 문자열을 포장한다. 2. 일급 컬렉션을 쓴다. 해당 포스팅에서는 원시값 포장과 일급 컬렉션이 무엇인지, 그리고 무조건 원시값과 컬렉션을 무조건 감싸주는 것이 옳은가에 대해 알아보겠습니다. 원시값 포장 원시값 포장은 Primitive 타입을 그대로 사용하지 않고, 객체로 사용하기 위해 하나의 클래스를 선언해주는 것을 의미합니다. Lotto 미션에서 로또 번호를 단순히 Int로 사용할 수도 있지만, 우리는 원시값을 포장하라는 요구사항을 받았기에 대부분 아래와 같이 코드를 작성했을 것입니다. class LottoNumber(val value: Int) { init { validateLottoNumb..

    [우아한테크코스] 2주차 - 점진적 리팩터링(Incremental Refactoring)

    이번 강의에서는 점진적 리팩터링에 대해 공부하였습니다. 점진적 리팩터링(Incremental Refactoring)은 한 번에 많은 코드를 바꾸는 것이 아니라, 여러 작은 단계로 나누어 변경하는 방법입니다. 기존 코드를 변경하는 일은, 해당 코드를 사용하는 곳에서 예기치 못한 오류를 발생시키거나 컴파일 에러가 발생할 수도 있습니다. 다른 블로그의 포스팅을 인용하자면 "굴러가는 자동차의 바퀴를 바꾸는 행위와 같다." 라고 말하고 있습니다. 다시 말해, 잘 돌아가는 코드를 개선하기 위한 목적이었지만, 그만큼 리스크를 가진다는 의미입니다. class Lotto(private val numbers: List) { fun match(lotto: List): Int { numbers.count { lotto.con..

    [Android] ConstraintLayout을 사용해야 하는 이유

    최근 github의 안드로이드 프로젝트의 xml을 확인해 보면, 거의 대부분의 프로젝트가 레이아웃을 ConstraintLayout을 채택하고 있습니다. 뿐만 아니라, 안드로이드 스튜디오에서 새로운 프로젝트를 생성하면 기본 레이아웃으로 ConstraintLayout을 제공하고 있습니다. 기존에 사용되던 LinearLayout, RelativeLayout 등 여러 Layout이 있음에도 불구하고 ConstraintLayout을 사용하는 이유는 무엇일까요? ConstraintLayout ConstraintLayout은 안드로이드에서 제공하는 레이아웃(Layout) 중 하나로, 뷰(View)를 배치할 때 제약 조건(Constraint)을 사용하여 제어하는 방식을 사용합니다. 기존의 LinearLayout, Re..

    [Kotlin] Value Class (inline class deprecated)

    Kotlin 1.6 버전부터 value class가 도입되었습니다. 이전 버전에서는 data class를 통해 유사한 효과를 얻을 수 있었지만, 데이터 클래스는 추가적인 객체 생성과 메모리 할당이 필요한 문제가 있었습니다. value class가 추가되면서, 객체 생성 및 메모리 할당을 최소화하고 성능을 개선할 수 있게 되었습니다. Kotlin 1.5에서는 inline class라는 키워드를 사용하였지만 1.6 버전으로 업그레이드되면서 value class가 등장하고 inline class는 Deprecated 되었습니다. 그 이유는 Kotlin 팀에서는 inline class를 대신하기 위해 value class를 도입하였기 때문입니다. 해당 포스팅에서는 value class가 무엇인지와 장점에 대해 ..