Flutter/Dart & Programming

고한동·2025년 3월 6일
  • SDK(Software Developement Kit) : 특정 플랫폼에서 앱을 개발하는 데 필요한 도구 모음. Compiler, API, Library, Debugging tool, 문서 등이 포함.

  • Curly braces : 중괄호

  • Framework : 소프트웨어 개발을 쉽게 할 수 있도록 제공되는 구조와 도구의 집합. 개발자가 반복적인 작업을 줄이고, 효율적으로 개발할 수 있도록 미리 설계된 코드, 라이브러리, 가이드라인 등을 포함하고 있다.

  • Compiler : 코드를 기계어로 변환하는 프로그램

  • Library : 미리 만들어진 기능을 제공하는 코드 모음

  • API(Application Programming Interface) : 앱과 운영체제가 상호작용할 수 있도록 하는 인터페이스

  • Emulator : 컴퓨터에서 가상의 모바일 환경을 실행할 수 있는 소프트웨어. 가상의 하드웨어 + 소프트웨어

  • Debugging : 오류 수정. 코드에서 발견한 버그를 찾아 수정하는 과정

  • DevOps : 개발과 운영을 병행하고 함게 관리하는 방식. 개발 + 운영

  • Snippet : 한 토막, 코드의 한 부분

  • Interface : 어떤 것과 어떤 것이 연결되는 접점. 두 개 이상의 시스템, 소프트웨어, 또는 컴포넌트가 서로 상호작용할 수 있도록 정의된 방식

  • Application : 사용자가 특정 기능을 수행할 수 있도록 만들어진 소프트웨어

  • Pivot : 제품의 초기 가설이 틀렸다고 판단되면 방향을 바꾸는 것

  • MVP(Minimum Viable Product) : 핵심 기능만 포함한 가장 단순한 형태의 제품

  • Lean Startup : 최소한의 비용과 자원으로 빠르게 시장에 제품을 출시하고 사용자 피드백을 기반으로 개선해 나가는 창업방법론

  • Build : 소스 코드를 실행 가능한 앱으로 변환하는 과정

  • Pitch Deck : 투자자나 파트너에게 사업 아이디어를 효과적으로 설명하는 프레젠테이션 자료. 사업의 핵심을 담은 슬라이드 쇼. 나의 패를 던지다!

  • Prototype : "이렇게 만들면 어떨까?"하고 아이디어를 시각적으로 표현한 것

  • Wireframe : 디자인이나 개발을 시작할 때 화면이 어떻게 구성될 지 정리하는 스케치. 특징 : 심플한 흑백(색상, 이미지, 아이콘이 없는) 기본 틀과 User flow(버튼 누르면 어디로 가는지)

  • UI(User Interface) : 사용자가 직접 보는 화면 디자인 & 인터랙션

  • UX(User Experience) : 사용자가 제품을 사용할 때의 경험과 느낌

  • Milestone : 프로젝트나 사업에서 중요한 목표나 성취 지점을 의미하는 개념. 주요 체크포인트. 핵심 개념 : 1. 시간과 목표 중심 2. 진행 상황 체크 3. 팀과 투자자 소통 도구 4. SMART 원칙 적용(Specific, Measurable, Achievable, Relevant, Time-bound)

  • Roadmap : 프로젝트, 제품개발, 또는 사업이 어떤 방향으로 진행될 지 정리한 계획표

  • IDE(Integrated Development Environment) : 통합 개발 환경. 코드를 작성하고 실행, 디버깅, 배포까지 한 곳에서 할 수 있도록 도와주는 소프트웨어

  • Production Code : 실제 사용자에게 배포되는 코드. 즉, 앱 또는 소프트웨어가 최종적으로 배포될 때 실행되는 코드

  • Gradle : 앱 빌드 및 관리를 자동화하는 도구

  • Business Logic : 앱이나 프로그램이 처리해야 하는 핵심 기능과 규칙을 정의하는 로직. 즉, 단순한 UI 처리나 데이터 저장이 아니라 앱이 수행해야 하는 중요한 계산, 데이터 처리, 규칙 적용 등을 담당하는 코드

  • Refactoring : 기능은 그대로 유지하면서 코드의 구조를 개선하는 과정. 즉, 코드를 더 읽기 쉽고 유지보수하기 쉽게 정리하는 것. 코드 청소 + 최적화. 기능은 그대로 + 코드 가독성 & 성능 개선. 리팩토링 핵심 : 1. 중복 코드 제거 2. 의미있는 변수 & 함수 이름 사용 3. 파일 구조 정리 4. 상태 관리 적용

  • Synchronous : 동기. 동기 방식은 작업이 순차적으로 처리되는 것을 의미한다. 하나의 작업이 끝나야 다음 작업이 진행된다. 단점 : 1. 블로킹 2. 비효율성(자원이 비효율적으로 사용될 수 있다)

  • Blocking : 특정 코드가 실행되는 동안 다른 작업이 중단되는 것

  • Asynchronous : 비동기. 비동기 방식은 작업이 병렬적으로 처리될 수 있음. 즉, 작업이 완료될 때까지 기다리지 않고 다음 작업을 바로 시작. 주로 네트워크 요청 파일 읽기/쓰기 등 시간이 걸리는 작업에 사용됨. 단점 1. 코드가 복잡해질 수 있다 2. 비동기 코드의 흐름을 추적하고 디버깅하는 것이 어렵다

  • Scrum : 애자일 개발 방식 중 하나로 팀이 효과적으로 협업하여 빠르게 소프트웨어를 개발하는 방식. 짧은 주기의 스프린트로 개발하고, 피드백을 받아 지속적으로 개선하는 방식. <주요회의> : 1. Daily Scrum 2. 스프린트 계획 회의 3. 스프린트 리뷰 4. 회고 <역할> : 1. 스크럼 마스터(스크럼 프로세스를 관리하고 팀이 원할하게 협업할 수 있도록 돕는 역할 2. 프로덕트 오너(고객의 요구사항을 정리하고 우선순위를 정하는 역할 3. 개발팀(실제로 코드를 작성하고 기능을 구현하는 팀원들)

  • Sprint : 일정한 주기의 개발 단계

  • Agile : 빠르고 유연하게 소프트웨어를 개발하는 방법론. 즉, 한번에 모든 기능을 완성하는 것이 아니라 짧은 주기로 점진적으로 개발 & 개선하는 방식. <애자일 핵심 개념> 1. 짧은 개발 주기로 점진적 개발 2. 고객 피드백을 지속적으로 반영 3. 변경 사항을 빠르게 적용할 수 있는 유연성 4. 개발 팀간 협업 & 의사소통 강조 <애자일 방법론 종류> 1. 스크럼 2. 칸반 3. XP 4. Lean 개발

  • Code Kata : 프로그래밍 실력을 향상시키기 위해 반복적으로 문제를 풀며 연습하는 방법. Kata는 가라테에서 특정 동작을 반복 연습하는 것을 의미

  • Onboarding : 신입 직원 교육. 조직 내 새로 합류한 사람이 빠르게 조직의 문화를 익히고 적응하도록 돕는 과정

  • Xcode : Apple에서 제공하는 macOS 전용 통합 개발 환경. 즉, iOS, macOS, watchOS, tvOS 앱을 개발할 때 사용하는 공식 개발 도구. Flutter 앱을 iOS에서 실행하거나 배포할 때 필소. Apple이 제공하는 공식 IDE. windows에서 Xcode 사용 불가

  • README : 프로젝트의 개요, 사용 방법, 설치 방법 등을 설명하는 문서. 즉, 개발자가 프로젝트를 이해하고 쉽게 시작할 수 있도록 작성하는 가이드 문서. <파일 특징> 1. 보통 프로젝트의 최상위 폴더에 위치(ReadME.md) 2. Markdown 형식으로 작성(가독성이 좋음) 3. GitHub 같은 저장소에서 프로젝트 소개 용도로 활용

  • Markdown : 텍스트를 손쉽게 포맷팅(서식 지정) 할 수 있는 문서 작성 언어. 간단한 기호(문법)만으로 글을 꾸밀 수 있는 문법으로 READMe.md, 블로그 작성 등에 많이 사용된다. 마크다운을 지원하는 환경에서만 적용됨

  • Class : 클래스는 객체를 만들기 위한 설계도. 즉, 데이터(변수)와 기능(메서드)를 하나로 묶어서 표현하는 방식 <클래스의 개념> 클래스 = 설계도, 객체는 클래스를 기반으로 생성된 실제 데이터. <클래스의 핵심 요소> 1. 속성(멤버 변수, Fields) : 객체가 가지는 데이터 2. Method : 객체가 수행할 기능 3. Constructor : 객체 생성시 호출되는 함수 4. 객체(Instance) : 클래스를 기반으로 만들어진 실제 데이터

  • Fields : 멤버 변수. 클래스 내부에 선언된 변수. 객체가 가지는 속성을 저장하는 역할. 클래스가 가지고 있는 데이터. 객체별로 따로 저장되는 변수 <멤버 변수 특징> 1. 클래스 내부에 선언됨 2. 각 객체마다 별도의 값을 가짐 3. private 혹은 public으로 선언 가능 4. 생성자에서 초기화 가능

  • Object : 객체. 프로그래밍에서 사용되는 모든 데이터 구조, 단위.

  • Instance : 클래스를 기반으로 생성된 객체

  • Method : 클래스 안에 정의된 함수를 의미. 즉, 객체가 수행할 수 있는 동작(기능)을 정의하는 함수 <메서드의 역할> 1. 객체의 데이터를 조작하거나 연산을 수행 2. 객체의 상태를 변경하거나 조회 3. 재사용 가능한 코드 블록 제공 <메서드의 종류> 1. 인스턴스 메서드 : 객체 단위로 동작하는 메서드. 객체마다 개별적인 데이터(this)를 사용 2. 정적 메서드 : 클래스 단위로 동작하는 메서드. Static 키워드를 사용하며 객체 생성 없이 호출 가능 3. Getter& Setter 메서드 : 클래스의 속성을 안전하게 가져오거나 변경할 때 사용

  • Static Method : 클래스 자체에서 실행할 수 있는 메서드. 객체를 생성하지 않아도 호출할 수 있는 메서드. 객체와 관계 없이 "고정된(Static) 메서드

  • Clean Architecture : 소프트웨어를 더 유지보하기 쉽고, 확장 가능하도록 설계하는 아키텍쳐 패턴. 즉, 코드를 계층으로 나누어 의존성을 정리하고 모듈간 결합도를 낮추는 방법. 코드를 정리해서 유지보수하기 쉽게 만드는 설계 원칙. 각 기능을 독립적으로 분리하여 테스트하기 쉽게 하는 구조 <클린 아키텍쳐 핵심 개념> 크게 4개의 계층으로 나뉜다 1. UI Layer : 사용자가 보는 화면 2. Presentation Layer : view model, state management 3. Domain Layer : 핵심 비즈니스 규칙 4. Data Layer : API, 데이터베이스, 외부 라이브러리 <클린 아케텍쳐 특징> 1. 의존성은 안쪽에서 바깥쪽으로만 향해야 함 ex) UI -> 도메인 계층을 직접 참조하지 않고 useCase를 통해 접근 2. 테스트가 쉬운 구조 3. 한 계층의 변경이 다른 계층에 영향을 덜 줌

  • Module : 코드를 논리적으로 분리한 독립적인 단위. 즉, 큰 프로그램을 작은 단위로 나누어 관리하는 방식. 코드를 여러 개의 작은 블록(파일/폴더)로 나누어 관리하는 것. 독립적으로 개발 & 재사용할 수 있는 코드 단위

  • Repository : git으로 관리하는 프로젝트 저장소

  • Package : 관련된 코드(클래스, 함수, 라이브러리 등)를 모아둔 단위. 즉, 재사용 가능한 코드 묶음. 관련된 기능을 하나로 묶어놓은 코드 상자. 필요한 기능을 한 번에 가져와 사용할 수 있는 도구. <패키지 종류> 1. 공식 패키지 : 프레임워크에서 기본제공하는 패키지 2. 서드파티 패키지 : 개발자들이 만든 오픈소스 패키지 3. 커스텀 패키지 : 내가 만든 패키지

  • External Library : 외부 라이브러리. 기본 제공되지 않고 외부에서 다운로드하여 사용하는 라이브러리. 다른 개발자가 만든 기능을 프로젝트에 가져와 사용하는 코드 모음. 기본 제공되지 않는 추가적인 기능을 가져와서 사용하는 것. 외부에서 다운로드해서 import하는 라이브러리

  • Test Code : 작성한 코드가 정상적으로 동작하는지 자동으로 검사하는 코드. 즉, 개발자가 직접 앱을 실행하지 않아도 코드가 원하는 대로 작동하는지 자동으로 확인해주는 코드. ex) Flutter 테스트 코드 종류 1. 단위 테스트 : 개별 함수/클래스가 정상 작동하는지 테스트 2. 위젯 테스트 : 특정 위젯이 올바르게 동작하는지 테스트(UI가 예상대로 렌더링 되는지 등) 3. 통합 테스트 : 앱 전체의 흐름을 실제 기기/에뮬레이터에서 테스트(실제 사용자처럼 앱을 실행하여) <테스트코드 작성 과정> 1. 테스트할 기능을 정의 2. 입력값 & 기대 결과를 상정 3. 테스트 실행

  • Database : 데이터를 체계적으로 저장하고 관리하는 시스템. 즉, 필요한 데이터를 저장하고, 검색하고, 수정하고, 삭제할 수 있는 저장소. 데이터를 저장하는 큰 파일. 필요할 때 데이터를 빠르게 꺼내쓸 수 있는 구조 <데이터베이스 종류> 1. 관계형 데이터베이스(Relational Database) 1) 테이블 형태로 데이터 저장 2) SQL 사용 3) 데이터간의 관계를 설정할 수 있음 4) MySQL, SQLite, Oracle, SQL server 등... 2. 비관계형 데이터베이스(Not Only SQL) 1) 테이블이 아닌 JSON, Key-value 형태로 저장 2) 빠른 읽기/쓰기 성능이 중요할 때 사용 3) 스키마(테이블 구조) 없이 자유로운 데이터 저장 가능 4) Firebase Firestore, Mongo DB, Redis 등...

  • Firebase Firestore : Google의 클라우드. Flutter에서 클라우드 데이터를 저장할 때 사용. NoSQL 데이터베이스. 실시간 동기화 지원(여러 기기에서 데이터가 자동으로 업데이트 됨)

  • SQL(Structured Query Language) : 데이터베이스에서 데이터를 저장, 조회, 수정, 삭제할 때 사용하는 언어 <SQL 주요 기능> 1. 데이터 추가(Insert) 2. 데이터 조회(Select) 3. 데이터 수정(Update) 4. 데이터 삭제(Delete) 5. 데이터 구조 정의(Create, Alter, Drop) : 테이블 생성 및 변경

  • Table : 데이터베이스에서 데이터를 저장하는 기본 구조. Row와 Column으로 이루어진 데이터 저장소. 엑셀 스프레드시트처럼 데이터를 저장하는 표. 하나의 테이블은 특정한 종류의 데이터를 저장하는 공간 <테이블의 기본 구조> 1. 행(row) : 개별 데이터 2. 열(Column) : 필드(속성) 3. Primary key : 각 행을 식별하는 고유한 값(id)

  • Schema : 데이터베이스의 구조(구성)을 정의하는 것. 즉, 어떤 테이블이 있고 각 테이블에는 어떤 컬럼이 있으며 그 데이터가 어떻게 연결되는지를 설명하는 설계도. 데이터베이스의 구조를 정의한 것. 어떤 데이터가 어떻게 저장될 지를 설명하는 문서 <스키마의 주요 요소> 1. 테이블 : 데이터를 저장하는 기본 단위 2. 컬럼 : 테이블에 저장될 속성 3. 데이터 타입 : 각 컬럼에 저장도리 데이터의 종류 4. 제약조건(constraints) : primary key, UNIQUE, Not NULL 등 데이터 무결성을 보장하는 규칙 5. 관계 : 테이블간의 연관성

  • Foreign key : 외래 키. 한 테이블의 특정 컬럼이 다른 테이블의 primary key를 참조하는 키. 즉, 두 테이블 간의 관게를 설정하는 역할. <외래키의 역할> 1. 데이터의 무결성 유지 : 존재하지 않는 값을 참조할 수 없음 2. 테이블간 관계 설정 : 연관된 데이터 쉽게 조회 가능 3. 중복 데이터 방지 : 불필요한 데이터 반복 없이 관계를 활용

  • Data Integrity : 데이터 무결성. 데이터의 정확성, 일관성, 신뢰성을 보장하는 원칙. 즉, 데이터가 손상되지 않고 논리적으로 올바르게 유지되는 것. 잘못된 데이터가 입력되거나 데이터간 불일치가 발생하지 않도록 보호. primary key, Foreign key, UNIQUE, Not NULL 등을 활용하여 데이터 무결성 유지

  • JSON(JavaScript Object Notation) : 데이터를 저장하고 전송하는 데 사용하는 가볍고 읽기 쉬운형식. 즉, 데이터를 주고받기 위한 표준 형식. 주로 웹, API, 모바일 앱에서 사용. 사람도 읽기 쉽고, 컴퓨터도 쉽게 처리할 수 있는 데이터 형식. 서버와 클라이언트(앱)간 데이터를 주고받을 때 사용 <JSON 특징> 1. 텍스트 기반의 데이터 형식(사람이 읽고 쓰기 쉬움) 2. 경량 & 빠름 : XML보다 데이터가 가볍고 속도가 빠름 3. 언어 독립적 : 다양한 언어에서 사용가능 4. API와 통신할 때 주로 사용 : Rest API, Firebase... <JSON 기본 문법> 1. key와 value 쌍으로 이루어진 데이터 구조 2. 중괄호 {} -> 객체 표현 3. 대괄호 [] -> 배열 표현

  • Firebase Crashlytics : 앱에서 발생하는 오류를 실시간으로 추적하고 분석하는 도구. 즉, 사용자가 앱을 사용하다가 충돌(Crash)이 발생하면, 원인을 Firebase 대시보드에서 확인할 수 있도록 도와주는 서비스. 앱이 어디서, 왜 충돌했는지 실시간으로 알려주는 도구

  • Objective-C : Apple의 macOS 및 iOS 애플리케이션을 개발하는 데 사용되는 프로그래밍 언어. C언어를 기반으로 객체지향 기능을 추가한 언어. Swift가 등장하기 전까지 iOS 및 macOS의 개발 주요 언어로 사용. <Objective-C 특징> 1. C언어 기반 : C의 성능을 그대로 유지하면서 객체지향 기능 추가 2. 동적 특성 강함 : 메서드 호출을 실행 중에 결정 3. Swift보다 복잡한 문법 : 대괄호와 메시지 패싱 방식 사용 4. 현재는 Swift로 대체됨 : 하지만 기존 iOS 유지보수 및 일부 라이브러리에 여전히 사용됨

  • CodePush : 앱 스토어에 다시 배포하지 않고도 앱의 코드 업데이트를 푸시할 수 있는 서비스. 즉, 앱을 재배포하지 않고도 JavaScript 또는 Dart 코드 수정 사항을 사용자에게 즉시 배포할 수 있는 기술. 앱을 앱스토어에 다시 올리지 않고 업데이트 하는 방법. 핫픽스나 작은 기능 변경을 빠르게 적용할 수 있는 서비스 <CodePush의 주요 기능> 1. 앱스토어 심사 없이 즉시 업데이트 가능 2. 버그 수정, UI 변경, 기능 추가를 빠르게 배포 가능 3. 업데이트 롤백 가능 → 문제가 있으면 원래 버전으로 되돌릴 수 있음 4. A/B 테스트 & 단계적 배포 가능 → 특정 사용자 그룹에게만 업데이트 배포 가능 <CodePush가 지원하는 플랫폼> 1. React Native → CodePush를 공식적으로 지원 2. Flutter → 직접 지원은 없지만 flutter_code_push 같은 패키지를 사용 가능 3. Cordova, Ionic 같은 하이브리드 앱 프레임워크에서도 사용 가능 4. CodePush는 JS, Dart 등의 스크립트 코드만 업데이트 가능 5. 네이티브 변경(Swift/Kotlin, Android/iOS 네이티브 라이브러리 변경)은 불가능 → 이 경우 앱을 다시 빌드 & 배포해야 함

  • Shorebird : Flutter 앱을 다시 빌드하지 않고도 코드 업데이트를 배포할 수 있는 CodePush 솔루션. 즉, 앱을 앱스토어에 다시 업로드하지 않고, 사용자의 기기에 즉시 Dart 코드 업데이트를 적용할 수 있는 서비스. "Flutter용 CodePush". 앱스토어 심사 없이 실시간 업데이트 가능. <Shorebird의 특징> 1. Flutter에 최적화된 CodePush 솔루션 2. 앱스토어 심사 없이 즉시 업데이트 가능 3. Dart 코드 수정만으로 빠르게 핫픽스 적용 가능 4. 무료 제공 5. 현재 iOS는 미지원 (Android 우선 지원 중) 6. 네이티브 코드(Swift/Kotlin)는 업데이트 불가능 7. Flutter 웹 & 데스크톱은 미지원

  • GetX : Flutter에서 상태 관리, 라우팅, 의존성 주입을 간편하게 할 수 있도록 도와주는 패키지. 즉, Flutter 앱 개발을 더 쉽게 만들기 위해 설계된 경량 프레임워크로, Redux, Provider보다 더 간단하고 성능이 뛰어남. Flutter에서 가장 쉬운 상태 관리 솔루션. 라우팅, 상태 관리, 의존성 관리까지 한 번에 해결 가능 <GetX의 주요 기능> 1. 간단한 상태 관리 → setState() 없이 반응형 상태 관리 가능 2. 라우팅 관리 → Navigator.push() 없이 화면 이동 가능 3. 의존성 주입 → Provider 없이 객체 관리 가능 4. 퍼포먼스 최적화 → 최소한의 리소스 사용 5. 전역 접근 가능 → BuildContext 없이 어디서든 사용 가능

  • State Management : 상태관리. 앱의 UI와 데이터를 동기화하는 방법. 즉, 앱에서 변경된 데이터를 화면(UI)에 반영하는 방식. 앱의 데이터(상태)를 관리하고, UI가 자동으로 업데이트되도록 하는 것. 버튼을 눌렀을 때, 데이터가 바뀌고 UI가 변하는 걸 관리하는 시스템 <상태 관리가 필요한 이유> 1. 데이터가 변경될 때 UI를 자동으로 업데이트 2. 여러 화면에서 동일한 상태를 유지 3. 앱이 복잡해질수록, 상태 관리를 체계적으로 할 필요가 있음 4. 전역 상태 관리(Global State)를 사용하면 전역에서 데이터 공유 가능

  • State : 앱이 현재 가지고 있는 데이터. 로그인 상태, 버튼 클릭 횟수 등...

  • Homebrew : macOS 및 Linux에서 소프트웨어 패키지를 간편하게 설치하고 관리할 수 있는 패키지 관리자. 즉, 터미널에서 한 줄 명령어로 프로그램을 설치, 업데이트, 삭제할 수 있도록 도와주는 도구. macOS용 apt 또는 yum 같은 패키지 관리자. 터미널에서 소프트웨어를 간편하게 설치하는 도구 <주요기능> 1. 패키지 설치 & 삭제 간편 → brew install <패키지명> 한 줄로 설치 가능 2. 자동 의존성 관리 → 필요한 라이브러리도 함께 설치 3. 버전 관리 & 업데이트 지원 → brew upgrade로 최신 버전 유지 4. macOS & Linux 지원 → macOS에서 가장 널리 사용됨

  • Environment Variable : 환경변수. 운영 체제(OS)에서 설정된 전역 변수로, 시스템이나 애플리케이션이 동작하는 데 필요한 설정값을 저장하는 변수. 즉, 소프트웨어가 실행될 때 참조하는 중요한 정보(예: 시스템 경로, API 키, 설정값 등)를 저장하는 변수. 운영 체제나 프로그램이 필요로 하는 설정값을 저장하는 변수. 특정 경로나 API 키를 저장해두고, 프로그램이 이를 참고할 수 있도록 하는 시스템 변수. <환경 변수의 주요 역할> 1. 시스템 설정 관리 → PATH, HOME 등 시스템 경로 설정 2. 개발 환경 설정 → JAVA_HOME, ANDROID_HOME 등 SDK 경로 저장 3. 보안 정보 보호 → API 키, 데이터베이스 비밀번호 등 민감한 정보 저장 4. 프로그램 실행 최적화 → 소프트웨어가 특정 설정을 자동으로 참조 가능. <환경 변수를 사용하는 이유> 1. 전역적으로 설정된 값을 쉽게 참조 가능 2. 보안 강화 (코드에 민감한 정보를 직접 포함하지 않음) 3. 개발 환경별 다른 설정 적용 가능 (예: 개발/운영 환경 분리)

  • CocoaPods : iOS 및 macOS 앱에서 라이브러리(패키지)를 관리하는 종속성 관리자. 즉, Swift 또는 Objective-C 프로젝트에서 외부 라이브러리를 쉽게 설치하고 업데이트할 수 있도록 도와주는 도구. iOS 개발에서 라이브러리를 설치하고 관리하는 도구. Flutter iOS 빌드를 할 때도 필요함.

  • Plugin : 소프트웨어의 기능을 확장하거나 추가하는 외부 모듈. 즉, 기본 프로그램에 새로운 기능을 추가할 수 있도록 도와주는 확장 모듈. Flutter에서는 네이티브 기능(Android, iOS)을 사용할 때 플러그인을 활용. <플러그인의 주요 역할> 1. 소프트웨어 기능 확장 → 기본 프로그램에서 지원하지 않는 기능 추가 가능 2. 코드 재사용성 증가 → 여러 프로젝트에서 같은 기능 사용 가능 3. 빠른 개발 가능 → 복잡한 기능을 직접 구현하지 않고 쉽게 추가 가능 4. Flutter에서는 네이티브 기능(Android/iOS) 연동

  • Commit : Git에서 변경된 파일을 저장하는 작업. 즉, 코드 변경 사항을 기록하고, 프로젝트의 특정 시점을 저장하는 과정. Git에 코드 변경 내용을 저장하는 행위. <커밋의 역할> 1. 코드 변경 사항 저장 → 이전 코드로 쉽게 되돌릴 수 있음 2. 협업 시 변경 이력 추적 → 누가, 언제, 어떤 변경을 했는지 확인 가능 3. 버전 관리 가능 → 기능별로 커밋을 나누면 변경 이력을 관리하기 쉬움 4. 코드 백업 기능 → 로컬 또는 원격 저장소에 안전하게 기록됨. <좋은 커밋 메시지 작성법> 1. 짧고 명확하게 변경 내용을 설명2. 첫 글자는 동사 원형 사용 (예: Add, Fix, Update) 3. 왜 변경했는지 추가 설명

  • Material Design : Google이 만든 UI 디자인 시스템. 일관된 UI, 직관적인 애니메이션, 반응형 디자인 제공. Android & Flutter에서 기본적으로 사용됨

  • Material Library : Material Design을 쉽게 구현할 수 있도록 제공되는 Flutter 위젯 라이브러리. Android 스타일의 UI 컴포넌트(Button, AppBar, Card 등)를 제공

  • Toggle : 두 가지 상태(ON/OFF, 활성/비활성 등)를 전환하는 기능. 즉, 버튼이나 스위치를 눌러서 특정 상태를 변경하는 UI 요소

  • UTF-8(Unicode Transformation Format - 8-bit) : 유니코드(Unicode) 문자를 인코딩하는 가장 많이 사용되는 방식. 즉, 모든 언어의 문자를 저장하고 표현할 수 있는 문자 인코딩 방식

  • Generic : 코드를 보다 유연하고 재사용 가능하게 만들기 위해 데이터 타입을 일반화하는 기능. 즉, 특정 데이터 타입에 의존하지 않고, 다양한 타입을 처리할 수 있도록 하는 프로그래밍 기법. 타입을 직접 지정하지 않고, 나중에 결정할 수 있는 방식

  • Widget : Flutter에서 UI를 구성하는 기본 요소. 즉, Flutter에서 화면을 만들기 위해 사용하는 모든 것이 위젯. Flutter의 화면은 위젯 트리(Widget Tree)로 구성됨. <위젯의 특징> 1. 모든 UI 요소가 위젯 → 버튼, 텍스트, 이미지, 입력 필드 등 2. 위젯은 중첩 가능 → 작은 위젯을 조합하여 복잡한 UI 구성 3. 위젯은 불변(Immutable) → 상태가 바뀌면 새로운 위젯을 생성하여 UI 업데이트

  • Widget Tree : Flutter에서 UI를 계층 구조(트리 구조)로 구성하는 방식. 즉, Flutter의 모든 화면은 여러 개의 위젯이 부모-자식 관계로 연결된 트리 형태를 가짐. 모든 위젯은 다른 위젯 안에 포함될 수 있음. <위젯 트리의 특징> 1. 부모-자식 관계 → 하나의 위젯이 여러 개의 자식 위젯을 포함 가능 2. 루트(Root) 위젯이 존재 → MaterialApp 또는 CupertinoApp이 최상위 위젯 3. 트리 형태로 화면 구성 → 부모 위젯이 자식 위젯을 감싸면서 UI 생성 4. 재사용성 증가 → 여러 개의 작은 위젯을 조합하여 복잡한 UI 구성

  • Nullable : 변수나 객체가 null 값을 가질 수 있는 상태. Dart에서는 널 안정성(Null Safety)이 도입되면서, 변수나 객체가 null을 가질 수 있는지 여부를 명확하게 정의해야 함. null을 허용하는 변수 = Nullable. null을 허용하지 않는 변수 = Non-nullable. Dart에서는 ?를 사용하여 Nullable 변수를 선언하고, 사용할 때 반드시 null 체크 필요

  • Positional Parameter : 매개변수를 전달할 때, 순서(위치)가 중요한 파라미터. Dart에서 함수를 호출할 때 인자의 순서를 지켜야 하는 매개변수. 매개변수 개수와 순서를 맞춰야 정상적으로 동작 <포지셔닝 파라미터의 특징> 1. 순서대로 값을 전달해야 함 2. 필수적으로 값을 전달해야 함 3. 기본값 설정 불가능 (선택적 포지셔닝 파라미터 제외)

  • Optional Positional Parameter : 선택적 포지셔널 파라미터. 대괄호를 사용하면 선택적으로 값을 전달할 수 있음. 기본값을 설정하지 않으면 null이 될 수 있음

  • Named Parameter : 함수를 호출할 때 매개변수 이름을 직접 지정하여 값을 전달하는 방식. Dart에서는 중괄호를 사용하여 네이밍 파라미터를 정의. 순서와 상관없이 원하는 값만 선택적으로 전달 가능. <네이밍 파라미터의 특징> 1. 순서에 상관없이 값을 전달할 수 있음 2. 선택적으로 값을 전달 가능 (기본값 설정 가능) 3. required 키워드를 사용하면 필수 값으로 지정 가능

  • Required : 네이밍 파라미터가 반드시 전달되어야 함을 강제하는 키워드. 즉, required가 붙은 매개변수는 함수를 호출할 때 반드시 값을 넘겨줘야 함. <required의 특징> 1. 네이밍 파라미터({})에서만 사용 가능 2. 값이 전달되지 않으면 컴파일 오류 발생 3. 널이 아닌 타입(non-nullable)과 함께 자주 사용됨

  • Default Value : 기본값 설정. 함수의 매개변수나 변수에 값이 전달되지 않았을 때 사용할 기본값을 미리 지정하는 것. Dart에서는 선택적 네이밍 파라미터({})나 선택적 포지셔닝 파라미터([])에 기본값을 설정할 수 있음. 매개변수에 값이 안 넘어오면, 미리 정해둔 값을 사용. required 없이 기본값을 설정하면, 값을 안 넘겨도 오류가 발생하지 않음. 기본값을 설정하면 null을 방지할 수 있음

  • Delegate : 특정 작업을 다른 객체나 클래스에 위임(Delegate)하는 개념. Flutter에서는 UI 구성, 레이아웃, 페인팅, 리스트 항목 생성 등의 작업을 다른 클래스로 위임할 때 사용. <Flutter에서 대표적인 Delegate 종류> 1. SliverChildDelegate → ListView.builder 같은 동적 리스트에서 사용 2. CustomPainterDelegate → 캔버스에 직접 그림을 그릴 때 사용 3. SliverGridDelegate → GridView의 그리드 배치를 정의할 때 사용

  • Axis : Flutter에서 UI 요소가 배치되는 방향(수평 또는 수직)을 결정하는 개념. Flutter에서 Axis는 horizontal(가로)과 vertical(세로) 두 가지 값을 가질 수 있음. Axis는 위젯이 정렬되거나 스크롤되는 방향.

  • Immutable : 한 번 생성된 객체나 값이 변경되지 않는 것. Dart에서는 final 또는 const 키워드를 사용하여 변수를 불변으로 만들 수 있음. 변경 불가능한 객체는 안전하고 예측 가능함

  • Extent : Flutter에서 위젯이 차지하는 크기(길이 또는 범위). 특히 리스트, 그리드, 스크롤 가능한 위젯에서 사용되며, 주로 너비(width)나 높이(height)를 결정하는 데 사용

  • Ticker : 일정한 간격으로 콜백을 실행하는 메커니즘. Flutter에서 애니메이션을 구현할 때 사용. 매 프레임마다 콜백을 호출하여 화면을 업데이트하는 역할. Ticker는 초당 60번 이상 실행되는 타이머 같은 것. 애니메이션 프레임마다 값을 변경하여 부드러운 움직임을 만듦. <Ticker의 주요 특징> 1. 초당 60프레임(기본 설정)으로 실행됨 2. 애니메이션이 진행될 때마다 콜백을 실행하여 상태를 갱신함 3. TickerProvider를 통해 관리됨 4. 사용 후 반드시 dispose()에서 해제해야 메모리 누수를 방지할 수 있음

  • Scaffold : Flutter에서 기본적인 화면 레이아웃(구조)을 제공하는 위젯. 앱의 앱바(AppBar), 본문(Body), 하단 네비게이션 바(BottomNavigationBar), 플로팅 액션 버튼(FloatingActionButton) 등을 쉽게 배치. Flutter에서 화면을 구성하는 기본 뼈대

  • Inset : 위젯의 내부 여백 또는 요소 간 간격을 조정하는 개념. Flutter에서는 Padding, EdgeInsets, SafeArea 등에서 Inset을 설정하여 여백을 조절

  • Provider : Flutter에서 상태 관리(State Management)를 위한 대표적인 패키지. ChangeNotifier를 활용하여 앱의 상태를 효율적으로 관리하고, 위젯 트리에 데이터를 쉽게 공유할 수 있도록 도와줌. <Provider의 핵심 개념> 1. ChangeNotifier → 상태 변경을 알리는 객체 2. ChangeNotifierProvider → ChangeNotifier를 위젯 트리에 등록 3. Consumer → Provider의 값을 사용하고 UI를 자동 업데이트 4. context.watch() / context.read() → Provider 데이터를 가져오는 방법

  • Symmetric : 좌우 또는 상하가 동일한 값을 가지는 것. Flutter에서는 EdgeInsets.symmetric을 사용하여 대칭적인 여백(Padding, Margin 등)을 설정할 때 사용. 대칭적인 여백을 설정하면 코드가 더 간결해짐

  • Import : 다른 파일이나 라이브러리를 가져와서 사용하는 키워드.

  • Override : Dart에서 부모 클래스로터 상속받은 클래스의 메서드를 재정의(Overriding)할 때 사용하는 키워드. Flutter에서는 기본 위젯이나 상태(State) 클래스를 상속받아 특정 메서드를 원하는 방식으로 변경할 때 사용. 객체의 동작을 원하는 방식으로 변경할 때 필수적으로 사용됨

  • Keyword : 프로그래밍 언어에서 특별한 의미를 가지며, 예약되어 있는 단어. 프로그래밍 언어에서 미리 정해져 있어서 특정 기능을 수행하는 단어. 변수나 함수 이름으로 사용할 수 없음.

  • Extends : 클래스를 상속(inheritance)할 때 사용하는 키워드. 즉, 부모 클래스의 속성과 메서드를 자식 클래스에서 그대로 물려받고, 필요하면 추가 기능을 확장(override)할 수 있음

  • Constructor : 클래스의 인스턴스를 생성할 때 자동으로 호출되는 특별한 메서드. 객체가 생성될 때 자동으로 실행되는 함수. 초기값을 설정하거나 필수 데이터를 전달할 때 사용. 기본 생성자, 네이밍 생성자, 초기화 리스트, const 생성자 등 다양한 방식으로 사용 가능

  • Asset : 앱 내부에서 사용하는 정적(Static) 리소스 파일. Flutter에서는 이미지, 폰트, JSON 파일, 로컬 데이터 파일 등을 assets 폴더에 저장하고 사용. Flutter에서 pubspec.yaml에 등록해야 사용할 수 있음

  • Third-party : 공식이 아닌 외부 개발자나 회사가 만든 라이브러리, 플러그인, 소프트웨어 등을 의미. Flutter에서는 공식 SDK 외에도 다양한 서드파티 패키지를 pub.dev에서 다운로드하여 사용

  • Routing : 앱에서 화면(페이지)을 이동하는 기능

  • DI(Dependency Injection) : 의존성 주입. 객체가 직접 의존성을 생성하는 것이 아니라, 외부에서 필요한 객체를 주입(Injection)받는 방식. 객체 간의 결합도를 낮추고, 유지보수를 쉽게 만들 수 있음. 결합도를 낮춰 코드 변경이 쉬워짐. 테스트가 용이해짐

  • Dependency : 의존성. 어떤 객체나 클래스가 다른 객체나 클래스에 의존하는 관계. 즉, A 클래스가 B 클래스를 사용해야만 동작할 수 있다면, A는 B에 "의존"하고 있음. 어떤 객체가 다른 객체를 필요로 하는 관계. 의존성이 강하면 유지보수가 어려워지고, 의존성 주입(DI)을 사용하면 결합도를 낮출 수 있음. Flutter에서는 Provider, GetX, Riverpod 등을 사용하여 의존성을 쉽게 관리 가능

  • Feature Specification : 기능 명세. 앱이나 소프트웨어에서 구현해야 할 기능을 구체적으로 정의한 문서 또는 설명. 즉, 어떤 기능이 어떻게 동작해야 하는지를 정리한 문서. 입력 값, 출력 값, 예외 처리 등을 구체적으로 설명

  • Rebuild : Flutter에서 UI가 다시 그려지는 과정. 즉, 위젯이 변경되었을 때 기존 화면을 새롭게 다시 그리는 것. setState() 호출 시, Provider 상태 변경 시, Bloc 상태 변경 시 위젯이 리빌드됨. 부모 위젯이 리빌드될 때 자식 위젯도 함께 리빌드됨. 불필요한 리빌드를 줄이면 성능 최적화 가능

  • ref(Reference) : Flutter의 Riverpod 상태 관리 라이브러리에서 상태를 읽고 조작하는 객체. 즉, ref를 사용하면 Provider에서 상태를 가져오거나, 상태를 감지하여 UI를 업데이트할 수 있음

  • CRUD(Create, Read, Update, Delete) : 소프트웨어에서 데이터를 다룰 때 기본적으로 수행하는 4가지 작업. 데이터베이스, API, 상태 관리 등에서 CRUD 기능을 구현하여 데이터를 추가, 조회, 수정, 삭제할 수 있음. 데이터를 추가(Create), 조회(Read), 수정(Update), 삭제(Delete)하는 기능

  • Reactive Programming : 데이터의 변화에 따라 자동으로 반응(React)하는 방식으로 프로그램을 설계하는 기법. 즉, 이벤트, 상태 변화, 비동기 데이터 흐름을 감지하고 이에 맞춰 UI나 로직을 자동으로 업데이트하는 패턴. 데이터가 변하면 자동으로 반응하는 프로그래밍 방식. 이벤트 기반, 스트림(Streams), 비동기 데이터 처리에 강함. <리액티브 프로그래밍의 핵심 개념> 1. 데이터 스트림(Streams) : 데이터가 시간의 흐름에 따라 계속해서 흘러가는 형태 2. 비동기 처리(Async) : Future와 Stream을 사용하여 데이터가 도착하면 반응하도록 설계 3. 선언형 UI (State-driven UI) State가 변경되면 UI가 자동으로 업데이트됨(Flutter의 Provider, Riverpod, Bloc 같은 상태 관리 패턴이 리액티브 프로그래밍을 활용함) 4. 이벤트 기반(Event-driven) : 사용자의 입력(버튼 클릭, 스크롤 등)에 따라 이벤트가 발생하고 UI가 반응

  • Controller : Flutter에서 UI와 비즈니스 로직을 연결하는 역할을 하는 객체. UI와 로직을 연결하는 중간 관리자. 사용자의 입력을 처리하고, 상태를 관리하며, UI 업데이트를 트리거하는 역할.

  • Native Module : Flutter에서 플랫폼(Android, iOS)의 네이티브 기능을 직접 사용하기 위해 작성된 코드 또는 브릿지. 즉, Flutter에서 직접 지원하지 않는 네이티브 기능(Android: Kotlin/Java, iOS: Swift/Objective-C)을 호출하는 방식. Flutter에서 Android, iOS의 네이티브 기능을 사용하기 위한 다리(Bridge). 카메라, 위치, 블루투스, 센서 등 네이티브 API를 Flutter에서 사용할 때 필요

  • Native Component : Android(Kotlin/Java)와 iOS(Swift/Objective-C)에서 제공하는 기본 UI 요소

  • Hotfix : 소프트웨어에서 긴급한 버그나 보안 문제를 신속하게 수정하는 업데이트. 보통 기능 추가보다는 치명적인 오류나 보안 취약점을 해결하는 목적으로 사용

  • Domain : 소프트웨어 개발에서 도메인 → "앱이 해결해야 하는 특정 문제 영역". 웹에서 도메인 → "웹사이트의 주소(URL)!" 1. 소프트웨어 개발에서 Domain 1) 도메인 계층(Domain Layer) → 애플리케이션에서 비즈니스 로직이 위치하는 곳 2) 도메인 모델(Domain Model) → 특정 문제를 해결하기 위한 데이터와 규칙 2. 웹에서 Domain : 웹사이트 주소 1) google.com 같은 웹사이트 주소 2) 사용자가 쉽게 접근할 수 있도록 IP 주소 대신 사용 3) DNS(Domain Name System)를 통해 실제 서버와 연결

  • Firebase : Google에서 제공하는 클라우드 기반의 모바일 및 웹 애플리케이션 개발 플랫폼. 즉, 백엔드 서버 없이도 데이터베이스, 인증, 푸시 알림 등을 쉽게 사용할 수 있도록 도와주는 서비스

  • Rest API(Representational State Transfer API) : 클라이언트(앱)와 서버가 HTTP를 통해 데이터를 주고받는 방식. 즉, Flutter 앱과 백엔드 서버가 데이터를 주고받을 때 사용하는 표준적인 통신 방법. <REST API의 주요 특징> 1. 클라이언트-서버 구조 → Flutter 앱(클라이언트)이 서버와 데이터를 주고받음 2. HTTP 요청 방식 사용 → GET, POST, PUT, DELETE 등의 요청 방식 지원 3. JSON 형식 데이터 사용 → 서버에서 JSON 형식으로 데이터를 주고받음 4. 무상태(Stateless) → 요청과 응답이 각각 독립적으로 처리됨

  • Skia : Flutter의 그래픽 엔진으로, 화면에 UI를 렌더링하는 역할을 하는 2D 그래픽 라이브러리. Google이 개발했으며, Flutter뿐만 아니라 Chrome, Android, Firefox 등 다양한 플랫폼에서 사용 <Skia의 특징> 1. 하드웨어 가속(GPU 지원) → 빠른 렌더링 속도 제공 2. 플랫폼 독립적 → Android, iOS, Windows, macOS, Linux 등에서 사용 가능 3. 벡터 그래픽 및 비트맵 지원 → 커스텀 UI 구현 가능 4. Flutter에서 UI를 직접 렌더링 → 네이티브 위젯이 아니라, Skia가 모든 UI를 직접 그림

  • Masking : UI에서 특정 영역만 보이게 하거나, 일부를 가리는 그래픽 기법. 이미지나 위젯의 특정 부분만 보이도록 잘라내는 효과. 텍스트, 버튼, 이미지 등에 투명도, 그라디언트, 블러 효과 등을 적용할 때 사용

  • Port : 컴퓨터 또는 네트워크에서 특정 서비스나 애플리케이션이 데이터를 주고받는 출입구(통로) 역할을 하는 번호. Flutter에서는 로컬 서버(API), 웹 소켓 통신, 네트워크 요청 등에 포트가 사용됨. <Port의 주요 특징> 1. IP 주소 + 포트 번호 조합으로 특정 서비스에 연결 2. 0~65535까지 존재하며, 특정 용도로 예약된 포트가 있음 3. 같은 컴퓨터에서도 서로 다른 서비스는 각기 다른 포트를 사용할 수 있음

  • Generate : Dart에서 리스트(List)를 동적으로 생성하는 함수. 즉, 특정 개수만큼 요소를 자동으로 생성할 때 사용. 반복문 없이 리스트를 자동으로 생성하는 함수. 리스트의 각 요소를 특정 규칙에 따라 동적으로 만들 수 있음

  • ClipRRect : Flutter에서 위젯의 모서리를 둥글게 자를 때 사용하는 위젯

  • Spread 연산자(...) : Dart에서 리스트, 맵(Map), 셋(Set) 같은 컬렉션을 펼쳐서 다른 컬렉션에 삽입할 때 사용하는 연산자. 즉, 기존 리스트(배열) 또는 컬렉션의 요소들을 개별적으로 분해하여 새로운 컬렉션을 만들 때 유용. 배열 요소를 쉽게 추가하거나, 리스트를 합칠 때 사용됨

  • Collection : Dart에서 여러 개의 값을 하나의 그룹으로 묶어서 관리하는 데이터 구조. 대표적으로 List(순서 있음, 중복 가능), Set(중복 없음), Map(키-값 저장)이 컬렉션에 해당. 여러 개의 데이터를 한 번에 저장하고 관리할 수 있는 자료 구조

  • Map : Dart에서 키(Key)와 값(Value)을 한 쌍(Pair)으로 저장하는 컬렉션 타입. 즉, 각 데이터를 특정한 키를 이용해 저장하고, 빠르게 검색할 수 있는 자료구조. 배열(List)처럼 인덱스가 아니라 키(Key)로 데이터를 찾음. <Map의 주요 특징> 1. 키(Key)는 중복될 수 없음 → 같은 키를 여러 번 저장하면 마지막 값으로 덮어씀 2. 값(Value)은 중복 가능 3. 키-값 쌍(Pair)으로 저장하여 검색 속도가 빠름

  • List : Dart에서 여러 개의 데이터를 순서대로 저장하는 컬렉션 타입. 즉, 배열(Array)과 비슷한 개념으로, 여러 개의 값을 인덱스(Index)를 사용하여 관리. 여러 개의 데이터를 저장하고, 순서대로 관리하는 자료 구조. 0번부터 시작하는 인덱스를 사용해 값을 가져올 수 있음. <List의 주요 특징> 1. 순서(인덱스)가 있는 데이터 구조 → 첫 번째 요소는 list[0]으로 접근 2. 중복된 값 저장 가능 3. 크기가 동적으로 변할 수 있음

  • Offset : Flutter에서 2D 좌표(위치)를 표현하는 클래스. (x, y) 좌표를 사용하여 위치를 지정할 때 사용. 화면에서 특정 위치를 나타내는 (x, y) 좌표. 위젯을 이동시키거나, 그림을 그릴 때 사용

  • GestureDetector : Flutter에서 사용자의 터치 이벤트(탭, 드래그, 스와이프, 더블탭 등)를 감지하는 위젯. 즉, 버튼이 아닌 일반 위젯(Container, 이미지 등)에서도 제스처를 감지할 수 있도록 도와줌. ex) 버튼이 아닌 다른 위젯에서도 클릭 이벤트를 만들 수 있음

  • Container : Flutter에서 UI 요소를 배치하고 스타일링할 때 사용하는 기본적인 레이아웃 위젯. 즉, 크기, 색상, 여백, 패딩, 정렬, 테두리 등을 설정할 수 있는 다용도 박스 위젯. Flutter에서 레이아웃을 만들 때 가장 많이 사용하는 기본 위젯. 텍스트, 이미지, 버튼 등을 감싸서 스타일링할 수 있음

  • Padding : 내부 여백(컨텐츠와 테두리 사이) 설정하는 속성 또는 위젯

  • Margin : 외부 여백(위젯과 다른 요소 사이) 설정하는 속성 또는 위젯

  • Alignment : 내부 요소 정렬 속성 또는 위젯의 위치를 정렬할 때 사용하는 클래스

  • Sizebox : Flutter에서 위젯의 크기를 지정하거나 빈 공간(Spacing)을 만들 때 사용하는 위젯. 즉, 고정된 너비(width)와 높이(height)를 가지는 박스를 만들거나, 위젯 간 간격을 줄 때 사용

  • this : Dart에서 현재 클래스의 인스턴스를 가리키는 키워드. 즉, 클래스 내부에서 해당 객체 자신을 참조할 때 사용. 같은 이름의 변수(매개변수 vs 필드)를 구분할 때 사용

  • Utility Function : 유틸리티 함수. 특정 객체에 종속되지 않고, 여러 곳에서 공통적으로 사용되는 기능을 수행하는 함수. 즉, 반복적으로 사용되는 기능을 따로 빼서 정적 메서드(static)로 만들어 필요할 때마다 호출할 수 있도록 만든 함수. 여러 곳에서 공통적으로 사용하는 함수. 객체를 만들지 않고, 필요할 때마다 바로 호출할 수 있는 함수

  • Message Passing : 프로그램 내에서 객체 또는 프로세스 간에 데이터를 주고받는 방식. 즉, 하나의 객체(또는 프로세스)가 다른 객체(또는 프로세스)에게 메시지를 보내고, 이를 처리하는 방식

  • Rollback : 시스템이나 데이터베이스에서 오류가 발생했을 때, 이전 상태로 되돌리는 과정. 즉, 잘못된 변경 사항을 취소하고 원래의 정상적인 상태로 복구하는 기능 <롤백의 특징> 1. 데이터 무결성 유지 : 잘못된 변경이 반영되지 않도록 보호 2. 트랜잭션 지원: 여러 작업을 하나의 단위로 묶어 관리 가능 3. 비정상 종료 복구 : 앱 충돌, 오류 발생 시 안전하게 원래 상태로 복원 4. Flutter에서는 DB 트랜잭션, 상태 관리(Bloc, Provider) 등에 활용

  • A/B 테스트 : 두 가지 버전(A와 B)을 만들어 사용자 반응을 비교 분석하는 실험 방법. 즉, 어떤 디자인, 기능, 콘텐츠가 더 효과적인지 데이터 기반으로 결정하는 과정. <A/B 테스트의 특징> 1. 데이터 기반 의사 결정: 감이 아닌 실제 데이터를 바탕으로 선택 가능 2. 사용자 경험 개선: 어떤 UI/UX 기능이 더 좋은지 검증 가능 3. 자동화된 분석 가능: Firebase Remote Config, Google Optimize 등과 연동하여 테스트 가능

  • Object-Oriented Programming, OOP : 객체지향 프로그래밍. 프로그램을 객체(클래스) 단위로 구성하여 개발하는 방식. 즉, 데이터와 그 데이터를 조작하는 함수를 하나의 객체로 묶어 관리하는 프로그래밍 패러다임. Flutter에서는 모든 UI 요소가 위젯(객체)으로 구성됨. <객체지향 프로그래밍의 4가지 핵심 특징> 1. 캡슐화(Encapsulation) : 객체 내부의 데이터를 숨기고 필요한 기능만 외부에 제공 2. 상속(Inheritance) : 기존 클래스를 재사용하여 새로운 클래스를 만들 수 있음 3. 다형성(Polymorphism) : 같은 메서드라도 객체에 따라 다르게 동작. 4. 추상화(Abstraction) : 불필요한 부분은 감추고 필요한 기능만 노출

  • Apache Cordova : HTML, CSS, JavaScript로 모바일 앱을 개발할 수 있는 오픈소스 프레임워크. 즉, 웹 기술을 사용하여 하이브리드 앱(웹+네이티브 기능 포함 앱)을 개발. Flutter와 달리 WebView 기반으로 실행. 웹을 기반으로 한 앱 개발에 적합

  • WebView : 모바일 앱 안에서 웹 페이지를 표시할 수 있는 내장 브라우저 컴포넌트. 즉, 네이티브 앱 내에서 HTML, CSS, JavaScript로 만든 웹 콘텐츠를 실행할 수 있도록 해줌. 앱 안에 작은 웹 브라우저를 넣는 기능. Flutter에서는 WebView 위젯을 사용하여 웹 페이지를 표시할 수 있음

  • Ionic : HTML, CSS, JavaScript로 모바일 및 웹 애플리케이션을 개발할 수 있는 오픈소스 프레임워크. 즉, 웹 기술을 사용하여 하이브리드 앱(웹+네이티브 기능 포함 앱)을 개발. Flutter와 달리 WebView 기반으로 실행. 웹을 기반으로 한 앱 개발에 적합

  • Flex : UI 레이아웃을 유연하게 배치하는 방식. 즉, 공간을 자동으로 나누고 조절하여 다양한 화면 크기에 대응할 수 있도록 도와주는 레이아웃 시스템. 화면 크기에 맞게 위젯들을 자동으로 정렬해주는 기능

  • YAML(YAML Ain’t Markup Language) : 사람이 읽기 쉬운 데이터 형식으로, 설정 파일 등에 자주 사용. Flutter에서는 pubspec.yaml 파일을 이용해 패키지, 의존성, 프로젝트 설정 등을 정의. JSON이나 XML처럼 데이터를 저장하는데, 더 쉽고 직관적인 문법을 가진 설정 파일. JSON은 API 응답 등에 적합, YAML은 설정 파일(.yaml) 관리에 적합. <YAML의 주요 특징> 1. 들여쓰기(Indentation) 기반 구조 : {}나 [] 대신 들여쓰기로 계층을 표현 2. 확장자: .yaml 또는 .yml : Flutter 프로젝트에서는 pubspec.yaml 파일이 필수 3. JSON보다 가독성이 좋음 : {} 없이 단순한 텍스트 형식으로 데이터 작성 4. 설정 파일, 데이터 저장, CI/CD 환경 구성 등에 사용.

  • Markup : 문서의 구조를 정의하는 언어. 즉, 텍스트에 태그(tag)나 기호를 추가하여 문서의 의미와 형식을 지정하는 방법 <Markup의 주요 특징> 1. 데이터의 의미(구조)를 정의 : 문서가 어떻게 구성되는지를 설명하는 역할 2. 태그(Tag) 또는 기호를 사용 : h1, p 같은 태그로 문서의 구조를 표현 (예: HTML) 3. 사람이 읽기 쉬운 형식 : 프로그래밍 언어와 달리, 데이터를 쉽게 작성하고 이해할 수 있음 4. 다양한 마크업 언어 존재 : HTML, XML, Markdown, YAML 등이 대표적인 마크업 언어

  • Side Effect : 함수나 메서드가 기대한 결과 외에 추가적인 영향을 미치는 현상. 순수 함수는 Side Effect가 없으며, 상태 변경, API 요청, 파일 저장 등은 Side Effect가 있음. 실행할 때마다 결과가 달라질 수 있음

  • Pure Function : 같은 입력값을 주면 항상 같은 결과를 반환하며, 외부 상태를 변경하지 않는 함수. 함수의 동작이 예측 가능한 함수

  • Parsing : 문자열 데이터를 특정 형식으로 변환하는 과정. 즉, 텍스트 데이터를 읽고, 의미 있는 구조로 변환하는 것. 문자열 데이터를 숫자, JSON, XML 등 원하는 형식으로 변환하는 것. <Parsing이 필요한 이유> 1. API 데이터 활용 : 백엔드에서 JSON 데이터를 받아와 앱에서 사용하려면 JSON을 Map 또는 객체로 변환해야 함 2. 사용자 입력 처리 : 입력된 문자열을 숫자, 날짜 등으로 변환하여 사용해야 하는 경우 3. 파일 및 데이터베이스 연동 : 저장된 데이터를 읽고 올바른 형식으로 변환하여 사용해야 함

  • Scheme : URL 또는 특정 프로토콜에서 자원의 위치와 접근 방법을 정의하는 부분. 즉, URL에서 가장 앞부분에 위치하며, 브라우저나 시스템이 해당 리소스를 어떻게 처리해야 하는지를 결정하는 역할. URL에서 http://, https://, mailto:, tel: 같은 부분이 스킴. 앱에서는 deeplink://, myapp:// 같은 커스텀 스킴을 정의할 수도 있음 <Scheme의 주요 특징> 1. 특정 프로토콜을 나타냄 : http, https, ftp, mailto, tel, file 등 다양한 스킴 존재 2. URL의 가장 앞부분에 위치 3. 웹뿐만 아니라 모바일 앱에서도 사용됨 : 딥링크(Deep Link)를 이용하면 앱을 특정 화면으로 직접 실행 가능

  • Rendering : 데이터나 코드를 화면에 그래픽으로 변환하는 과정. 코드로 작성한 UI를 실제 화면에 그려주는 과정. <Flutter의 렌더링 과정> Flutter의 렌더링 시스템은 3단계로 이루어짐 1. 위젯 트리 (Widget Tree) 생성 : 개발자가 작성한 위젯(UI 요소)을 트리 구조로 관리 2. 요청된 UI를 렌더 트리(Render Tree)로 변환 : Flutter 엔진이 위젯을 실제 화면에 그릴 수 있도록 변환 3. Skia 엔진을 이용해 실제 화면에 그림 : Flutter는 네이티브 UI를 사용하지 않고 Skia 엔진을 통해 직접 렌더링

  • Stretch : 컨테이너 안에서 요소가 가능한 한 최대 크기로 확장되도록 만드는 동작. 즉, 공간이 허용되는 한 요소를 늘려 정렬하는 방식

  • Cache : 자주 사용하는 데이터를 빠르게 불러오기 위해 임시로 저장하는 공간. 즉, 속도를 높이기 위해 데이터를 미리 저장해두고, 필요할 때 빠르게 접근할 수 있도록 도와주는 기술. Flutter에서는 이미지, API 응답, 파일 등을 캐싱하여 성능을 최적화할 수 있음. <캐시의 주요 특징> 1. 빠른 데이터 접근 가능 : 동일한 요청을 다시 실행할 때 기존 데이터를 재사용하여 속도를 향상 2. 네트워크 요청 감소 : API 응답 데이터를 캐싱하면 불필요한 네트워크 요청을 줄일 수 있음 3. 디스크 또는 메모리에 저장됨 : 1) 메모리 캐시(RAM): 빠르지만 앱을 종료하면 사라짐 2) 디스크 캐시(Storage): 느리지만 앱을 다시 실행해도 유지됨 4. 만료 정책 존재 (TTL, Time To Live) : 캐시는 오래 보관하면 낡은 데이터가 될 수 있기 때문에, 자동으로 삭제되는 시간(유효 기간)을 설정 가능

  • expanded widget : Expanded 위젯은 부모 위젯의 남은 공간을 꽉 채우는 역할

  • stack widget : 여러 개의 위젯을 서로 겹쳐서 배치할 수 있는 Flutter 레이아웃 위젯. 즉, 위젯들을 겹쳐 쌓아서(스택 구조로) 배치하는 방식을 제공

  • Inter : 가장 많이 사용되는 무료 Sans-serif 폰트 중 하나로, 가독성이 뛰어난 글꼴. 주로 웹, 모바일 UI, 대시보드, 앱 디자인 등에서 사용

  • Statelesswidget : 상태(State)가 변하지 않는 위젯. 즉, UI가 한 번 생성되면 이후 변경되지 않는 정적인 위젯. 화면을 다시 그릴 필요가 없는 경우 사용. <Stateless 위젯의 주요 특징> 1. 상태(State)가 없는 정적인 UI -> UI가 사용자 입력이나 데이터 변경에 따라 업데이트되지 않음. 예: 텍스트, 아이콘, 이미지, 버튼 등 고정된 요소 2. build() 메서드에서 한 번만 UI를 생성 : build() 메서드는 위젯이 처음 그려질 때만 실행됨 3. 성능이 뛰어남 : 불필요한 setState() 호출이 없어서 빠르고 가벼운 위젯 4. const 키워드와 함께 사용하면 렌더링 최적화 가능 : 불필요한 위젯 빌드를 줄여 앱 성능 향상

  • StatefulWidget : 상태(State)가 변할 수 있는 위젯. 즉, 사용자의 입력이나 데이터 변경에 따라 UI가 다시 렌더링되는 동적인 위젯. <Stateful 위젯의 주요 특징> 1. 상태(State)를 가짐 : State 객체를 사용해 UI를 변경할 수 있음. 상태가 변하면 setState()를 호출하여 UI를 다시 렌더링 2. 동적인 UI 구현 가능 : 버튼 클릭, API 데이터 로딩, 애니메이션 같은 변화가 필요한 UI에서 사용됨 3. createState() 메서드 필요 : StatefulWidget은 createState()를 사용해 상태를 관리하는 State 객체를 생성 4. setState()를 호출하면 UI가 업데이트됨 : 상태가 변경될 때만 필요한 부분만 다시 그려서 성능 최적화

  • PageView widget : 여러 개의 페이지를 좌우(수평) 또는 상하(수직)로 스와이프할 수 있도록 도와주는 위젯. 즉, 앱에서 슬라이더, 온보딩 화면, 탭 뷰, 이미지 갤러리 등을 만들 때 유용한 위젯

  • View widget : View 위젯은 특정한 위젯이 아니라, UI를 화면에 표시하는 기본적인 컨테이너 역할을 하는 위젯들을 의미. Container, ListView, GridView, Stack 등 화면을 구성하는 위젯들이 View 역할을 수행

  • Layout widget : 텍스트, 버튼, 이미지 등의 위젯을 화면에서 원하는 위치에 배치하는 데 사용되는 위젯들을 의미. Flutter에서는 Column, Row, Stack, GridView 같은 위젯이 레이아웃을 구성하는 데 사용됨

  • GridView widget : Flutter에서 위젯들을 격자(그리드) 형태로 배치할 수 있도록 도와주는 레이아웃 위젯입니다. 즉, 갤러리, 제품 목록, 카드 UI 등 여러 개의 항목을 정렬하는 데 사용

  • Functional Widget : 기능성 위젯. Flutter에서 특정한 기능을 수행하는 위젯. 즉, 레이아웃을 구성하는 것이 아니라, 애니메이션, 제스처, 네트워크 요청, 사용자 입력 처리 등의 기능을 담당하는 위젯. GestureDetector, FutureBuilder, StreamBuilder, Hero 등...

  • View : 사용자에게 화면(UI)을 보여주는 모든 요소를 의미. 즉, Flutter에서 View는 사용자가 눈으로 볼 수 있는 위젯(텍스트, 버튼, 이미지, 리스트 등)들을 포함하는 개념

  • TabBar widget : Flutter에서 여러 개의 페이지(탭)를 전환할 수 있도록 도와주는 네비게이션 위젯. 즉, 앱에서 상단에 탭 메뉴를 추가하여 사용자가 쉽게 화면을 변경할 수 있도록 함. <Flutter에서 TabBar를 구성하는 3가지 요소> 1. TabBar → 탭 버튼을 표시하는 위젯 2. TabBarView → 선택한 탭에 따라 변경되는 화면 3. TabController → 탭의 상태를 관리하는 컨트롤러

  • ListView widget : Flutter에서 여러 개의 위젯을 스크롤 가능한 리스트 형태로 표시할 때 사용하는 위젯. 긴 목록을 효율적으로 관리하고 표시할 때 필수적인 위젯

  • exception : 프로그램 실행 중 발생하는 오류. try-catch를 사용하여 안전하게 예외 처리 가능. 네트워크, 데이터 변환, 사용자 입력 등 다양한 상황에서 발생 가능 <Dart에서 Exception(예외)의 주요 특징> 1. 실행 중(Runtime) 오류 발생 : 문법 오류(컴파일 오류)와 달리, 프로그램 실행 도중 오류가 발생 2. throw 키워드를 사용하여 예외 발생 가능 : 특정 상황에서 직접 예외를 발생시킬 수 있음 3. try-catch를 사용하여 예외 처리 가능 : 예외가 발생하면 프로그램이 멈추지 않도록 대응하는 코드 작성 가능 4. Dart의 기본 예외 유형 1) FormatException → 형식 오류 (예: 숫자가 아닌 문자열을 int로 변환) 2) TimeoutException → 네트워크 요청 시간 초과 3) IOException → 파일 입출력 오류 4) RangeError → 리스트 인덱스 범위 초과

  • Default Constructor : 기본 생성자. 클래스의 인스턴스를 만들 때 자동으로 호출되는 생성자 중 가장 기본적인 형태. 즉, 매개변수가 없거나, 모든 매개변수가 선택적이며 기본값을 가지는 생성자. 클래스를 생성할 때 자동으로 실행되는 기본 함수. Dart에서는 생성자를 직접 정의하지 않으면 기본 생성자가 자동으로 제공됨. 클래스 이름과 동일한 함수 형태로 선언됨. 매개변수를 추가하여 원하는 방식으로 초기화 가능

  • Named Constructor : Dart에서 클래스의 여러 개의 생성자를 만들 때 사용되는 특별한 생성자. 즉, 기본 생성자 외에도 추가적인 생성자를 정의할 때 사용되며, 클래스명.이름() 형태로 호출 가능. JSON 데이터 변환, 특정 값 초기화, 빈 객체 생성 등 다양한 상황에서 활용 가능

  • Factory Constructor : Dart에서 객체를 생성하는 특별한 생성자로, 매번 새로운 인스턴스를 만들지 않고 기존 객체를 반환하거나 커스텀 로직을 적용할 수 있음. 즉, 객체를 캐싱하여 재사용하거나, 특정 조건에 따라 다른 인스턴스를 반환할 때 유용한 생성자. 싱글톤 패턴, JSON 변환, 특정 조건에 따른 객체 생성 등에 사용됨. <팩토리 생성자의 주요 특징> 1. factory 키워드를 사용하여 정의 2. 항상 새로운 인스턴스를 생성하지 않고 기존 객체를 반환 가능 3. JSON 변환, API 응답 처리, 캐싱 등에 유용 4. return 키워드를 사용할 수 있음 (일반 생성자는 return 사용 불가) 5. 생성자 내부에서 this를 직접 사용할 수 없음 (기본 생성자와 차이점)

  • Initializer List : 초기화 리스트. Dart에서 생성자가 실행되기 전에 인스턴스 변수의 값을 초기화하는 방법. 즉, 생성자의 본문(body)이 실행되기 전에 필드를 초기화할 수 있도록 해주는 문법. 객체가 생성될 때 특정 필드를 빠르게 초기화할 수 있음. 생성자가 실행되기 전에 변수 값을 먼저 설정하는 문법. <초기화 리스트의 주요 특징> 1. 생성자의 본문이 실행되기 전에 필드 초기화 가능 2. :(콜론) 뒤에 초기화할 값을 지정 3. final 변수(한 번만 설정 가능한 변수)를 초기화할 때 필수 4. 부모 클래스의 생성자를 호출할 때도 사용 (super)

  • Final Fields : 한 번만 값을 할당할 수 있는 클래스의 인스턴스 변수. 즉, 객체가 생성될 때 값이 결정되며, 이후 변경할 수 없는 필드. <Dart에서 Final Fields의 주요 특징> 1. 한 번만 값을 할당할 수 있음 : 생성자에서 값을 설정할 수 있지만, 이후 변경 불가 2. final 키워드 사용: final을 사용하여 선언 3. 반드시 초기화해야 함 : 초기값을 직접 할당하거나, 생성자 또는 초기화 리스트에서 할당 가능 4. 런타임 시 결정 가능 (컴파일 타임이 아님) : const와 달리, 실행 중 동적으로 값 할당 가능

  • super : 부모 클래스(상위 클래스)의 생성자, 메서드 또는 필드에 접근할 때 사용하는 키워드. 즉, 자식 클래스에서 부모 클래스의 기능을 호출하거나 확장할 때 사용

  • Call : 호출. 함수(메서드)나 생성자를 실행하는 행위. 즉, 코드에서 특정 함수나 메서드를 실행할 때 "호출한다"라고 표현. <Dart에서 호출(Call)의 주요 유형> 1. 함수(Function) 호출 2. 클래스의 메서드(Method) 호출 3. 생성자(Constructor) 호출 4. 객체를 함수처럼 호출하는 call() 메서드 사용. <호출(Call)이 필요한 이유> 1. 코드 실행을 제어할 수 있음 : 필요한 시점에 특정 함수를 실행하여 프로그램을 동작시킴 2. 객체 지향 프로그래밍에서 메서드를 활용 가능 : 클래스 내부의 기능을 호출하여 다양한 동작 수행 가능 3. 재사용성을 높일 수 있음 : 한 번 정의한 함수나 메서드를 여러 번 호출하여 반복적인 작업을 줄일 수 있음

  • Initialization : 초기화. 변수나 객체가 사용되기 전에 처음으로 값을 설정하는 과정. 변수 선언 후 반드시 초기화해야 사용할 수 있음. 초기화 관련 키워드 (final, const, late)

  • Operator : 값(피연산자)들을 사용하여 특정 연산을 수행하는 기호 또는 키워드. 즉, 숫자 계산, 비교, 논리 연산, 할당 등을 수행하는 데 사용되는 기호. 연산자는 프로그램에서 데이터를 처리하고 조작하는 핵심 요소. <연산자의 주요 유형> 1. 산술 연산자 (Arithmetic Operators) → +, -, *, /, ~/, % 2. 비교 연산자 (Comparison Operators) → ==, !=, <, >, <=, >= 3. 논리 연산자 (Logical Operators) → &&, ||, ! 4. 할당 연산자 (Assignment Operators) → =, +=, -=, *=, /=, ~/= 5. 조건 연산자 (Conditional Operators) → ?:, ??, ??= 6. 비트 연산자 (Bitwise Operators) → &, |, ^, ~, <<, >> 7. 타입 검사 연산자 (Type Test Operators) → is, is!, as 8. 커스텀 연산자 오버로딩 (Operator Overloading) → operator +, operator - 등

  • Conditional Operators : 조건 연산자 (?:, ??, ??=) ?:는 if-else 대체, ??는 null 값 대체, ??=는 null이면 값 할당

  • Type Test Operators : 타입 검사 연산자 (is, is!, as) is는 타입 확인, is!는 타입이 아닌지 확인, as는 타입 변환

  • Argument : 인자. 함수나 메서드를 호출할 때 전달하는 값. 즉, 함수가 원하는 데이터를 외부에서 전달할 수 있도록 해주는 요소. 함수에 값을 전달하는 것. <인자의 주요 유형> 1. 필수 인자 (Positional Arguments) : (값1, 값2), 무조건 값을 전달해야 함 2. 선택적 인자 (Optional Arguments) : [값1, 값2], 값을 전달하지 않아도 됨 (null 허용) 3. 명명된 인자 (Named Arguments) : {이름: 값}, 이름을 지정하여 값을 전달4. 기본값을 가진 인자 (Default Arguments) : {이름: 값 = 기본값}, 값을 전달하지 않으면 기본값 사용

  • Ternary Operator : 3항 연산자. 조건을 평가한 후 참(true) 또는 거짓(false)에 따라 다른 값을 반환하는 연산자. 즉, if-else 문을 간단하게 줄여서 표현할 수 있는 연산자. "조건 ? 참일 때 값 : 거짓일 때 값" 형식으로 사용. 여러 개의 조건을 중첩하여 if-else if-else를 대체할 수 있음. 조건이 많아질 경우 가독성이 떨어질 수 있음

  • Function : 특정 작업을 수행하는 코드 블록으로, 필요할 때 호출하여 실행할 수 있는 재사용 가능한 코드 단위. 즉, 같은 작업을 여러 번 반복해야 할 때, 코드를 효율적으로 관리하기 위해 사용. void 함수명() {} 또는 타입 함수명() => 값; 형식으로 정의. 매개변수(인자)를 받을 수 있음. 값을 반환할 수도 있고(return 사용), 반환하지 않을 수도 있음. 화살표 함수(Arrow Function)로 간결하게 표현 가능

  • void : 함수가 값을 반환하지 않을 때 사용하는 키워드. 즉, 함수가 실행되지만 return 값이 없을 때 사용. <void의 주요 특징> 1. 반환값이 없는 함수에 사용 2. return 문이 없어도 자동으로 종료됨 3. return;을 사용할 수도 있지만 생략 가능 4. void를 생략하면 기본적으로 dynamic으로 처리됨

  • dynamic : 모든 타입을 가질 수 있는 변수 타입. 즉, 변수의 타입이 실행 시간(Runtime)에 결정되며, 숫자, 문자열, 리스트 등 어떤 값이든 저장할 수 있음. 너무 남용하면 타입 안정성이 떨어질 수 있으므로 주의 필요

  • return : 함수가 실행 결과를 호출한 곳으로 돌려줄 때 사용하는 키워드. 즉, 함수 내부에서 연산을 수행한 후 결과값을 반환(return)할 때 사용. 함수가 계산한 결과를 함수 호출 위치로 돌려주는 역할. return 값; 형식으로 사용. return이 실행되면 함수는 즉시 종료됨. 화살표 함수(=>)에서도 return을 생략 가능

  • Arrow Function : 화살표 함수. => 기호를 사용하여 간결하게 작성할 수 있는 함수 표현식. return을 생략 가능 (자동 반환). 한 줄짜리 함수에서만 사용 가능. 매개변수가 없는 함수에도 사용 가능

  • Declaration : 선언. 변수, 함수, 클래스 등의 이름과 타입을 정의하여 사용할 준비를 하는 과정. 즉, 코드에서 특정 요소를 처음 정의하는 행위. 변수나 함수를 처음 만들 때 '이런 게 있어!' 하고 알려주는 것. 선언만 하면 메모리에는 공간이 잡히지만, 값을 할당하지 않으면 사용 불가능

  • main() 함수 : 프로그램이 실행될 때 가장 먼저 호출되는 진입점(Entry Point) 함수. 코드가 실행될 때 시작되는 함수이며, 반드시 main() 함수가 있어야 프로그램이 실행. void main() 형식으로 작성 (반환값 없음). main() 함수 내에서 다른 함수 호출 가능

  • Definition : 정의. 변수, 함수, 클래스 등이 어떤 동작을 하는지 구체적으로 작성하는 것. 즉, 어떤 요소를 "선언(Declaration)"한 후, 그것이 어떻게 동작하는지를 코드로 작성하는 과정. 코드에서 변수, 함수, 클래스 등의 내용을 직접 작성하는 것. 변수를 선언하고 값을 할당하거나, 함수를 선언하고 내부 로직을 작성하는 것이 '정의'

  • Callback Function : 콜백 함수. 다른 함수의 인자로 전달되어 나중에 실행되는 함수. 즉, 어떤 이벤트가 발생하거나 특정 작업이 끝난 후 실행되는 함수. 함수 안에 함수. 어떤 함수가 실행된 후 나중에 호출되는 함수. 함수 자체를 변수처럼 다른 함수의 인자로 전달 가능. 비동기 작업, 이벤트 핸들링, 커스텀 연산 등에 유용하게 사용됨

  • Terminal : 명령어를 입력하여 컴퓨터와 상호작용하는 텍스트 기반 인터페이스. 마우스를 사용하지 않고, 키보드로 명령을 입력하여 컴퓨터를 조작하는 창. 파일 관리, 프로그램 실행, 코드 빌드, 네트워크 설정 등을 수행할 수 있음. Windows, macOS, Linux에서 모두 사용 가능하며, 개발자에게 필수적인 도구. GUI(그래픽 인터페이스) 없이 텍스트 기반으로 동작

  • CMD(Command Prompt) : 명령 프롬프트. Windows 기본 쉘. 오래된 MS-DOS 기반의 명령어를 사용합니다. 파워셸(PowerShell)보다 기능이 적고, 리눅스 명령어를 지원하지 않습니다. CMD는 "오래된 비서"이고, PowerShell은 "새로운, 더 똑똑한 비서"입니다.

  • Shell : 쉘. 명령어 해석기. 터미널에서 입력한 명령어를 해석하고 실행하는 프로그램. 운영체제와 사용자를 연결하는 중간 관리자 역할. 사용자가 터미널(전화기)을 통해 명령을 내리면, 쉘(비서)이 이를 해석하여 운영체제(사장님)에게 전달

  • Higher-Order Function : 고차 함수. 다른 함수를 매개변수로 받거나, 실행 결과로 함수를 반환하는 함수. 더 유연하고 재사용 가능한 코드를 작성할 수 있도록 도와줌

  • GPU(Graphics Processing Unit) : 그래픽 처리 장치. 이미지, 동영상, 3D 그래픽 등의 복잡한 연산을 빠르게 처리하는 프로세서. 즉, CPU처럼 연산을 수행하지만, 그래픽과 병렬 연산에 특화된 하드웨어. CPU가 뇌라면, GPU는 수많은 작은 뇌(코어)로 동시에 작업을 수행하는 병렬 연산 장치. AI, 머신러닝, 데이터 분석, 블록체인 연산에도 활용됨. 게임, 3D 모델링, 영상 편집, 가상 현실(VR) 등에 필수적

  • GUI(Graphical User Interface) : 사용자가 그래픽 요소(아이콘, 버튼, 창 등)를 이용하여 컴퓨터와 상호작용하는 방식. 텍스트 기반 명령어(CLI) 없이 마우스와 화면을 사용하여 쉽게 조작할 수 있는 인터페이스

  • CLI(Command Line Interface) : 사용자가 키보드로 명령어를 입력하여 컴퓨터와 상호작용하는 방식

  • Event Handling : 이벤트 핸들링. 사용자가 발생시킨 이벤트(클릭, 터치, 키 입력 등)에 반응하는 기능을 구현하는 것. onPressed, onTap, onChanged 등을 활용하여 이벤트 처리>

  • Loop : 반복문. 특정 코드 블록을 여러 번 실행할 수 있도록 해주는 제어 구조. 즉, 같은 작업을 반복해야 할 때, 코드 중복을 줄이고 효율적으로 실행하기 위해 사용. <반복문의 주요 유형> 1. for 반복문 → 반복 횟수가 정해진 경우 사용 2. while 반복문 → 조건이 참(true)인 동안 실행 3. do-while 반복문 → 최소 한 번은 실행한 후 조건 검사 4. for-in 반복문 → 리스트, 맵(Map) 등 컬렉션 순회

  • Conditional Statement : 조건문. 주어진 조건에 따라 프로그램의 실행 흐름을 제어하는 문법. 즉, 조건이 참(true)이면 특정 코드 블록을 실행하고, 거짓(false)이면 다른 코드 블록을 실행하는 방식. <조건문의 주요 유형> 1. if 문 → 특정 조건이 true일 때 실행 2. if-else 문 → 조건이 true이면 실행, false이면 다른 코드 실행 3. if-else if-else 문 → 여러 개의 조건을 순차적으로 검사 4. switch-case 문 → 값에 따라 실행할 코드 블록 선택

  • Thread : 프로그램 내에서 실행되는 가장 작은 단위의 작업 흐름. 즉, 프로세스(Process) 내에서 실행되는 독립적인 실행 단위. 하나의 프로그램(프로세스) 안에서 여러 개의 작업(스레드)이 동시에 실행될 수 있음. Future, async/await, Isolate를 활용하여 스레드 관리 가능.

  • Event Loop : 이벤트 루프. 비동기 프로그래밍에서 여러 작업을 효율적으로 처리하는 메커니즘. Dart(Flutter)에서 Future, async/await, Isolate 등을 관리하여 비동기 작업을 순차적으로 실행하는 역할. 싱글 스레드 환경에서 여러 작업을 효율적으로 실행하는 방법 <Dart의 이벤트 루프 동작 방식> 1. main() 함수 실행 → 이벤트 루프가 시작됨 2. 동기(Synchronous) 코드 먼저 실행 3. 비동기(Asynchronous) 작업(Future, async/await)을 이벤트 큐에 추가 4. 현재 실행 중인 코드가 끝나면, 이벤트 큐에서 작업을 하나씩 실행 <이벤트 루프의 주요 역할> 1. 비동기 코드(Future, async/await)의 실행 순서를 조정 2. Dart의 싱글 스레드 환경에서 멀티태스킹 효과 제공 3. UI가 멈추지 않도록 이벤트(onPressed, onChanged)를 적절히 실행 4. Flutter 애니메이션, 네트워크 요청, 백그라운드 작업을 효율적으로 처리

  • Event Queue : 이벤트 큐. 비동기 작업(Future, async/await, Timer 등)이 완료되면 해당 작업을 실행하기 위해 저장하는 대기열(Queue). 즉, 이벤트 루프(Event Loop)가 실행할 비동기 작업들을 관리하는 공간 및 목록. 이벤트 루프(Event Loop)가 이벤트 큐에서 작업을 하나씩 가져와 실행. <Dart의 이벤트 큐 동작 방식> 1. 동기 코드(Synchronous Code) 먼저 실행 2. 비동기 코드(Future, Timer 등)는 이벤트 큐에 추가 3. 현재 실행 중인 코드가 끝나면, 이벤트 루프(Event Loop)가 이벤트 큐의 작업을 실행 4. Microtask Queue가 먼저 실행된 후, 이벤트 큐(Event Queue)의 작업이 실행됨

  • Microtask Queue : 마이크로태스크 큐. 이벤트 루프에서 동기 코드 실행이 끝난 후, 이벤트 큐(Event Queue)보다 먼저 실행되는 비동기 작업 목록. 즉, 일반적인 Future(이벤트 큐)보다 더 높은 우선순위를 가지며, 즉시 실행되는 비동기 작업을 저장하는 공간. scheduleMicrotask()를 사용하여 등록 가능

  • Single Thread : 단일 스레드. 프로그램이 하나의 작업을 한 번에 하나씩 순차적으로 처리하는 방식. 즉, CPU가 한 번에 하나의 작업만 실행하며, 이전 작업이 끝나야 다음 작업을 실행할 수 있는 구조. Dart는 기본적으로 싱글 스레드 환경에서 동작. 멀티 스레드보다 단순하고 메모리 사용이 적음. UI가 멈추지 않도록 비동기 처리(Future, async/await)를 활용해야 함. Isolate를 사용하면 멀티 스레드(병렬 처리) 가능

  • Multi-thread : 멀티 스레드. 하나의 프로그램(프로세스)에서 여러 개의 작업(스레드)을 동시에 실행하는 방식. 즉, 여러 개의 스레드를 사용하여 프로그램이 병렬로 작업을 처리할 수 있도록 하는 기법. CPU를 여러 개의 작은 작업(스레드)으로 나누어 동시에 실행하는 방식. CPU 사용률을 최대로 활용하여 성능 향상 가능. 스레드 간 공유 데이터 문제(경쟁 상태, 동기화 문제) 발생 가능. <멀티스레드의 주요 활용 사례> 1. 백그라운드 연산 처리 (예: 데이터 다운로드, AI 연산) 2. UI가 멈추지 않도록 비동기 처리 (예: 애니메이션, 입력 반응) 3. 네트워크 요청 및 API 호출 (예: 로그인, 데이터 가져오기) 4. 게임 엔진 및 실시간 렌더링 (예: 3D 그래픽, 물리 연산)

  • Asynchronous Programming : 비동기 프로그래밍. 작업이 끝날 때까지 기다리지 않고, 다음 코드를 실행할 수 있도록 하는 프로그래밍 방식. 즉, 시간이 오래 걸리는 작업(API 호출, 파일 읽기, 데이터베이스 조회 등)을 실행하면서도, 프로그램이 멈추지 않고 다른 작업을 계속 수행할 수 있도록 하는 방법

  • Future : Dart에서 비동기(Asynchronous) 작업의 결과를 나타내는 객체. 즉, 작업이 즉시 완료되지 않고, 나중에 완료될 수도 있는 값을 포함하는 비동기 데이터 타입. 비동기 작업(API 호출, 파일 읽기 등)의 결과를 나중에 받아올 수 있는 객체. Dart에서 async/await과 함께 비동기 프로그래밍을 할 때 사용

  • await : Dart에서 Future(비동기 작업)가 완료될 때까지 기다리는 키워드. 즉, 비동기 함수(async 함수) 안에서 Future의 결과를 동기 코드처럼 처리할 수 있도록 도와줌. async 함수 내부에서만 사용 가능. UI가 멈추지 않도록 백그라운드에서 실행됨. <await이 필요한 이유> 1. Future.then()보다 가독성이 뛰어남 2. 비동기 코드도 동기 코드처럼 읽을 수 있음 3. UI가 멈추지 않고 부드럽게 실행됨 4. try-catch를 사용하여 오류를 쉽게 처리 가능

  • Dart에서 비동기(Asynchronous) 함수임을 선언하는 키워드. 즉, async를 사용하면 해당 함수가 Future를 반환하며, await을 사용하여 비동기 작업을 처리할 수 있음. "이 함수는 비동기적으로 실행될 거야!". await을 사용하려면 async를 반드시 함수 선언에 추가해야 함. <Dart에서 async의 주요 특징> 1. async를 붙이면 함수가 Future를 반환함 2. await 키워드를 사용하여 비동기 작업을 기다릴 수 있음 3. Future.then() 대신 async/await을 사용하면 코드 가독성이 향상됨 4. 비동기 작업이 완료될 때까지 다른 코드 실행을 계속 진행할 수 있음

  • Cupertino : Flutter에서 iOS 스타일의 디자인을 구현할 수 있도록 제공하는 위젯 세트. 즉, Flutter에서 iOS와 유사한 UI/UX를 만들고 싶을 때 사용하는 위젯 모음. Material 디자인이 Android 스타일이라면, Cupertino는 iOS 스타일

  • inistate() : StatefulWidget이 생성될 때 한 번만 호출되는 생명주기 메서드. 즉, 위젯이 처음 생성될 때 초기화 작업을 수행하는 곳. API 요청, 변수 초기화, addListener() 등록 같은 초기 작업을 여기서 하면 됨

  • setState() : StatefulWidget의 상태를 변경하고, 변경된 상태를 반영하여 UI를 다시 렌더링하는 함수. 즉, 화면(UI)을 업데이트할 필요가 있을 때 setState()를 호출해야 변경 사항이 적용. setState()를 사용하지 않으면 Flutter는 UI가 변경된 것을 인식하지 못함. <setState()의 주요 특징> 1. StatefulWidget에서만 사용 가능 (StatelessWidget에서는 사용 불가) 2. setState() 내부에서 상태 변수를 변경하면 UI가 자동으로 업데이트됨 3. 성능 최적화를 위해, setState()는 필요한 부분만 다시 빌드함 4. UI 업데이트가 필요할 때만 호출해야 함 (불필요한 호출은 성능 저하 가능성 있음)

  • Declarative UI : 선언형 UI. UI의 상태를 "어떻게 변경할지"가 아니라, "어떤 상태여야 하는지"를 선언적으로 정의하는 방식. 즉, 현재 상태(State)에 따라 UI가 자동으로 업데이트되는 방식. UI를 직접 변경하는 것이 아니라, 현재 상태(State)를 정의하면 Flutter가 알아서 UI를 업데이트해줌. Flutter는 선언형 UI 방식으로 작동함. <선언형 UI의 주요 특징> 1. UI는 현재 상태(State)에 따라 자동으로 업데이트됨 2. setState(), Provider, Bloc 등을 사용하여 상태를 변경 3. Flutter, React, SwiftUI 등에서 사용됨 4. imperative UI(명령형 UI)보다 코드가 간결하고 유지보수가 쉬움

  • Imperative UI : 명령형 UI. UI 변경을 직접 명령(코드)으로 지정해야 하는 방식. 즉, 개발자가 UI의 상태를 직접 변경하는 코드(setText(), setVisibility(), updateLayout())를 작성해야 함. Android(Java/Kotlin), UIKit(Objective-C) 같은 전통적인 UI 프레임워크가 명령형 UI를 사용. <명령형 UI의 주요 특징> 1. UI를 변경하려면 직접 업데이트하는 코드가 필요함 2. 특정 동작이 발생하면 개발자가 명령을 내려 UI를 업데이트함 3. 상태(State)와 UI가 분리되지 않고, UI가 직접 조작됨 4. 코드가 많아지고 유지보수가 어려울 수 있음

  • Responsive UI : 반응형 UI. 화면 크기, 해상도, 기기 방향(세로/가로), 입력 방식(터치/마우스)에 따라 UI가 자동으로 조정되는 인터페이스. 즉, 하나의 코드로 다양한 화면 크기(모바일, 태블릿, 웹 등)에 대응할 수 있는 UI 설계 방식. 화면 크기에 따라 UI가 자동으로 변하는 디자인. Flutter에서는 MediaQuery, LayoutBuilder, Flexible, Expanded 등을 활용하여 구현 가능

  • try-catch : Dart에서 예외(Exception)가 발생할 경우 프로그램이 멈추지 않도록 예외를 처리하는 구조. 즉, 코드 실행 중 오류가 발생해도 앱이 강제 종료되지 않고, 적절한 오류 메시지를 출력하거나 대체 동작을 수행할 수 있도록 해줍니다. 오류가 발생할 수 있는 코드를 try 블록에 넣고, 오류가 발생하면 catch 블록에서 처리하는 방법. Flutter에서는 API 요청, 파일 읽기, 네트워크 통신 등에서 자주 사용됨

  • catchError : Dart에서 Future(비동기 작업) 실행 중 예외(Exception)가 발생했을 때, 이를 처리하는 메서드. 즉, 비동기 작업(Future)이 실패하면 catchError()를 사용하여 오류를 잡고 예외를 처리할 수 있음. 네트워크 요청(API 호출), 파일 읽기, 데이터베이스 작업 등에서 예외 처리를 할 때 사용. <Dart에서 catchError의 주요 특징> 1. Future에서 예외가 발생하면 catchError()가 실행됨 2. then()과 함께 사용하여 정상 결과와 오류를 각각 처리 가능 3. onError 매개변수를 사용하여 특정 예외만 처리 가능 4. try-catch와 함께 사용할 수도 있음

  • Compile Time : 컴파일 타임소스 코드가 실행되기 전에, 컴파일러가 코드를 분석하고 기계어(바이너리)로 변환하는 과정이 수행되는 시간. 즉, 코드 작성 후 실행하기 전에, 오류 검사를 하고 실행 파일을 생성하는 단계. 코드를 실행하기 전에, 컴퓨터가 코드를 이해할 수 있도록 변환하는 시간. Dart에서는 JIT(Just-In-Time)과 AOT(Ahead-Of-Time) 컴파일이 모두 사용됨. <컴파일 타임의 주요 특징> 1. 실행 전에 코드가 분석되고 변환되는 과정 2. 문법 오류(Syntax Error), 타입 오류(Type Error) 등을 검출할 수 있음 3. 실행 파일을 생성(AOT 컴파일)하거나, 인터프리터가 실행할 수 있도록 변환(JIT 컴파일)함 4. Flutter에서는 개발 중 JIT 컴파일(빠른 실행), 배포 시 AOT 컴파일(최적화된 실행) 사용

  • Interpreter : 코드를 한 줄씩 읽고, 즉시 실행하는 프로그램 또는 기법. 즉, 소스 코드를 기계어로 변환하여 실행하는 것이 아니라, 한 줄씩 해석(Interpret)하면서 바로 실행하는 방식. 컴파일러는 실행 전에 코드를 변환(AOT), 인터프리터는 코드 실행 중에 변환(JIT). Flutter/Dart에서는 개발 중에는 JIT(인터프리터 방식), 배포 시에는 AOT(컴파일러 방식) 사용. <인터프리터의 주요 특징> 1. 코드를 한 줄씩 해석하며 실행 (즉시 실행 가능) 2. 실행 속도는 느리지만, 디버깅이 용이함 3. 별도의 컴파일 과정 없이 실행 가능 (즉시 실행형 언어에서 사용) 4. Python, JavaScript 같은 스크립트 언어에서 주로 사용됨.

  • children : 여러 개의 자식 위젯을 포함할 수 있는 위젯의 속성. 즉, 여러 개의 위젯을 리스트 형태로 담을 때 사용. 하나의 부모 위젯이 여러 개의 자식 위젯을 가질 때 사용하는 속성. Column, Row, Stack, ListView 등에서 사용됨

  • child : Flutter에서 하나의 자식 위젯을 포함할 때 사용하는 속성. 즉, 단일 위젯을 감싸서 배치할 때 사용되며, Container, Padding, Center 같은 위젯에서 지원

  • transparent : UI 요소의 배경이나 색상을 투명하게 만드는 개념. 즉, 위젯의 배경을 보이지 않게 하거나, 다른 위젯 위에 겹쳐 놓을 때 사용. 화면에서 보이지 않도록 하는 설정. <투명을 사용하는 이유> 1. UI의 배경을 보이지 않게 만들기 (Overlay UI 구현) 2. 버튼, 컨테이너 등의 불필요한 배경을 제거하여 디자인을 깔끔하게 유지 3. 특정 위젯을 반투명하게 하여 뒷배경을 강조하는 효과 구현 (예: 모달 창)

  • YUM(Yellowdog Updater, Modified) : Linux 시스템에서 패키지를 관리하는 패키지 관리 도구. 즉, 소프트웨어 패키지를 설치, 업데이트, 제거하는 데 사용. <YUM의 주요 기능> 1. 패키지 설치 (yum install) 2. 패키지 제거 (yum remove) 3. 패키지 업데이트 (yum update) 4. 패키지 검색 (yum search) 5. 의존성 자동 해결 (필요한 다른 패키지도 함께 설치됨)

  • HTTP (HyperText Transfer Protocol) : 웹에서 데이터를 주고받는 프로토콜. 즉, 웹 브라우저와 서버가 소통하는 약속(규칙). GET, POST, PUT, DELETE 같은 메서드 사용. 80 포트 사용. <HTTP의 주요 기능> 1. 요청(Request) & 응답(Response) : 클라이언트(브라우저)가 서버에 요청 → 서버가 응답 예) 사용자가 https://example.com 입력하면 서버가 HTML 파일을 반환 2. 무상태(Stateless) : 서버는 이전 요청을 기억하지 않음 예) 로그인 유지하려면 쿠키, 세션, 토큰 필요 3. 텍스트 기반 : 사람이 읽을 수 있는 형태로 요청과 응답 전송

  • HTTPS (HyperText Transfer Protocol Secure) : HTTP + 보안(SSL/TLS 암호화). 즉, 웹사이트와 사용자 간의 데이터를 안전하게 주고받는 프로토콜. 443 포트 사용. 브라우저에서 자물쇠 아이콘 표시. <HTTPS 동작 방식> 1. 브라우저가 서버에 HTTPS 요청 2. 서버가 SSL/TLS 인증서 전송 3. 브라우저가 인증서 확인 & 암호화 키 교환 4. 보안 연결이 설정됨 (암호화 시작) 5. 데이터가 암호화되어 전송됨. <HTTPS를 사용하는 이유> 1. 해킹 방지 (데이터 도청 및 변조 불가능) 2. 신뢰성 향상 (사용자에게 안전한 사이트로 인식됨) 3. 검색 엔진 SEO 순위 상승 (구글은 HTTPS 사이트를 우선순위로 노출) 4. 브라우저 경고 방지 (HTTP 사이트는 ‘안전하지 않음’ 경고 표시)

  • SSL/TLS 인증서 : 보안 프로토콜. SSL(Secure Sockets Layer) / TLS(Transport Layer Security). SSL은 구버전, TLS는 신버전. 데이터를 암호화하여 해킹을 방지. 신뢰할 수 있는 기관(CA, 인증 기관)이 발급

  • Open Source Programming Language : 오픈 소스 프로그래밍 언어. 소스 코드가 공개되어 누구나 자유롭게 사용할 수 있는 프로그래밍 언어. 즉, 개발자들이 코드 수정, 배포, 개선할 수 있는 언어. <오픈소스 프로그래밍 언어의 특징> 1. 무료 사용 가능 → 누구나 무료로 다운로드 & 사용 가능 2. 소스 코드 공개 → 내부 동작을 직접 보고 수정 가능 3. 커뮤니티 지원 → 전 세계 개발자들이 개선 & 유지보수 4. 다양한 라이브러리 → 커뮤니티가 만든 강력한 패키지 활용 가능 5. 빠른 발전 → 많은 개발자들이 기여하여 지속적인 업데이트

  • Dataset : 특정 목적을 위해 수집된 데이터의 집합. 즉, 표(Table), 이미지, 텍스트, 영상 등 다양한 형태로 구성된 데이터 모음. 많은 데이터를 모아놓은 파일 또는 데이터 모음. AI, 머신러닝, 연구, 분석 등에 활용되는 데이터 집합. <데이터셋의 주요 특징> 1. 구조화된 데이터 → 표 형태(엑셀, CSV) 또는 비정형 데이터(이미지, 텍스트 등) 포함 2. 대량의 데이터 포함 → 머신러닝, 빅데이터 분석을 위해 많은 데이터가 필요 3. 특정 목적을 가짐 → 예) AI 학습, 통계 분석, 연구 4. 다양한 파일 형식 지원 → CSV, JSON, XML, SQL 데이터베이스 등. <데이터셋을 사용하는 이유> 1. AI & 머신러닝 학습 → 모델을 훈련시키기 위해 필요 2. 데이터 분석 → 트렌드 분석, 통계 연구 3. 소프트웨어 테스트 → 시스템 성능 및 정확도 평가 4. 연구 & 논문 작성 → 과학 및 기술 연구에 활용

  • chocolatey : Windows에서 소프트웨어를 쉽게 설치, 업데이트, 제거할 수 있는 패키지 관리자. 리눅스의 apt(Ubuntu)나 yum(CentOS)처럼 Windows에서 패키지를 관리하는 도구. <Chocolatey의 주요 기능> 1. 소프트웨어 설치 (choco install) 2. 소프트웨어 업데이트 (choco upgrade) 3. 소프트웨어 제거 (choco uninstall) 4. 자동화된 설치 (GUI 없이 명령어로 설치 가능) 5. 여러 프로그램을 한 번에 설치 가능<Chocolatey를 사용하는 이유> 1. 클릭 없이 명령어 하나로 빠른 설치 가능 2. 여러 프로그램을 한 번에 자동 설치 가능 3. 최신 버전 자동 업데이트 가능 4. Windows 환경에서 소프트웨어 관리를 쉽게 할 수 있음

  • Format : 데이터를 특정한 구조나 형태로 변환하는 것. 즉, 파일, 숫자, 텍스트, 저장 장치 등을 정해진 방식으로 정리하는 것. 데이터를 정리하고, 사용할 수 있도록 형태를 맞추는 것. 파일 형식, 데이터 형식, 저장 장치 초기화 등 다양한 의미로 사용됨

  • Type Inference : 타입 추론. 변수나 값의 타입을 명시적으로 지정하지 않아도, 컴파일러(또는 인터프리터)가 자동으로 타입을 결정하는 기능. <타입 추론이 어떻게 동작할까?> 1. 변수의 초기값을 보고 타입 결정 2. 연산의 결과를 보고 타입 결정 3. 함수 반환값을 보고 타입 결정

  • bin : binary(바이너리)"의 줄임말. 실행 파일(Executable)이나 바이너리 데이터를 저장하는 디렉터리 또는 파일을 의미. 프로그램 실행 파일이나 중요한 바이너리 데이터가 저장된 폴더. 컴파일된 파일(.exe, .class, .so 등)이 들어있는 디렉터리. 1. 시스템 bin 폴더 : OS의 기본 실행 파일 저장 2. 프로젝트 bin 폴더 : 컴파일된 실행 파일 저장 3. 패키지 관리 bin : 설치된 프로그램 실행 파일 저장

  • null : 아무 값도 없음"을 의미하는 특수한 값. 즉, 변수는 존재하지만, 그 안에 아무 값도 들어 있지 않을 때 사용하는 개념. 언어마다 의미가 다름. Dart에서는 값이 없음을 나타냄 (널-세이프티 지원). 널 체크(if), 널 병합 연산자(??), 옵셔널(?.)을 활용해 안전하게 사용. null 처리를 잘못하면 오류가 발생하므로 항상 신경 써야 함. <null이 발생하는 이유> 1. 변수를 선언했지만 초기화하지 않음 2. 메모리에 객체가 할당되지 않음 3. 데이터베이스에서 값이 존재하지 않음 4. API 응답에서 값이 없을 때

  • Null Safety : 변수에 null이 들어가는 것을 방지하는 기능. 즉, null로 인해 발생하는 오류를 미리 예방하는 시스템. null 값이 원인이 되어 프로그램이 터지는 것을 막는 기능. 변수를 사용할 때 null이 들어갈 수 있는지 명확하게 구분하는 기능. <Null Safety의 장점> 1. NullPointerException을 원천 차단 2. null 처리를 명확하게 구분하여 코드 안정성 향상 3. 코드의 가독성이 높아지고 유지보수가 쉬워짐 4. 컴파일 단계에서 오류를 잡아줌 → 실행 중 크래시 방지

  • NullPointerException(NPE) : null 값을 가진 변수를 잘못 사용하려고 할 때 발생하는 오류. 즉, null을 참조하려고 하면 프로그램이 충돌(Crash)하는 문제. 객체가 없는데 메서드나 속성을 호출하면 발생하는 오류. 값이 없는 변수를 사용하려고 하면 터지는 오류

  • AOT(Ahead-Of-Time) : 소스 코드를 미리 기계어로 변환하는 컴파일 방식. 즉, 프로그램 실행 전에 코드를 한 번 컴파일하여 실행 속도를 빠르게 하는 기법. JIT보다 실행 속도가 빠르고, 최적화된 코드로 실행 가능. Flutter에서는 개발 중 JIT, 배포 시 AOT를 사용하여 최적화

  • JIT(Just-In-Time) : 프로그램을 실행하는 도중에 코드를 기계어로 변환하는 컴파일 방식. 즉, 앱을 실행할 때 필요한 부분만 즉시 컴파일하여 실행 속도를 최적화하는 기법. JIT은 개발 속도를 높이고, AOT는 실행 속도를 최적화하는 역할

  • const : 변하지 않는 상수(Constant)를 선언할 때 사용하는 키워드. 즉, 한 번 값을 지정하면 변경할 수 없는 변수를 만들 때 사용. 프로그램 실행 중에 수정할 수 없는 변수. <const의 주요 특징> 1. 값을 변경할 수 없음 2. 선언과 동시에 초기화해야 함 3. 컴파일 타임(Compile-Time)에 결정됨. <const를 사용하는 이유> 1. 코드의 안전성 증가 → 값이 변경되지 않도록 보호 2. 성능 최적화 가능 → 컴파일 타임에 결정되어 빠르게 실행 3. 가독성 향상 → 상수임을 명확히 표시

  • final : 변수를 한 번만 할당할 수 있도록 제한하는 키워드. 즉, 초기화 후 값을 변경할 수 없지만, 런타임에 결정될 수도 있는 변수를 선언할 때 사용. const와 다르게 런타임에도 값을 설정할 수

  • Runtime : 코드를 실행하는 순간이 바로 런타임. 프로그램이 실행되는 시간(시점). 즉, 코드가 작성되거나 컴파일되는 과정이 아니라, 실제로 실행되고 동작하는 순간. 앱이 동작하는 동안 일어나는 모든 과정. 코드가 실행되면서 발생하는 오류를 "런타임 오류(Runtime Error)"라고 함

  • RTE(Runtime Environment) : 런타임 환경. 프로그램이 실행되는 데 필요한 모든 소프트웨어 및 시스템 자원. 즉, 코드를 실행하는 데 필요한 운영체제(OS), 메모리, CPU, 가상 머신, 라이브러리 등이 포함된 환경. 프로그램이 실행되는 배경 시스템

  • late : 변수를 나중에 초기화할 수 있도록 하는 Dart 키워드. 즉, 변수를 선언할 때 즉시 값을 할당하지 않아도, 필요할 때 초기화할 수 있도록 해주는 기능. 변수를 먼저 선언하고, 나중에 값을 넣을 수 있도록 하는 키워드. 반드시 한 번은 값을 할당해야 하지만, 실행될 때까지 미룰 수 있음. 변수를 선언할 때 값을 몰라도 되는 경우"에 유용함. <late를 사용하는 이유> 1. 변수를 즉시 초기화할 수 없을 때 사용 2. final과 함께 사용하여 한 번만 할당 가능 3. 메모리를 절약하고 성능을 최적화할 수 있음 4. null safety와 함께 사용 가능 (late로 선언하면 null 방지 가능)

  • Initialization Cost : 초기화 비용. 프로그램이 변수를 생성하고 초기값을 할당할 때 발생하는 비용(시간 & 메모리 사용량). 즉, 객체를 생성하거나 변수를 선언할 때 소요되는 리소스(메모리, CPU 등)의 양. late, const, lazy initialization 등을 활용하여 최적화 가능. 초기화 비용을 최적화하면 앱 실행 속도가 더 빨라짐. <초기화 비용이 발생하는 이유> 1. 메모리 할당 (Memory Allocation) : 변수를 저장할 공간을 확보해야 함 2. 객체 생성 비용 (Object Creation Cost) : 클래스 인스턴스를 만들 때 CPU 연산 필요 3. 연산 비용 (Computation Cost) : 변수를 초기화하면서 계산이 필요할 수도 있음 4. 데이터 로딩 비용 (I/O Cost) : 초기화 시 파일 읽기, 데이터베이스 조회, 네트워크 요청 등이 포함될 수 있음

  • HashMap : 키(Key)와 값(Value)을 저장하는 자료구조. 즉, 특정 키를 입력하면, 빠르게 값을 찾아낼 수 있는 데이터 구조. 이름표(Key)를 붙여 데이터를 빠르게 찾을 수 있는 저장소. <해시 맵의 특징> 1. 빠른 검색 속도 (O(1)) 2. 키(Key)와 값(Value) 쌍으로 데이터 저장 3. 키는 중복될 수 없음 (값은 중복 가능) 4. 내부적으로 해시 함수(Hash Function) 사용

  • Dart : Google이 개발한 오픈 소스 프로그래밍 언어

  • Side Project) : 개인이 본업(일, 학업) 외에 자유롭게 진행하는 프로젝트. 즉, 재미있거나 배우고 싶은 기술을 활용해서 스스로 만들어 보는 프로젝트

  • Dart VM(Dart Virtual Machine) : Dart 코드를 실행하는 가상 머신. 즉, Dart 언어로 작성된 코드를 실행할 수 있도록 변환하고 최적화하는 핵심 엔진. Flutter 앱이 실행될 때, 백그라운드에서 동작하는 중요한 기술. <Dart VM의 역할> 1. Dart 코드를 바이트코드로 변환하여 실행 2. JIT(Just-In-Time) 컴파일을 사용하여 빠른 개발 지원 3. AOT(Ahead-Of-Time) 컴파일을 지원하여 성능 최적화 4. 가비지 컬렉션(GC) 기능 제공 5. 네이티브 코드 변환을 통해 Flutter 앱 최적화

  • Garbage Collection(GC) : 더 이상 사용되지 않는 메모리를 자동으로 정리하는 기능. 즉, 프로그램이 동작하면서 필요 없어진 메모리를 자동으로 해제하여 메모리 누수를 방지하는 기술. C++에는 없음. Flutter 개발에서는 dispose(), late, setState() 최적화를 활용하면 좋음. <가비지 컬렉션 동작 방식 (Dart 기준)> 1. 객체가 언제 가비지 컬렉션 대상이 될까? -> 프로그램에서 더 이상 참조되지 않는 객체는 자동으로 삭제됨. 예를 들어, 함수 안에서 만든 변수가 함수 종료 후 더 이상 접근할 수 없다면 GC가 메모리에서 제거. 2. Dart의 가비지 컬렉션 방식 : Dart에서는 Generational Garbage Collection을 사용함. 즉, 객체를 "젊은 객체(Young)"와 "오래된 객체(Old)"로 분류하여 효율적으로 관리

  • Hot Reload : Flutter에서 코드 변경 사항을 즉시 반영하는 기능. 즉, 앱을 다시 실행하지 않고도 UI와 기능을 실시간으로 업데이트할 수 있는 기술. <Hot Reload가 동작하는 원리> 핵심: Dart VM의 Just-In-Time (JIT) 컴파일을 활용 1. 코드를 변경하면 변경된 부분만 다시 컴파일 2. 변경된 코드만 Dart VM에 반영 (전체 앱을 다시 실행하지 않음) 3. 현재 상태(State)를 유지한 채, 변경된 UI를 즉시 표시. <Hot Reload가 적용되는 것 & 적용되지 않는 것> 1. 적용되는 경우 (즉시 반영 가능) : UI 변경 (Text(), Container(), Column(), Row() 등), 스타일 변경 (color, size, padding 등), 메서드 & 함수 로직 변경, 새로운 위젯 추가 2. 적용되지 않는 경우 (Hot Restart 필요) : main() 함수 변경, 전역 변수 변경, 앱의 initState() 변경, 네이티브(Android, iOS) 코드 변경

  • Collection : 여러 개의 데이터를 하나의 변수에 저장하고 관리할 수 있는 자료구조. , 리스트(List), 맵(Map), 셋(Set) 같은 데이터 구조를 총칭하는 개념

  • Set : 중복을 허용하지 않는 컬렉션. 같은 값을 여러 번 저장할 수 없고, 순서가 보장되지 않는 자료구조. 집합과 같은 개념으로, 중복 데이터를 자동으로 제거. <Set의 주요 특징> 1. 중복 값 저장 불가 → 같은 값이 여러 개 들어가면 하나만 저장됨 2. 순서가 보장되지 않음 → 인덱스로 접근 불가능 3. 검색 속도가 빠름 (O(1)) → 리스트보다 빠르게 존재 여부 확인 가능 <Set의 주요 메서드> 1. add(value) 값 추가 2. remove(value) 값 삭제 3. contains(value) 특정 값 존재 여부 확인 4. length Set의 크기 확인 5. clear() 모든 요소 삭제 6. toList() Set을 List로 변환

  • Enum(Enumerations) : 열거형. 서로 연관된 상수 값들을 하나의 타입으로 정의하는 자료형. 즉, 특정한 값들만 가질 수 있도록 제한된 데이터 타입. 월(月), 요일(요일), 상태(ON/OFF)처럼 정해진 값들만 가질 수 있도록 제한. switch-case와 함께 사용하면 깔끔한 코드 작성 가능. Flutter에서 상태 관리, HTTP 요청 상태, UI 테마 관리 등에 자주 사용됨

  • Generic Class : 클래스를 정의할 때 특정 데이터 타입에 의존하지 않도록 만드는 기능. 즉, 클래스를 여러 타입에서 재사용할 수 있도록 하는 템플릿 같은 개념. 같은 클래스를 int, String, double 등 여러 타입에서 사용할 수 있게 만들어줌. Flutter에서 API 응답 처리, 데이터 모델, 컬렉션 클래스 등에 자주 사용됨

  • Generic Function : 특정 데이터 타입에 의존하지 않고, 여러 타입에서 재사용할 수 있도록 만드는 함수. 즉, 같은 로직을 여러 타입에서 사용할 수 있도록 일반화한 함수

  • Type Parameter : 제네릭을 사용할 때 타입을 일반화하여 나중에 지정할 수 있도록 하는 변수. 즉, 코드를 여러 타입에서 재사용할 수 있도록 만드는 제네릭의 핵심 요소. < T>, <K, V> 등의 형식으로 사용됨

  • Method Chaining : 객체에서 여러 메서드를 연속적으로 호출할 수 있도록 하는 프로그래밍 기법. 즉, 객체의 메서드가 자기 자신을 반환하여, 여러 메서드를 이어서(.) 호출할 수 있도록 만드는 방식. 객체에서 여러 메서드를 한 줄로 이어서 실행하는 기법

  • Zsh(Z Shell) : 기본적인 Bash(배시)보다 강력한 기능을 제공하는 유닉스 기반 셸(Shell). 즉, 명령어를 입력하고 실행하는 터미널 환경 중 하나로, Bash보다 더 강력한 기능을 갖춘 확장 버전. 명령어 자동 완성, 플러그인, 테마 기능이 추가된 개선된 셸

  • Bash(Bourne Again Shell) : 유닉스 및 리눅스에서 기본적으로 사용되는 명령어 셸(Shell). 즉, 터미널에서 명령어를 입력하고 실행할 수 있도록 해주는 프로그램. 리눅스와 macOS에서 가장 많이 사용되는 기본 셸

  • Dart SDK 표준 라이브러리 : Dart SDK 표준 라이브러리는 Dart에서 기본적으로 제공하는 내장 라이브러리의 모음. 즉, 추가 설치 없이 바로 사용할 수 있는 Dart의 기본 기능들. <주요 기능> 1. dart:core (기본 타입 & 컬렉션) : int, double, String, List, Map 같은 기본 타입 제공, print(), Comparable, Iterable 등 핵심 기능 포함 2. dart:math (수학 연산 지원) : pi, sin(), cos(), sqrt(), pow() 등 제공 3. dart:async (비동기 프로그래밍 지원) : Future, Stream, async/await 같은 비동기 기능 제공 4. dart:convert (데이터 변환 지원) : JSON, UTF-8, Base64 같은 데이터 변환 기능 포함 5. dart:io (파일, 네트워크, 프로세스 입출력 지원) : 파일 읽기/쓰기, HTTP 요청, 소켓 통신 등 제공 (Flutter 웹에서는 사용 불가) 6. dart:typed_data (고성능 바이너리 데이터 처리) : Uint8List, Float32List 같은 저수준 데이터 조작 가능 7. dart:ffi (네이티브 코드 연동) : C/C++ 코드와 연결하여 성능 최적화 가능 8. dart:mirrors (리플렉션 지원, 제한적 사용) : 런타임에 클래스, 객체 정보를 가져오는 기능

  • abs() : 숫자의 절댓값(Absolute Value)을 반환하는 함수

  • map() : 리스트 또는 컬렉션의 모든 요소에 특정 연산을 적용하여 새로운 리스트를 생성하는 함수. 즉, 각 요소를 변환(transform)할 때 사용되는 함수형 프로그래밍 메서드. 리스트의 모든 요소를 변환하고 싶다면 map()을 사용

  • where() : 리스트 또는 컬렉션에서 특정 조건을 만족하는 요소만 필터링하는 함수. 즉, 리스트에서 원하는 값들만 골라서 새로운 리스트를 생성할 때 사용. 리스트에서 필요한 값들만 추출하는 필터 기능. 특정 조건을 만족하는 요소만 남기고 나머지는 제거

  • firstWhere() : 리스트에서 특정 조건을 만족하는 첫 번째 요소를 반환하는 함수. 즉, 조건을 만족하는 첫 번째 값을 찾을 때 사용. 조건을 만족하는 요소가 없으면 예외 발생 → orElse()를 사용하여 기본값 설정 가능

  • lastWhere() : 리스트에서 특정 조건을 만족하는 마지막 요소를 반환하는 함수. 즉, 리스트의 끝에서부터 조건을 만족하는 첫 번째 값을 찾을 때 사용. 조건을 만족하는 요소가 없으면 예외 발생 → orElse()를 사용하여 기본값 설정 가능

  • reduce() : 리스트의 모든 요소를 하나의 값으로 축약(누적)하는 함수. 즉, 리스트의 요소들을 차례로 연산하여 하나의 결과를 반환. 리스트의 값을 하나로 합치는 함수. fold()는 reduce()보다 안전하며 초기값을 설정할 수 있음

  • fold() : 리스트(List)의 모든 요소를 하나의 값으로 축약(누적)하는 함수. 즉, 초기값을 지정한 상태에서 리스트의 요소를 차례로 연산하여 최종 값을 반환. reduce()와 비슷하지만, 초기값을 설정할 수 있어 더 안전함

  • any() : 리스트 또는 컬렉션에서 하나 이상의 요소가 특정 조건을 만족하는지 확인하는 함수. 즉, 조건을 만족하는 요소가 하나라도 있으면 true를 반환하고, 없으면 false를 반환. where()처럼 값을 필터링하는 게 아니라, 조건을 만족하는 값이 있는지만 검사

  • every() : 리스트의 모든 요소가 특정 조건을 만족하는지 확인하는 함수. 모든 요소가 조건을 만족하면 true, 하나라도 만족하지 않으면 false를 반환

  • takeWhile() : 리스트에서 특정 조건을 만족하는 동안 요소를 가져오는 함수. 즉, 리스트를 앞에서부터 확인하면서 조건을 만족하는 요소만 포함하고, 조건이 처음으로 거짓이 되는 순간 중단. 리스트 앞에서부터 조건을 만족하는 값들만 가져오는 함수. 조건이 깨지는 순간 멈추고, 이후의 값들은 무시

  • skipWhile() : 리스트에서 특정 조건을 만족하는 동안 요소를 건너뛰고, 조건이 처음으로 거짓이 되는 순간부터 남은 요소들을 반환하는 함수. 리스트 앞에서부터 조건을 만족하는 요소들은 버리고, 조건이 깨진 순간부터 가져오는 함수

  • $ : 문자열 내에서 변수를 삽입(문자열 보간, String Interpolation)하는 기능. 즉, 변수를 문자열에 직접 포함할 때 사용. 계산식이나 객체 속성에 접근할 때는 {} 사용. 변수명과 문자열이 붙어 있으면 {}를 사용해야 함

  • LINUX : 오픈소스 기반의 운영체제(OS). 즉, 윈도우나 macOS처럼 컴퓨터를 운영하는 시스템이지만, 무료로 누구나 사용할 수 있는 OS. Ubuntu, Debian, CentOS 등 다양한 배포판 존재. 강력한 보안성 & 안정성 → 서버, 해킹, AI 분야에서 많이 사용됨. 터미널 중심 → 개발자와 전문가들이 선호. Windows보다 가볍고 최적화 가능 → 개인 & 서버 환경에서 널리 사용

  • Ubuntu : 리눅스 기반의 가장 인기 있는 무료 운영체제(OS). 리눅스 배포판. <Ubuntu 버전 종류> 1. Ubuntu Desktop : 그래픽 인터페이스(GUI) 포함, 개인용 PC, 개발 환경 2. Ubuntu Server : GUI 없음, 터미널 기반 서버 운영, 클라우드 환경 3. Ubuntu LTS : 장기 지원(Long-Term Support) 기업, 서버용 (5년 지원) 4. Ubuntu Minimal : 경량화된 버전 IoT, 라즈베리파이

  • Local Variable : 지역 변수. 특정 블록(함수, 클래스, 제어문 등) 안에서 선언되고, 해당 블록 내부에서만 사용할 수 있는 변수. 즉, 함수나 특정 코드 블록 안에서만 접근할 수 있으며, 블록을 벗어나면 사라지는 변수. 같은 이름의 변수를 여러 블록에서 사용할 수 있음 (각 블록에서 독립적)

  • Static Variable : 정적 변수. 클래스에 속하지만, 객체마다 개별적으로 존재하는 것이 아니라 클래스 전체에서 공유되는 변수. 즉, 클래스의 모든 객체가 같은 값을 공유하며, 프로그램이 실행되는 동안 메모리에 한 번만 할당. static 키워드를 사용하여 선언

  • Instance Variable : 클래스 내부에서 선언되며, 객체(인스턴스)마다 별도로 존재하는 변수. 즉, 클래스로부터 생성된 각 객체(인스턴스)마다 고유한 값을 가질 수 있는 변수. 객체가 생성될 때마다 메모리에 따로 할당됨

  • Instance Method : 클래스의 개별 객체(인스턴스)에서 호출할 수 있는 메서드. 즉, 각 객체가 고유한 데이터를 처리하기 위해 사용하는 메서드. 정적 메서드(static)와 달리, 객체를 생성해야 호출 가능

  • Static Method : 클래스에 속하지만, 객체(인스턴스)를 생성하지 않고 클래스 이름으로 직접 호출할 수 있는 메서드. 즉, 클래스 전체에서 공유되며, 인스턴스 변수 없이 동작할 수 있는 함수. 유틸리티 함수, 공통 설정 값, 데이터 검증 같은 기능에 유용함

  • Utility Function : 특정한 객체나 상태에 의존하지 않고, 재사용 가능한 공통 기능을 수행하는 함수. 즉, 반복적으로 사용되는 기능을 모아둔 함수로, 어디서든 호출할 수 있도록 설계. 어디서나 편하게 쓸 수 있는 공통 함수. 주로 정적 메서드(static)로 선언하여 클래스 이름으로 직접 호출 가능. <유틸리티 함수의 주요 활용 예제> 1. 수학 연산 (MathUtils) → 덧셈, 곱셈, 원의 넓이 계산 2. 문자열 조작 (StringUtils) → 대문자로 변환, 공백 검사 3. 데이터 검증 (Validator) → 이메일 & 비밀번호 유효성 검사 4. 날짜/시간 포맷팅 → 특정 형식으로 날짜 변환 5. 파일 처리 & 네트워크 요청 관리 → 파일 읽기/쓰기, API 요청

  • Parameter Constructor : 매개변수 생성자. 객체를 생성할 때 원하는 값을 바로 전달할 수 있도록 매개변수를 받는 생성자. 즉, 객체 생성 시 값 초기화를 편리하게 하기 위해 사용하는 생성자.

  • Named Constructor : 클래스에서 여러 개의 생성자를 정의할 수 있도록 해주는 기능. 즉, 같은 클래스에 다양한 방식으로 객체를 초기화할 수 있도록 별도의 이름을 붙인 생성자

  • JSON Serialization : JSON 변환. Dart 객체를 JSON 형식으로 변환하거나, JSON 데이터를 Dart 객체로 변환하는 과정. 즉, API에서 받은 JSON 데이터를 객체로 변환하거나, 객체를 JSON으로 변환할 때 필요

  • Encoding : 데이터를 특정 형식으로 변환하는 과정

  • Decoding : 인코딩된 데이터를 원래의 형식으로 변환하는 과정

  • Lifecycle : 생명주기. 객체나 애플리케이션이 생성되고, 사용되며, 종료되는 과정. 즉, 어떤 것이 시작부터 끝날 때까지 거치는 단계. 객체, 앱, 프로세스, 위젯 등 모든 소프트웨어 요소는 생명주기를 가짐. <소프트웨어에서 생명주기가 중요한 이유> 1. 자원을 효율적으로 관리 (메모리, CPU) 2. 적절한 시점에 초기화 및 정리(Cleanup) 3. 사용자가 앱을 어떻게 사용하는지 이해 가능 4. 필요한 동작을 특정 생명주기 단계에서 실행 가능

  • try : 실행 중 발생할 수 있는 예외를 잡아서 앱이 멈추지 않도록 하는 기능. 즉, 코드에서 에러가 발생해도 앱이 죽지 않고 정상적으로 동작할 수 있도록 예외를 처리하는 문법. 문제가 발생할 가능성이 있는 코드를 try로 감싸면 프로그램이 멈추지 않음. try-catch를 사용하면 에러를 잡고, 적절한 조치를 취할 수 있음

  • on : 특정한 예외만 처리하고 싶을 때 사용하는 키워드. 즉, 모든 오류가 아닌, 특정 오류만 잡아서 처리할 때 사용

  • catch : 블록에서 발생한 모든 예외를 잡아서 처리하는 키워드

  • finally : try-catch 구문에서 예외 발생 여부와 관계없이 항상 실행되는 블록. 즉, 오류가 발생해도, 발생하지 않아도 무조건 실행되는 코드

  • throw : 강제로 예외를 발생시키는 키워드. 즉, 특정 조건에서 오류를 직접 만들고, 이를 catch로 처리할 수 있도록 도와줌. Flutter 앱에서 유효성 검사(Validation)나 API 응답 처리 등에 활용됨

  • Validation : 유효성 검사는 사용자가 입력한 데이터가 올바른지 확인하는 과정. 사용자가 잘못된 데이터를 입력하지 않도록 검사하는 것. 회원가입할 때 이메일 형식이 맞는지, 비밀번호가 안전한지 확인하는 과정. <유효성 검사가 중요한 이유> 1. 잘못된 데이터 입력 방지 → 오류 발생 예방 2. 보안 강화 → SQL Injection, XSS 등의 공격 방지 3. 정확한 데이터 유지 → 데이터베이스에 깨진 데이터 저장 방지 4. 사용자 경험 개선 → 즉시 피드백 제공

  • Exception Class : Dart에서 오류(예외)를 정의하고 처리하는 데 사용하는 클래스

  • Inheritance : 상속. 하나의 클래스가 다른 클래스의 속성과 메서드를 물려받는 개념. 즉, 코드를 재사용하고 유지보수를 쉽게 하기 위해 부모 클래스의 기능을 자식 클래스가 그대로 사용할 수 있도록 해줌. extends 키워드를 사용하여 부모 클래스를 상속. super 키워드를 사용하여 부모 생성자 및 메서드 호출 가능. @override를 사용하여 부모 메서드를 재정의(오버라이딩)할 수 있음. abstract class를 사용하면 반드시 상속받아 구현해야 함

  • Sockets : 네트워크를 통해 데이터를 주고받을 수 있도록 해주는 통신 방식. 즉, 두 개의 장치(클라이언트-서버)가 인터넷이나 네트워크를 통해 데이터를 실시간으로 주고받을 때 사용. 채팅 앱, 온라인 게임, 실시간 알림 등에 사용

  • TCP Socket : TCP 프로토콜을 사용하여 두 장치(클라이언트-서버)가 안정적으로 데이터를 주고받는 방식. 즉, 클라이언트와 서버 간의 연결을 유지하면서 데이터를 주고받을 수 있는 소켓 통신. <TCP 소켓 통신의 특징> 1. 연결 기반(Connection-oriented) : 클라이언트와 서버가 연결을 유지하면서 데이터 전송 2. 신뢰성 보장(Reliability) : 데이터가 순서대로 안전하게 전달됨 (패킷 손실 없음) 3. 양방향 통신(Bidirectional) : 클라이언트와 서버가 동시에 데이터를 주고받을 수 있음 4. 실시간 통신(Real-time Communication) : 채팅, 게임, 파일 전송 등 실시간 데이터 교환 가능. < TCP 소켓 통신 과정> 1. 클라이언트 → 서버에 연결 요청 (3-way handshake) 2. 서버 → 연결 승인 (연결이 완료됨) 3. 클라이언트 ↔ 서버 간 데이터 주고받기 4. 연결 종료 (4-way handshake)

  • WebSocket : HTTP을 기반으로 두 장치(클라이언트-서버)가 데이터를 주고받는 방식

  • TCP(Transmission Control Protocol) : 전송 제어 프로토콜. 즉, 네트워크에서 데이터를 신뢰성 있게 전송하는 프로토콜을 의미

  • pubspec.yaml : Publication Specification 줄임말. Flutter 및 Dart 프로젝트의 설정을 관리하는 파일. 즉, 패키지(의존성), 프로젝트 정보, 환경 설정 등을 정의하는 설정 파일. 패키지를 추가하거나, 앱 이름, 버전, 아이콘 등을 설정

  • TTL(Time To Live) : 생존시간. 데이터가 네트워크에서 얼마나 오래 살아남을 수 있는지를 나타내는 값. 즉, 패킷이 네트워크를 통해 전달될 수 있는 최대 시간 또는 홉(Hop) 수를 제한하는 메커니즘. 네트워크에서 무한히 떠돌지 않도록 TTL 값이 0이 되면 폐기됨. DNS 캐시, IP 패킷, 메시지 큐 등 다양한 곳에서 사용됨. <TTL의 동작 원리> 네트워크에서 TTL이 줄어드는 방식 1. 데이터(패킷)가 네트워크에 전송됨 2. 패킷이 라우터(Router)를 지날 때마다 TTL 값이 1씩 감소 3. TTL 값이 0이 되면 패킷이 폐기(Drop)됨 4. 폐기된 패킷은 송신자에게 ICMP "Time Exceeded" 오류 메시지를 보냄

  • Packet : 네트워크에서 데이터를 작은 조각으로 나누어 전송하는 단위. 즉, 인터넷에서 파일, 웹페이지, 영상 등의 데이터를 작은 조각으로 나누어 목적지까지 보내는 방식. 패킷들이 여러 경로를 통해 이동한 후, 목적지에서 다시 조립됨. 모든 인터넷 통신(TCP/IP, UDP, HTTP, DNS 등)은 패킷을 기반으로 이루어짐

  • Dynamic List : 크기가 고정되지 않고, 필요에 따라 자동으로 늘어나거나 줄어드는 리스트. 즉, 배열과 달리 초기 크기를 미리 정할 필요 없이 데이터를 추가하거나 제거할 수 있는 리스트 구조. Dart에서는 List가 기본적으로 동적 리스트 역할을 함

  • Flutter 엔진 : Flutter 앱을 실행하는 핵심 컴포넌트로, UI 렌더링, 그래픽 처리, 애니메이션, 플러그인 통합 등을 담당하는 핵심 모듈. 즉, Flutter 앱이 실제로 화면에 UI를 그리는 역할을 하며, 네이티브 플랫폼(Android/iOS)과의 연결을 처리. <Flutter 엔진이 중요한 이유> 1. 고성능 UI → 60fps(초당 60 프레임) 이상 부드러운 애니메이션 지원 2. 일관된 UI → Android와 iOS에서 동일한 UI 렌더링 3. 빠른 개발 속도 → 핫 리로드(Hot Reload)로 즉시 코드 반영 4. 플랫폼 독립적 → 하나의 코드베이스로 여러 플랫폼 지원

  • Component : 소프트웨어에서 특정 기능을 수행하는 독립적인 단위(모듈). 즉, 하나의 애플리케이션을 구성하는 작은 조각(부분)으로, 재사용 가능하고 유지보수가 용이. 컴포넌트는 독립적으로 동작하며, 필요할 때 조립해서 사용 가능. Flutter에서는 위젯(Widget)이 컴포넌트 역할을 함 <컴포넌트의 특징> 1.독립성 : 컴포넌트는 독립적으로 동작하며 다른 부분과 영향을 주지 않음 2. 재사용성 : 한 번 만든 컴포넌트를 여러 곳에서 사용 가능 3.캡슐화 : 내부 동작을 숨기고, 외부에는 필요한 기능만 제공 4. 모듈화 : 프로그램을 여러 개의 작은 단위(모듈)로 나누어 관리

  • Transaction : 하나 이상의 작업(작업 단위)을 묶어서 실행하는 것. 모든 작업이 성공해야 최종적으로 적용되는 개념. 즉, 데이터베이스나 금융 시스템에서 여러 개의 작업이 하나의 단위로 실행되고, 중간에 오류가 발생하면 전체 작업이 취소되는 방식. 트랜잭션 내의 모든 작업이 완벽하게 처리되거나(Commit), 실패하면 전부 취소(Rollback). 중간에 오류가 나면 변경된 데이터는 원래대로 복구됨. <트랜잭션의 4가지 원칙 (ACID 원칙)> 1. Atomicity (원자성) : 트랜잭션 내 작업은 모두 실행되거나, 하나라도 실패하면 전체 취소 2. Consistency (일관성) : 트랜잭션이 실행되기 전과 후의 데이터가 항상 일관성을 유지 3. Isolation (고립성) : 여러 트랜잭션이 동시에 실행될 때, 서로 영향을 미치지 않도록 보장 4.Durability (지속성) : 트랜잭션이 성공하면 데이터가 영구적으로 저장됨

  • Custom Painting : 기본 제공되는 위젯이 아닌, 개발자가 원하는 대로 UI를 그릴 수 있는 기능. 직접 선(Line), 도형(Shape), 이미지(Image)를 그릴 수 있는 기능. Canvas와 Paint 객체를 활용하여 자유로운 그래픽 디자인 가능. 애니메이션, 그래프, 차트, 시계 등 복잡한 UI를 만들 때 유용

  • Troubleshooting : 문제(버그, 오류)가 발생했을 때 원인을 분석하고 해결하는 과정. 즉, 프로그램, 시스템, 네트워크, 하드웨어 등의 문제를 진단하고 수정하는 것. 단순히 오류를 수정하는 것이 아니라, 문제를 논리적으로 분석하고 해결하는 과정. <트러블슈팅 5단계> 1. 문제 확인 (Identify the Problem) : 무엇이 잘못되었는지 확인 (에러 메시지, 로그 분석) 2. 원인 분석 (Analyze the Cause) : 문제의 원인을 찾기 위해 실험, 테스트, 로그 검사 3. 해결 방법 찾기 (Find a Solution) : 기존 해결 방법 검색, 문서 참고, 실험적 접근 4. 해결 시도 (Implement a Fix) : 수정 사항 적용 (코드 변경, 설정 변경 등) 5. 테스트 및 검증 (Test & Verify) : 수정 후 정상적으로 동작하는지 확인

  • Build Runner : Dart에서 코드 생성을 자동화하는 도구. 즉, Dart 코드에서 추가적인 파일(코드)을 자동으로 생성하는 역할. JSON 변환, 불변 클래스 생성, 데이터베이스 코드 생성 등에 사용됨. 반복적인 코드 작성 없이, 명령어 한 줄로 자동 코드 생성 가능

  • Mockito : Flutter/Dart에서 테스트(Mock Test)를 위한 목 객체(Mock Object)를 생성해주는 라이브러리. 즉, 실제 객체를 대신할 가짜(Mock) 객체를 만들어 단위 테스트(Unit Test)를 쉽게 할 수 있도록 도와줌. API, 데이터베이스, 네트워크 요청 없이 가짜 데이터를 사용하여 테스트 가능. @GenerateMocks + flutter pub run build_runner build로 자동 Mock 생성

  • flutter pub run build_runner build : Flutter에서 반복적인 코드를 자동으로 만들어 주는 명령어. 직접 작성할 필요 없이 build_runner가 필요한 코드를 자동 생성. 특히 json_serializable, freezed, mockito 같은 패키지를 사용할 때 필수

  • Freezed : Dart에서 불변(Immutable) 클래스를 쉽게 생성할 수 있도록 도와주는 패키지. copyWith(), toString(), ==, hashCode 같은 메서드를 자동 생성

  • Immutable Class : 한 번 객체가 생성된 후, 그 객체의 상태나 속성 값을 변경할 수 없는 클래스. 즉, 객체를 생성한 후 그 값을 변경할 수 없으며, 객체의 상태는 고정됨. <불변 클래스의 특징> 1. 속성 값 변경 불가 : 클래스의 속성 값이 한 번 설정되면 변경할 수 없음 2. final 또는 const 사용 : 불변 객체를 만들려면 속성에 final 키워드를 사용하여 초기화만 가능. 객체를 const로 만들어 상수 객체로 설정할 수도 있음 3. 객체 수정 시 새로운 객체 생성 : 기존 객체를 변경하는 대신, 새로운 객체를 생성하여 상태를 변경 4. 안전한 병렬 처리 : 불변 객체는 다중 스레드 환경에서 안전하게 사용할 수 있음, 여러 스레드에서 같은 객체를 공유해도 상태가 변하지 않기 때문에 경쟁 상태(race condition) 문제를 예방할 수 있음

  • Redux : 애플리케이션의 상태를 효율적으로 관리하기 위한 상태 관리 라이브러리. 즉, 전역 상태를 중앙에서 관리하여 여러 위젯에서 쉽게 공유할 수 있도록 도와주는 아키텍처. 앱의 상태를 한 곳(스토어)에서 관리하는 패턴. 단방향 데이터 흐름(One-way Data Flow) 방식으로 상태 변경을 예측 가능하게 만듦. Flutter에서 여러 위젯이 같은 상태를 공유해야 할 때 사용. 상태가 변경될 때마다 예측 가능하게(state 변화 추적 가능) 동작. <Redux의 핵심 개념> 1. Store(스토어) : 앱의 전역 상태를 저장하는 곳 2. Action(액션) : 상태를 변경하는 유일한 방법 (이벤트 같은 개념) 3. Reducer(리듀서) : 현재 상태와 액션을 받아 새로운 상태를 반환하는 함수

  • Riverpod : Flutter의 상태 관리를 쉽게 할 수 있도록 도와주는 라이브러리. 즉, 앱의 상태를 효율적으로 관리하고, 전역적으로 공유할 수 있도록 하는 강력한 상태 관리 솔루션. Provider의 업그레이드 버전. <Riverpod이 필요한 이유> 1. Provider는 위젯 트리에 의존하여 위젯이 많아지면 복잡해짐 2. Riverpod은 위젯 트리와 독립적이므로 어디서든 상태를 접근 가능 3. Provider는 안전성이 부족(런타임 오류 발생 가능) 4. Riverpod은 컴파일 타임에 오류를 방지하여 더 안정적

  • BLoC(Business Logic Component) : Flutter에서 상태 관리를 체계적으로 하기 위한 아키텍처 패턴이자 라이브러리. 즉, 이벤트 기반(Event-Driven) 상태 관리 방식으로, UI와 로직을 분리하여 앱을 구조적으로 관리할 수 있도록 도와줌. 사용자의 입력(이벤트)을 받아 상태(State)를 변경하는 방식의 상태 관리 패턴. UI와 비즈니스 로직을 철저히 분리하여 유지보수가 쉬움. Event → BLoC → State" 순서로 상태가 업데이트됨. <BLoC의 핵심 개념> 1. Event(이벤트) : 사용자의 입력 (버튼 클릭, API 호출 등) → 상태 변경 요청 2. State(상태) : 현재 UI의 상태를 나타내는 값 3. Bloc(비즈니스 로직) : 이벤트를 받아 새로운 상태를 생성하는 중간 관리층

  • CSV(Comma-Separated Values) : 쉼표(,)로 구분된 텍스트 데이터를 저장하는 파일 형식. 즉, 엑셀과 같은 표 형태의 데이터를 저장할 때 사용되는 간단한 파일 포맷. 엑셀처럼 행(Row)과 열(Column)로 이루어진 데이터 저장 형식. <CSV의 장점> 1. 간단하고 가벼움 → 텍스트 파일이라 파일 크기가 작음 2. 엑셀, 데이터베이스, Python, Flutter 등 다양한 환경에서 사용 가능 3. 읽고 쓰기가 쉬움 → ,로 구분되므로 사람이 직접 편집 가능 4. 데이터 교환이 용이함 → API, 데이터베이스에서 많이 사용됨. <CSV의 단점> 1. 구조가 단순하여 복잡한 데이터 표현이 어려움 (JSON, XML보다 기능이 적음) 2. 데이터 타입이 없어서 문자열과 숫자를 구분하기 어려움 3. 대량의 데이터 처리 시 비효율적 (No Index, No Schema)

  • Pattern : 반복적으로 발생하는 문제를 해결하기 위해 사용하는 일반적인 해결 방법(템플릿). 즉, 효율적인 코드 작성, 유지보수, 확장성을 높이기 위해 사용되는 설계 원칙. <패턴의 종류> 1. 디자인 패턴(Design Pattern) : 객체지향 프로그래밍에서 자주 쓰이는 설계 방식. 예) 싱글톤, 팩토리, 옵저버 2. 아키텍처 패턴(Architecture Pattern) : 애플리케이션 전체 구조를 설계하는 패턴. 예) MVC, MVVM, BLoC 3.UI/UX 패턴 : 사용자 경험(UX)과 UI 설계를 위한 패턴. 예) 네비게이션 바, 모달 윈도우

  • Docker : 애플리케이션을 컨테이너라는 가상 환경에서 실행할 수 있도록 도와주는 플랫폼. 즉, 개발, 테스트, 배포 환경을 동일하게 유지하면서 애플리케이션을 실행할 수 있도록 도와주는 도구. Docker를 사용하면 어디서든 동일한 환경에서 애플리케이션을 실행할 수 있음. 운영체제(OS)와 무관하게, 애플리케이션과 필요한 모든 파일을 컨테이너에 패키징. 가상 머신(VM)보다 가볍고, 빠르며, 실행 환경을 쉽게 복제할 수 있음

  • Modal Window : 현재 작업을 중단하고 사용자의 입력을 반드시 받아야 하는 팝업 창. 모달 창이 뜨면, 사용자는 모달을 닫기 전까지 다른 작업을 할 수 없음. 로그인 창, 경고 메시지, 확인 창 등이 대표적인 모달 윈도우. 일반적인 팝업과 다르게, 사용자가 반드시 반응해야 함. <모달 윈도우가 필요한 이유> 1. 사용자 입력을 강제 : 중요한 결정(삭제 확인, 결제 확인 등)을 사용자가 확실히 입력하도록 유도 2. 현재 화면과 독립적인 작업 수행 : 로그인, 설정 변경 등 다른 작업을 방해하지 않고 처리 가능 3. UI/UX 개선 : 별도의 페이지 이동 없이 빠르게 필요한 정보를 입력받을 수 있음

  • Attribute : 속성. 객체(Object) 또는 요소(Element)의 특정한 값이나 특징을 정의하는 데이터. 클래스, HTML 태그, 데이터 모델 등 다양한 곳에서 사용

  • Observer Pattern : 옵저버 패턴은 어떤 객체의 상태 변화를 다른 객체들이 감지하고 자동으로 반응할 수 있도록 하는 디자인 패턴. 어떤 객체가 변하면, 그것을 구독(Observer)한 객체들이 자동으로 업데이트됨. Flutter에서는 Provider, Stream, Bloc 등이 옵저버 패턴을 활용. <옵저버 패턴이 필요한 이유> 1. 객체 간 의존성을 줄임 : UI와 데이터 모델이 직접 연결되지 않고, 변경 사항을 옵저버들이 감지함 2. 자동 업데이트 가능 : 데이터가 바뀌면 수동으로 UI를 업데이트할 필요 없이 자동으로 반영됨 3. 이벤트 기반 프로그래밍에 적합 : 실시간 데이터 스트림, 상태 관리 등에 활용. <옵저버 패턴의 구조> 1. Subject(주체, 관찰 대상) : 변경 사항을 감지하고 옵저버들에게 알림 2. Observer(옵저버, 구독자) : Subject의 변경을 감지하고 자동으로 반응

  • Singleton Pattern : 싱글톤 패턴. 프로그램 내에서 특정 클래스의 인스턴스를 오직 하나만 생성하고, 모든 곳에서 동일한 인스턴스를 공유하도록 보장하는 디자인 패턴. 즉, 객체가 여러 개 만들어지는 것을 방지하고, 하나의 인스턴스를 재사용하는 패턴. 하나의 객체를 전역적으로 공유. 클래스의 인스턴스가 단 하나만 존재하도록 보장. 어디에서 호출하든 항상 같은 객체를 반환. Dart에서는 static final과 factory 생성자를 사용해 구현 가능. <싱글톤 패턴이 필요한 이유> 1. 불필요한 객체 생성을 방지 : 데이터베이스 연결, 설정 파일 관리 등 한 개의 인스턴스만 필요한 경우 유용 2. 메모리 절약 & 성능 향상 : 같은 객체를 계속 생성하면 메모리 낭비, 싱글톤을 사용하면 이미 생성된 객체를 재사용하여 성능 최적화 3. 전역 상태 관리 : 앱 설정, 네트워크 관리, 캐시 저장 등 전역적으로 공유할 데이터 관리에 적합

  • Factory Pattern : 팩토리 패턴은 객체를 직접 생성하지 않고, 생성 로직을 캡슐화하여 제공하는 디자인 패턴. 즉, 객체 생성을 숨기고, 특정 조건에 따라 적절한 인스턴스를 반환하는 방식. 객체를 만들 때 new 키워드를 직접 사용하지 않고, 팩토리 메서드에서 생성. 어떤 객체를 반환할지 팩토리 메서드 내부에서 결정. Dart에서는 factory 키워드를 사용하여 팩토리 생성자 구현 가능. <팩토리 패턴이 필요한 이유> 1. 객체 생성을 캡슐화 : 클래스 내부에서 어떤 객체를 반환할지 제어 가능, 객체 생성 방식이 변경되더라도 외부 코드 수정 필요 없음 2. 싱글톤 패턴 구현 가능 : 팩토리 생성자를 사용하면 싱글톤을 쉽게 구현할 수 있음 3. 캐싱 가능 : 이미 생성된 객체가 있다면 새 객체를 만들지 않고 기존 객체 반환 가능

  • Shadowing : 내부 스코프(범위)에서 선언된 변수가 외부 스코프의 동일한 이름의 변수를 가리는 현상. 즉, 같은 이름의 변수가 두 개 존재할 때, 내부 변수가 외부 변수를 덮어써서 외부 변수에 접근할 수 없는 현상. 이름이 같으면, 내부 블록(함수, 조건문 등)의 변수가 우선적으로 사용됨. 클래스에서는 this 키워드를 사용하면 해결 가능

  • Raspberry Pi : 초소형 싱글보드 컴퓨터(SBC, Single Board Computer)입니다. 즉, 손바닥 크기의 작은 컴퓨터로, 리눅스 운영체제를 실행하고 다양한 프로젝트에 활용할 수 있음. 프로세서(CPU), RAM, USB 포트, HDMI 포트, GPIO 핀까지 모두 포함. 리눅스 OS 실행 가능, 코딩, IoT, 로봇, 미디어 서버 등 다양한 용도로 사용. <라즈베리파이의 특징> 1. 작고 저렴한 컴퓨터 : 크기는 신용카드보다 약간 크고, 가격은 일반 PC보다 훨씬 저렴함. 기본적인 웹 브라우징, 문서 작업, 프로그래밍 가능 2. 다양한 운영체제(OS) 지원 3. GPIO 핀을 이용한 전자제어 가능 : LED, 센서, 모터, 카메라 모듈 등 다양한 하드웨어 제어 가능. IoT(사물인터넷) 프로젝트에 많이 사용됨 4. 네트워크 & 미디어 기능 : Wi-Fi & Bluetooth 지원 (최신 모델), HDMI 포트를 통해 모니터 연결 가능

  • Deep Link : 앱 내 특정 화면으로 바로 이동할 수 있도록 해주는 URL 또는 링크. 즉, 앱을 실행하면서 특정 페이지(화면)로 바로 이동하는 링크. 사용자가 앱을 실행할 필요 없이, 링크를 클릭하면 원하는 화면으로 바로 이동. 마케팅, 푸시 알림, 공유 기능 등에 활용 가능. <딥링크의 종류> 1. 기본 딥링크(Custom URL Scheme) : 특정 URL 스키마를 사용하여 앱을 실행하고, 특정 화면으로 이동하는 방식. 웹에서 사용 불가. 예시) myapp://product/1234, 사용) 네이티브 앱에서 직접 정의한 URL 스키마 2. 유니버설 링크(Universal Link, Android App Links) : iOS & Android에서 공식적으로 지원하는 딥링크 방식. HTTP/HTTPS 링크를 사용하여 앱을 실행 (웹과 연결 가능) 예시) https://example.com/product/1234. 앱이 설치되지 않은 경우, 웹사이트로 이동 3. 동적 링크(Firebase Dynamic Links) : 앱이 설치되지 않아도 링크를 통해 앱을 설치하고, 이후 특정 화면으로 이동. Firebase에서 제공하는 기능. 예시) https://myapp.page.link/product1234

  • CI/CD : 소프트웨어를 자동으로 빌드, 테스트, 배포하는 개발 방식. CI(Continuous Integration, 지속적 통합) → 코드 변경을 자동으로 빌드 & 테스트. CD(Continuous Deployment/Delivery, 지속적 배포/전달) → 코드 변경을 자동으로 배포. 개발자가 코드를 변경하면, 자동으로 테스트 & 배포까지 진행. 수동으로 코드를 빌드하고 배포하는 번거로움을 없애줌. 버그를 빠르게 찾아내고, 안정적으로 업데이트 가능. <CI/CD가 필요한 이유> 1. 자동화로 개발 효율성 증가 : 코드를 바꿀 때마다 테스트 & 배포를 자동으로 진행 → 개발 속도 상승 2. 버그 발생 시 빠르게 감지 : CI 과정에서 자동 테스트 진행 → 버그를 초기에 발견하고 해결 가능 3. 배포 속도 증가 & 안정성 확보 : CD를 사용하면 버튼 클릭 없이 자동으로 배포 가능. 여러 명이 협업할 때 코드 충돌을 방지하고 안정적인 릴리즈 가능. <Flutter에서 CI/CD 자동화 도구> 1. GitHub : GitHub Actions (무료, 강력함) 2.GitLab : GitLab CI/CD 3. Bitbucket : Bitbucket Pipelines 4. 전용 서비스 : Codemagic, Fastlane (Flutter 앱 최적화)

profile
What up

0개의 댓글