[Flutter/Dart] 변수, 상수

keemeesuu·2022년 10월 25일
0

Flutter > Dart

목록 보기
1/4

변수(variable)

변수란 변하다라는 뜻을 가지고 있다.

변수특징

  • 같은 변수명으로 중복 선언 불가.
  • 변수 이름은 소문자로 시작하고, 카멜케이스를 따름. var blackPink
  • 변수의 이름은 _로 시작할 수 있으며, 이 변수는 클래스의 private변수명으로 사용됨.
  • 클래스는 대문자로 시작하며 변수를 대문자로 선언하면 구분이 어려워짐.

var

자바스크립트의 var과 비슷한 동작을 하는 변수. 어떤 타입으로도 할당 할 수 있음.

void main() {
	var name = '자동차'
    name = '기차'
    
    // name = 10
    // error: 변수 타입 변경 불가.
    
    // var name = '비행기'
    // error: 재선언 불가.
    
}

한번 선언하면 그 선언타입으로 fixed가 된다. 바꿀수가 없다.
Dart에서 var은 런타임 시에 타입이 결정되기 떄문에 코드만 보고 타입을 이해하기 명확하지 않다. 변수선언과 함께 타입을 선언하는 방식의 코드를 지향하자.

var키워드는 암시적 타입 지역 변수(Implicitly typed local variable)라고도 한다.

var 키워드

dynamic

void main() {
  dynamic name = 'Naruto';
  print(name);
  name = 10;
  print(name);
 }

var과 다르게 타입변경이 된다.

int

정수형 데이터를 다룰때 사용하며 기본적인 수학 연산 가능.

void main() {
	int num1 = 10;
    int num2 = 20;
    print(num1 + num2);
    print(num1 - num2);
    print(num1 * num2);
    print(num1 / num2);
}

double

실수형 데이터를 다룰때 사용하며 기본적인 수학 연산 가능.

void main() {
	double num1 = 1.2;
    double num2 = 2.2;
    print(num1 + num2);
    print(num1 - num2);
    print(num1 * num2);
    print(num1 / num2);
}

String

문자열 데이터를 다룰때 사용.

void main() {
	String name = 'Kakashi';
	String name2 = 'Obito';
    print(name);
    print('my name is ' + name);
    print('my name is $name');
  	print('${name.runtimeType} ${name2}');
    print(name.toUpperCase());
    print(name.toLowerCase());
}

bool

참/거짓 저장할때 사용 가능.

void main() {
	bool isTrue = true;
    print(isTrue);
    isTrue = false;
    print(isTrue);
}

List

void main() {
  List<String> blackPink = ['제니', '지수', '로제', '리사'];
  List<int> numbers = [1, 2, 3, 4, 5, 6];

  print(blackPink);
  // [제니, 지수, 로제, 리사]
  
  print(numbers);
  // [1, 2, 3, 4, 5, 6]
  
  print(blackPink[0]);
  // 제니
  
  print(blackPink.length);
  // 4
  
  blackPink.add('호기');
  print(blackPink);
  // [제니, 지수, 로제, 리사, 호기]
  
  blackPink.remove('호기');
  // blackPink.removeAt(4);
  print(blackPink);
  // [제니, 지수, 로제, 리사]

  
  print(blackPink.indexOf('로제'));
  // 2
}

"<>"사이에 타입을 명시해놓는 형태를 Generic(제네릭) 이라고 한다.

제테릭 참고

List의 다양한 함수

join : 각 요소를 합쳐 하나의 문자열을 만듬

void main() {
  List<String> blackPink = ['제니', '지수', '로제'];
  print(blackPink.join(', '));
  // 제니, 지수, 로제
}	  

indexOf : 요소를 찾고, 해당 요소의 index를 반환함.

void main() {
  List<String> blackPink = ['제니', '지수', '로제'];
  print(blackPink.indexOf('지수'));
  // 1
}

Map

key-value 형태로 데이터를 저장하는 자료구조이며 key 값을 통해 데이터를 검색, 저장, 삭제한다.
중복된 key 값은 허용되지 않는다.

void main() {
  // Map
  // Key / Value
  Map<String, String> dictionary = {
    'Harry Potter': '해리포터',
    'Ron weasley': '론 위즐리',
    'Hermione Granger': '허마이오니 그레인저',
  };
  
  print(dictionary);
  // {Harry Potter: 해리포터, Ron weasley: 론 위즐리, Hermione Granger: 허마이오니 그레인저}
  
  Map<String, bool> isHarryPotter = {
    'Harry Potter': true,
    'Ron Wasley': true,
    'Ironman': false,
  };
  
  print(isHarryPotter);
  // {Harry Potter: true, Ron Wasley: true, Ironman: false}
  
  print(isHarryPotter['Ironman']);
  // false
}

Map의 다양한 함수

void main() {
  // Map
  // Key / Value
  Map<String, bool> isHarryPotter = {
    'Harry Potter': true,
    'Ron Wasley': true,
    'Ironman': false,
  };
  
  // Add
  isHarryPotter.addAll({
    'Spiderman': false,
    'Naruto': false,
  });
  print(isHarryPotter);
  // {Harry Potter: true, Ron Wasley: true, Ironman: false, Spiderman: false, Naruto: false}
  
  // Add
  isHarryPotter['Hulk'] = false;
  print(isHarryPotter);
  // {Harry Potter: true, Ron Wasley: true, Ironman: false, Spiderman: false, Naruto: false, Hulk: false}

  // Remove
  isHarryPotter.remove('Harry Potter');
  print(isHarryPotter);
  // {Ron Wasley: true, Ironman: false, Spiderman: false, Naruto: false, Hulk: false}
}

enum

enum Status{
  approved, // 승인
  pending, // 대기
  rejected, // 거절
}

void main() {
  Status status = Status.pending;
  
  if(status == Status.approved){
    print('승인입니다');
  }else if(status == Status.pending){
    print('대기입니다.');
  }else{
    print('거절입니다.');
  }
}

enum 을 사용하는 이유는 정확히 이 안의 값들만 있다는걸 명시해 두고 사용한다 라는걸 알려주기, 정의하기 위해.

Set

List<>처럼 하나의 값들만 저장할 수 있는 형태이다.
List와 Set은 비슷한 함수들이 매우 많다.
List와 Set의 차이는 List와 다르게 Set은 중복값이 들어갈 수 없다.
즉, 중복을 자동으로 처리해준다.

void main() {
  Set<String> names = {
    'Naruto',
    'Sasuke',
    'Kakashi',
    'Sasuke',
  };
  
  print(names);
  // {Naruto, Sasuke, Kakashi}
  
  names.add('Obito');
  print(names);
  // {Naruto, Sasuke, Kakashi, Obito}
  
  names.remove('Obito');
  print(names);
  // {Naruto, Sasuke, Kakashi}
  
  print(names.contains('Kakashi'));
  // true
}

상수(constant)

상수란 항상 같은 수, 변하지 않는 수를 말한다.
영어로는 constant.

final과 const

일반적으로 변수를 선언할때 변수 앞에다가 선언하면 된다.

void main() {
  final String name = 'Kakashi';
  print(name); // 'Kakashi;

  const String name2 = 'Obito';
  print(name2); // 'Obito;

  // name2 = 'Sasuke';
  // error: 값을 한 번 선언하면 변경 불가.
}

final과 const의 차이를 알아보기 전에 DateTime을 알아보자.

void main() {
	// DateTime now = DateTime.now();
    // 컴파일 하는순간이 아닌(!) 이 코드가 실행되는 순간에 실행된다.
    
    final DateTime now = DateTime.now();
    print(now);
    
    // const DateTime now2 = DateTime.now();
    // error: DateTime은 빌드가 되고 해당 코드를 읽을때 실행되는것이다(읽기 전에는 실행되지 않는다). 하지만 const는 빌드가 되는 순간의 값을 알아야 하기 때문에 에러가 난다.
}

한 번 선언하면 값을 바꿀 수 없는건 똑같다.

final

  • final은 실행중에 값이 결정된다.
  • final은 이 파일이 실행될 때 해당 위치에서 값이 결정된다.
  • final은 빌드타임의 값을 몰라도 된다.
  • 로컬 영역(함수 안)에서 선언된 final 변수는 해당 함수가 리턴되면 메모리에서 정리됩니다.

const

  • const는 컴파일시에 값이 결정된다.

  • const는 이 파일을 컴파일할 때 기계어로 번역될 때 값이 결정된다.

  • const는 빌드타임의 값을 절대적으로 알아야 한다.

  • Class 안에서 const 키워드는 static 필드에서만 사용 가능하다.
    이는 Class 가 인스턴스화 되기 전, compile-time에 해당 필드의 값이 정해지기 때문이다.(static 필드는 compile-time에 메모리 상에 올라단다.)

  • Class의 생성자에서 필드의 기본값으로 사용할 때, const 키워드를 사용한다.

nullable

null이 들어갈 수 있는 변수에 사용하며 변수타입뒤에 ?를 붙인다.

void main(){
    // null - 아무런 값도 있지 않다.
	// nullable - null이 될 수 있다.
    // non-nullable - null이 될 수 없다.
    
    // String name;
    // error: non-nullable. null이 들어갈수없다.
    String name = 'Kakashi';
    print(name);
    
    String? name2;
	print(name2);
    
    // String? name2 = 'Obito';
	// print(name2);
	// print(name2!);
    	// name2! = name2는 null이 아니다.
        
    number ??= 3;
    // number가 만약 null이면은 3을 넣어라.
}


연산자(Operator)

변수에 쓰이는 operator를 알아보자.

null일때 값을 지정하는 operator

void main() {
  int? num = 3;
  print(num);

  num = null;
  print(num);

  num ??= 3;
  print(num);
}

type을 비교하는 operator

void main() {
	int num1 = 1;
    
    print(num1 is int);
    // ture
    print(num1 is String);
    // false
    
    print(num1 is! int);
    // false
    print(num1 is! String);
    // ture
}





reference

profile
개발관련 정리하고 기록하는 블로그 🦦

0개의 댓글