article thumbnail image
Published 2023. 1. 13. 16:05

flutter 설치 후

cd $HOME/Documents
unzip $HOME/Downloads/flutter_macos_3.30.5-stable.zip
vi ~/.bash_profile

# export PATH="$PATH:Users/jiwonpar/Documents/bin" 추가

 

xcode 설치 후

sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer
sudo xcodebuild -runFirstLaunch

 

안드로이드 스튜디오 설치 (기본 값으로 설치하기)

이후 플러그인에서 flutter 설치 하기


설치 이후 문제를 해결하기 위해 flutter doctor 명령어 입력

-> cmdline-tools component is missing 에러 : android SDK Command Line Tools 설치 안 되어 생기는 에러

-> Android license status unknown 에러 : 라이센스 동의 진행 안 되어 생기는 에러

 

두가지 문제를 해결한 이후에도 아래 사진과 같은 에러가 해결되지 않음

https://guides.cocoapods.org/using/getting-started.html#installation
해당 사이트를 통해 cocoapods 설치를 진행하였으나 진행되지 않음

 

CocoaPods Guides

CocoaPods is fully open-sourced, so it depends on community contributions to get better. If you're looking to start working on CocoaPods, this is the place to start.

guides.cocoapods.org

 

Error installing cocoapods: ERROR: Failed to build gem native extension.

xcode 소프트웨어의 업데이트가 필요해 발생한 에러로 xcode-select --install 를 통해 업데이트 진행 후 cocoapods 설치 해야함

xcode-select --install
sudo gem install cocoapods

-> 위 코드 두줄을 진행하였으나 똑같은 에러로 진행되지 않음 : 맥 OS 소프트웨어 업데이트로 문제 해결

이로써 맥OS 개발 환경 구축을 완료함


Flutter는 Dart 프로그래밍 언어를 통해 개발

<Dart>

비동기 언어 / 이벤트 기반 / 동시성 기능 제공 / 널 세이프티, 스프레드, 콜렉션 if문 등 제공 / 자바스크립트 언어

  개발할 때 배포할 때
네이티브 JIT + VM AOT + 런타임
웹 자바스크립트 dartdevc dart2js

JIT : Just in time -> 다트 가상머신에서 코드의 변경된 사항을 즉시 화면에 반영할 수 있는 핫리로딩 제공

그러나 배포할 때는 컴파일이 되어있어야 더욱 효율적 사용 가능 / 그래서 배포시에는 AOT 사용

AOT : Ahead of time -> 기계어로 다트언어가 직접 컴파일

 

<문법 공부 방법>

1. https://dartpad.dev

 

DartPad

 

dartpad.dev

해당 다트패드를 통해 온라인 개발 환경을 확인할 수 있음

2. 안드로이드 스튜디오 내 main.dart 파일에 생성되는 모든 코드 삭제

void main(){
 print('hello world');
}

위와 같은 main() 함수만 남겨둔 후, 터미널에 dart lib/main.dart 명령어 실행

(이와 같은 방식으로 dart lib//main.dart 명령을 통해 코드 실행)

 


<기초 문법>

1. 메인 함수

void main(){

}

-> 이때 void : 아무 값도 변환하지 않음 / () 안 매개변수가 없음으로 아무런 매개변수도 받지 않음

 

2. 주석

// 한줄주석

/*
 * 여러줄
 * 주석
 */
 
 ///문서 주석

 

3. print 함수

void main(){
 print('ABC');
}

 

4. 변수 선언

void main(){
 //var를 통한 변수 선언
 var va = "test";
 print(va);
 
 va = "TEST";
 print(va);
 
 //dynamic을 통한 변수 선언
 dynamic dy = "test";
 print(dy);
 
 dy = 1;
 print(dy);
 
 //final, const를 통한 변수 선언
 final String fi = 'hello';
 name = 'hi'; // 해당 코드는 error : final로 선언한 변수는 선언 이후 값 변경 불가
 
 const String co = 'hi';
 co = 'hello'; // 해당 코드는 error : const로 선언한 변수는 선언 이후 값 변경 불가
 
 // 이 외 변수타입
 String name = 'string';
 int num = 10;
 double flo = 1.1;
 bool tru = true;
}

var, dynamic : 변수에 값이 들어가면 자동으로 타입 추론 (그러나 직접 변수 타입 명시시 코드가 직관적이라 유지보수 쉬워짐)

var / dynamic 차이점

1. var의 경우 타입을 한번 유추하면 타입이 고정됨 : 이후 다른 타입값으로 변경 불가

2. dynamic의 경우 타입이 고정되지 않음 : 이후 다른 타입값으로 변경 가능

 

final, const : 변수의 값을 처음 선언 후 변경 불가능

final / const 차이점

1. final : 런타임 상수 - 코드가 실행될 때 값이 확정되면 사용

2. const : 빌드타임 상수 - 코드를 실행하지 않은 상태에서 값이 확정되면 사용


5. 컬렉션

여러 값을 하나의 변수에 저장할 수 있는 타입 ( 종류 : List, Map, Set )

장점 : 서로의 타입으로 자유롭게 형변환이 가능

 

5.1 List 타입

여러 값을 순서대로 한 변수에 저장할 때 사용

void main(){
 List<String> testList = ['a', 'b', 'c', 'd'];
 
 print(testList);
 print(testList[0]);

 print(testList.length); // 리스트의 길이 반환
 
 
 testList[0] = 'A'; // 값 변경
 print(testList[0]); // [A, b, c, d]
 
 
 testList.add('e'); // 리스트의 끝에 값 추가 : [A, b, c, d, e]
 
 
 final newList = testList.where(
  (test) => test == 'A' || test == 'b',
 );
 
 print(newList); // (A, b)
 print(newList.toList()); // 해당 값을 List로 다시 변환할 때 // [A, b]
 
 ... map(), reduce(), fold() 함수
}

.add() : 리스트의 끝에 값 추가

.where() : 리스트에 있는 값들을 순서대로 루핑하며 필터링해 true는 값 유지, flase는 값 버림 / 매개변수에 함수 입력 ( 함수는 리스트의 값을 매개변수로 입력받음)

-> 루핑이 끝난 후에 유지된 값들을 기반으로 이터러블 반환

* Iterable : 추상 클래스  -> 순서가 있는 값을 반환할 때 사용 / List와 Set 같은 컬렉션이 공통으로 사용하는 기능을 정의해둔 클래스

.toList() : Iterable 을  리스트로 다시 변환할 때 사용

.map() : 리스트에 있는 값들을 순서대로 루핑하며 값 변경 / 매개변수에 함수 입력 ( 함수는 리스트의 값을 매개변수로 입력받음) 

복사했습니다!