선언과 사용

2023. 3. 13. 22:26앱 개발/dart

1. 정수 타입 선언

int

2. 실수 타입 선언

double

 

3. 문자열 타입 선언

String

  • 희안하게 대문자를 사용
  • 문자열의 길이 - > length 속성 사용
  • 변경 불가능한 타입
void main() {
	//  글자 타입 - String
    String name = "John";
    name = "David" // 변수에 새로운 값을 할당함
    // String 타입 변수에 새로운 값을 할당하면 이전 값이 변경되는 것이 아니라
    // 새로운 String 객체가 생성되고 이를 참조함

	String name2 = "Ann";
    print('$name $name2'); // David Ann
	print('${name} ${name2}'); // David Ann
    print('$name.runtimeType ${name2.runtimeType}');
    // David.runtimeType String
}

 

 

4. Boolean 타입

bool

ex) bool isSunny = true;

 

5. 변수 선언

1. var

  • 타입 추론을 지원하기 위해 사용되는 키워드
  • 컴파일러가 자동으로 추론하여 결정됨
  • 즉, 초기값의 데이터 타입을 기반으로 변수의 타입이 결정됨

2. dynamic

  • 동적 타이핑을 지원하기 위해 사용되는 키워드
  • 모든 데이터 타입을 가질 수 있다.
  • 즉, 변수의 데이터 타입은 런타임 시점에 결정, 해당 변수에 대해 어떤 연산이 수행될 때마다 해당 연산의 타입 체크가 실행됨.
  • 보통 다른 언어에서의 Object 타입과 비슷한 역할
void main() {
    dynamic x = 10;
    print(x.runtimeType); // int
    x = "hello";
    print(x.runtimeType); // String
    var y = 20;
    print(y.runtimeType); // int
    y = "hi";
    // line.6에서 y의 타입이 int가 되었기 때문에
    // String Type "hi"를 할당하려고 하면 데이터 타입이 다르기 때문에 컴파일 에러 발생
    print(y.runtimeType);
}

3. var와 dynamic의 차이

  • var는 초기화 시 타입이 결정되며 다른 타입으로 재할당 시 컴파일 에러 발생(같은 타입으로만 재할당 가능)
  • dynamic은 런타임 시점에 데이터 타입이 결정되기 때문에 재할당 시에도 다른 데이터 타입으로 할당 가능함.

 

6. nullable / non-nullable

void main() {
	// nullable - null이 될 수 있다.
    // non-nullable - null이 될 수 없다.
	// null - 아무런 값도 있지 않다.
    
    // non-nullable
    String name = "John";
    print(name); // John
    
    // nullable - ?
    String? name2 = "Ann";
    print(name2!); // 현재 이 값은 null이 아니다.
    name2 = null;
    print(name2); // null

}

 

7. final / const

void main() {
  final String name = "John";
  print(name);
  //name = "David"; // error
  const name2 = "Ann";
  print(name2);
  //name2 = "Jully"; // error

  // 초기화 시 재할당 불가능
  // final과 const 모두 불변 변수를 선언할 때 사용됨
}

1. 공통점

  • 값을 변경할 수 없는 불변 변수를 선언하는 데 사용

2. 차이점

  • 초기화 시기
    • final : 런타임 시점에 초기화
    • const: 컴파일 시점에 초기화
  • const는 컴파일 시점에 초기화 되기 때문에, 값으로 컴파일 타임 상수로만 사용할 수 있다.
    • ex) DateTime.now()와 같은 런타임 상수를 const로 사용할 수 없음
    • const는 DateTime.now()가 빌드되는 시점을 모르기 때문에 상수로 사용할 수 없다.
const DateTime x = DateTime.now();
// 컴파일 에러 발생 : DateTime.now()는 런타임 상수가 아닙니다.

 

8. Assignment Operator

  • = : 일반적인 할당 연산자로, 변수에 값을 할당합니다.
  • += : 왼쪽 변수에 오른쪽 피연산자를 더한 값을 왼쪽 변수에 할당합니다.
  • -= : 왼쪽 변수에서 오른쪽 피연산자를 뺀 값을 왼쪽 변수에 할당합니다.
  • *= : 왼쪽 변수에 오른쪽 피연산자를 곱한 값을 왼쪽 변수에 할당합니다.
  • /= : 왼쪽 변수를 오른쪽 피연산자로 나눈 값을 왼쪽 변수에 할당합니다.
  • %= : 왼쪽 변수를 오른쪽 피연산자로 나눈 나머지 값을 왼쪽 변수에 할당합니다.
  • ~/= : 왼쪽 변수를 오른쪽 피연산자로 나눈 몫 값을 왼쪽 변수에 할당합니다.
  • <<= : 왼쪽 변수를 오른쪽으로 시프트한 값을 왼쪽 변수에 할당합니다.
  • >>= : 왼쪽 변수를 오른쪽으로 시프트한 값을 왼쪽 변수에 할당합니다.
  • &= : 왼쪽 변수와 오른쪽 변수를 비트 단위 AND 연산한 결과를 왼쪽 변수에 할당합니다.
  • ^= : 왼쪽 변수와 오른쪽 변수를 비트 단위 XOR 연산한 결과를 왼쪽 변수에 할당합니다.
  • |= : 왼쪽 변수와 오른쪽 변수를 비트 단위 OR 연산한 결과를 왼쪽 변수에 할당합니다.
  • ??= 변수가 null인 경우에만 할당하고, 그렇지 않으면 그대로 둡니다.
void main() {
	double? number = 4.0;
    print(number); // 4
    number ??= 2.0;
	print(number); // 4
	number = null;
    number ??= 2.0;
    print(number); // 2
}

 

9. 값 비교

void main() {
  int number = 1;
  print(number is int); // true
  print(number is String); // false
  print(number is! String); // true is! = is not
}

 

10. List / Set

  • List : 중복 가능
  • Set : 중복 불가능
void main() {
  // List - 리스트
  List<String> fruit = ['사과', '배', '귤', '수박'];
  List<int> numbers = [1, 2, 3, 4, 5];
  print(fruit); // [사과, 배, 귤, 수박]
  print(numbers); // [1, 2, 3, 4, 5]

  // index - 순서
  print(fruit[2]);  // '귤'
  print(numbers[1]);  // 2

  // 리스트의 길이
  print(fruit.length);  // 4
  print(numbers.length);  // 5

  // 리스트 속성 추가/제거
  numbers.add(6); // + 6
  fruit.remove('수박'); // - '수박'

  print(fruit); // [사과, 배, 감귤]
  print(numbers); // [1, 2, 3, 4, 5, 6]

  // 리스트의 값이 인덱스의 몇번째 인지 리턴
  print(fruit.indexOf('사과')); // 0
}
void main() {
  // Set
  // 중복 삭제 처리
  final Set<String> names = {'John', 'David', 'Ann', 'Garry', 'John'};
  print(names); // {John, David, Ann, Garry}
  // 초기화 시 John이 두개 들어갔지만 print에서는 하나만 있음(중복 삭제)
  print(names.contains('Ann')); // 값이 존재하는지 확인하는 멤버 함수(constains) - true
}

 

11. Map

void main() {
  // Map
  // Key / Value
  Map<String, bool> avengers = {'캡틴 아메리카': true, '아이언맨': true, '헐크': true};
  print(avengers); // {캡틴 아메리카: true, 아이언맨: true, 헐크: true}
  avengers.addAll({'토르': true, '배트맨': false}); // avengers에 추가
  print(
      avengers); // {캡틴 아메리카: true, 아이언맨: true, 헐크: true, 토르: true, 배트맨: false}
  avengers.remove('배트맨'); // avengers에서 삭제
  print(avengers); // {캡틴 아메리카: true, 아이언맨: true, 헐크: true, 토르: true}
  print(avengers['아이언맨']); // 키 값을 기반으로 value를 가져온다. true
  avengers['블랙 위도우'] = true; // == avengers.addAll({'블랙 위도우': true})
  print(
      avengers); // {캡틴 아메리카: true, 아이언맨: true, 헐크: true, 토르: true, 블랙 위도우: true}
  print(avengers.keys); // (캡틴 아메리카, 아이언맨, 헐크, 토르, 블랙 위도우)
  print(avengers.values); // (true, true, true, true, true)
}

 

 

'앱 개발 > dart' 카테고리의 다른 글

enum, 함수, posional/optional/named parameter, Operation  (0) 2023.03.13