[Flutter] 플러터 변수 종류와 변수 선언 특징 이해하기
플러터에서 변수 종류는 암시적(Implicity) 타입인 var, dynamic과 명시적(Explicty) 타입의 int, string, double, bool, list, map 등의 타입으로 정의할 수 있다. 변수 선언 방식은 final과 const가 있다. 플러터에서 데이터를 담는 변수에 대한 이해는 초기 학습에 매우 중요하기 때문에 반드시 숙지하고 다음 단계로 넘어가야 한다.
1. 변수 종류 (Variables type)
1. 변수 종류 (Variables type)
1.1. Var
자바스크립트의 변수 타입과 유사하며, 시스템이 알아서 변수 타입을 유추하여 지정하게 된다. 이 변수 타입은 한번 할당이 되면 새로운 유형으로 다시 값을 할당할 수 없음에 유의해야 한다.
var age=32;
var country='Canada';
var rate=32.56;
var isMen=true;
1.2. Dynamic
다른 타입과 달리 타입이 지정되지 않아도 변수 선언 및 사용이 가능하다.
dynamic vartest;
print(vartest);
vartest="캐나다";
print(vartest);
1.3. int, string, double, bool
명시적으로 직접 변수를 지정하고자 할 때, 선언하는 변수타입이다.
int age=52;
string country='Canada';
double rate=32.56;
bool isMen=true;
1.4. list
list 변수는 다른 프로그래밍 언어에서 배열(Array)로 불리오는 타입의 변수이다. 선언방식은 아래와 같이 []로 해준다.
var list=[a,b,c,d];
선언 후에 값을 변경하지 못하게 하려면 선언 시, 아래와 같이 const 선언을 해준다.
var list=const[a,b,c,d];
아래와 같이 list 변수에 대한 제어는 다음과 같이 이루어진다.
//list를 출력할 때, 1,2,3,4가 출력
print(list);
//list의 길이를 출력할 때, 4가 출력
print(list.length);
//list의 선택된 값을 출력할 때, list[0]은 a가 출력되며, list[1]은 b가 출력
print(list[1]);
//list에 추가로 값을 입력하고자 할 때
list.add(e);
//list에서 특정값을 제거하고자 할 때, 위의 a,b,c,d에서 c값이 제거
list.remove(c);
//list에서 특정 위치의 값을 제거하고자 할 때, [0]은 list의 첫번째 값인 a값이 제거
list.removeAt(0);
1.5. map
map 타입의 변수는 자바스크립트의 Object 변수 선언과 같다. 선언방식은 아래와 같이 {}로 해준다.
var map={
'key1':'James',
'key2':'Smith',
'key3':'Sarah'
};
list 타입과 마찬가지로 const 선언을 통해서 변경을 못하게 할 수 있다. map 변수에 대한 제어는 다음과 같이 이루어진다.
//key1값인 James가 출력
print(map['key1']);
//해당 되는 키값이 존재하지 않을 경우에는 null 값을 반환
print(map['key5'];
//길이를 확인하고자 할 때, 3이 출력
print(map.length);
//현재 특정 값에 할당된 키 값을 확인하고자 할 때, key3 반환
map.containsKey('Sarah');
//map 변수에 할당된 엔트리와 값을 확인하고자 할 때
var entries=map.entries;
var values=map.values;
//값을 추가하는 방법 (1) - 네번 째 값으로 Mina가 입력
map['key4']='Mina';
//값을 추가하는 방법 (2) - 생성자를 이용하여 값을 입력하는 방법으로 다섯번 째 값으로 Cole이 입력
main(List<String> args){
var map=new Map();
map[key5]='Cole';
2. 변수 선언 (Variables declaration)
변수는 final과 const로 선언할 수 있다. final과 const 선언의 차이점은 const 변수는 컴파일 시간 동안 값을 가져야 한다고 하며, final 변수는 런타임 시간 동안 할당할 수 있다고 한다. (출처: 원문)
아직 완전히 이해가 되지는 않지만 final은 전역 변수의 개념이고, const는 final 변수를 상속 받아서 특정 클래스 내에서 사용되는 지역 변수의 개념으로 이해가 된다. 런타임 시간 동안에 할당을 받는다는 의미는 아마도 앱이 빌드(컴파일)이 되고 나서 사용자 등에 의해 입력을 받는 final 변수는 런타임 시간 동안 변수 할당이 일어난다고 하는 것 같고, 어차피 전역 변수를 상속 받아서 특정 클래스에서 사용되는 const 변수의 경우 final 변수와의 관계성이 컴파일 단계에서 정의가 되어야 하기 때문에 컴파일 시간 동안 값을 가져야 한다고 이야기 하는 것으로 이해된다.
이러한 특성에 따라서 final 변수는 두 개의 라우트(route)가 있다고 했을 때, 값을 전달 하는 쪽의 라우트(route)에서 선언이 이루어지고, 값을 전달 받는 라우트(route)에서는 const 변수가 선언이 되는 것으로 보인다.
final로 선언된 변수의 경우 선언단계나 생성자를 통해 아래와 같이 초기화가 필요한 특징이 있다.
// Variables리스트의 아이템을 저장할 자료 구조 class Variables { // final로 정의된 필드는 선언단계나 생성자를 통해 초기화해야함 final String name; final String country; Todo(this.name, this.country); // 생성자로 필드 초기화 } //..(중략) // 첫 번째 스크린 class FirstScreen extends StatelessWidget { final List<Variables> varlist; // Variables 아이템 리스트 // 생성자에서 Variables 아이템 리스트를 받아서 필드에 저장 FirstScreen({Key key, @required this.varlist}) : super(key: key);
아래의 두번째 화면(route)에서는 const로 변수 선언을 한번 더 하여 정의하는 것을 볼 수 있다.
//..중략 // 첫번째 화면을 선택 시 출력되는 두번째 화면 위젯 클래스 class SecondScreen extends StatelessWidget { final Variables variables; // 생성자로 아이템을 수신하여 필드에 저장 const SecondScreen({Key key, @required this.variables}) : super(key: key);
참고. 플러터가 Dart 기반 언어라 변수 정의 및 사용에 대한 예는 대부분 플러터 코드가 아닌 Dart 코드를 기반으로 정의되고 있는 것으로 보인다.
댓글
댓글 쓰기