[Flutter] Dart_studying

Jiwon·2022년 11월 15일
0

Dart언어

• 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';

주석 종류 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}
	○ Enum Color {red, green, blue}
	
	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();
}

루프

• 다른 언어와 동일한 키워드로 반복 루프를 구현함
	○ 표준 for: 인덱스가 필요할 때 사용
	○ For-in: 인덱스가 필요 없을 때 사용
	○ forEach: 인덱스가 필요 없을 때 대안으로 사용 
	○ While: 바디 실행 전 조건을 확인하므로 바디가 실행되지 않을 수도 있음
	○ Do while: 루프 바디를 실행한 후 조건을 평가함
	○ Break와 continue로 루프 흐름 제어

0개의 댓글