접근지정자, getter, setter

접근지정자

기본 public = 모든 파일 접근 가능

언더스코어를 붙이면 private = 해당 파일만 접근 가능 (클래스 x)

class Animal{
    String _name;
}

class Test {
    void play(){
        Animal a2 = Animal();
        a2._name = "원숭이"; // 같은 파일이기에 접근 가능
    }
}
main(){
    // new 생략 가능
    Animal a1 = Animal();
    a1._name = "호랑이"; // 같은 파일이기에 접근 가능
}

생성자, getter, setter

생성자

car.dart

class Car{
    String _name; //private

    // 초기화 생성자
    Car(this._name){}

    // 초기 생성자 필요없을때
    Car.origin()

    // getter
    String getName(){
        return _name;
    }
}

main.dart

import 'cart.dart';

main(){
    // private에 접근하기위해 초기화 생성자 필요
    Car c = Car("아반떼");
    // 초기 생성자 없이 불러오기
    Car c2 = Car.origin();
}

getter

car.dart

class Car{
    String _name; //private

    // 초기화 생성자
    Car(this._name){}

    // getter
    String getName(){
        return _name;
    }
    // getter 축약
    String get name{
        return _name;
    }
}

main.dart

import 'cart.dart';

main(){
    // private에 접근하기위해 초기화 생성자 필요
    Car c = Car("아반떼");
    // 호출
    // getter 축약법
    print(c.name); 
}

setter

car.dart

class Car{
    String _name; //private

    // 초기화 생성자
    Car(this._name){}

    //setter
    setName(String value){
        _name = value;
    }
    //setter 축약법
    set name(String value){
        _name = value;
    }
}

main.dart

import 'cart.dart';

main(){
    Car c = Car();
    // setter 축약법
    c.name = '아반떼';
}

참고

https://www.youtube.com/watch?v=mdjp2knKMeg&list=PL93mKxaRDidGEaUXprXqhNvSW02xCjLZI&index=15

 

728x90

'Study > Dart' 카테고리의 다른 글

[Dart] 상속을 쓰는 이유  (0) 2021.06.07
[Dart] 상속  (0) 2021.06.07
[Dart] 클래스  (0) 2021.06.04
[Dart] final 과 const 차이  (0) 2021.06.04
[Dart] 반복문과 깊은 복사  (0) 2021.06.04

클래스 특징

클래스

  1. dart의 모든 것들은 1급 객체이다.
  2. class는 여러가지 데이터를 저장할 수 있다.
class Dog{
    var name = "초롱이";
    var age = 2;
    void sound(){
        print("멍");
    }
}
  1. class는 메모리에 뜨지 않는다.
  2. class는 개발자가 메모리에 직접 올려야 한다. (new연산자)
main() {
    Dog d1 = new Dog(); // new 됐다는 것은 메모리에 로드 됐다는 뜻(인스턴스화)
    Dog d2 = new Dog();
}

Cascade 연산자

class User{
    var id;
    var name;
    var phone;
}
main() {
    User u = new User()
    ..id = 1
    ..name = '홍길동'
    ..phone = '123456'

    u.name = '홍길동'; //위와 동일

}

오버로딩 대체

class User{
    var id;
    var name;
    var phone;

    // 생성자로 초기화
    User(){
        id = 2;
    }

    // 오버로딩 불가능
    User(var name){

    } // 에러

    // 오버로딩 대체해서 이름 있는 생성자
    User().second(){
        id = 3;
        name = '임꺽정';
        phone = '4321432';
    }
}
main() {
    User u = new User()
    ..id = 1
    ..name = '홍길동'
    ..phone = '123456'

    u.name = '홍길동'; //위와 동일

    //이름있는 생성자 호출
    User u2 = new User.second();

}

참고

https://www.youtube.com/watch?v=1IafJ4Lg2fM&list=PL93mKxaRDidGEaUXprXqhNvSW02xCjLZI&index=14

 

728x90

'Study > Dart' 카테고리의 다른 글

[Dart] 상속  (0) 2021.06.07
[Dart] 접근지정자, 생성자, getter, setter  (0) 2021.06.04
[Dart] final 과 const 차이  (0) 2021.06.04
[Dart] 반복문과 깊은 복사  (0) 2021.06.04
[Dart] 익명함수와 화살표 함수  (0) 2021.06.04

final 과 const 차이

final

한번 값을 대입하면 변경할 수 없다.

실행 중에 값이 결정

final String choose = "볶음밥";

void main(){
    print(choose)
    choose = "짬뽕"; // 에러
}

const

한번 값을 대입하면 변경할 수 없다.

컴파일 할 때 값이 결정된다.

const String choose = "볶음밥";

void main(){
    print(choose)
    choose = "짬뽕"; // 에러
}

예시

어떤 프로그램이 실행될 때 시간에 대한 로그 남기고 싶음

var log = DateTime.now()
final var log = DateTime.now()

const var log = DateTime.now() // 에러

언제 실행될지 모르니 실행 중 값이 결정되는 final은 오류가 안나지만 컴파일할 때 값이 결정되는 const는 오류

참고

https://www.youtube.com/watch?v=QV_yNEay5qo&list=PL93mKxaRDidGEaUXprXqhNvSW02xCjLZI&index=13

 

728x90

'Study > Dart' 카테고리의 다른 글

[Dart] 접근지정자, 생성자, getter, setter  (0) 2021.06.04
[Dart] 클래스  (0) 2021.06.04
[Dart] 반복문과 깊은 복사  (0) 2021.06.04
[Dart] 익명함수와 화살표 함수  (0) 2021.06.04
[Dart] 메서드(함수)  (0) 2021.06.03

반복문과 깊은 복사

반복문

기본 for 문


var list = [1, 2, 3, 4];

for(var i=0; i<list.length; i++){

print(list[i]);

}

for in 문

  • 배열의 끝까지 돌 때 사용

for(var e in list){

print(e);

}

forEach 문 ( 권장 x )

  • for in 문과 동일

list.forEach((e) => print(e));



list.forEach((e) {

print(e);

});

배열 복사

얕은 복사 ( 주소 복사 )

  • list[0] = 1 일때 얕은 복사 후 list[0]을 10으로 바꾸면 newLIst[0]도 10으로 바뀜
  • 같은 공간을 참조하고 있기 때문

var newList = list; // 주소 복사

깊은 복사 ( 배열 복사 )

  • map
  • 반복해서 값을 리턴해주는데 값을 연산해서 리턴 가능

var mapList = list.map((e) => e + 1 );

깊은 복사 ( 스프레드 연산자 )

  • 연산 불가능
  • 그러나 삽입할때 유용

var spreadList = [...list];

var spreadList = [10, ...list, 100];

필터링 후 깊은 복사

  • true 가 리턴된 값만 리스트에 넣음

var filterList = list.where((e) => e == 2);

정리

기본 반복 : 일반 for 문, for in 문

반복 후 리턴 : map

반복 후 어떤 값을 걸러내고 싶을 때 : where

값 변경 시에 깊은 복사 → 주소가 달라야 플러터나 리액트에서 그림을 다시 그림

참고

https://www.youtube.com/watch?v=s8xUCD0IxIo&list=PL93mKxaRDidGEaUXprXqhNvSW02xCjLZI&index=11

 

728x90

'Study > Dart' 카테고리의 다른 글

[Dart] 클래스  (0) 2021.06.04
[Dart] final 과 const 차이  (0) 2021.06.04
[Dart] 익명함수와 화살표 함수  (0) 2021.06.04
[Dart] 메서드(함수)  (0) 2021.06.03
[Dart] 기본자료형  (0) 2021.06.03

익명함수와 화살표 함수

익명함수

dart는 리턴타입 정의 안해도 됨

dart는 메서드가 1급 객체이기 때문에 Function 타입 변수에 저장할 수 있음

Function 타입 뿐만 아니라 var, dynamic 에도 가능

변수이기 때문에 세미콜론으로 닫아줘야함

Function greet = bye() {
    print("bye");
};

위에서 Function 변수의 이름 greet으로 메서드를 찾아갈 것이기 때문에 bye라는 함수 명이 필요가 없음

Function greet = () {
    print("bye");
};

( ){ ... }; 부분이 익명 함수

화살표함수

함수가 가지고 있는 내부 스택(코드블럭 == 중괄호{ } 부분) 한줄일때 화살표 함수 사용

Function add = () {
    return 1+1;
}

int add() => 1+1; // return 키워드 생략 가능

정리

일반 메서드

int sum(){
    return 10;
}

익명함수를 저장하는 변수

  • 일반 메서드를 익명 함수로 변경해서 변수에 저장
  • 변수의 타입에 함수를 저장할 것이라면 Function(Type), var(Type), dynamic(Type)
Function sum2 = () {
    return 10;
}

화살표함수

  • 일반 메서드를 생성할때 한줄 밖에 안된다면 그냥 { }와 return을 생략하고 => 화살표 사용
int sum3() => 10;

화살표 함수를 저장하는 변수

Function sum4 = () => 10;

참고

https://www.youtube.com/watch?v=S170Po5mino&list=PL93mKxaRDidGEaUXprXqhNvSW02xCjLZI&index=9

 

728x90

'Study > Dart' 카테고리의 다른 글

[Dart] 클래스  (0) 2021.06.04
[Dart] final 과 const 차이  (0) 2021.06.04
[Dart] 반복문과 깊은 복사  (0) 2021.06.04
[Dart] 메서드(함수)  (0) 2021.06.03
[Dart] 기본자료형  (0) 2021.06.03
// 함수의 이름을 메모리에 저장
// dart는 return type을 정하지 않아도 됨
add(){
	print("더하기 함수입니다.")
}
// var 생략 가능
add2(var n1,n2){
	print(n1 + n2);
}

void main(){
	// 저장된 함수 호출
	add();
    add2(3, 5);
}

자료형을 알고 있을땐 선언하는 것을 권장

dart는 오버로딩이 되지 않음

기본값 할당 가능

{ 매개변수} 로 선택적으로 사용 가능

return의 자료형을 모를땐 dynamic 사용

// 기본값 할당 가능
// { } 선택적으로 매개변수 사용 가능
void add({int n1 = 1, var n2 = 1}) {
	print(n1 + n2);
}

void main(){
	add(n1:10);
}
함수를 변수에 저장 가능 Function 타입 사용
// 함수가 1급 객체이기 때문에 전달 가능
Function add = ({int n1 = 1, var n2 = 1}) {
	return n1 + n2;
}

void hello(Function t) {
	t();
}

void main() {
	hello(add);
}

var 과 dynamic 의 차이

var 는 실행 시에 타입이 고정

main(){	
    var num = 10;
	num = '안녕'; // 오류 발생
}

dynamic은 실행 시에 타입이 고정되지 않음

main(){
    dynamic sum = 20;
    sum = '안녕';
}

조건문

bool isRunning = true; // false

String name;

void main(){
	// if 조건문
    if (isRunning){
    	print("참");
    } else {
    	print("거짓");
    }
    
    // 삼항 연산자 (변수 = 조건 ? 데이터1 : 데이터2 )
    String s = isRunning ? "참" : "거짓";
    
    print("결과 ${s}");
    
    // 엘비스(Elvis) 연산자 null 값 확인
    String data = name; // data = null
    // data가 null일때 data = 홍길동
    String data = name ?? '홍길동';
    
}
728x90

'Study > Dart' 카테고리의 다른 글

[Dart] 클래스  (0) 2021.06.04
[Dart] final 과 const 차이  (0) 2021.06.04
[Dart] 반복문과 깊은 복사  (0) 2021.06.04
[Dart] 익명함수와 화살표 함수  (0) 2021.06.04
[Dart] 기본자료형  (0) 2021.06.03

+ Recent posts