yield가 있는 함수 호출 시 본문 미실행과 제너레이터 객체 반환 확인하기 (inspect.isgeneratorfunction, type())
·
Python
왜 이 내용을 정리하나파이썬에서 함수 안에 yield가 있으면 일반 함수처럼 동작하지 않는다. 함수를 호출하는 순간 본문 코드가 한 줄도 실행되지 않고, 제너레이터 객체만 돌아온다. 이 사실을 모르고 코드를 짜면 print가 안 찍히는 이유를 찾느라 시간을 낭비하기 쉽다. 특히 디버깅 중에 함수의 반환값을 확인할 때, 값이 나오지 않고 객체만 보여 당황하는 경우가 많다. 그래서 이 동작을 직접 확인할 수 있는 방법을 알아 둘 필요가 있다. 이 노트에서는 inspect.isgeneratorfunction과 type()으로 이 동작을 확인하는 방법을 정리해 본다.개념 설명함수 정의 안에 yield 키워드가 하나라도 있으면, 파이썬은 그 함수를 제너레이터 함수로 취급한다. 일반 함수는 호출하면 본문을 처음부터..
Dart 명명된 매개변수에서 required와 기본값을 함께 쓸 때의 동작 확인
·
Flutter
왜 이 내용을 정리하나Dart로 함수를 설계하다 보면 매개변수 중 일부는 반드시 받아야 하고, 일부는 값이 없을 때 기본값으로 대체되어야 하는 경우가 많다. 이때 명명된 매개변수에 required와 기본값을 함께 쓰면 어떤 규칙이 적용되는지 정확히 알아두지 않으면, 호출부에서 빠뜨린 인자가 런타임 오류로 뒤늦게 드러나거나 의도와 다른 기본값이 조용히 들어가는 문제가 생긴다. 특히 Flutter 위젯 생성자처럼 명명된 매개변수가 많은 코드에서는 이 차이가 실제 버그로 이어지기 쉽다.이 노트에서는 required 매개변수를 빠뜨렸을 때 컴파일 단계에서 무엇이 일어나는지, 기본값이 있는 매개변수는 호출하지 않았을 때 어떤 값이 들어가는지를 코드로 확인해 본다.개념 설명Dart의 명명된 매개변수는 중괄호로 감싸..
Swift let 상수에 재할당 시도 시 컴파일 에러 메시지 직접 확인하기
·
Swift
왜 이 내용을 정리하나Swift를 처음 배울 때 var와 let의 차이를 설명으로만 익히면 실제로 어떤 상황에서 막히는지 감이 잘 오지 않는다. 특히 함수 안에서 값을 바꾸려다 컴파일러가 빌드를 거부하는 경우를 여러 번 겪게 된다. 이때 에러 메시지를 직접 읽어 보면 Swift가 무엇을 보장하려는지 바로 드러난다. 그래서 let 상수에 값을 다시 넣으려는 코드를 일부러 작성하고, 컴파일러가 어떤 메시지를 내는지 확인하는 과정을 기록해 둘 필요가 있다. 이 노트에서는 let의 의미와 재할당 시 에러 메시지, 그리고 헷갈리기 쉬운 지점을 정리해 본다.개념 설명let은 한 번 초기화된 뒤 값을 바꿀 수 없는 상수를 선언하는 키워드다. var은 이후에 값을 다시 할당할 수 있는 변수를 선언한다. Swift는 컴..
React JSX 중괄호 안의 산술 표현식 계산 결과 확인하기
·
React
왜 이 내용을 정리하나React 컴포넌트를 작성하다 보면 화면에 보여줄 값을 JSX 안에서 바로 계산해야 하는 경우가 많다. 예를 들어 상품 가격에 수량을 곱하거나, 목록의 개수를 세서 표시하거나, 페이지 번호를 계산해서 출력하는 상황이다. 이때 계산을 별도의 변수로 빼지 않고 JSX 중괄호 안에 바로 적으면 코드가 짧아진다. 하지만 JSX의 중괄호가 어떤 식으로 해석되는지 정확히 알지 못하면, 계산 결과가 출력되는지, 문자열로 그대로 찍히는지, 아무것도 나오지 않는지 헷갈리게 된다. 이 노트에서는 JSX 중괄호 안에 산술 표현식을 넣었을 때 계산 결과가 화면에 출력되는지 직접 확인해 본다.개념 설명JSX는 자바스크립트 문법을 HTML과 비슷한 모양으로 쓸 수 있게 해 주는 확장 문법이다. JSX 안에서..
Dart 레코드를 함수 반환값으로 쓰고 구조 분해로 받아 확인하는 방법
·
Flutter
왜 이 내용을 정리하나Flutter 앱에서 비동기 호출이나 입력 검증을 하면 함수가 여러 값을 돌려줘야 하는 경우가 자주 생긴다. 예를 들어 서버 응답의 상태 코드와 본문을 함께 받거나, 폼 검증 결과와 에러 메시지를 한 번에 돌려주는 식이다. 이전에는 리스트나 맵에 값을 담거나, 별도의 클래스를 만들어 감싸는 방식을 많이 썼다. Dart 3부터 도입된 레코드(record)를 쓰면 이런 값을 가볍게 묶어 반환할 수 있고, 구조 분해로 바로 변수에 나눠 받을 수 있다. 이 노트에서는 레코드를 함수 반환값으로 쓰는 방법과 구조 분해로 받아 값을 확인하는 흐름을 정리해 본다.개념 설명레코드는 여러 값을 쉼표로 묶어 만든 불변(immutable) 값이다. 위치 기반 필드는 (int, String)처럼 쓰고, 이..
Python 함수 기본 인자에 가변 리스트를 쓸 때 호출 사이에 값이 유지되는 이유와 확인 방법
·
Python
왜 이 내용을 정리하나Python으로 함수를 만들다 보면 기본 인자에 빈 리스트를 넣는 경우가 많다. 결과 목록을 쌓거나, 캐시를 흉내 내거나, 옵션을 담을 때 자연스럽게 떠오르는 방식이다. 그런데 이렇게 짠 함수를 여러 번 호출하면 앞선 호출에서 넣은 값이 다음 호출에도 남아 있는 것처럼 보이는 일이 생긴다. 처음 보는 사람에게는 함수가 상태를 기억하는 것처럼 느껴져서 원인을 찾기 어렵다. 이 노트에서는 기본 인자가 언제 만들어지는지, 호출 사이에 값이 유지되는 이유가 무엇인지, 그리고 이를 직접 확인하는 방법을 정리해 본다.개념 설명Python에서 함수의 기본 인자 값은 함수를 호출할 때마다 새로 만들어지지 않는다. 함수가 정의되는 시점, 즉 def 문이 실행되는 시점에 한 번 계산되어 함수 객체의 ..
제너레이터 표현식으로 파일 줄을 지연 평가하며 빈 줄과 주석 줄 건너뛰기
·
Python
왜 이 내용을 정리하나설정 파일이나 로그 파일을 읽어 처리하는 스크립트를 만들다 보면, 파일 안에 빈 줄과 주석 줄이 섞여 있는 경우가 대부분이다. 이런 줄을 걸러내는 가장 단순한 방법은 파일 전체를 리스트로 읽은 뒤 조건문으로 거르는 것이다. 그런데 파일이 수 기가바이트에 이르면 리스트 하나가 메모리를 모두 차지한다. 이때 제너레이터 표현식을 여러 단계로 이어 붙이면 한 번에 한 줄씩만 처리하면서도 같은 결과를 얻을 수 있다. 이 노트에서는 빈 줄과 주석 줄을 건너뛰는 흐름이 실제로 어떻게 지연 평가되는지 확인해 본다.개념 설명제너레이터 표현식은 대괄호 대신 소괄호로 감싼 식이다. 리스트 컴프리헨션이 결과를 즉시 만들어 메모리에 담는 것과 달리, 제너레이터 표현식은 값을 요구받을 때 하나씩 계산한다. ..
Swift 구조체는 대입 시 복사된다: 값 타입 동작을 print로 검증하기
·
Swift
왜 이 내용을 정리하나Swift를 처음 공부하면 class와 struct를 거의 같은 것으로 생각하기 쉽다. 둘 다 프로퍼티를 가지고 메서드를 호출할 수 있으니 문법만 보면 차이가 잘 드러나지 않는다. 그러다 함수에 데이터를 넘기거나 배열 안의 값을 꺼내 고칠 때 예상과 다른 결과가 나오면서 당황하게 된다. 이런 문제는 대부분 값 타입과 참조 타입을 구분하지 못해서 생긴다.특히 앱 상태를 여러 화면이 나눠 가질 때 이 차이는 바로 버그로 이어진다. 한 화면에서 값을 바꿨는데 다른 화면의 값도 같이 바뀌거나, 반대로 바꾼 값이 반영되지 않는 상황이 생긴다. 그래서 struct가 대입될 때 실제로 무엇이 복사되는지 감으로 넘기지 않고 직접 확인해 볼 필요가 있다. 이 노트에서는 같은 struct를 두 변수에..
React useEffect 빈 의존성 배열([]) 마운트 시 한 번 실행 확인하기
·
React
왜 이 내용을 정리하나React 함수형 컴포넌트에서 useEffect는 화면이 그려진 뒤 부수 효과를 실행하는 훅이다. 서버에서 데이터를 가져오거나, 이벤트 리스너를 등록하거나, 타이머를 설정하는 작업이 대표적이다. 이때 두 번째 인자인 의존성 배열을 비워 두면 효과가 언제 실행되는지 헷갈리는 경우가 많다. 특히 개발 환경에서 같은 로그가 두 번 찍히는 것을 보고 버그인지 아닌지 판단하기 어렵다. 그래서 빈 배열([])이 실제로 마운트 시점에 한 번만 실행을 의미하는지 콘솔 로그로 직접 확인해 본다. 이 노트에서는 빈 의존성 배열의 동작을 코드로 검증하고, 개발 모드의 Strict Mode에서 나타나는 차이를 정리해 본다.개념 설명useEffect(setup, deps)에서 deps가 빈 배열이면 Rea..
Flutter Column과 Row로 화면을 배치하는 방법
·
Flutter
왜 이 내용을 정리하나Flutter에서 화면을 만들 때 위젯을 세로나 가로로 나란히 놓는 일은 거의 모든 화면에서 반복된다. 프로필 카드에서 이미지 옆에 이름과 설명을 두는 경우, 하단 버튼 두 개를 가로로 나누는 경우, 목록 항목 안에서 아이콘과 텍스트를 한 줄에 맞추는 경우가 모두 여기에 해당한다. 이때 쓰는 기본 위젯이 Column과 Row다. 둘의 동작 방식과 정렬 속성을 정확히 알아 두지 않으면 화면이 깨지거나 오버플로우 경고가 계속 나오기 쉽다. 이 노트에서는 Column과 Row의 기본 개념, 정렬 방식, 자주 부딪히는 문제를 정리해 본다.개념 설명Column은 자식 위젯을 위에서 아래로 세로 방향으로 배치한다. Row는 자식 위젯을 왼쪽에서 오른쪽으로 가로 방향으로 배치한다. 두 위젯 모두..