๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“ฑFlutter/Dart

Dart 1์ผ์ฐจ : ์ปดํŒŒ์ผ๋Ÿฌ & ๋ณ€์ˆ˜

by ojui 2025. 8. 28.
๋ฐ˜์‘ํ˜•

 

๐Ÿ“ŒIntroduction

โญDart ์ปดํŒŒ์ผ๋Ÿฌ

Dart๋Š” ๋‹ค์ค‘ ์ปดํŒŒ์ผ๋Ÿฌ ๋ฐฉ์‹์„ ์ง€์›ํ•œ๋‹ค.


๊ฐœ๋ฐœ ์ค‘์—๋Š” JIT๋ฅผ ํ†ตํ•ด ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ณ ,
๋ฐฐํฌํ•  ๋•Œ๋Š” AOT ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋นŒ๋“œํ•œ๋‹ค.

 

1๏ธโƒฃAOT (ahead-of-time)

- ๋ชฉํ‘œ CPU ์•„ํ‚คํ…์ฒ˜๋ฅผ ์ง€์ •ํ•œ ํ›„, ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๊ธฐ๊ณ„์–ด๋กœ ๋ณ€ํ™˜
- ์ฝ”๋“œ ์ˆ˜์ • ์‹œ์—๋Š” ๋‹ค์‹œ AOT ๋นŒ๋“œ ํ•„์š”

 

2๏ธโƒฃJIT (just-in-time)

- Dart VM ์‚ฌ์šฉ
- ๊ฐœ๋ฐœ ์ค‘ ์ฝ”๋“œ๊ฐ€ ์ฆ‰์‹œ ์ปดํŒŒ์ผ๋จ
- ๋น ๋ฅธ ํ…Œ์ŠคํŠธ์™€ ํ•ซ ๋ฆฌ๋กœ๋“œ์— ํ™œ์šฉ

 

โญFlutter์™€ Dart์˜ ๊ด€๊ณ„

Flutter์™€ Dart๋Š” ๋ชจ๋‘ ๊ตฌ๊ธ€์—์„œ ๊ฐœ๋ฐœํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ƒํ˜ธ์ตœ์ ํ™”๊ฐ€ ๊ฐ€๋Šฅํ•œ ๊ตฌ์กฐ๋‹ค.
Flutter์˜ ์„ฑ๋Šฅ๊ณผ ๊ฐœ๋ฐœ ๊ฒฝํ—˜์„ ๋†’์ด๊ธฐ ์œ„ํ•ด์„œ Dart๋ฅผ ๋ฐœ์ „์‹œํ‚จ๋‹ค.
์‹ค์ œ๋กœ JIT์™€ AOT ์ปดํŒŒ์ผ ๋ฐฉ์‹์€ Flutter ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด Dart์— ์ถ”๊ฐ€๋œ ๋Œ€ํ‘œ์ ์ธ ๊ธฐ๋Šฅ์ด๋‹ค.

 

โญ์ฐธ๊ณ  & ์—ฐ์Šต ์‚ฌ์ดํŠธ

- Dart Document

 

Dart ๊ฐœ์š”

Dart์— ๋Œ€ํ•œ ์งฆ์€ ์†Œ๊ฐœ

dart-ko.dev

Dart ๊ณต์‹ ๋ฌธ์„œ์—์„œ ๋” ์ž์„ธํ•œ ๋‚ด์šฉ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

- DartPad

 

DartPad

 

dartpad.dev

์›น ๊ธฐ๋ฐ˜ ์˜จ๋ผ์ธ IDE
๋ณ„๋„์˜ ์„ค์น˜ ์—†์ด Dart๋ฅผ ์‹คํ–‰ํ•ด๋ณด๊ณ  ์‹ถ๋‹ค๋ฉด, DartPad์—์„œ ๊ฐ„๋‹จํžˆ ์ฝ”๋“œ๋ฅผ ํ…Œ์ŠคํŠธํ•ด ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

๐Ÿ“ŒVariables

โญHello World

void main() {
    // print ํ•จ์ˆ˜ : ๋กœ๊ทธ ์ถœ๋ ฅ
    print('hello world');
}

C์ฒ˜๋Ÿผ mainํ•จ์ˆ˜์—์„œ ์‹œ์ž‘ํ•˜๊ณ , ์„ธ๋ฏธ์ฝœ๋ก ์„ ์จ์ค˜์•ผํ•œ๋‹ค.

 

โญVar

  var name = 'jui';
  
  // ์—…๋ฐ์ดํŠธ ๊ฐ€๋Šฅ
  // ๋ณธ๋ž˜ ํƒ€์ž…๊ณผ ์ผ์น˜ํ•ด์•ผํ•จ.
  name = 'julie';

์ž๋™์œผ๋กœ ํƒ€์ž… ์ถ”๋ก ์„ ํ•ด์ฃผ๋Š” ํ‚ค์›Œ๋“œ๋‹ค.

 

๊ด€์Šต์ ์œผ๋กœ ํ•จ์ˆ˜๋‚˜ ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์— ์ง€์—ญ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•  ๋•Œ var๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

class์—์„œ ๋ณ€์ˆ˜๋‚˜ property๋ฅผ ์„ ์–ธํ•  ๋•Œ๋Š” ๋ช…์‹œ์ ์œผ๋กœ ํƒ€์ž…์„ ์„ ์–ธํ•œ๋‹ค.

 

โญDynamic

  // var ๋ณ€์ˆ˜๋กœ ์„ ์–ธํ•ด์„œ dynamic๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ
  var name;
  
  // dynamic์œผ๋กœ ์„ ์–ธํ•  ์ˆ˜๋„ ์žˆ์Œ.
  dynamic nickname;
  
  name = "jui";
  name = 12;
  name = true;
  
  // dynamic์ด๊ธฐ ๋•Œ๋ฌธ์— ํƒ€์ž…์„ ํ™•์ธํ•ด์ค˜์•ผํ•จ.
  if(name is String){
    // string์ธ์ง€ ํ™•์ธํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— string ๋ฉค๋ฒ„๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ.
    print(name.length);
  }
  
  // ์—ฌ๊ธฐ์„œ๋Š” string ๋ฉค๋ฒ„๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Œ.

 

์—ฌ๋Ÿฌ๊ฐ€์ง€ ํƒ€์ž…์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ๋ณ€์ˆ˜์— ์“ฐ๋Š” ํƒ€์ž…์ด๋‹ค.

์„ ์–ธํ•  ๋•Œ ๋ณ€์ˆ˜ ํƒ€์ž…์„ ์ •ํ•˜์ง€ ์•Š๊ณ , ์ถ”ํ›„์— ํƒ€์ž…์„ ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฑด ํ”ผํ•ด์•ผํ•˜์ง€๋งŒ, ๋ณ€์ˆ˜๊ฐ€ ์–ด๋–ค ํƒ€์ž…์ผ์ง€ ์•Œ๊ธฐ ์–ด๋ ค์šด ๊ฒฝ์šฐ ๋“ฑ ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋Š” ๋งค์šฐ ํšจ๊ณผ์ ์ด๋‹ค.


โญNullable

  String name = 'jui';
  
  // null safety
  // null์„ ๋Œ€์ž…ํ•  ๊ฒฝ์šฐ ์—๋Ÿฌ๋‚จ
  //name = null;
  
  // nullable
  // null์ด ๋  ์ˆ˜ ์žˆ์Œ
  String? nickname = 'jui';
  nickname = null;
  
  // ์—ฌ๊ธฐ์„œ๋Š” string ๋ฉค๋ฒ„๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Œ
  // null ์—ฌ๋ถ€๋ฅผ ๋ชจ๋ฅด๊ธฐ๋•Œ๋ฌธ์— ์—๋Ÿฌ๋‚จ
  // nickname.isNotEmpty;
  
  // null์ธ์ง€ ํ™•์ธ
  if(nickname != null){
    nickname.isNotEmpty;
  }
  
  // ๋‹จ์ถ• ๋ฌธ๋ฒ•
  // ๊ฐ’์ด ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธํ•œ ํ›„ ์—ฐ์‚ฐ ์ง„ํ–‰
  nickname?.isNotEmpty;

null safety๋Š” NullPointerException ์˜ค๋ฅ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด null ๊ฐ’์„ ์ฐธ์กฐํ•  ์ˆ˜ ์—†๋„๋ก ํ•˜๋Š” ๊ธฐ๋Šฅ์ด๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋“  ๋ณ€์ˆ˜๋Š” non-nullable์ด๋‹ค.

 

nullable ๋ณ€์ˆ˜๋Š” ๋ช…์‹œ์  ํƒ€์ž… ๋’ค์— [?]๋ฅผ ๋ถ™์—ฌ์„œ ์‚ฌ์šฉํ•œ๋‹ค.

 

๋ช…์‹œ์  ๋ณ€์ˆ˜์˜ ๋ฉค๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด null ์—ฌ๋ถ€ ํ™•์ธ ํ›„ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค.ํ™•์ธํ•˜๋Š” ๋ฐฉ๋ฒ•์€ 2๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

  1. if ๋ฌธ ์‚ฌ์šฉ
  2. null ์•ˆ์ „ ์—ฐ์‚ฐ์ž ์‚ฌ์šฉ : [?.]

 

โญFinal

  // ํƒ€์ž… ์ถ”๋ก  ๊ฐ€๋Šฅ
  final name = 'jui';
  
  // ํƒ€์ž…์„ ์ง€์ •ํ•ด์ค˜๋„ ๋จ
  final String nickname = 'julie';
  
  // ์ˆ˜์ • ๋ถˆ๊ฐ€. ์—๋Ÿฌ๋‚จ.
  // name = 'julie';

final ๋ณ€์ˆ˜๋Š” ์ˆ˜์ • ๋ถˆ๊ฐ€ํ•œ ์ƒ์ˆ˜์ด๋‹ค.

javascript์˜ const์™€ ๋น„์Šทํ•˜๋‹ค.

 

โญLate

  // ๋ณ€์ˆ˜ ํƒ€์ž… ์•ž์— ๋ถ™์—ฌ์„œ ์‚ฌ์šฉ
  late final name;
  late var nickname;
  
  // ์ง€์—ฐ ์ดˆ๊ธฐํ™”
  name = 'jui';

late ๋ณ€์ˆ˜๋Š” ์ง€์—ฐ ์ดˆ๊ธฐํ™”(Lazy Initialization)๋ฅผ ์ง€์›ํ•œ๋‹ค.

๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•  ๋•Œ ์ดˆ๊ธฐ๊ฐ’์„ ํ• ๋‹นํ•˜์ง€ ์•Š๊ณ , ๋‚˜์ค‘์— ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

โญConstant

  // ํƒ€์ž…์ถ”๋ก  ๊ฐ€๋Šฅ
  const name = 'jui';
  const String nickname = 'julie';
  
  // ์ˆ˜์ •๋ถˆ๊ฐ€
  // name = 'julie';

 

const๋Š” compile-time constant์ด๋‹ค.

ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋˜๊ธฐ ์ „์— ๊ฐ’์ด ํ™•์ •๋˜๋Š” ์ƒ์ˆ˜์ด๋‹ค.

๋Ÿฐํƒ€์ž„ ์ค‘์—๋Š” ์ ˆ๋Œ€ ๋ฐ”๋€Œ์ง€ ์•Š๊ณ , ์ปดํŒŒ์ผ ์‹œ์ ์— ๊ฐ’์ด ๊ฒฐ์ •๋˜์–ด ์žˆ์–ด์•ผํ•œ๋‹ค.

 

   final time = DateTime.now();

ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์‹œ์ ์— ๊ฐ’์„ ๊ฒฐ์ •ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, runtime constant์ธ final์„ ์จ์•ผํ•œ๋‹ค.

 

 

๋ฐ˜์‘ํ˜•

'๐Ÿ“ฑFlutter > Dart' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

Dart 3์ผ์ฐจ : ํ•จ์ˆ˜  (0) 2025.08.30
Dart 2์ผ์ฐจ : ๋ฐ์ดํ„ฐ ํƒ€์ž…  (0) 2025.08.29