Dart 변수,함수 정리글

Gavri·2022년 9월 14일

Flutter

목록 보기
9/14

개요

Dart에서 제공하는 빌트인 타입에 대해 살펴볼 예정입니다.

변수에 자주 사용되는 var, const, late, final, dynamic에 대해 알아 볼 것 이며,

Function의 파라미터, 클로저, 익명 함수, 렉시컬 스코프에 대해서도 알아볼 것입니다.

Dart 변수 종류

Numbers,String,Boolean,List,Set,Map

주로 사용하는 타입에 대해 알아보겠습니다.

변수범위
int64비트 이하의 정수 값.0,1
double64비트 부동 소숫점 숫자0.5,123.456
StringUTF-16 코드 단위"스트링"
bool참,거짓true,false
List배열["Text","Text2"]
Set고유한 항목의 정렬되지 않은 컬렉션{"불소","염소","브롬"}
Map키와 값으로 이루어진 컬렉션{"a":"A","b":"B"}
// 간단한 선언과 값들
int x = 1; 
int hex = 0xDEADBEEF;

double y = 1.2;
double exponents = 1.42e5;

-------------------------------
String text = "Text";
String text2 = '작은따옴표';


String multiLine = """이것은
여러줄입니다.
"""
String numberWithString = "$text $x"; // "Text 1";


------------------------------

bool isTrue = true;
bool isFalse = false;

------------------------------
List fruit = ["Apple","Banana"];

fruit.add("Melon");

Set fruitSet = {"불소","염소"};

fruitSet.add("브롬");

Map gifts = {"first":"partridge","second","turtledoves"};

gifts["first"]; // partridge
gifts["second"] = "apple"; // 값 재할당

Dart var ,const ,late ,final ,dynamic

var 의 경우 값을 할당할때 변수의 타입이 추론된다는 특징이 있다.
dynamic 의 경우 TypeScript의 Any 처럼 어느 값이든 할당이 가능하다.

	var name = "임의값" ; // String
    
    name = "임의텍스트" ; // String
    
    name = 0; // Error : A value of type 'int' can't be assigned to a variable of type 'String'.
    
    var test;
    
    test = "String";
    test = 0; // 이 경우엔 첫 할당에서 타입이 지정되지 않아 dynamic 타입처럼 작동한다.
    
    dynamic d_name = "String";
    
    d_name = 0; // 에러가 발생하지 않는다.
    

late 의 경우 값의 초기화를 뒤로 미룰 수 있게 해주는 키워드이다.
Dart 2.12 버전에서 키워드가 추가 되었으며, 해당 키워드를 사용함으로써 다른 개발자에게 값이 추후에 초기화 된다는 것을 인지 시킬 수 있다.

	late String? apiCallData; // 선언시 null
    
    Timer(Duration(seconds: 3), () { // package:async/async.dart Timer 
      apiCallData = "변경";
    });

const,final 두 키워드의 경우 상수라는 공통점이 있다.
차이점은 const는 컴파일시 상수로 지정 되어 런타임 도중에는 변경이 불가하다.

	const String fixed_const = "고정된 값";
    final String fixed_final = "고정된 값";
    
	_anyfn(String getText){
    	final String anyText = getText;
        //	const String anyText_const = getText ; // 에러 컴파일시 값을 초기화 해야됨.
        
        // anyText = "변경"; // 에러 값이 이미 초기화 된 상태에선 재할당이 불가능
		// fixed_const = "변경"; // 위 에러와 동일
	}

Dart 함수

Dart는 진정한 객체 지향 언어이므로 함수도 객체이며 Function이라는 타입을 가집니다. 즉,함수를 변수에 할당하거나 다른 함수에 인수로 전달할 수 있습니다.
// 좋은 형태
bool isNoble(int atomicNumber) {
  return _nobleGases[atomicNumber] != null;
}
// 좋지 않음
isNoble(atomicNumber) {
  return _nobleGases[atomicNumber] != null;
}
// 화살표 함수를 이용한 짧은 형태
bool isNobel(int atomicNumber) => _nobleGases[atomicNumber] != null;
// => expr; == {return expr;}

파라미터

파라미터(매개변수) 선언 방식은 크게 3가지로 나뉩니다.

  • anyText1(String text1,String text2)

  • anyText2({required String text1, required String text2})

  • anyText3(String text1,[String text2])

    void anyText1(String text1,String text2){...};
     anyText1("텍스트1번","2번");
     
     void anyText2({required String text1, required String text2}){...}
     // required는 필수값을 나타냄
     anyText2({text1:"1번텍스트",text2:"2번텍스트"});
     
     void anyText3(String text1,[String text2]){...};
     anyText3("필수 1번텍스트");
     anyText3("필수 1번텍스트","선택적 2번텍스트");

main()

main()은 모든 앱의 진입점 역할을 하는 최상위 기능이 있어야 합니다.

인수로 [List<String_>] 매개 변수를 가지고 있으며 리턴 값은 void 입니다.

void main([List<String> arguments]){
	... App 
}

일급 객체

일급 객체란 > 일급객체(First-class Object)란 다른 객체들에 일반적으로 적용 가능한 연산을 모두 지원하는 객체를 가르킨다.

다음 3가지 조건을 충족한다면 1급 객체로 표현한다

  • 변수나 데이터에 할당 할 수 있어야 한다
  • 객체의 인자로 넘길 수 있어야 한다
  • 객체의 리턴값으로 리턴 할 수 있어야 한다
	// 변수나 데이터에 할당 할 수 있어야 한다
	var functionObject = (int a,int b) => a + b;
    // 객체의 인자로 넘길 수 있어야 한다
    var functionObject2 = (Function func) => func();
    // 객체의 리턴값으로 리턴 할 수 있어야 한다.
    hocFunc(int num) => (Function func) => func(num)
    hocFunc(3)(print);  // 3

익명 기능

	<InkWell
    	onTap=(){
        // 익명 함수 
        }
        onTap=()=> returnValue
        // 익명 함수 람다
   />

어휘 범위(렉시컬 스코프)

다트 언어에서 렉시컬 스코프는 코드의 레이아웃에 의해 정적으로 결정됩니다. 변수가 범위내에 있는지 확인 하기 위해선 중괄호를 따라가면 됩니다.
void main(){
   var language = 'Dart';
   void printLanguage(){
      language = 'DartLang';
      print("Language is ${language}");
   }
   printLanguage(); // Language is DartLang 
}
// ----------------------------------------
void main() {
   String language = "Dart";
   void outerFunction() {
      String level = 'one';
      String ex = "scope";
      void innerFunction() {
         Map level = {'count': "Two"};
         print('ex: $ex, level: $level');
         print('Language: $language');
      }
      innerFunction(); 
      
      print('ex: $ex, level: $level'); 
      
   }
   outerFunction();
   // outer -> inner / 	ex: scope, level {count:Two}
   // outer -> inner / 	Language: Dart
   // outer / 			ex: scope, level:one}
}

어휘 폐쇠(클로저)

클로저란 함수가 원래 범위 외부에서 사용되는 경우에도 렉시컬 스코프의 변수에 액세스할 수 있는 함수 객체를 의미합니다. ```java Function makeAdder(int addBy) { return (int i) => addBy + i; }

void main() {
// Create a function that adds 2.
var add2 = makeAdder(2);

// Create a function that adds 4.
var add4 = makeAdder(4);

var add23 = makeAdder(2)(3);

assert(add2(3) == 5);
assert(add2(3) == add23);
assert(add4(3) == 7);
}



profile
모든건 기록으로

0개의 댓글