분류 전체보기 118

Python 정적 타입 선언

Python에서 정적 타입 선언을 이해하기 위해 알아야 할 것들 파이썬은 타입이 동적으로 할당된다. 즉, 원래 따로 타입을 명시하지 않았다. 규모가 작은 파이썬 프로젝트일 때 동적 변수 타입 할당은 이해가 빠르고 코드 작성 속도에서 유리하다. 하지만 프로젝트 규모가 커질수록 동적 할당은 런타임 오류 발생 확률이 높아지도록 만든다. 따라서 버그를 미연에 방지하기 위해 타입을 명시해주는 것이 좋다. 파이썬에서는 어떻게 정적으로 변수의 타입을 선언할까? 바로 타입 어노테이션(또는 힌트)이다. 이 글에 의하면 파이썬 버전 3.5부터 타입 어노테이션(또는 힌트)가 추가되었다고 한다. 그것이 typing 모듈(공식 문서)로 구현되었다. 그렇게 선언된 정적 타입을 Mypy라는 정적 타입 검사 도구로 검사한다. Myp..

<오브젝트>에서 말하는 '객체지향, 왜 필요한가?'

책 에서 말하는 객체지향 설계 책 의 34쪽에서 36쪽을 발췌, 요약한 글입니다. 설계가 왜 필요한가 항상 변경되는 요구사항에 잘 대응하기 위해서 좋은 설계가 필요하다. 우리가 짜는 프로그램은 두 가지 요구사항을 만족시켜야 한다. 우리는 오늘 완성해야 하는 기능을 구현하는 코드를 짜야 하는 동시에 내일 쉽게 변경할 수 있는 코드를 짜야 한다. 좋은 설계란 오늘 요구하는 기능을 온전히 수행하면서 내일의 변경을 매끄럽게 수용할 수 있는 설계다. - 35p 요구사항은 항상 변경된다. 코드를 변경해야 한다. 버그가 발생할 가능성이 높아진다. 그러니 변경을 수용할 수 있는 설계가 중요하다. 객체지향 설계 객체지향 프로그래밍은 의존성을 효율적으로 통제할 수 있는 다양한 방법을 제공함으로써 요구사항 변경에 좀 더 수..

javascript 논리연산자(&&, ||) 우선순위 vs. 단락 평가(short circuit)

자바스크립트 논리연산자를 공부하다가 논리연산자 우선순위와 단락 평가를 알게 됐다. 배우면서 알게된 것을 기록해두려고 한다. 자바스크립트에서 논리연산자는 표현식을 반환한다. 자바스크립트에서 논리연산자 AND와 OR는 참과 거짓만 반환하는 게 아니라, 표현식 자체를 반환한다. 규칙은 다음과 같다. AND의 경우 왼쪽이 참 같은 값(Truthy)이면 오른쪽을 반환하고, 참 같은 값이 아니면 왼쪽을 반환한다. OR의 경우 왼쪽이 참 같은 값이면 왼쪽을 반환하고, 참 같은 값이 아니면 오른쪽을 반환한다. 논리 연산자 우선순위는 표에 의하면 AND는 6, OR는 5로 AND가 OR 보다 우선순위가 더 높다. 다음은 MDN 웹 문서에 나와 있는 예제다. true || false && false // returns t..

노마드코더 CSS Layout 코스 & 챌린지 후기

강의 플렉스(flex)와 그리드(grid)를 중점으로 배운다. SASS/SCSS도 간단하게 소개해준다. 가격은 6만 원이다. 강의만 있다면 6만 원이 아깝다고 느껴질 수 있다. 하지만 이 강의의 가격의 비쌈은 이 강의를 수강함으로 참가할 수 있는 챌린지로 상쇄된다. 챌린지 이 강의의 강점 중 하나인 챌린지. 2주 동안 매일 (첫째주 일요일은 쉬고, 이따금 이틀짜리 과제가 주어진다) 과제가 주어진다. html, css로 요구사항에 맞춰 웹페이지를 구현하면 된다. 개발 환경은 repl.it 을 사용한다. 실제로는 어느정도 챌린지를 진행 하다보니 repl.it은 불편해서 VSCode에서 작업한 뒤 repl에 복사했다. 적절한 난이도의 과제가 출제된다. 챌린지 초반엔 과제 내용 자체가 낯설어서 시간이 오래 걸릴..

일반 2021.01.26

주요 디자인 패턴

주요 디자인 패턴 디자인 패턴이란? 반복적으로 사용되는 소프트웨어 설계 패턴 전략(Strategy) 패턴 예시 상황 → 과일 매장에서 상황에 따라 다른 가격 할인 정책을 적용할 때 서로 다른 계산 정책들이 한 코드에 섞여 있어, 정책이 추가될수록 코드 분석이 어려움 가격 정책이 추가될 때마다 calculate 메서드를 수정하는 것이 점점 어려워진다. 예를 들어 마지막 손님 50% 할인과 같은 새로운 가격 정책이 추가될 경우, calculate 메서드에 마지막 손님을 구분하기 위한 lastGuest 파라미터가 추가되고 if 블록이 하나 더 추가되어야 한다. 일반 상황 if - else로 구성된 코드 블록이 비슷한 기능(비슷한 알고리즘)을 수행하는 경우 완전히 동일한 기능을 제공하지만 성능의 장단점에 따라 ..

DI(Dependency Injection)와 서비스 로케이터

DI(Dependency Injection)와 서비스 로케이터 애플리케이션 영역과 메인 영역 (본 책에서는 예제를 통해 애플리케이션과 메인 영역을 설명한다. 예제가 구체적이고 설명도 자세해서 책을 찬찬히 읽으면 이해가 잘 된다.) 메인 영역은 다음 작업을 수행한다. 어플리케이션 영역에서 사용될 객체를 생성한다. 각 객체 간의 의존 관계를 설정한다. 어플리케이션을 실행한다. 메인 영역은 어플리케이션영역의 객체를 생성하고, 설정하고, 실행하는 책임을 갖기 때문에, 어플리케이션 영역에서 사용할 하위 수준의 모듈을 변경하고 싶다면 메인 영역을 수정하게 된다. 모든 의존은 메인 영역에서 어플리케이션 영역으로 향한다. 반대의 경우인 어플리케이션 영역에서 메인 영역으로의 의존은 존재하지 않도록 한다. 이는 메인 영역..

SOLID 설계 원칙

설계 원칙: SOLID SOLID 설계 원칙은 다섯 가지 원칙으로 구성된다. 객체 지향 설계 관련 내용들을 체계적으로 정리한 것으로서 이 원칙만으로도 좋은 설계를 하는데 큰 도움이 될 것이다. SRP, Single responsibility principle 단일 책임 원칙 OCP, Open-closed principle 개방-폐쇄 원칙 LSP, Liskov substitution principle 리스코프 치환 원칙 ISP, Interface segregation principle 인터페이스 분리 원칙 DIP, Dependency inversion principle 의존 역전 원칙 SRP, Single responsibility principle 단일 책임 원칙 클래스는 단 한 개의 책임을 가져야 한다..

재사용, 상속보다는 조립으로

재사용: 상속보단 조립 상속을 사용하면 재사용을 쉽게 할 수 있는 것은 분명하다. 하지만 상속을 사용할 경우 몇 가지 문제점이 있다. 이 글에서는 상속을 통한 재사용 과정에서 발생할 수 있는 문제점을 살펴보고, 또 다른 재사용 방법인 객체 조립을 통해 상속을 통한 재사용의 단점을 해소하는 방법을 알아본다. 상속을 통한 재사용의 단점 상위 클래스 변경의 어려움 어떤 클래스를 상속받는다는 것은 그 클래스에 의존한다는 뜻이다. 따라서 의존하는 클래스의 코드가 변경되면 영향을 받을 수 있다. 즉, 상위 클래스에서 변경의 여파가 하위 클래스로 전파된다. 최악의 경우 상위 클래스의 변화가 모든 하위 클래스에 영향을 줄 수 있다. 이는 클래스 계층도에 있는 클래스들을 한 개의 거대한 단일 구조처럼 만들어 주는 결과를..

CSS Position 속성 (static, relative, absolute, fixed)

Position 속성 position 속성은 요소의 위치를 정의한다. top, bottom, left, right 속성과 함께 사용하여 위치를 지정한다. position 속성의 값으로 static(기본 값), relative(상대 위치), absolute(절대 위치), fixed(고정 위치) static (기본 위치) static은 position 속성의 기본 값으로 position 속성을 지정하지 않았을 때와 같다. 기본적인 요소의 배치 순서에 따라 위에서 아래로, 왼쪽에서 오른쪽으로 순서에 따라 배치되며 부모 요소 내에 자식 요소로서 존재할 때는 부모 요소의 위치를 기준으로 배치된다. 기본적으로 이 값을 지정할 일은 없지만 이미 설정된 position을 무력화하기 위해 사용될 수 있다. 좌표 속성(t..

CSS display 속성과 block, inline, inline-block, none

display 속성 display 속성은 레이아웃 정의에 자주 사용되는 중요한 속성이다. 속성의 값으로 다음과 같은 키워드가 있다. block → block 특성을 가지고 요소(block 레벨 요소)로 지정한다. inline → inline 특성을 가지는 요소(inline 레벨 요소)로 지정한다. inline-block → inline-block 특성을 가지는 요소(inline-block 레벨 요소)로 지정한다. none → 해당 요소를 화면에 표시하지 않는다. 차지하는 공간도 사라진다. block 레벨 요소 block 특성을 가지는 요소는 아래와 같은 특징을 지닌다. 항상 새로운 라인에서 시작한다. 화면 크기 전체의 가로폭을 차지한다. (width: 100%) width, height, margin, ..