카테고리 없음

[Flutter 스터디 1주차] Dart 언어를 익혀보자 (1)

lee_jy_1204 2024. 4. 11. 21:15
작성자 이재영
일 시 2024. 4. 11  (목) 18:00 ~ 21:00
장 소 복지관 b128-1호
참가자 명단 임혜진, 이재영, 성창민, 김명원, 장원준
 사 진

 


더보기

목차

  1. 변수
  2. 연산자
  3. 라이브러리 & 임포트

이번 주차부터는 Flutter 스터디도 진행하기로 하였다. Flutter를 사용해보기 전 Flutter 전용 언어인 Dart에 대해서 알아보겠다.

변수

Dart에서 사용하는 자료형은 크게 String, int, double, bool, var, dynamic이 있다. 각각의 자료형들을 살펴보겠다.

void main(){
  int a = 5;
  String b = "Hello World";
  double c = 1.6;
  bool d = true;
  var e = "var";
  dynamic f = "dynamic";

  print(a);
  print(b);
  print(c);
  print(d);
  print(e);
  print(f);
}

코드의 실행 결과는 다음과 같다.

이처럼 다른 언어와 같이 각각 자료의 형태를 담는 것을 볼 수 있다. 그러나 잘 보지 못하던 자료형이 있는 것을 볼 수 있는데 바로 var와 dynamic이다. 이 둘은 초기화되기 전까지 타입이 고정되지 않는 자료형들이다. 예를 들어 위에 코드를 보면 e와 f 변수에 값을 문자열로 주었는데 그러면 var와 dynamic의 자료형은 문자열. 즉, String이 된 것이다. 그렇다면 var와 dynamic의 차이점은 무엇일까? 다음 코드를 한 번 보자.

void main(){
  var e = "var";
  dynamic f = "dynamic";

  print(e);
  print(f);

  e = 50;
  f = 50;
  
  print(e);
  print(f);
}

이렇게 실행을 할 경우 다음과 같은 에러 메시지를 볼 수 있다.

이 에러는 간단하게 String 자료형에 int 형 값을 넣을 수 없다는 뜻이다. 이처럼 var와 dynamic의 차이점은 변수에 자료형을 변경할 수 있냐 없냐에 차이이다. var는 자료형 타입이 고정되어 변경이 불가능하고, dynamic은 자료형 타입이 고정되자 않아서 변경이 가능하다. 

dynamic과 동일한 자료형으로 Object라는 자료형도 있다. 둘 다 동일한 기능을 제공해준다.

 

그리고 변수를 선언할 때 Nullable 타입을 가지는 초기화되지 않은 변수를 초기 값으로 null을 가지게 할 수 있다. 다음 코드를 살펴보자.

void main(){
  int? a;
  print(a);
}

실행 결과는 다음과 같다.

이렇게 자료형 다음에 ?를 붙히는 것으로 변수를 null 값으로 초기화시켜줄 수 있다.

연산자

Dart에는 다양한 연산자가 존재하지만 거의 대부분의 연산자가 다른 언어의 연산자과 비슷하기 때문에 흔히 볼 수 없는 연산자들을 알아보겠다.

 

-expr : 부정으로도 부르며 단항 빼기 연산자이다. 쉽게 식 부호를 바꾸어주는 산술 연산자이다.

void main(){
  int a = 5;
  print(a);
  print(-a);
}

이렇게 작성하고 실행하면 결과값으로 

5

-5

가 나오게 된다.

 

타입 테스트 연산자(as, is, is!)

 

우선 is는 타입을 확인해주는 연산자이다. 같은 타입이면 true를, 다른 타입이면 false를 반환해준다. 반대로 is! 연산자는 같은 타입이면 false를, 다른 타입이면 true를 반환해주는 연산자이다. 다음 코드를 보자.

void main(){
  int a = 5;
  print(a is int);
  print(a is String);

  print(a is! int);
  print(a is! String);
}

실행 결과는 다음과 같다.

 

다음은 관련된 타입으로 변환해주는 as이다. as는 개념이 조금 복잡해지는데 간단하게만 알아보고 다음에 더 자세히 알아보겠다.

데이터 타입을 다른 타입으로 변환해주지만 타입마다 연관이 있어야 변환이 가능하다. 예를들어 int 자료형을 string 자료형으로 캐스팅이 되는 것은 아닌 것이다. 그렇다면 as 연산자는 어디에서 많이 사용될까? 바로 클래스이다. 정확하게 말하면 부모클래스와 자식클래스 즉, 상속관계인 클래스에서 사용이 된다. 우선 이정도만 알아보자.

 

할당 연산자

 

할당 연산자는 보통 = 으로 알고 있는데 Dart에는 처음보는 할당 연산자가 존재했다. 바로 ??= 이다. 이 연산자의 기능은 할당을 받는 변수가 null일 때만 할당해주는 기능을 가진다. 예시 코드를 보자.

void main(){
  int? a;
  int b = 5;

  a ??= 1;
  b ??= 2;

  print(a);
  print(b);
}

결과값은 다음과 같다.

b에는 값이 변경되지 않은 것을 볼 수 있고, Null이 들어가 있던 a에는 1이 잘 들어간 것을 볼 수 있다.

 

Cascade 노테이션 (.., ?..)

정말 처음 보는 특이한 문법이다. cascade는 같은 객체에 대해 연속적인 명령을 적용할 수 있게 해준다. 인스턴스 멤버에 접근하거나 인스턴스 메서드 호출 또한 가능하다. 예시 코드를 보자.

class Paint{
  late String color;
  late double strokeWidth;
}

void main(){
  var paint = Paint()
    ..color = "Black"
    ..strokeWidth = 5.0;
  
  print(paint.color);
  print(paint.strokeWidth);
}

cascade는 이런 식으로 사용하면 된다. '..'를 사용하면 하나의 오브젝트에 함수호출, 필드접근을 순차적으로 수행할 수 있다. 이 과정 중간에 어떤 값이 반환되더라도 무시된다. '?..' 과 같은 경우는 '..'과 같은 기능을 하지만 객체의 필드가 null 일 수 있는 경우에 사용한다.

라이브러리 & 임포트

import외 library 명령어는 코드를 모듈화하고 공유하는 것을 도와준다. Dart에서 모듈을 임포트할 때 그 형태가 python과 비슷하다는 생각이 들었다. 그럼 한 번 라이브러리를 사용해보자. 어떤 라이브러리의 네임스페이스가 다른 라이브러르의 스코프에서 사용되는 방법을 지정하고 싶다면 import를 사용하면 된다.

import 'dart:html';

이런 식으로 필요한 인자는 라이브러리를 특정 지을 수 있는 URI이다. 내장 라이브러리들은 dart: 라는 스키마를 따른다. 이외의 라이브러리를 사용하려면 파일 시스템 경로나 package: 를 사용하면 된다.

import 'package:test/test.dart';

 

그리고 Dart에서는 라이브러리의 일부만 가져올 수 있는 방법이 있는데, 바로 show와 hide이다.

// foo만 import.
import 'package:lib1/lib1.dart' show foo;

// foo를 제외하고 모두 import.
import 'package:lib2/lib2.dart' hide foo;

위에 코드를 보면 show의 기능은 package:lib1/lib1.dart 라이브러리에 foo만 import 해주고 hide의 기능은 package:lib2/lib2.dart 라이브러리의 foo만 제외하고 다 import 해주는 기능인 것을 볼 수 있다.


이번 주차부터는 Flutter 스터디도 진행하기로 했다. Flutter를 다루어 보며 프론트도 경험해보는 것이 목표이며, 풀스택 개발을 해보는 것을 목표로 해볼 것이다.