[dart] dart 기초 (6)
참고: https://dart.dev/overview + https://nomadcoders.co/
✔️ Dart Class
이번에는 가장 중요한 class 코스이다.
class는 dart의 핵심이고, 구현도 많이 할 것이라서 가장 중요한
문법 중 하나라고 생각하면 된다.
다음과 같은 클래스에 property를 선언할 때는
타입을 사용해서 정의한다.
function 내에서는 var를 사용해도 됐지만,
class를 생성할 때는 꼭 타입의 선언이 필요하다.
다음과 같이 선언한 클래스를 사용할 때는
new Player 처럼 사용하지 않고도 바로 Player를 호출하여
Player 인스턴스 하나가 생성된다.
기본으로 설정한 player의 property 값인 test에서
다시 선언된 name의 값인 test2가 출력되는 것을 확인할 수 있다.
앞서 배운 variable의 modifier 또한 적용이 가능하다.
예를 들어서 name 값을 변경하지 못하도록 하고 싶다면,
final 키워드를 추가하면 될 것이다.
final variable, property는 수정할 수 없기 때문에
선언과 동시에 에러가 발생하는 것이다.
또한, 하나의 void형 함수를 선언하게 되면
다음과 같은 name 변수에 this.name을 사용할 수도 있지만,
Class method 내에서의 this는 사용하지 않는 것이 권고된다고 한다.
method 내에서 같은 이름의 변수가 있어서 사용하는 것이 아니라면 말이다.
예를 들면, 함수 내 같은 변수가 있을 때 Player name 변수에 접근하고 싶다면
다음과 같이 {} 괄호로 감싸준 뒤 this.name을 사용하면 된다.
✔️ Dart Class Constructors
Dart의 Class Constructors를 사용할 때,
constructor method의 이름은 class의 이름과 같게하여 사용할 수 있다.
다음과 같이 constructor method를 사용할 수 있는데,
Dart는 값이 없는 것을 싫어하기 때문에 final 키워드를 사용한
name에 대해서 초기화해야된다는 무시무시한 에러를 보여준다.
또한, money에 대한 값도 없기 때문에
late 키워드를 사용해 나중에 받아오겠다라는 내용을 보내주면 된다.
다음과 같이 선언하면 오류가 사라지는 것을 확인할 수 있다.
이처럼 late는 class에서 유용하게 사용할 수 있다.
이렇게 작성한 class를 이용해서 2개의 생성자를 이용해
파라미터를 넘겨주는 것을 확인할 수 있다.
하지만, 이것보다 조금 더 효율적으로 코드를 작성할 수 있는데
late 키워드를 지워주고 간단하게 선언하게 되면
이미 상단에 타입을 선언하였기 때문에
다음과 같은 선언이 가능하고 같은 결과를 출력할 수 있게 된다.
✔️ Dart Named Constructor Parameters
위에서 본 것은 positional parameters(argument) 이기 때문에
순서를 지켜서 class에 파라미터를 넘겨준 것을 확인할 수 있었다.
하지만, class가 거대해지면 순서를 기억하기 어렵기에
이전에 배운 것처럼 named parameters를 넘겨주면 편하게 된다.
기존 Player 생성자에 {} 괄호로 감싸준 뒤,
null을 피하기 위해 required 키워드를 선언하게 된다.
그리고 해당 클래스를 사용하는 변수에 key:value 형태로 작성해주면,
순서와 상관없이 사용할 수 있는 Named Parameters로 사용할 수 있게 된다.
✔️ Dart Named Constructors
Player({
required this.name,
required this.money,
required this.team,
required this.age,
});
위에서 보았던 위 코드들은 Named constructor parameter이였고,
이번에는 Named Constructor에 대해서 알아보도록 하자.
해당 코드는 클래스를 호출할 때마다 기본적으로 호출되는 기본 constructor을
의미하게 되는데, 각각의 변수를 클래스로 보내면 생성자가 해당하는 것들을
class property에 할당하는 방식으로 동작한다.
만약 다른 constructor을 가지고 싶다면 어떻게 해야할까?
constructor 들이 내가 정한 값으로 property를 초기화 시킨
Player를 전달하기 위해서 즉, name과 age만 전달하고 싶다면
다음과 같이 named constructor를 만들어서 Player를 초기화하는
method를 생성할 수 있다.
위에 나온 사진처럼 콜론을 사용하여 필수한 값 name과 age를
전달하고 나머지는 default 값을 전달하게끔
Player 클래스의 초기화가 가능하다.
즉, 콜론을 넣음으로써 Player 객체를 초기화하겠다고 전달하는 것이다.
named parameter을 안쓰고도 가능한데,
positional parameter로 사용하는 것이다.
createRedPlayer는 positional parameter이기 때문에
기본적으로 모든 파라미터가 required 형태로 동작하게 된다.
named parameter는 required 속성이 없기 때문에
해당 키워드를 명시해주어야 한다.
✔️ 배운 내용들 요약
다음과 같이 json 객체처럼 생긴 데이터를
Player Class를 통해서 사용해보게 되면,
다음과 같은 Player Class에서 fromJson이라는 constructor를 생성한 뒤,
Map으로 이루어진 파라미터를 받고 있다.
그리고 콜론을 통해서 property를 초기화하고 있으며,
class 내부 name을 playerJson Map에서 key가 name인 값을 가져와서 넣고
각 money와 team도 동일하게 동작한다.
해당 생성자를 사용할 때에는
다음과 같이 forEach를 돌면서 playerJson이라고 하는 element에
새로운 Player 객체의 fromJson을 호출하게 된다.
그리고 sayHello 함수를 호출하면서 각 이름에 맞는 데이터를
콘솔에 출력해주는 것을 확인할 수 있다.
화이팅 💪