- Function의 body
- Var 변수 키워드: String, int, double, List<String>, Map(key와 value로 이루어짐)
(데이터타입 따로 지정안해도 자동으로 지정됨)
int timesTwo(int x){
return x*2;
}
int timesThree(int x) =>x*2;
- 다트 문법은 main() 함수가 진입점-> void main(){
Print("hh");
}
- 다트는 객체지향 언어이며 단일 상속을 지원한다.
- 다트에서 모든 것이 객체이며 모든 객체는 클래스의 인스턴스이다. 모든 객체는 Object 클래스를 상속받는다. 심지어 숫자도 기본형이 아니라 객체!
- 다트는 형식을 갖는다. 문자열을 반환한다고 선언한 함수에서 숫자를 반환할 수 없다.
- 다트는 최상위 수준 함수와 변수를 지원하며 이를 라이브러리 멤버라 부른다.
- 다트는 어휘적으로 한정된다.
# 형식 시스템
- 변수를 선언할 때는 형식을 지정해야 한다.
- List나 Map을 사용할 때는 <와> 사이에 요소의 형식을 정의한다.
- 함수에서 인수를 정의할 때도 형식을 사용한다.
Return x+y;
}
- 다트는 동적 형식도 지원한다. 변수를 dynamic으로 설정하면 컴파일러가 해당 변수에 모든 형식을 허용한다.
# 주석 종류 3가지
//: 한 줄 주석
/* */: 여러 줄 주석
///: 문서 주석-> 메서드나 클래스 정의 위에 작성하면 dartdoc과 같은 문서 생성 도구를 통해 문서를 자동으로 생성해줌
- 문장은 세미콜론으로 표시!
# final, const, static
- 세 키워드는 변수의 형식을 확장한다.
- 변수의 값을 바꿀 수 없게 하려면 final, const 사용
- Final 변수는 한 번만 할당할 수 있으며 클래스 수준에서 변수를 할당하기 전에 선언함. 쉽게 말해 클래스의 생성자에서 할당하는 모든 변수에 final을 사용함
- 반면 const 변수는 할당하기 전에 선언하지 않음 컴파일 이후로 항상 같은 값을 갖는 변수를 상수라고 함
# 변수: num(int, double), String, bool
- 변수에 담긴 값은 언제라도 다른 값으로 바꿀 수 있음
- 타입 추론
다트는 타입을 직접 명시하지 않고 var로 대체할 수 있는 타입 추론을 지원
- 변수는 값이 변경되어 의도치 않게 에러를 발생할 가능성이 있으므로 가급적이면 값이 변하지 않게 상수로 사용하는 것이 좋음-> final 키워드를 제일 앞에 붙이면 값이 수정되지 않는 상수로 사용가능!
- 변수에 required 키워드 애너테이션을 추가하려면 meta라는 다트 라이브러리를 사용해야 함
# 산술연산자: +, -, *, /, ~/(정수 나눗셈), %
# 증감연산자
# 비교연산자
# 논리연산자: &&,||
# 타입검사: is, is!
Ex)
void main(){
int a=10;
if(a is int){
print('정수');
}
String text='hello';
if(text is! int){
print('숫자가 아님');
}
}
# ?. 연산자
# ?? 연산자: 값이 존재하지 않는 상황에 할당할 백업값을 지정 가능-> 이 값이나 변수가 null이면 백업값을 사용하시오를 의미
# ??= 연산자: 객체가 null이면 백업값을 할당하고 아니면 객체를 그대로 반환한다.
# 형변환: as 키워드 사용-> int와 double 모두 상위 개념인 num으로 형변환 가능
- Assert() 함수는 계산 결과가 참인지 검사
- 더하기 연산자의 또 다른 쓰임새는 두 개의 문자열을 결합하는 것
# 함수
Int f(int x){
Return x+10;
}
Void main(){
Var result=f(10);
}
- 함수는 입력과 출력을 다양하게 조합 가능
- 입력값은 없거나 여럿일 수 있음
- 출력값은 없거나 하나만 있을 수 있음
- Print() 함수는 반환값이 void인 대표적인 함수
변수 앞에 $ 기호를 붙여 문자열 내에 변수를 삽입할 수 있음
Ex)
String _name='홍길동';
int _age= 20;
void main(){
print('$_name은 $_age살입니다.');
}
- 클래스 내부에 작성하는 함수를 메서드라고 함
- 정의된 클래스에 관계된 기능을 수행
Ex)
class Myclass{
bool isEven(int number){
return number %2==0;
}
}
var myClass=MyClass();
print(myClass.isEven(10)); //static키워드를 붙이면
정적 메서드가 되며 함수로 볼 수 있음
Ex)
void main(){
Person person=Person("hjw",age:24);
person.greeting();
}
class Person{
String name;
int age;
Person(this.name,{this.age});
void greeting(){
print('안녕하세요 저는 $name입니다.');
}
}
# 익명함수: 이름 없는 함수도 정의해 사용 가능
- ([인수명]) {[동작 또는 반환값]}
(number){
return number %2==0;
};
# 람다식
- ([인수명]) => [동작 또는 반환값]
(number)=> number % 2 ==0;
# 선택 매개변수: 함수 정의에서 {}j로 감싼 매개변수는 선택적으로 사용 가능
- 호출시 매개변수명을 값 앞에 써주면 됨-> 이름 있는 매개변수라고 함
- 만약 필수 매개변수와 선택 매개변수를 함께 사용하고 싶다면 앞쪽에 필수 매개변수를 먼저 둔다.
- 선택 매개변수는 호출할 때 매개변수명을 함께 쓰기 때문에 옵션이 많을 때도 가독성을 높여주는 장점
void something(String name,{int age}){}
void main(){
something('홍길동',age: 10);
something('홍길동');
}
main(){
String text='hello';
# if와 else
if(text is int){
print('정수');
}else if(text is double){
print('실수');
}else{
print('정수도 실수도 아님');
}
}
- 다트의 조건문에는 반드시 불리언을 사용해야 함
# 삼항 연산을 활용한 분기
- [조건] ?[참일 때]:[거짓일 때]
Var todo =isRainy? '빨래를 하지 않는다' : '빨래를 한다';
# switch와 case
- Switch문의 각 case에 switch를 탈출하는 키워드를 추가해야 함 보통 break나 return으로 탈출
-객체 지향 프로그래밍
- New 키워드는 인스턴스화하는 키워드이며 생략 가능
Var person=new Person();
Var person2=Person(); //new 키워드 생략 가능
- 변수명 뒤에 .연산자를 입력해 생성한 객체의 프로퍼티에 접근 가능
- 변수명 앞에 _기호를 붙이지 않으면 외부에서 접그 가능하고, 붙이면 접근 불가능함
- _기호가 붙은 프라이빗 변수는 해당 클래스가 정의되어 있지 않은 다른 파일에서 직접 접근 불가능
# 프라이빗 변수에 접근하려면 게터와 세터 메서드 필요! 각각 읽기와 쓰는 기능을 함
class Person{
String name;
int _age;
int get age=>_age;
}
import 'person.dart'
var person= Person();
print(person.age); //_age값 출력
Ex)
class Rectangle{
num left, top, width, height;
Rectangle(this.left,this.top,this.width,this.height);
num get right=>left+width;
set right(num value)=> left=value-width;
}
# 상속: extends 키워드 사용하여 상속
- 상속을 받으면 원래 있던 기능을 그대로 물려받는데, 만약 새로 정의하고 싶다면 @override 어노텡이션을 사용해 오버라이드하여 재정의하면 됨
- 추상 클래스는 그대로 인스턴스화할 수 없으며 다른 클래스에서 임플리먼트하여 기능을 완성하는 상속 재료로 사용됨 이때 대상 클래스에는 implements 키워드를 메서드에는 @override 키워드를 사용
class Goblin implements Monster{
@override
void attack(){
print('고블린 어택');
}
}
class Bat implements Monster{
@override
void attack(){
print('할퀴기');
}
}
# 믹스인: with 키워드를 사용하면 상속하지 않고 다른 클래스의 기능을 가져오거나 오버라이드할 수 있음
# 열거 타입: 상수를 정의하는 특수한 형태의 클래스
- Enum Status{login,logout}
Void updateColor(Color color){
Switch (color){
Case Color.red:
//작업수행
Case Color.green:
//작업수행
Case Color.blue:
//작업수행
}
}
# 다트는 List, Map, Set 등의 컬렉션을 제공함
- List: 같은 타입의 자료를 여러 개 담을 수 있고 특정 인덱스로 접근 가능
- Map: 키와 값의 쌍으로 저장할 수 있고 키를 통해 값을 얻을 수 있음
- Set: 중복이 허용되지 않고 찾는 값이 있는지 없는지 판단하고자 할 때 사용
# 다트에서는 함수를 값으로 취급 가능 그러므로 다른 변수에 함수를 대입 가능
void greeting(String text){
print(text);
}
void main(){
var f=greeting;
f('hello');
}
--> 이렇게 함수를 매개변수로 전달하기, 수정하기, 변수에 대입하기가 가능한 객체를 일급 객체라고 함
# for() 문과 forEach() 함수
forEach()함수: 내부 반복을 수행-> 외부에서 봤을 때는 반복을 띠지 않지만 내부적으로 반복을 띰
# where 함수: 조건을 필터링할 때 사용하는 함수
# map 함수: 반복되는 값을 다른 형태로 변환하는 방법을 제공하는 함수
- Where() 함수와 toSet() 함수를 함께 사용하면 중복 데이터를 없앨 수 있음
class Car{
int seats;
String color;
Car(int sts,[String clr='black']){
this.seats=sts;
this.color=clr;
}
printVars(){
print('seat: $seats,color:$color');)
}
}
void main(){
Car newCar=Car(4,'red');
newCar.printVars();
}
# 루프
- 다른 언어와 동일한 키워드로 반복 루프를 구현함
'개발 > Flutter' 카테고리의 다른 글
| [Flutter] #1 Widget (0) | 2022.11.14 |
|---|