🐦 Flutter

[Flutter] part 와 import 차이를 알아보자

ji-hyun 2022. 8. 20. 15:17

Part 와 import 차이

 

3개의 파일의 간단한 예시를 통해 알아보겠습니다.

 

 

1. library_main.dart 

 

library counter;

export 'package:flutter/material.dart';

part 'library_part.dart';

class Counter extends AbstractCounter {
  // we can access library private variable _count even though it is in a different
  // file because we made it part of the same library
  reset() => _count = 0;
}

 

첫번째 줄은 이 라이브러리의 이름을 명시해줍니다 -> counter

이것은 part 로부터 참조될 이름으로 사용해줄 수 있습니다. (아래의 library_part.dart 파일에서 "part of counter" 로 사용하는 등)

 

세번째 줄은 이 라이브러리의 part 로 사용되는 파일들을 나타냅니다. 

 

Counter Class 안에 있는 _count 를 유심히 지켜보며, 아래의 파일(library_part.dart) 을 봅시다.

 

 

 

 

2. library_part.dart

 

part of counter;

abstract class AbstractCounter {
  // this is a library private variable (_varName)
  // if this file were not made part of the counter library, this variable
  // would not be accessible to the Counter class in library_main.dart
  int _count = 0;

  get count => _count;
  increment() => ++_count;
}

 

_count 는 이 파일에 선언되어 있는 것을 볼 수 있습니다.

만약 첫번째 줄처럼 "part of counter" 처럼 선언을 안해줬다면 이 변수는 library_main.dart 파일의 Counter class 에서 접근하지 못했을 겁니다.

 

 

 

 

3. library_example.dart

 

// note that 'material.dart' does not need to be imported
// because it has been exported with the counter library
import 'library_main.dart';

class LibraryExample extends StatefulWidget {
  @override
  _LibraryExampleState createState() => _LibraryExampleState();
}

class _LibraryExampleState extends State<LibraryExample> {
  final _counter = Counter();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Library Example'),
      ),
      body: Center(
        child: Text('You have pressed the button ${_counter.count} times.'),
      ),
      floatingActionButton: Row(
        mainAxisAlignment: MainAxisAlignment.end,
        children: [
          FloatingActionButton(
            child: Text('Reset'),
            onPressed: () => setState(() => _counter.reset()),
          ),
          SizedBox(width: 10),
          FloatingActionButton(
            child: Icon(Icons.add),
            onPressed: () => setState(() => _counter.increment()),
          ),
        ],
      ),
    );
  }
}

 

위와 같이 사용할 수 있습니다.

 

 

 

 

 

dart 에서는 이렇게 설명합니다.

In Dart, private members are accessible within the same library. With import you import a library and can access only its public members. With part/part of you can split one library into several files and private members are accessible for all code within these files.

 

즉, 간단히 말해서 import 는 라이브러리를 임포트하고 오직 public 멤버에 대해서만 접근할 수 있습니다 (참고로, private 는 _ 이런 걸로 선언된 것)

 

그러나 Part 는 한 라이브러리를 여러 개의 파일로 쪼갤 수 있으며 이 파일들 안에서 private 멤버들을 모두 접근할 수 있게 됩니다.