-
반응형
변수 선언
- var : 타입 추론 (자동으로 타입을 추론해줌. 명시적으로 타입을 선언하지 않아도 되지만 많은 사용을 추천하진 않음)
var name = ‘홍길동’;
- 특징 : 같은 타입의 값을 치환해도 오류 나지 않음. 다른 타입의 값 입력시 오류
- dynamic : var와 다르게 해당 키워드를 사용하면 변수의 타입이 고정되지 않아 다른값 저장 가능
- dynamic name = '홀길동'; name = 1;
- final , const : final, const 로 선언한 변수는 값을 변경할수 없음💡알고 넘어가요const : 빌드 타입 상수 (코드를 싱행하지 않은 상태에서 확정된 값)
- final : 런타입 상수 (코드를 실행할때 확정된 값)
- final String name = '홍길동'; name = '이순신'; // 에러 발생 const String name = '홍길동'; name = '이순신'; // 에러 발생
- 변수 타입intbool
- double
- String
컬렉션
여러값을 하나의 변수에 저장할수있게 해주는 타입
- List : 여러값을 순서대로 저장하기위함
→ where() : list를 순회 하면서 특정 조건에 맞는값 필터링할때 사용→ map() : list에 들어있는 함수를 순회하면서 값을 변경할때 보통 사용→ reduce() : 순회 할때마다 값을 쌓아가는 특징이 있음리스트에 타입 값들은 반환값들과 동일해야함→ fold() : reduce 함수와 논리적으로는 값지만 차이점은 여러타입을 반환할수 이음List<String> name = ['홍길동', '이순신', '신사임당'] name.add('세종대왕'); print(name); // ['홍길동', '이순신', '신사임당', '세종대왕']
List<String> name = ['홍길동', '이순신', '신사임당']; final foldName = name.fold<int>(0, (value, element) => value + element.length); print(foldName); // 10
- 대신 어떤타입으로 반환할것인지 명시 해줘야함
- List<String> name = ['홍길동', '이순신', '신사임당'] final reduceName = name.reduce((value, element) => value + ',' + element); print(reduceName); // 홍길동, 이순신, 신사임당
- 위의 함수들은 iterable을 반환하지만 reduce는 List멤버의 타입과 같은 타입 반환
- List<String> name = ['홍길동', '이순신', '신사임당'] final mapName = name.map((e) => '위인 $e'); print(mapName); // ('위인 홍길동', '위인 이순신', '위인 신사임당')
- List<String> name = ['홍길동', '이순신', '신사임당'] final whereName = name.where((e) => e == '이순신' || e == '신사임당'); print(whereName); // ('이순신', '신사임당')
- → add() : 값을 추가 할때 사용
- Map : 특정 키값을 빠르게 검색 할떄 사용
Map<String, String> compony = { '인사팀' : '홍길동' , '홍보팀' : '이순신' , '범무팀' : '신사임당' , }; print(compony['범무팀']); // 신사임당 print(compony.key); // (인사팀, 홍보팀, 범무팀) print(compony.values); // (홍길동, 이순신, 신사임당)
- 순서대로 값을 저장하는데에 중점인 List와 달리 키를 이용해서 원하는 값을 빠르게 찾는데 중점을 둠
- Set : 중복 된 데이터를 제거할때 사용
- Set<String> compony = {'홍길동', '이순신', '신사임당', '신사임당'}; print(compony); // {홍길동, 이순신, 신사임당} // contains 함수는 값이 있는지 없는지 알수있음 print(compony.contains('홍길동')); // true
- enum : 한 변수의 값을 몇가지 옵션으로 제한하는 기능
enum Status { login, logout } Status sta = Status.login; print(sta); // Status.login
- 어떤 선택지가 존재하는지 정의해둘수있기 때문에 유용
연산자
- 산술 연산자 지원
+,-,*,/,~/,% (더하기, 뺴기, 나누니, 몫, 나머지)
- 증감 연산자 지원 (전위, 후위)
- 비교 연산자 지원 (==, ≠, >,<,≥,≤)
- 논리 연산자 지원 (&&, ||, ==, !,≠)
- 타입 검사 지원 (is! : 다른 타입이면 true
- is : 같은 타입이면 true
)
- null 관련 연산자double? number = 1;double number = null;
- void main() { double? number; print(number); // null number ??= 3; // ??를 사용하면 기존 값이 null일 때만 값 치환 print(number); // 3.0 number ??= 5; // null이 아니므로 3 유지 print(number); // 3.0 }
- // 타입뒤에 ?를 명시하지 않으면 에러발생
- // 타입 뒤에 ?를 명시해서 null 값을 가질수 있음
함수와 람다
다트 함수에서 매개변수를 지정하는 방법으로 순서가 고정된 매개변수, 이름이 있는 매개변수로 나뉘어짐
- 위치 매개변수
- int addNumber(int a, int b) { return a + b; } void main() { print(addNumber(2,2)); // 4 }
- 명명된 매개변수required 키워드는 매개변수가 null 값이 불가능함 타입이면 기본겂울 지정하거나 필수로 입력해야 한다는 의미
- int addNumber({ required int a, required int b }) { return a + b; } int addNumber2({ required int c, int d = 2 }) { return c + d; } void main() { print(addNumber(a: 3, b: 3)); // 6 print(addNumber2(c: 3)); // 5 }
- 네임드 파라미터로 지정하려면 { } required 키워드를 사용해야 함
- typedef 와 함수(여기서 말하는 시그니처는 반환값 타입, 매개변수 개수와 타입등을 말함.
프라이빗 변수
Dart 에서는 프라이빗 변수가 다른언어놔 약간 차이가 있음.Dat에서는 같은 파일에서만 접근 가능한 변수변수명 앞에 _ 기호를 붙이지 않으면 외부에서 접근이 가능하고, 붙이면 접근 불가Dart Javapublic AAA public AAA private _AAA private AAA class Idol { String _name; idol(this._name); } void main() { Idol blakpink = Idol('블랙핑크'); // 같은 파일에서는 _name 변수에 접근 할수 있음 // 다른 파일에서는 _name 변수에 접근 할수 없음 print(blakpink._name); }
getter, setter
프라이빗 변수에 접근하려면 게터와 세터 메서드가 필요함
getter : 값을 가져올때 사용. 가변 변수를 선언해도 직접 값을 가져오거나 지정할수 있지만 게터와 세터를 사용하면 어떤 값이 오눌최고 어떤 형태로 노출될지 그리고 어떤 변경 가능하게 할지 유연하게 정할수 있음import 'dart:math'; class Person { late final int _age; int get age => _age; set age (int value) => _age = value; } void main() { Person p = Person(); p.age = 20; print(p.age ); } // _age 값 20 출력
상속
extends 키워드를 상속할수 있습니다.Class Idol { final String name; final int memberCount; Idol(this.name, this.memberCount) } Class BoyGroup extends Idol { BoyGroup( String name, int memberCount, ) : super( name, memberCount ) }
오버라이드
오버라이드는 부모클래스 또는 인터페이스에 정의된 메서드를 재정의할때 사용됨@override void sayName() { print("test"); }
인터페이스
상속은 공유 되는 기능을 상속받는개념이지만 인터페이스는 공통으로 필요한 기능들을 정의해 두는 역할을 합니다.믹스인
믹스인은 특종 클래스에 원하는 기능들만 골라 넣을 수있는 기능또한 인터페이스처럼 한개의 클래스에 여러개의 믹스인을 적용할수 있습니다.추상은 상속이나 인터페이스로 사용하는데 필요한 속성만 정의하고 인스턴스화 할 수도 옶도록 하는 기능 입니다.인스턴스에서 해당 인스턴스의속성이나 멘버 함수를 호출해 사용 하는 기능cLASS iDOL { final String name; final int memberCount; IDOL(this.name, this.memberCount); void sayNmae() { orunt('저는 여자 아이돌 ${this.name}입니다'); } void sayMemberCount() { orunt('인원은 ${this.memberCount} 명 입니다'); } } void main() { IDOL blakPink = IDOL('블랙핑크', 4) ..sysMame() ..sayMemberCount(); } // 저는 여자 아이돌 블랙핑크 입니다 // 인원은 4 명 입니다
- Future그렇기 때문에 컴퓨터 자원을 낭비 하지 않고 더욱 효율 적으로 코드를 실행할수 있음List 나 Set 처럼 어떤 미래의 값을 받아올지를 정할수 있습니다. 비동기 프로그램은 서버 요청과 같이 오래 걸리는 작업을 기다린후 값을 받아와야 하기 때문에 미래값을 표현하는 Future 클래스가 필요함
- Future<String> name; // 미래에 받을 String 값
- Future<int> number; // 미래에 받을 int 값
- Future<bool> ipOpened; // 미래에 받을 boolean 값
- 비동기 프로그래밍은 요청한 결과를 기다리지 않고 응답 순서또한 요청한 순서와 다를수 있음
- async 와 await - async 와 await 키워드를 사용하면 비동기 프로그랴밍을 유지하면서도 코드 가독성을 유지할수 있음
-
Future<int> futureNumber() { // 3초 후 100을 반환 return Future<int>.delayed(Duration(seconds: 3), () { return 100; }); } void main() async{ // future 라는 변수에서 미래에(3초 후에) int가 나올 것입니다 int result = await futureNumber(); print(result); print('main 종료'); } // 100 // main 종료
- Stream
컨트롤러가 add를 해서 제공을 해주고
스트림은 컨트롤러에서 받은 것을 subscription에게 전달해주는 역할을 함.
스트림은 한개의 리슨만 할 수 있음
하지만 broadcast를 하면 여러개의 리슨을 할 수 있음
Future는 반환값을 딱 한번 받아내는 비동기 프로그래밍을 사용
지속적으로 값을 반환받을때는 Stream을 사용함
단일
import 'dart:async'; void main() async { final streamController = StreamController(); streamController.stream.listen(print); streamController.sink.add('test'); streamController.sink.add(100); // test // 100 }
다중
import 'dart:async'; void main() { var streamController = StreamController.broadcast(); streamController.stream.listen((event) { print('first subscription: $event'); }); // the second subscription streamController.stream.listen((event) { print('second subscription: ${event + event}'); }); // push events streamController.sink.add(1); streamController.sink.add(100); } // first subscription: 1 // second subscription: 2 // first subscription: 100 // second subscription: 200
반응형'flutter' 카테고리의 다른 글
위젯(Widget) 개인 정리 (0) 2023.04.11 FLutter 개인 정리 (0) 2023.04.11 flutter Version 3.7대 오류 (0) 2023.03.14 flutter 3.7 버전 오류 (0) 2023.03.06 현지화(Localization) (0) 2023.02.14 - var : 타입 추론 (자동으로 타입을 추론해줌. 명시적으로 타입을 선언하지 않아도 되지만 많은 사용을 추천하진 않음)