Dart 기본 문법 02

GreenBean·2023년 4월 3일
0
post-thumbnail

Dart

Dart 공식문서
다트 ( Dart ) 키워드
다트 ( Dart ) 주석 ∙ 타입 ∙ 변수 ∙ 상수

Dart 의 키워드

  • 프로그래밍에서 키워드 ( keyword ) 는 특별한 의미를 지니는 단어를 뜻함
    • 예약어 ( reserved word ) 라는 말도 쓰는데 키워드와 예약어는 약간 다름
    • 차이를 설명하려면 식별자 ( indentifier ) 라는 말도 등장

식별자

  • 변수 ∙ 함수 등의 이름 ( = 변수명 ∙ 함수명 )
    • 이름을 지정해야 식별 가능
# 예시

int a; // 식별자는 a
void foo(); // 식별자는 foo
  • 다트에는 내장 식별자 ( built-in identifier ) 가 존재
    • 내장 식별자는 클래스명 ∙ 타입명 ∙ import 시 prefix 로 사용할 수 없음

Tip! Dart 의 내장 식별자

키워드

  • 특정 문맥에서 특별한 의미를 가지는 단어
    • 따라서 '특정 문맥' 이 아는 곳에서는 식별자로 사용 가능

Tip! Dart 의 문맥 키워드

  • 키워드의 의미대로라면 특정 문맥에서는 특별한 의미, 즉 어떤 동작을 수행하는 역할 을 하지만 그 외에서는 함수명 ∙ 변수명으로 사용 가능

예약어

  • 식별자로 사용할 수 없는 특별한 단어
    • 다트 버전 1.0 이후에 비동기 지원에 관련한 제한된 예약어가 추가됨
      • 해당 예약어는 asyncasync*sync* 로 표시된 ( 비동기∙동기 ) 함수의 바디에서는 식별자로 사용 불가
    • 비동기 관련 제한된 예약어는 2가지
      • awaityield
  • 그 외 많은 예약어 존재

Tip! Dart 의 예약어

  • 식별자가 될 수 없는 예약어

Dart 의 주석 ∙ 타입 ∙ 변수 ∙ 상수

주석 ( comment )

  • 다트 주석은 다른 언어와 큰 차이 없음
    • // 내용 : 한 줄 주석
    • /* 내용 */ : /**/ 사이의 모든 내용 주석
# 예시

add(int a, int b) {
  return a + b
}

main() {
  // 한 줄만 주석
  
  /*
  여러 줄 주석
  var numberA = 1;
  var numberB = 2;
  */
  
  var numberA = 10;
  var numberB = 25;

타입 ( type )

  • 다트에서 제공하는 내장 타입 ( bult-in type ) 은 다음과 같음
    • numvardynamic 을 제외하면 대부분의 언어에서 사용하는 것과 유사

Tip! Dart 의 내장 타입

변수 ( variable )

  • 변수를 선언하고 초기화하는 기본 형태는 아래와 같음
# 예시

String lasName = 'Yang';
String firstNmae = "hwaya";
  • 다트의 변수는 참조 ( reference ) 를 저장
    • 위의 lastName 변수는 Yang 이라는 값을 가진 String 객체에 대한 참조를 가지는 것
    • '' ( 작은 따옴표 ) 혹은 "" ( 큰 따옴표 ) 로 묶을 수 있음
  • lastName 변수는 String 이라고 타입을 명시적으로 지정해주었음
    • 하지만 var 타입을 사용하여 타입을 지정하지 않을 수 있음
      • var 타입 사용 시 초기값을 참고하여 해당 변수의 타입을 추론
# 예시

var balance = 1000;
balance = "천"; // error
  • 위의 예시에서 balance 변수는 1000 이라는 정수형 타입을 값으로 가졌음
    • 따라서 int 타입인 것으로 추론 가능
    • 이렇게 int 타입으로 초기화된 balance 변수는 다른 타입을 값으로 가질 수 없음
  • 이 상태에서 balance 변수에 문자열을 넣어야 할 일이 있다면 어떻게 해야 할까?
    • 타입 변경이 가능한 dynamic 타입을 사용하면 됨
    • 또는 최상위 클래스인 Object 를 사용할 수 있음
# 예시

dynamic balanceA = 1000;
balanceA = "천";

Object balanceB = 1000;
balanceB = "천";
  • var 는 가독성이 떨어지고 실수를 유발할 가능성이 높기 때문에 초보자는 가급적 명시적으로 타입을 선언하는 것을 추천
# 예시

main() {
  var number;
  dynamic balanceA = 1000;
  Object balanceB = 2000;
  print('The number is $number');
  print('The balanceA is $balanceA');
  print('The balanceB is $balanceB');
  print('');
  
  number = 10;
  balanceA = "천";
  balanceB = false;
  print('The number is $number');
  print('The balanceA is $balanceA');
  print('The balanceB is $balanceB');
}

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

# 결과

The number is null
The balanceA is 1000
The balanceB is 2000

The number is 10
The balanceA is 천
The balanceB is false
  • numintdouble 의 상위 타입
    • 따라서 num 타입은 intdouble 모두 참조 가능
    • 그러나 intdouble 은 서로 참조할 수 없음
      • 보통 더 큰 범위를 가지는 doubleint 가 할당되는데 다트에서는 안됨
# 예시

num a = 10;
int b = 20;
double c = 1.2;

a = b;
a = c;

b = c; // error
c = b; // error

상수

  • 상수와 변수의 가장 큰 차이는 값의 변경 유무
    • 변수는 값을 바꿀 수 있지만 상수는 값을 바꿀 수 없음
      • 값이 변경되지 않는 것은 리터럴도 마찬가지
      • 리터럴과 상수의 차이는 리터럴은 값 그 자체이고 상수는 그 값을 가진 후 값이 변경되지 않는 변수
  • 상수 는 결국 값을 바꿀 수 없는 변수
    • finalconst 2가지 타입이 존재
# final 예시

final int PRICE = 1000; // 1000은 리터널
final Name = "Kim"; // 타입 생략 가능
PRICE = 2000; // error


# const 예시

const int PRICE = 1000;
const NAME = "Kim"; // 타입 생략 가능
PRICE = 2000; // error
  • finalconst 의 차이점
    • const 는 컴파일 시점에 상수가 됨
    • final 은 런터임에 상수화되기 때문에 실행 시 아래와 같이 get() 함수에서 가져온 값으로 설정이 가능
      • 하지만 const 는 이미 컴파일 시점에 상수화 되었기 때문에 런타임 시 get() 함수에서 가져온 값을 넣으려고 하면 에러 발생
# 예시

get() {
  return 100;
}

main() {
  final int NUMBER = get();
  // const int PRICE = get();
  final NAME = "Kim";
  const COLOR = "Red";
  
  print("The NUMBER is $NUMBER");
  // print("The PRICE is $PRICE");
  
  print("The NAME is $NAME");
  print("The COLOR is $COLOR");
}

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

# 결과

The NUMBER is 100
The NAME is Kim
The COLOR is Red
profile
🌱 Backend-Dev | hwaya2828@gmail.com

0개의 댓글