
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 -> 기계어로 다트언어가 직접 컴파일
<문법 공부 방법>
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() : 리스트에 있는 값들을 순서대로 루핑하며 값 변경 / 매개변수에 함수 입력 ( 함수는 리스트의 값을 매개변수로 입력받음)