• 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을 사용할 때는 <와> 사이에 요소의 형식을 정의한다.
○ List<String> names; -> 문자열 리스트
- 함수에서 인수를 정의할 때도 형식을 사용한다.
○ Int addNums(int x, int y){
Return x+y;
}
- 다트는 동적 형식도 지원한다. 변수를 dynamic으로 설정하면 컴파일러가 해당 변수에 모든 형식을 허용한다.
○ Dynamic myNumber='Hello';
//: 한 줄 주석
/* */: 여러 줄 주석
///: 문서 주석-> 메서드나 클래스 정의 위에 작성하면 dartdoc과 같은 문서 생성 도구를 통해 문서를 자동으로 생성해줌
• 문장은 세미콜론으로 표시!
• 세 키워드는 변수의 형식을 확장한다.
• 변수의 값을 바꿀 수 없게 하려면 final, const 사용
• Final 변수는 한 번만 할당할 수 있으며 클래스 수준에서 변수를 할당하기 전에 선언함. 쉽게 말해 클래스의 생성자에서 할당하는 모든 변수에 final을 사용함
• 반면 const 변수는 할당하기 전에 선언하지 않음 컴파일 이후로 항상 같은 값을 갖는 변수를 상수라고 함
• 변수에 담긴 값은 언제라도 다른 값으로 바꿀 수 있음
• 타입 추론
다트는 타입을 직접 명시하지 않고 var로 대체할 수 있는 타입 추론을 지원
• 변수는 값이 변경되어 의도치 않게 에러를 발생할 가능성이 있으므로 가급적이면 값이 변하지 않게 상수로 사용하는 것이 좋음-> final 키워드를 제일 앞에 붙이면 값이 수정되지 않는 상수로 사용가능!
• 변수에 required 키워드 애너테이션을 추가하려면 meta라는 다트 라이브러리를 사용해야 함
Ex)
void main(){
int a=10;
if(a is int){
print('정수');
}
String text='hello';
if(text is! int){
print('숫자가 아님');
}
}
• 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;
• 호출시 매개변수명을 값 앞에 써주면 됨-> 이름 있는 매개변수라고 함
• 만약 필수 매개변수와 선택 매개변수를 함께 사용하고 싶다면 앞쪽에 필수 매개변수를 먼저 둔다.
• 선택 매개변수는 호출할 때 매개변수명을 함께 쓰기 때문에 옵션이 많을 때도 가독성을 높여주는 장점
void something(String name,{int age}){}
void main(){
something('홍길동',age: 10);
something('홍길동');
}
main(){
String text='hello';
if(text is int){
print('정수');
}else if(text is double){
print('실수');
}else{
print('정수도 실수도 아님');
}
}
- 다트의 조건문에는 반드시 불리언을 사용해야 함
• [조건] ?[참일 때]:[거짓일 때]
Var todo =isRainy? '빨래를 하지 않는다' : '빨래를 한다';
• 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;
}
• 상속을 받으면 원래 있던 기능을 그대로 물려받는데, 만약 새로 정의하고 싶다면 @override 어노텡이션을 사용해 오버라이드하여 재정의하면 됨
• 추상 클래스는 그대로 인스턴스화할 수 없으며 다른 클래스에서 임플리먼트하여 기능을 완성하는 상속 재료로 사용됨 이때 대상 클래스에는 implements 키워드를 메서드에는 @override 키워드를 사용
class Goblin implements Monster{
@override
void attack(){
print('고블린 어택');
}
}
class Bat implements Monster{
@override
void attack(){
print('할퀴기');
}
}
• Enum Status{login,logout}
○ Enum Color {red, green, blue}
Void updateColor(Color color){
Switch (color){
Case Color.red:
//작업수행
Case Color.green:
//작업수행
Case Color.blue:
//작업수행
}
}
• List: 같은 타입의 자료를 여러 개 담을 수 있고 특정 인덱스로 접근 가능
• Map: 키와 값의 쌍으로 저장할 수 있고 키를 통해 값을 얻을 수 있음
• Set: 중복이 허용되지 않고 찾는 값이 있는지 없는지 판단하고자 할 때 사용
void greeting(String text){
print(text);
}
void main(){
var f=greeting;
f('hello');
}
--> 이렇게 함수를 매개변수로 전달하기, 수정하기, 변수에 대입하기가 가능한 객체를 일급 객체라고 함
forEach()함수: 내부 반복을 수행-> 외부에서 봤을 때는 반복을 띠지 않지만 내부적으로 반복을 띰
• 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();
}
• 다른 언어와 동일한 키워드로 반복 루프를 구현함
○ 표준 for: 인덱스가 필요할 때 사용
○ For-in: 인덱스가 필요 없을 때 사용
○ forEach: 인덱스가 필요 없을 때 대안으로 사용
○ While: 바디 실행 전 조건을 확인하므로 바디가 실행되지 않을 수도 있음
○ Do while: 루프 바디를 실행한 후 조건을 평가함
○ Break와 continue로 루프 흐름 제어