- Dart 문법 알아보기 - 32023년 11월 26일 13시 56분 04초에 업로드 된 글입니다.작성자: 핀수728x90반응형
mixin
- 여러 클래스 계층에서 클래스의 코드를 재사용하는 방법
- , 로 여러 클래스의 코드를 사용할 수 있다.
class Engine { int power = 5000; } // extends 해서 Engine 클래스 쓰고 싶은데..BMW가 Engine은 아니잖아요ㅠ (다형성을 만족하지 않음) class BMW with Engine { // with 키워드를 사용한다. } void main() { BMW b = BMW(); print(b.power); // 5000 }
- 다른 언어에서는 composition이라는 개념을 사용한다.
- composition
- 클래스 간에 포함 관계(composition)를 맺어주는 것
- 한 클래스의 멤버 변수로 다른 클래스 타입의 참조 변수를 선언하는 것을 의미
+ 다트 문법을 복습하면서 다시 보게된 mixin 는 인터페이스(implements)와 유사하게 느껴졌다.
그래서 extends, implements, with 의 차이를 살펴보자면
- extends (inheritance) : public, protected 멤버 변수 및 동작과 함께 하나의 클래스만 상속 가능
- implements (contract) : 많은 클래스를 구현할 수 있으나 모든 동작을 재정의 해야함
- with (mixin) : 많은 클래스를 혼합할 수 있으며 해당 클래스의 동작을 재정의 할 수 있음
추상 클래스
- 타입을 일치시키기 위한 용도
- 몸체가 없는 메소드를 만들 수 있음
abstract class Animal { void sound(); } class Fish implements Animal{ @override void sound() { // 해당 메소드를 반드시 정의해야함 print("뻐끔뻐끔 배고파"); } } void main() { Fish fish = Fish(); fish.sound(); // 뻐끔뻐끔 배고파 Animal fish = Fish(); // 이렇게도 가능 (동적 바인딩) print(fish is Animal); // true print(fish.runtimeType); // Fish }
Collection
void main() { // List List<int> nums = [1,2,3,4]; print(nums[2]); // 3 var nums2 = [3,4,5]; // 타입추론 가능 print(nums2[0]); // 3 // 이렇게 선언할 수도 있음 (공식문서 권장) -> 컬렉션 리터럴 var mList = []; // list var mMap = <String, String>{}; var mSet = <int>{}; // set // Map Map<String, dynamic> user = { "id": 1, "username" : "cos" }; }
반복문
void main() { // 반복문 기본 형태 for(int i=0;i<4;i++){ print(nums[i]); } // map() -> 값을 하나씩 변형해서 리턴할 때 var sushi = ["새우초밥", "광어초밥", "연어초밥"]; var sushiChange = sushi.map((i) => "간장과 $i").toList(); // return print(sushiChange); // () Iterable, [] List // where -> 필터링할 때 var findSushi = sushi.where((i)=> i!="광어초밥").toList(); print(findSushi); }
얕은 복사 / 깊은 복사
얕은 복사 (Shallow Copy)
- 메모리 주소를 공유함 → 값을 변경하면 복사한 리스트에도 반영됨
void main() { var list1 = [1,2,3,4]; var list2 = list1; list1[0] = 10; print(list1); // [10, 2, 3, 4] print(list2); // [10, 2, 3, 4] }
깊은 복사 (Deep Copy)
- 아예 값 전체를 가져온다. → 이때 메모리 상의 주소도 바뀜
void main() { // 얕은 복사 var list1 = [1,2,3,4]; var list2 = list1; list1[0] = 10; print(list1); // [10, 2, 3, 4] print(list2); // [10, 2, 3, 4] // 깊은 복사 var list3 = [...list1]; list1[0] = 100; print(list1); // [100, 2, 3, 4] print(list3); // [10, 2, 3, 4] }
- Object를 들고 있으면 깊은 복사가 힘들다. → 주소가 spread 되기 때문
- list와 testList가 가지고 있는 내부 Map<String, int>의 주소는 동일함
void main() { var list = [{"id" : 1}, {"id": 2}]; var testList = [...list]; var newList = list.map((i)=>{...i}).toList(); list[0]["id"] = 10; print(list); // [{id: 10}, {id: 2}] print(testList); // [{id: 10}, {id: 2}] print(newList); // [{id: 1}, {id: 2}] print(list[0].hashCode); // 69610927 print(testList[0].hashCode); // 69610927 print(newList[0].hashCode); // 201171375 }
final과 const
- 한번 값을 정하면 변경할 수 없다는 점은 동일하다.
final
- 실행 중에 값이 결정됨 (런타임 시)
const
- 컴파일 시 값이 결정됨
- 프로그램이 실행될 때의 시간을 남기고 싶다고 가정할 때,
- const는 컴파일 시에 값이 결정되므로 error가 발생한다.
void main() { final log1 = DateTime.now(); const log2 = DateTime.now(); // error }
Null Safety
- Flutter 2.0부터 도입
- null로 인해 예상치 못하고 의도하지 않은 예외를 대비하는 것
- null을 허용하는 것(Nullable Type)과 허용하지 않는 것(Non-Nullable Type)으로 나뉨
- 기본적으로 모든 데이터 타입은 null을 허용하지 않는 타입
- 데이터 타입 뒤에 ‘?’을 붙여 nullable 타입임을 명시한다.
class Dog{ late String name; late int age; late String? nickname; Dog(String name, int age, String? nickname){ this.name = name; this.age = age; this.nickname = nickname ?? "없음"; } } void main() { Dog happy = Dog("happy", 1, null); Dog toto = Dog("toto", 3, "또또"); print("${happy.name}는 ${happy.age}살이며 별명은 ${happy.nickname}이다."); // happy는 1살이며 별명은 없음이다. print("${toto.name}는 ${toto.age}살이며 별명은 ${toto.nickname}이다."); // toto는 3살이며 별명은 또또이다. }
- late : 필드가 참조되기 전 반드시 할당됨을 의미한다.
- ?? : null 대체 연산자. 해당 변수가 null일 경우 지정된 값을 반환하고 null이 아닐경우 해당 값 반환
공부하며 작성된 글이라 잘못된 정보가 있을 수 있습니다.
말씀해주시면 수정하겠습니다. 감사합니다.
References
아래 글을 참고하여 작성 되었습니다.
이지업클래스 | 모두를 위한 온라인 IT CLASS
쉽게 배우고 알차게 쓰는 온라인 IT CLASS.
easyupclass.e-itwill.com
[Dart] Collection : List & Set & Map
Dart 언어에서의 Collection에 대하여 살펴봅니다. #. 구독 대상 Dart 언어를 처음 접하시면서 공부해보고 싶으신 분 플러터(Flutter) 개발에 관심이 있어나 해보고 싶으신 분 멀티 플랫폼 모바일 앱 개
joycestudios.tistory.com
When to use mixins and when to use interfaces in Dart?
I'm very familiar with the concepts of interfaces and abstract classes, but not super familiar with the concepts of mixins. Right now, in Dart, every class A defines an implicit interface, which ...
stackoverflow.com
Dart mixin 이란?
1. 믹스인이 필요한 이유 C#같은 언어에는 믹스인이 없습니다. 다음 클래스 상속 다이어그램을 살펴 보겠습니다. Animal이라는 슈퍼클래스가 있습니다. Mammal, Bird, Fish가 그 클래스를 상속합니다.
paulaner80.tistory.com
[Java] Inheritance (vs. composition)
기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것적은 양의 코드로 새로운 클래스를 작성할 수 있다.공통적으로 코드를 관리하기 때문에 코드의 추가 및 변경이 용이하다.Child class는 Pa
velog.io
prefer_collection_literals
dart-lang.github.io
Dart final과 const의 차이
final와 const
velog.io
728x90반응형'Flutter' 카테고리의 다른 글
[Flutter] 간단한 UI 알아보기 (0) 2023.11.28 [Flutter] 프로젝트 구조 알아보기 (0) 2023.11.27 Dart 문법 알아보기 - 2 (0) 2023.11.25 Dart 문법 알아보기 - 1 (0) 2023.11.24 Dart 문법 알아보기 - 0 (0) 2023.11.23 다음글이 없습니다.이전글이 없습니다.댓글