Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- serializable
- parcelable
- DOMContentLoaded
- intent
- C++
- textContent
- html
- Class
- DFS
- javascript
- null-safety
- ActionBar
- Flutter
- 생명주기
- 인텐트
- 안드로이드
- 230503
- querySelector
- 데이터 타입
- 230508
- string
- 함수 인자
- 부가데이터
- Adapter
- ViewPager
- putextra
- 프래그먼트
- 230510
- fragment
- classList
Archives
- Today
- Total
나만의 개발노트
[Dart] Class 1 - Class / Constructor / Named Constructor 본문
1. Class
- class 내부의 property는 타입을 반드시 선언해야 한다.
- 외부에서 객체의 변수를 변경하지 못하게 하려면 final을 붙여준다
- class method안에 동일한 이름의 변수가 있는게 아니면 this 는 쓰지 않는 것 권장
- 객체를 생성할 때, new 사용하지 않아도 됨
class Player{
//외부에서 변경할 수 없게 final
final String name = "mokjak";
final int age = 20;
void sayHello(){
//class method 안에서 this를 쓰지 않는다(권장)
print("Hi my name is $name");
}
}
void main(){
//선언할 때, new를 붙이지 않아도 된다.
var player1 = Player();
print(player1.name); //output : mokjak
player1.sayHello(); //output : Hi my name is mokjak
}
2. Constructors(생성자)
: 객체(object, instance)를 생성할 때, 초기화하는 메서드
- class이름과 동일하게 정의해야 함.
- parameter로 데이터를 전달 받아 설정하려면, late 키워드 필요
class Player{
late final String name;
late int age;
//class이름과 동일한 이름의 constructor(생성자)
Player(String name, int age){
//this(이 객체)의 name에 전달받은 name할당
this.name = name;
this.age = age;
}
}
void main(){
var player1 = Player("mokjak",20);
}
*조금 더 간단하게 표기하기
//기존 코드
class Player{
late final String name;
late int age;
Player(String name,int age){
this.name = name;
this.age = age;
}
}
//더 간편한 코드
class Player{
//late 표기 안해도 됨
final String name;
int age;
//parameter(arguments)의 순서는 유지
//첫번째 파라미터를 this.name에, 두번째 파라미터를 this.age에 할당한다.
Player(this.name,this.age);
}
2. Named Constructor Parameter
: 생성자에 parameter를 전달할 때, 순서 상관 없이 더 가독성 있게 전달하는 방법
*function Parameter방법과 동일
Positional constructor parameter | named constructor parameter | |
특징 | 순서가 맞아야 함 -> 3개 미만의 parameter에서 적합 |
property이름을 명시하고, 순서가 달라도 됨 -> 3개 이상의 parameter를 요구하는 경우 적합 |
사용 | 중괄호 x | { } (중괄호) 필요 |
required | 필요 x | default 설정을 하거나, required 키워드 사용해야 함 |
예시 코드 | Player(String name, int age){ ... }; | Player({required String name, int age = 99}){...}; |
/*positional constructor parameter*/
Player(String name, int age, int xp, String team){
this.name = name;
...
}
//호출 시 순서 필요, 무엇인지 파악 어려움
var player = Player('abc', 12, 0, 'red');
/*named constructor parameter*/
//required 작성해야 함
Player({required String name, required int age, required int xp, required String team}){
...
}
//호출시 속성(property)알 수 있음. 순서 필요x
var player = Player(
name: 'abc',
xp: 0,
age: 12,
team: 'red',
);
3. Named Constructors
: 생성자를 여러개 만드는 방법 (parameter의 종류,개수도 다를 수 있음)
기본 방법 | inital list 사용 | |
요구사항 | 기본 생성자 이외에 name, age만 입력받고 team = 'red', xp = 0으로 초기화 하는 생성자 | |
기본 코드 | Player.createRedPlayer( ... ) ... | |
사용법 | { } 사용 | : 사용 |
특징 | 기본적인 방법. 복잡한 초기화에 적합 | 생성자 본문이 실행되기 전에 초기화하여 속도 빠름. 간단한 초기화에 적합 |
class Player{
late final String name;
late int age, xp;
late String team;
//기본 생성자
Player(...){...};
//Named Constructor1 - 기본
Player.createRedPlayer({required String name, required int age}){
this.name = name;
this.age = age;
this.team = 'red';
this.xp = 0;
}
//Named Constructor2 - :(initial list)사용
Player.createRedPlayer({required String name, required int age}) :
//, 로 연결 후 마지막만 ;
this.name = name,
this.age = age,
this.team = 'red',
this.xp = 0;
//Named Constructor2 - 간소화
Player.createRedPlayer({required this.name, required this.age}) :
this.team = 'red',
this.xp = 0;
}
5. Named Constructor 코딩해보기
미션)
- 구조화 되지 않은 player list를 받아서, Player객체를 만들어 출력하는 코드를 완성해라
class Player {
late final String name;
late String team;
late int xp;
Player({
required this.name,
required this.team,
required this.xp,
});
//여기에 Json으로부터 입력받은 구조화 되지 않은 player를 초기화하는 Named Constructor 구현
Player.fromJson(...)
void printInfo() {
print("Hello, my name is $name and I'm in $team team. xp : $xp");
}
}
void main() {
var apiData = [
{
'name': 'A',
'team': 'red',
'xp': 12,
},
{
'name': 'B',
'team': 'red',
'xp': 15,
},
{
'name': 'C',
'team': 'blue',
'xp': 20,
},
];
apiData.forEach((playerJson){
var player = Player.fromJson(playerJson);
player.printInfo();
});
}
정답)
Player.fromJson(Map<String, dynamic> player)
: name = player['name'],
team = player['team'],
xp = player['xp'];
output)
'[Flutter] > [Dart]' 카테고리의 다른 글
[Dart] class2 - Cascade Notation / Enums (0) | 2024.07.16 |
---|---|
[Dart] Functions (함수) (0) | 2024.07.13 |
[Dart] data type(데이터 타입) (0) | 2024.07.13 |
[Dart] Variables(변수) (1) | 2024.07.12 |