class Product {
  String name;
  int price;

  Product(this.name, this.price);
}

class ShoppingMall {
  List<Product> productList = [];

  void printProducts() {
    for (Product p in productList) {
      print('${p.name} / ${p.price} 원');
    }
  }
}

void main() {
  ShoppingMall mall = ShoppingMall();
  
  Map<String, int> products = {
    '셔츠': 10000,
    '바지': 20000,
    '치마': 30000,
    '양말': 1000,
    '신발': 50000,
  };

  List<String> keys = products.keys.toList();
  List<int> values = products.values.toList();

  for (var i = 0; i < products.length; i++) {
    Product product = Product(keys[i], values[i]);
    mall.productList.add(product);
  }
  
  mall.printProducts();
}

앱개발종합반에서 진행한 개인과제 중 일부 코드.

 

다양한 메서드를 사용했지만  마지막 4개의 메서드를 만드는 것보다 첫 메서드를 제대로 동작하도록 하는 것이 훨씬 오래 걸렸다. 메서드의 호출 때문이다. 

 

메서드

객체가 특정한 행동을 할 수 있게 해주는 함수의 일종.

 

class ShoppingMall {
  List<Product> productList = [];

  void printProducts() {
    for (Product p in productList) {
      print('${p.name} / ${p.price} 원');
    }
  }
}

printProducts() 가 메서드이다.

클래스 ShoppingMall내에 선언된 것을 볼 수 있다.

 

메서드는 클래스 내부에 존재하기 때문에 클래스에 의존한다.

따라서 메서드의 호출은 함수와 다른 방식으로 작동한다.

 

void main() {
  ShoppingMall mall = ShoppingMall();
  
  Map<String, int> products = {
    '셔츠': 10000,
    '바지': 20000,
    '치마': 30000,
    '양말': 1000,
    '신발': 50000,
  };

  List<String> keys = products.keys.toList();
  List<int> values = products.values.toList();

  for (var i = 0; i < products.length; i++) {
    Product product = Product(keys[i], values[i]);
    mall.productList.add(product);
  }
  
  mall.printProducts();
}

main() 내부에서 printProducts() 를 호출하고 있다.

 

 

ShoppingMall mall = ShoppingMall();

Class ShoppingMall 내부의 메서드이므로 ShoppingMall 객체인 mall을 생성한다.

 

mall.printProducts();

mall 로 클래스를 호출하여 메서드를 불러온다.

Dart 는 List, Set, Map 이라는 세 가지 Collection을 기본으로 지원한다.

이 중 유사한 개념인 List와 Set의 차이점을 확실히 정리했다.

 

List (배열)

:순서가 있는 값의 묶음

 

 

선언 규칙

 

List<[타입]> [변수 이름] = [요소]; 

List<String> colors = ['red', 'blue', 'green'];

 

[변수 이름] = [요소];

var numbers [1, 2, 3, 4, 5];

 

리스트 타입을 정해주지 않거나 var로 선언해도 된다. 

위 코드의 경우 타입을 int로 추론한다.

 

 

리스트의 타입을 정한 경우, 다른 타입의 요소를 넣으면 오류가 발생한다.

타입을 정하지 않은 경우 모든 요소를 포함하는 상위 클래스로 타입을 추론한다.

 

List<String> colors = ['red', 'blue', 'green', 000];
//The element type 'int' can't be assigned to the list type 'String'

String 타입을 정해주었으므로 int 타입의 000을 넣으면 오류가 발생한다.

 

var numbers = [1, 2, 10, 3.14];
print(numbers.runtimeType);
CONSOLE

List<num>

타입을 정해주지 않았으므로 int와 double타입의 상위 타입인 Numbers로 추론한다.

 

 

 

Set (집합)

: 순서가 없는 중복되지 않은 값의 묶음

 

 

선언 규칙

 

Set<타입> [변수 이름] = {요소};

Set<String> fruits = {'apple', 'orange', 'banana'};

 

변수 이름 = {요소};

var numbers = {1, 2, 3, 4, 5};

 

List와 마찬가지로 타입을 정해 줄 수도, 정하지 않을 수도 있다.

타입을 정하지 않은 경우 모든 요소를 포함하는 상위 타입을 자동으로 추론한다.

 

단, Set안에 값을 넣지 않는 경우 타입 지정이 필요하다. 

var names = <String>{}; 
print(names.runtimeType); // Set<String>
var names = {}; 
print(names.runtimeType); // Map<dynamic, dynamic>

 

타입 지정한 경우 Set, 지정하지 않은 경우 Map으로 선언됨

 

 

 

List와 Set의 차이점

 

한글명인 배열, 집합에서 알 수 있듯이

 

List는 순서가 정해진 값들의 묶음,

Set은 순서가 없는 값들의 묶음이다. 

 

 

 

일반적인 리스트, 집합의 이미지를 떠올리면 이해가 쉽다.

 

리스트는 순서대로 작성되어 있고, 집합은 순서 없이 하나의 틀 안에 모여있을 뿐이다.

 

또한, '순서(index)' 가 있기 때문에 리스트는 같은 값이라도 순서에 따라 구별되지만, 집합에서는 같은 값은 하나로 처리된다.

따라서 List에서만 index 관련 기능을 사용할 수 있다.

 

  List Set
선언방법 List<[타입]> [변수 이름] = [요소];  Set<타입> [변수 이름] = {요소};
[변수 이름] = [요소]; 변수 이름 = {요소};
Index 유무 O X
중복 허용 유무 O X
공통 사용 가능한 코드 .isEmpy, add(), addAll(), remove(), length, contains(), clear()
각 타입에서만 사용 가능한 코드 indexOf(), removeAt() containsAll()

 

심화 문법 공부 후 개인 과제 중 Product class 선언 파트를 구현했다.

선언한 클래스에 map과 for문을 사용하여 리스트에 클래스를 추가했다. 

 

과제 설명 일부

 

전체 Code

class Product {
  String name;
  int price;

  Product(this.name, this.price);
}

void main() {
  Map<String, int> products = {'shirts': 1000, 'skirt': 5000, 'pants': 20000};

  List<Product> productList = []; // Product 객체를 저장할 리스트 생성

  // for문을 사용하여 Product속성에 Map 데이터를 입력하고 리스트에 추가
  for (var key in products.keys) {
    productList.add(Product(key, products[key]!));
  }

  // 결과 출력
  for (var product in productList) {
    print('${product.name}/ ${product.price}won');
  }
}

 

결과

shirts/ 1000won
skirt/ 5000won
pants/ 20000won

 

 

 

 

클래스 선언 파트

class Product {
  String name;
  int price;

  Product(this.name, this.price);
}

Product 라는 클래스를 선언해 주고 name, price라는 속성을 부여한다.

 

 

Product(this.name, this.price);

원래 이 부분은

Product(String name, int price) {
    this.name = name;
    this.price = price;
  }

이렇게 작성하지만, 위와 같이 짧게 줄여쓸 수 있다.

해당 코드를 이용해 초기값을 설정하지 않은 속성이 null로 처리되는 것을 막고 후에 부여할 값을 사용할 수 있다.

 

 

클래스의 생성자 매개변수에 할당값 전달 파트

void main() {
  Map<String, int> products = {'shirts': 1000, 'skirt': 5000, 'pants': 20000};

  List<Product> productList = []; // Product 객체를 저장할 리스트 생성

  // for문을 사용하여 Product속성에 Map 데이터를 입력하고 리스트에 추가
  for (var key in products.keys) {
    productList.add(Product(key, products[key]!));
  }

  // 결과 출력
  for (var product in productList) {
    print('${product.name}/ ${product.price}won');
  }
}

데이터가 map 형식으로 제공되었으므로, Product 객체를 저장할 리스트를 생성한다.

 

for-in문을 사용하여 각각의 key와 value를 각 클래스의 name, price에 부여한다.

리스트를 사용하기 때문에

for (초기화식, 조건식, 증감식) {...}

문보다 for-in의 사용이 더 간단하다.

 

for, for-in 등 루프문의 사용법과 차이점은

https://dart.dev/language/loops

 

Loops

Learn how to use loops to control the flow of your Dart code.

dart.dev

위 문서를 참고했다.

 

 

 

 

 

추가 참고 문서

https://dart.dev/language/constructors

 

Constructors

Everything about using constructors in Dart.

dart.dev

 

'Dart' 카테고리의 다른 글

[Dart] 비동기 프로그래밍 - Future  (0) 2025.03.14
[Dart] 콘솔 쇼핑몰 트러블슈팅  (0) 2025.03.13
[Dart] 메서드의 사용  (0) 2025.03.12
[Dart] List, Set 개념 및 차이점  (0) 2025.03.11
1주 1일차 - Dart 문법  (0) 2025.03.07
Summary
Flutter 앱개발 캠프에 합류를 완료했고, 앱개발 종합반 1주차 강의 수강을 시작함.
Dart 문법 중 변수, 반복문을 학습함.

 

 

변수

변수란?

: 값을 담아두는 곳. 타입을 지정해 값을 넣어두고, 이름을 사용하여 호출할 수 있다.

 

변수 선언 예시

int intValue = 2;
string stringValue = "문자열";

 

int, string 등 변수 타입을 먼저 선언하고 이름을 붙인 뒤 값을 넣는다.

var를 선언하는 경우 타 변수 타입과 달리 값을 인식하여 타입을 정해줄 수 있다. 

 

 

반복문

for 반복문

: 반복 작업을 할 때 사용함

 

for 반복문 사용 예시

for(var i = 1; i <=1000, i++) { sum += i; }

 

for 괄호 내의 첫 번째 영역: 반복 시작 시점

두 번째 영역: 반복 종료 시점

세 번째 영역: 증감값

대괄호 내 영역: 로직

 

예시코드는 i값이 1에서부터 시작하며, i값이 1000보다 같거나 커지면 끝난다. 매번 반복할 때마다 i값에 1을 더한 값을 새로운 i로 사용한다.

 

 

 

 

 

돌아보기
더 많은 양을 공부할 수 있을 줄 알았는데, 세팅 등에 시간을 많이 소모한 점이 아쉬움.
앞으로의 공부 계획에 개발환경 세팅과 같은 변수를 고려해 미리 준비를 할 수 있도록 해야겠음.

 

+ Recent posts