[Dart]

해달·2023년 12월 17일

다트코드는 여러 CPU의 아키텍처에 맞게 변화시켜줌

  • null safety 가 있음
  • 구글에서 만든 플러터, 다트언어 이기때문에 플러터에 맞춰서 다트언어가 변화할 수 있기때문에 굉장한 조합!

요거 따라하고 extension 깔면 알아서 vscode에서 적용된다


Dart는 객체지향언어임
모든건 class로 되어있음

main 함수는 모든 다트 프로그램의 엔트리포인트

반드시 main함수를 작성해야하고 그 함수에서 쓴코드가 호출이 됨

세미콜론을 잊지말고 꼭 닫아줘야 함 다트는 자동으로 닫아주는 기능이 없음

왜냐하면 일부러 세미콜론을 쓰지 않을때가 있기 때문에 꼭 유념해서 코드를 작성해야 함


The Var keyword

  1. var 로 변수 선언
    타입이 자동으로 정의도기때문에 이전에 수정할때는 같은 타입의 값으로 만 수정해야 함
  1. type 을 통해 변수 선언

String name = '선영'

  • 관습적으로 함수나 메소드 내부에서 지역 변수를 선언할때 : var
  • class 에서 변수나 property를 선언할 때에는 : 타입
  1. dyynamic
    여러가지 타입을 가질 수 있는 변수
    추천하지 않는 방법이지만 필요할 때 사용하는 변수타입
var name; // dynamic type
dynamic name;

if(name is String) {  // 타입확인
  // string 관한 함수들을 사용할 수 있음
}

null safety

개발자가 null 값을 참조할 수 없도록 하는 것

어떤 변수가 null 이 될 수 있음을 정확히 표시해야 함
null safety는 어떤 변수, 혹은 데이터가 null이 될 수 있음을 명시하는 걸 말한다.

String? seonyeong = 'seonyeong' //null 일수도 있음을 명시

if(seonyeong != null) {
 // null이 아닐 때 
}

dart의 변수는 기본적으로 nullable이 아니다.

final variables

정의된 변수를 수정할 수 없게 할 때 쓰는 final 변수 선언자

final name = 'seonyeong`

Late Variabels

초기 데이터 없이 변수를 선언할 수 있게 해준다.

late final String name;


// do something, go toapi

Constant Variables

complit-time constant를 만들어준다.

  • 수정이 안되는 상수
  • complie-time에 알고 있어야 하는 값에만 사용한다.

Basic Data Types

dart의 타입들은 object로 이루어져있다

  • string
  • bool
  • int
  • double

Lists

Type: List<int>

  void main() {
  var numbers = [1, 2, 3, 4, 5];
}
 
 void main() {
  List<int> numbers = [1, 2, 3, 4, 5];
}
 

두개는 동일하게 동작한다.

타입들은 class로 정의되어있다.

  • methods
    • first : 첫번째 요소
    • last : 마지막 요소

collection if

void main() {
  var giveMeFive = true;
  var numbers = [
    1,
    2,
    3,
    4,
    if(giveMeFive) 5, // giveMeFive가 true면 List에 5가 추가 됨
  ];
}

collection for

string imterpolation
text에 변수를 추가하는 방법


void main() {
  var name = 'seonyeong';
  var greeting = 'hello $name'; // 변수 추가
} 
  • $ 뒤에는 변수 사용
void main() {
  var name = 'seonyeong';
  var age = 10;
  var greeting = 'hello $name , ${age + 2}'; // 변수에 값 더하기

  print(greeting);
}
  • 계산은 중괄호 사용

for을 이용한 계산

void main() {
  var oldFrineds = ['local', 'heeZzang'];
  var newFriends = [
    'go_hard',
    'bibi',
    for (var firend in oldFrineds) "💞 $firend"
  ];

  print(newFriends);
}
  • 추가 할 값을 변형해서 사용할 때 쓴다.

Maps

// Type :  Map<String, Object>
// Object는 typescript의 any라고 볼 수 있다.

void main(){
  var palyer = {
    'name': 'Messi',
    'age': 33,
    'club': 'Barcelona',
  }
} 

void main(){
  Map<int,bool> player= {
    1: true,
    2: false,
  }
  
  Map<List<int> , bool> player = {
  	[1,2,3,4,5] : true,
  }
}

  • key(String) : value(Object)
    object는 기본적으로 어느 자료형이든 될 수 있다.

Sets

모두 유니크 한 값

var numbers= {1,2,3,4};
set<int> numbers = {1,2,3,4} 

Functions

Defining a Function

// 아무것도 리턴하지 않는 함수
void sayHello(String name) {
  print("Hello $name");
}

//string type을 리턴하는 함수
String sayHello_string(String name) {
  return "Hello $name";
}

// 바로 리턴
String sayHello_string_arrow(String name) => "Hello $name";

Named Parameters

name argument를 파라미터로 받아서 쓸 때,

String sayHello({String name, int age, String country}) {
  return "Hello $name, you are $age, and you come from $country";
}

void main () {
  print(sayHello(
    age : 12,
    country :"",
    name :""
    )
  )
}

사용할 때는 소괄호를 쓰지 않음,
만약 옵셔널로 값이 들어가게 될 때 방지하고자
1. 정의한 함수에 기본 디폴트 값을 넣어주기 default Value
2. required 사용하기

String sayHello({
  required String name
  }) {
  //,,,
  }

cscade notation

객체의 값을 변겯ㅇ하고 싶을 때 아래와 같은 syntax sugar 적용 가능


// 같은 객체에 대해 여러 작업을 수행할 수 있도록 하는 표기법
void func() {
  var seonyeong = Player(name: 'seonyeong', xp: 100, team: 'red');

  seonyeong
    ..name = 'seonyeong' // 점 하나는 선언한 변수를 의마한다.
    ..xp = 100
    ..team = 'red';

  seonyeong.name = 'seonyeong';
  seonyeong.xp = 100;
  seonyeong.team = 'red';
}

Enums

  • 휴먼실수를 막아주는 Enums
enum Team { red, blue }

class Player {
  String name;
  int xp;
  Team team;

  Player({
    required this.name,
    required this.xp,
    required this.team,
  });
}

// 같은 객체에 대해 여러 작업을 수행할 수 있도록 하는 표기법
void func() {
  var seonyeong = Player(name: 'seonyeong', xp: 100, team: Team.red);

  seonyeong
    ..name = 'seonyeong'
    ..xp = 100
    ..team = Team.blue;
}

Abstract Classes (추상화 메소드)

  • 추상화 클래스란 절 대 이런식으로 작성할 일이 없는 클래스
  • 추상화 클래스로는 객체를 생성할 수 없다.
  • 추상화 클래스는 다른 클래스들이 직접 구현해야 하는 메소드들을 모아놓은 일종의 청사진이다.
  • 추상화 클래스는 extends 키워드를 사용하여 상속받아 사용한다.
  • 추상화 클래스는 다른 클래스들이 어떤 청사진을 가지고 있어야 하는지 알려주는 역할을 한다.
abstract class Human {
  void walk();
}
  • 수많은 청사진에 공통적으로 들어가야 하는 메소드를 추상화 클래스에 정의한다.
class Player extends Human {
  String name;
  int xp;
  Team team;

  Player({
    required this.name,
    required this.xp,
    required this.team,
  });

  void walk() {
    print('$name is walking');
  }
}

// 이런식으로 상속받고 또 다른 동작을 하는 클래스를 만들 수 있다.
class Coach extends Human {
  void walk() {
    print('coach is walking');
  }
}

Inheritance (상속)

class Human {
  final String name;
  Human({required this.name});

  void sayHello() {
    print('Hello, $name');
  }
}

enum Team { red, blue }

class Player extends Human {
  final Team team;

  Player({
    required this.team,
    required String name, // 필수요소를 받겠다고 정의
  }) : super(name: name);
  //Player 생성자에서 온 name은 그 즉시 super 생성자로 전달 된다.

   // 부모클래스의 메소드를 재정의
  void sayHello() {
    super.sayHello(); // 부모클래스의 sayHello() 메소드를 호출
    // 확장한 부모 클래스의 프로퍼티에 접근하게 하거나 메소드를 호출하게 하려면 super라는 키워드를 사용한다.

    print('My team is ${team}');
  }
}
  • super라는 키워드를 통해(확장을 한) 부모클래스와 상호작용을 한다.
  • super에 name을 전달해주면 이 클래스를 전달한 name과 함께 호출하게 된다.
  • super클래스는 확장한 부모 클래스를 의미한다.

Mixins

  • Mixin은 생성자가 없는 클래스
  • 다른 클래스의 프로퍼티와 메소드를 그냥 긁어다 오는 것 뿐
  • Mixin은 여러 글래스에 재사용이 가능하다.
mixin Strong {
  final double strengthLevel = 1500.99;
}

mixin QuickRunner {
  void runQuick() {
    print("ruuuuuuuun!");
  }
}

mixin Tall {
  final double height = 1.99;
}

enum Team { red, blue }

class Player with QuickRunner, Tall {
  final Team team;

  Player({
    required this.team,
  });
}

class Horse with Strong, QuickRunner {}

class kid with QuickRunner {}

done,

객체지향언어에 대한 공부를 따로 한적이 없었는데, 이번에 좋은 기회로 객체지향 언어를 사용하게 되었다.
이론적인 부분이지만 강의를 통해서 클래스에 대해 좀 더 알게 된거같은데,,
실전을 통해 더 많은 개념을 익혀야겠다는 생각이 ..ㅎ.ㅎ..

0개의 댓글