Dart 생성자와 cascade notation

Byeonggwan Kang·2023년 3월 29일
0

dart, flutter and modes

목록 보기
5/9

Dart의 생성자에 관해 설명한다.

  • Positional Constructor Parameter
  • Named Constructor Parameter
  • Named Constructor

Positional Constructor Parameter

예시로 사람을 표현하는 한 클래스를 만들어 볼 것이다. 등장인물은 내가 좋아하는 떡잎방범대로 하겠다.

class Person {
	final String name;
    int age;
    String region;
    String bestFriend;
    
    void hello() {
    	print('안녕 난 $name. ${this.age}살이고, 베프는 $bestFriend!');
    }
}

Person class이다. 사람 이름은 변하지 않을테니 final을 붙여줬고 이름, 지역, 절친은 바뀔 수 있으니 납뒀다. 그리고 인사하는 함수 hello도 만들었다. (참고로 멤버 변수에 접근할 땐 this를 쓰지 않는 것이 권장된다고 한다.)

그렇다면 이 클래스의 생성자는 어떻게 만들어주면 좋을까?

class Person {
	// 모든 변수 앞에 late 키워드를 추가해주어야함.
	...
    Person(String name, int age, 
    	   String region, String bf) {
           this.name = name;
           this.age = age;
           this.region = region;
           // dart에서는 this 안쓰는 게 dart스럽다고 함
           bestFriend = bf;
    }
}

첫 번째 방식이다. 이와 같이 인자를 받아 this 뭐시깽이로 일일이 대입하는 거 물론 가능은 하지만 굉장히 재미없다. 그리고 멤버 변수들의 null safety error를 방지하기 위해서 변수 이름 앞에 late 키워드를 추가하던가 nullable 변수로 다시 선언하던가 멤버변수의 default 값(초기화)을 정해줘야 한다던가 하는 귀찮음이 발생한다...

물론 dart에서는 생성자를 선언하는 더 awesome한 방식이 존재한다. 다음과 같다.

class Person{
	...
    Person(this.name, this.age,
    	   this.region, this.bestFriend);
}

void main() {
	var person = Person('철수', 5, 'Korea', '짱구');
    person.hello();
}


출력
안녕 난 철수. 5살이고, 베프는 짱구!

이 방식은 보기에도 직관적이고 dart에서 추천하는 방식이라고 하니 자주 쓰면 되겠다.


Named Constructor Parameter

위 처럼 생성자에 인자들을 그냥 순서대로 넘겨주기만 하면 어느 부분이 무엇을 뜻하는 지 알 수 없다. 이를 방지하기 위해 다음과 같은 방법을 사용한다.

class Person {
	...
    Person({required this.name, required this.age,
    		required this.region, required this.bestFriend});
}

void main() {
	var person2 = Person(
    	name: '맹구',
        age: 5,
        region: 'Korea',
        bestFriend: '짱구',
    );
    person2.hello();
}


출력
안녕 난 맹구. 5살이고, 베프는 짱구!

맹구도 정상적으로 만들 수 있다. 인스턴스를 생성할 때 변수 이름과 콜론(:)을 사용하는 것을 주의깊게 보자.
참고로 멤버 변수들은 nullable로 설정하지 않았기 때문에 무조건 모든 인자를 받기 위해서 required 키워드를 추가한 점 잊지 말자.


Named Constructor

Dart에서는 다른 생성자를 다른 이름으로 선언할 수 있다. Person 클래스에서 떡잎방범대를 만드는 createCrayonKeeper 생성자를 만들어보겠다.

class Person {
	...
    Person.createCrayonKeeper(this.name, this.bestFriend)
    	: region = 'Korea',
          age = 5;
}

void main() {
	var person3 = Person.createCrayonKeeper('수지', '짱구');
    person3.hello();
}


출력
안녕 난 수지. 5살이고, 베프는 짱구!

이런 식으로 콜론(:)을 사용해서 간단하게 생성자를 만들 수 있다는 것도 알아두자.


Cascade Notation

만약 철수가 나이를 먹고 절친이 훈이로 바꼈다고 가정하자. 그럼 아래와 같은 코드를 작성할 수 있다.

void main() {
	...
    
    person.age = person.age+1;
    person.bestFriend = '훈이';
    person.hello();
}

이 방법도 나쁘지 않지만 dart에서는 더 보기 편한 syntax를 지원한다.

void main() {
	...
    
    person
    	..age = person.age + 1,
        ..bestFriend = '훈이'
        ..hello();
}


출력
안녕 난 철수. 6살이고, 베프는 훈이!

0개의 댓글