본문 바로가기
웹 · 앱 개발/플러터(Flutter)

Flutter 2화 - Dart 문법 학습하기

by woojin1354 2024. 8. 10.
728x90

본 글은 윈도우11에서 VSCode를 사용하고 있습니다.

이전 포스트에서 Flutter 프레임워크를 설치하면서 Dart 언어도 함께 설치되었습니다.
Flutter 프레임워크는 Dart 언어로 다루어지므로 Flutter를 잘 사용하기 위해 Dart 언어를 학습해보겠습니다.

[목차생성]

1. 변수 (Variables)

Dart에서 변수를 선언하는 방법은 var, final, const 키워드를 사용하거나 명시적으로 타입을 지정하는 방법이 있습니다.

  1. var: 변수를 선언할 때 사용하며, 초기화 시 타입이 결정됩니다.
  2. final: 한 번 값이 할당되면 변경할 수 없는 변수입니다.
  3. const: 컴파일 시간에 값이 결정되고, 이후 절대 변하지 않는 상수입니다.
  4. int: 정수형 (e.g., int age = 25;)
  5. double: 실수형 (e.g., double height = 5.9;)
  6. String: 문자열 (e.g., String name = 'Dart';)
  7. bool: 불리언 (e.g., bool isFlutterAwesome = true;)
  8. List: 리스트 (e.g., List<int> numbers = [1, 2, 3];)
  9. Map: 맵 (e.g., Map<String, int> scores = {'Math': 90, 'Science': 85};)
  10. Dart는 기본적으로 모든 변수는 null 값을 가질 수 없습니다. ?를 사용하여 null을 허용할 수 있습니다. (e.g., String? nullableName;)
void main() {
  var name = 'Flutter';  // String 타입으로 추론됨
  int age = 2;           // 명시적으로 int 타입 지정
  final country = 'Korea';  // 이후 변경 불가
  const pi = 3.14159;    // 컴파일 시간에 값이 고정됨
  
  print('Name: $name, Age: $age, Country: $country, Pi: $pi');
}
void main() {
  int age = 30;
  double price = 9.99;
  String greeting = 'Hello, Dart!';
  bool isDartCool = true;

  List<int> numbers = [1, 2, 3, 4];
  Map<String, int> scores = {'Math': 95, 'Science': 80};

  print('Age: $age, Price: $price, Greeting: $greeting, Dart is cool: $isDartCool');
  print('Numbers: $numbers');
  print('Scores: $scores');
}

2. 입력 (Input)

Dart 자체에서는 콘솔 입력을 받기 위해 dart:io 라이브러리의 stdin을 사용합니다. 그러나 Dart가 웹 또는 모바일 환경에서 사용될 때는 UI를 통해 입력을 받습니다.

import 'dart:io';

void main() {
  stdout.write('Enter your name: ');  // 콘솔에 출력
  String? name = stdin.readLineSync();  // 콘솔에서 입력 받기
  print('Hello, $name!');
}

3. 출력 (Output)

Dart에서 출력을 위해 print 함수를 사용합니다. 콘솔에 문자열을 출력할 수 있으며, 문자열 내에서 변수를 $ 기호를 사용하여 쉽게 삽입할 수 있습니다.

void main() {
  String name = 'Dart';
  print('Hello, $name!');  // 콘솔에 출력

  int age = 10;
  print('Age: $age');  // 숫자도 문자열 내에 포함 가능
}

4. 조건문 (Conditionals)

Dart의 조건문은 if, else if, else 구조로 작성됩니다. 조건은 항상 불리언 값이어야 하며, 조건에 따라 다른 코드 블록이 실행됩니다.

void main() {
  int number = 10;

  if (number > 0) {
    print('$number is positive');
  } else if (number < 0) {
    print('$number is negative');
  } else {
    print('$number is zero');
  }
}

5. 반복문 (Loops)

Dart에서는 반복문을 사용해 반복 작업을 수행할 수 있습니다. 주로 사용되는 반복문으로는 for, while, do-while 문이 있습니다.

void main() {
  // for 문
  for (int i = 0; i < 3; i++) {
    print('For loop: $i');
  }

  // while 문
  int count = 0;
  while (count < 3) {
    print('While loop: $count');
    count++;
  }

  // do-while 문
  int num = 0;
  do {
    print('Do-While loop: $num');
    num++;
  } while (num < 3);
}

 

 

6. 함수 (Functions)

Dart에서 함수는 void로 반환 타입을 지정하거나 값을 반환할 수 있습니다. Dart는 람다 표현식(익명 함수)도 지원합니다.

void main() {
  greet('Dart');  // 함수 호출

  int result = add(5, 3);  // 값 반환 함수 호출
  print('Sum: $result');

  var multiply = (int a, int b) => a * b;  // 람다 함수
  print('Multiply: ${multiply(4, 5)}');
}

void greet(String name) {
  print('Hello, $name!');
}

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

7. 클래스 (Classes)와 객체 (Objects)

Dart는 객체 지향 언어이기 때문에, 클래스와 객체 개념이 매우 중요합니다. 클래스를 정의하고, 그 클래스로부터 객체를 생성할 수 있습니다.

class Person {
  String name;
  int age;

  Person(this.name, this.age);

  void greet() {
    print('Hello, my name is $name and I am $age years old.');
  }
}

void main() {
  Person person = Person('Alice', 30);
  person.greet();
}

8. 상속 (Inheritance)

Dart에서는 클래스가 다른 클래스의 특성을 상속받을 수 있습니다. 이를 통해 코드의 재사용성을 높일 수 있습니다.

class Animal {
  void makeSound() {
    print('Animal makes a sound.');
  }
}

class Dog extends Animal {
  @override
  void makeSound() {
    print('Dog barks.');
  }
}

void main() {
  Dog dog = Dog();
  dog.makeSound();  // Dog barks.
}

9. 인터페이스와 추상 클래스 (Interfaces and Abstract Classes)

Dart에서는 인터페이스를 명시적으로 선언하지 않지만, 클래스 자체가 인터페이스로 사용될 수 있습니다. 추상 클래스는 일부 구현만 제공하고, 나머지는 서브 클래스가 구현하도록 강제합니다.

abstract class Vehicle {
  void drive();
  
  void honk() {
    print('Vehicle honks.');
  }
}

class Car extends Vehicle {
  @override
  void drive() {
    print('Car is driving.');
  }
}

void main() {
  Car car = Car();
  car.drive();  // Car is driving.
  car.honk();   // Vehicle honks.
}

10. 제네릭 (Generics)

제네릭은 다양한 타입에 대해 재사용 가능한 코드를 작성할 때 유용합니다. Dart에서는 제네릭을 사용하여 타입 안전성을 높일 수 있습니다.

class Box<T> {
  T content;

  Box(this.content);

  void showContent() {
    print('The content is: $content');
  }
}

void main() {
  Box<int> intBox = Box(123);
  intBox.showContent();  // The content is: 123

  Box<String> strBox = Box('Hello');
  strBox.showContent();  // The content is: Hello
}

11. 비동기 프로그래밍 (Asynchronous Programming)

Dart는 비동기 프로그래밍을 강력하게 지원합니다. Future와 async/await 키워드를 사용하여 비동기 작업을 쉽게 처리할 수 있습니다.

Future<String> fetchData() async {
  await Future.delayed(Duration(seconds: 2));  // 2초 대기
  return 'Data fetched';
}

void main() async {
  print('Fetching data...');
  String data = await fetchData();
  print(data);  // Data fetched
}

12. 익명 함수 (Anonymous Functions)와 람다 (Lambda)

Dart에서는 익명 함수와 람다를 사용하여 간단한 함수를 작성할 수 있습니다.

void main() {
  var add = (int a, int b) => a + b;
  print(add(3, 5));  // 8

  List<int> numbers = [1, 2, 3, 4, 5];
  numbers.forEach((number) => print(number * 2));  // 2, 4, 6, 8, 10
}

13. 예외 처리 (Exception Handling)

Dart는 try, catch, finally 구문을 사용하여 예외를 처리할 수 있습니다.

void main() {
  try {
    int result = 12 ~/ 0;  // 예외 발생: 정수를 0으로 나눔
    print(result);
  } catch (e) {
    print('Caught an exception: $e');
  } finally {
    print('This is always executed.');
  }
}

14. 라이브러리 및 패키지 (Libraries and Packages)

Dart는 라이브러리 시스템을 통해 코드를 모듈화할 수 있습니다. 또한 Pub 패키지 매니저를 통해 다양한 패키지를 관리하고 사용할 수 있습니다.

import 'dart:math';  // Dart의 표준 라이브러리

void main() {
  var random = Random();
  print(random.nextInt(100));  // 0에서 100 사이의 랜덤 정수 출력
}

 

728x90