전체 글

전체 글

    [Kotlin] val a: Int = 1000과 val b: Int = 1000은 다르다

    (우아한테크코스 미션 피드백을 듣다가 한 가지 새로운 사실을 알게 되어 정리합니다.) Kotlin은 정수를 나타내는 타입으로 Int와 Integer가 있습니다. 이 둘의 차이는 Int는 primitive type이지만 Integer는 reference type이라는 점입니다. 이 둘의 존재로 인해, 동등성과 동일성을 비교해야 하는 상황에서 어떠한 차이가 발생하는지 알아보겠습니다. isEqualTo() 메서드는 동등성을 비교합니다. (객체의 내용이 같음) isSameAs() 메서드는 동일성을 비교합니다. (메모리 주소가 같음) @Test fun test1() { val actual: Int = 1 val expected: Int = 1 assertThat(actual).isEqualTo(expected) ..

    [우아한테크코스] 2주차 - 로또(자동) 미션 회고 및 피드백

    우아한테크코스 로또(자동) 미션에서는 TDD를 도입하여 페어프로그래밍을 하였습니다. 기존과 다르게 TDD 사이클을 기반으로, 3단계(실패하는 테스트 코드 작성 -> 가능한 빠르게 성공하는 테스트 코드 작성 -> 리팩터링)를 거치다 보니 시간이 촉박하였습니다. 하지만 1주차때와 달리, 테스트 코드를 우선적으로 작성하다 보니 가능한 많은 경우에 대해 생각해 볼 수 있었고, 도메인 모델에 기능을 추가할 때 더 높은 신뢰를 가질 수 있었습니다. 기능이 수정되어도 기존에 작성해놓은 테스트 코드를 통해 쉽게 검증할 수 있었기에, 테스트 코드를 믿고 과감하게 리팩터링 할 수 있었습니다. 또한, 코치님의 말씀대로 TDD를 적용하니, Green에서 Refactor 단계로 넘어가는 과정에서 어떠한 로직이 추가되어야 할 근..

    [Programming] 원시값과 컬렉션을 포장해야 하는 이유 - 래퍼 클래스, 일급 컬렉션(Wrapper class, First-class Collection)

    해당 포스팅은 Kotlin 언어를 기반으로 작성하였습니다. 모든 원시값과 문자열을 포장하자 우선, 모든 원시값과 문자열을 포장하자는 이야기에 대해 살펴보겠습니다. Lotto와 관련된 프로그램을 작성한다면, 원시값을 아래와 같은 코드로 검증해 줄 수 있습니다. val lottoNumber: Int = 45 class Lotto(lottoNumbers: List) : List by lottoNumbers { init { lottoNumbers.forEach { validateLottoNumber(it) } validateLottoSize(lottoNumbers) } fun validateLottoNumber(lottoNumber: Int) { require(lottoNumber in MIN_LOTTO_NUM..

    [우아한테크코스] 2주차 - TDD(Test Driven Development)

    테스트 주도 개발(Test-driven Development TDD)은 매우 짧은 개발 사이클을 반복하는 소프트웨어 개발 방법론(또는 프로세스) 중 하나입니다. TDD는 단순한 설계를 장려하고 자신감을 불어넣어 주는 역할을 합니다. TDD = TFD(Test First Developent) + 리팩토링 1. 빨강 - 실패하는 작은 테스트를 작성합니다. 처음에는 컴파일조차 되지 않을 수 있지만 일단 작성합니다. 2. 초록 - 가능한 빨리 테스트가 통과하게끔 만듭니다. 테스트가 통과하기 위해서 어떠한 죄악을 저질러도 좋습니다. 3. 리팩터링 - 초록 단계에서 일단 통과하게만 작성한 코드를 완전한 형태로 리팩터링합니다. (매직 넘버, 리터럴 제거 / 중복 제거 등 / 도메인 모델 검증 함수 추가) 죄악이란 기..

    [우아한테크코스 5기] 1주차 회고 - (양념 반 후라이드 반) 설렘 반 걱정 반

    2월 7일을 시작으로 우아한테크코스 5기가 시작했습니다. 필자는 영광스럽게도 'AOS 부나'라는 이름으로 우테코에 참여할 수 있게 되었습니다! 사실 우테코가 시작되기 전에 기대와 설렘도 있었지만, 내향적인 성격 탓에 걱정 또한 많이 했습니다. 하지만 처음으로 팀원들과 매칭되고 이야기를 나눠보니 괜한 걱정이었다는 것을 알 수 있었습니다. 다들 친절과 열정까지 겸비하신 분들이었습니다. 처음 캠퍼스에 들어오자마자, 말로만 듣던 열려있는 IT기업 사무실 냄새가 폴폴 진동했습니다. 앞으로의 10개월이 기대되는 순간이었습니다! 한 주를 보내면서 느꼈던 점은 일단 경기에서 선릉역까지 출퇴근 시간대에 오가는 것이 체력 소모가 크다는 점이었습니다. 또한, 강남 근처라 그런지 점심 시간대에는 모든 식당에 직장인들의 웨이팅..

    [Kotlin] const val vs val - 둘의 차이점은 무엇일까?

    최근 우아한테크코스에서 코틀린에 대해 공부하면서 상수를 관리할 때 companion object(동반 객체) 내에 필요한 상수를 선언하는 일이 자주 있었습니다. 단순히 상수이기 때문에 val 키워드를 사용하면 된다고 생각했지만, IDE에서는 이 방식을 추천하지 않았습니다. val만 사용하여 상수를 선언하면, Might be 'const'라는 문구가 나타나면서 노란 줄로 경고가 나타납니다. 여기서 IDE가 추천해주는 방식을 따르면 const 키워드가 추가로 붙게 됩니다. 이 둘에 어떤 차이가 있는지 알아본 바로는, const val는 컴파일 시점에 값을 할당하는 반면, val는 런타임 시점에 값을 할당한다는 차이가 있습니다. 많은 레퍼런스를 참조해봤지만 대부분 이 둘에 대한 차이밖에 찾을 수 없었으며, K..

    [운영체제] Page table의 3가지 구조 - Hierarchical, Hashed, Inverted Page table

    목차 🐤 계층적 페이지 테이블 (Hierarchical page table) 🐦 해시 페이지 테이블 (Hashed page table) 🐧 역페이지 테이블 (Inverted page table) 페이징(Paging)이란? [운영체제] 비연속할당(Noncontiguous allocation) - 페이징(Paging) 목차 🤔 페이징(Paging)이란? 🙉 페이지 테이블(Page table)과 주소 변환 🙈 페이징의 문제점 내부 단편화(Internal fragmentation) 페이지 테이블의 크기 🤔 페이징(Paging)이란? 기존 Segmentation과 Contiguous al itstory1592.tistory.com 페이징(Paging)은 외부 단편화를 해결하고 메모리를 효율적으로 사용할 수 있는 ..

    [운영체제] 비연속할당(Noncontiguous allocation) - 페이징(Paging)

    목차 🤔 페이징(Paging)이란? 🙉 페이지 테이블(Page table)과 주소 변환 🙈 페이징의 문제점 내부 단편화(Internal fragmentation) 페이지 테이블의 크기 🤔 페이징(Paging)이란? 기존 Segmentation과 Contiguous allocation의 경우, 남은 메모리 총량이 충분해도 작은 Hole들을 활용하지 못하는 외부 단편화 문제가 있었습니다. 특히, First-fit의 경우 50% rule에 의해 메모리의 1/3이 낭비되는 문제가 발생하기도 하였습니다. 이러한 문제들의 공통적인 특징은 가변 분할이었습니다. 프로세스마다, 세그먼트마다 크기가 각기 다르다보니 메모리에는 각기 다른 Hole들이 발생하였고, 이러한 Hole들은 대부분 낭비된다는 문제였습니다. 그래서 등..

    [운영체제] 비연속할당(Noncontiguous allocation) - 세그먼테이션(Segmentation)

    목차 🤔 비연속할당(Noncontiguous allocation)이란? 🧩 세그먼테이션(Segmentation)이란? 🙉 세그먼트 테이블(Segment table) 🙊 세그먼테이션(Segmentation) 주소 변환 🙈 Segmentation의 문제점 🤔 비연속 할당(Noncontiguous allocation)이란? 기존에는 연속 할당(contiguous allocation) 기법을 사용하여 프로세스를 통째로 메모리에 적재하였습니다. 연속 할당 기법은 base address에 상대 주소인 logical address를 더해줌으로써 물리 주소를 간단하게 translation 할 수 있다는 장점이 있었습니다. 따라서 MMU를 단순화할 수 있었지만, 외부 단편화가 발생하여 메모리 공간을 효율적으로 사용하지 ..

    [운영체제] Contiguous Allocation의 문제점 - External Fragmentation(외부단편화)

    목차 💥 Contiguous allocation의 문제점 🤔 External Fragmentation이란? 👀 Compaction(압축)을 활용한 외부 단편화 해결 💥 Contiguous allocation의 문제점 이전 포스팅에서 Contiguous allocation은 프로세스를 메모리에 분할해서 적재하지 않고 한 번에 통째로 적재하는 방법론이라고 설명했습니다. Contiguous allocation은 CPU의 MMU(Memory Management Unit)가 논리 주소를 물리 주소로 translation 함에 있어 단순함을 제공해준다는 장점이 있었습니다. 그러나, 단지 단순함때문에 값비싼 HW자원 중 하나인 Memory를 낭비하는 문제가 발생했습니다. 🤔 External Fragmentation이..