Skip to content

Syntax

Hello World (Main 함수)

dart
// Main 함수 - 프로그램의 시작 지점을 갖고 있는 함수
// function
void main() {
  // print 함수 - 프로그램 실행 도중에 콘솔 창에 출력할 떄
  print('hello world');
}

변수와 자료형

dart
void main() {
  // 변수란 - 변할 수 있는 값
  String name = 'im';
  print(name);

  int age = 30;
  print(age);

  var name2 = 'hyun'; // dart 지원 문법이며 타입을 추론하게 됨
  print(name2);

  var age2 = 35;
  print(age2);

  bool isChecked = false;
  print(isChecked);

  double tall = 164.4;
  print(tall);
}

dynamic 타입 활용

dart
void main() {
  // dynamic type - 모든 데이터 타입을 포함 할 수 있음
  dynamic car = 'benz';
  car = 10;
  print(car);
}

Null Safety

dart
void main() {
  String name = 'im'; // not null

  String? name2 = null; // null
  name2 = 'hyun';
  print(name2);

  String? name3 = null;
  print(name3?.length);

  // null 합류 연산자 (??)
  String? name4 = null;
  String result = name3 ?? 'hoo';
  print(result);
}

late 키워드의 활용

dart
// late 키워드
late String name; // null, 초기화 되지않음.

void main() {
  name = 'im'; // 늦은 초기화
}

final vs const

dart
// 상수 - 항상 같은 수

void main() {
  // final - 최초에 값이 할당되면 다시 할당할 수 없음
  final int textVal = 30;
  textVal = 10; // 오류

  final int testVal2;
  testVal2 = 10;

  // const - 최초에 값이 할당되면 다시 할당할 수 없음 + 선언과 동시에 값을 할당해야 함 (해당 값은 컴파일 시점에 결정되어야 한다.)
  const int testValue3;
  testValue3 = 10; // 오류

  const int testValue4 = 10;
}

연산자와 표현식

dart
void main() {
  // 산술 연산자
  int a = 10;
  int b = 3;

  int sum = a + b;
  int minus = a - b;
  int product = a * b;
  double divided = a / b;
  int remain = a % b;
  int mok = a ~/ b;

  // 비교 연산자
  bool isResult = (a == b);
  bool isResult2 = (a > b);

  // 논리 연산자
  bool result = (true || false); // 논리 합 (OR)
  bool result2 = (true && false); // 논리 곱 (AND)
  bool result3 = !result2; // 논리 부정 (NOT)

  // 할당 연산자
  int c = 10;
  c += 30;
  c -= 10;
  c *= 10;
  c /= 10;

  // 조건 연상자
  int age = 30;
  String ageStatus = age >= 18 ? '성인' : '미성년자'; // 3항 연산자
}

조건문과 반복문 (제어문)

dart
void main() {
  // if - else
  int age = 3;
  if (age == 0) {
    print("신생아");
  } else if (age <= 19) {
    print("미성년자");
  } else {
    print("성인");
  }

  // switch
  String grade = 'A';
  switch (grade) {
    case 'A':
      print('우수');
      break;

    case 'B':
      print('보통');
      break;

    case 'C':
      print('부족');
      break;

    case 'D':
      print('매우 부족');
      break;

    default:
      print('미평가');
      break;
  }

  // for 반복문
  for (int i = 0; i < 5; i++) {
    print('반복 $i');
  }

  // while 반복문
  int count = 0;
  while(count < 3) {
    print('while 반복 $count');
    count++;
    break;
  }
}

List와 Map

dart
// List - 순서가 있는 데이터 컬렉션, 인덱스라는 개념
List<int> numbers = [];
List<int> numbers2 = [
  1,
  2,
  3,
  4,
  5,
];

// Map - key, value의 한쌍
Map<String, int> scoreMap = {};
Map<String, int> scoreMap2 = {
  'a': 100,
  'b': 200,
  'c': 300,
};

void main() {
  // list
  print(numbers2[2]);

  numbers.add(6);
  print(numbers);

  for (int i = 0; i < numbers2.length; i++) {
    print('$i ${numbers2[i]}');
  }

  numbers.removeAt(0);

  numbers.add(7);
  numbers[0] = 8;

  // map
  print(scoreMap2['a']);

  scoreMap['d'] = 400;
  print(scoreMap['d']);

  scoreMap2.forEach((key, value) {
    print('$key의 점수는 $value 입니다.');
  });
}

함수와 메서드

dart
// 함수와 메서드

// 함수 (Function)
// 함수 이름, 매개 변수 (parameter) 반환 유형 (return type) 으로 구성.
void main() { // void 리턴타입일 경우 아무런 값을 반환하지 않고 오로지 실행한다.
  // 프로그램의 출발지점인 main 함수

  print(add(1, 2));
  setStart();
}

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

void setStart() {
  print('시작 합니다.');
}

// 매서드 (Method) - 클래스 내부에서 정의된 함수
class UserInfo {
  String? name;
  int? age;
  String? hobby;

  void setStart() {

  }
}

positional parameter vs named parameter

dart
// positional parameter
void setStart(String name, int age) {
  print('called set started, $name, $age');
}

// named parameter
void setStart2({String name = 'b', int age = 14}) {
  print('called set started, $name, $age');
}

// named parameter with required
void setStart3({required String name }) {
  print('called set started, $name');
}


void main() {
  setStart('a', 30);
  setStart2(age: 50, name: 'd');
  setStart3(name: 'e');
}

클래스와 상속

dart
// 클래스 (class) - 객체를 생성하기 위한 템플릿 또는 청사진 또는 설계도

class Person {
  // 상태 - 멤버 변수
  String name;
  int age;

  // 생성자 (Constructor) - 함수
  Person(this.name, this.age);

  // 행동 - 메서드 (함수)
  void sayHello() {
    print('나는 $name이고 $age살 입니다.');
  }
}

// 상속
// 부모 클래스 (super class)와 자식 클래스 (sub class) 간의 상송 관계가 형성
class Man extends Person {
  Man(String name, int age) : super(name, age);

  @override
  void sayHello() {
    super.sayHello(); // 부모 클래스의 정의되어 있는 함수 호출
    print('제 성별은 남자 입니다.');
  }
}

void main() {
  Person personHuman = Person('낫닝겐', 3500); // 클래스 인스턴스 생성
  Person personHuman2 = Person('너닝겐', 30); // 클래스 인스턴스 생성
  Person personHuman3 = Person('나닝겐', 10); // 클래스 인스턴스 생성

  personHuman.sayHello();
  personHuman2.sayHello();
  personHuman3.sayHello();

  var personMan = Man('카카로트', 25);
  personMan.sayHello();
}

생성자와 선택적 매개변수

dart
// 생성자 (constructor) - 클래스의 인스턴스를 초기화하는 특별한 메서드
// 클래스를 생성할 때 가장 먼저 호출

class Person {
  // 기본 생성자 (default contructor), 생략가능
  Person();
}

class Person2 {
  String name;
  int age;

  // 매개변수가 존재하는 생성자
  Person2(this.name, this.age);
}

class Person3 {
  String name;
  int age;

  // 선택적 매개변수
  Person3({this.name = 'a', this.age = 20});
}

class Person4 {
  String name;
  int age;

  Person4({required this.name, required this.age});
}

void main() {
  var person = Person(); // 클래스 인스턴스 생성 (메모리 올림)
  var person2 = Person2('a', 30);
  var person3 = Person3(name: 'b');
  var person4 = Person4(name: 'c', age: 40);
}

enum 타입

dart
// enum types
// enum (열거형) - 타입 정의 보통 많이 사용. 상수들의 그룹을 정의할 때 유용
// 왜 필요? - 협업 개발자들 간에 코드를 읽고 이해하기 쉽게 만들기 위해

enum Color {
  RED,
  GREEN,
  BLUE,
  YELLOW,
}

void main() {
  // enum 값을 변수에 할당
  Color myColor = Color.BLUE;

  if (myColor == Color.RED) {
    print('빨간색');
  } else if (myColor == Color.BLUE) {
    print('파란색');
  } else if (myColor == Color.GREEN) {
    print('초록색');
  } else if (myColor == Color.YELLOW) {
    print('노란색');
  }

  print(Color.RED.index);
  for (int i = 0; i < Color.values.length; i++) {
    print(Color.values[i]);
  }
}

Future와 await를 활용한 비동기 프로그래밍

dart
// Future와 await을 활용한 비동기 프로그래밍

// future - 비동기 작업의 결과 또는 완료 상태를 나타내는 객체
// 동기 - 작업이 순차적으로 실행
// 비동기 - 작업이 순차적으로 실행되지 않으며, 동시에 여러 작업을 처리할 수 있음

void main() {
  playComputerGame();
}

Future<void>  playComputerGame() async {
  startBoot();
  await startInternet();
  startGame();
}

void startBoot() {
  print('1. boot completed');
}

Future<void> startInternet() async {
  // await - 비동기 함수 내에서 사용되며, await 뒤에 나오는 결과값이 완료될때까지 기다림
  await Future.delayed(Duration(seconds: 3), () {
    print('2. internet completed');
  });
  print('delay completed');
}

void startGame() {
  print('3. game completed');
}