🎯 1. Cascade Notation (.. 연산자)
✅ 같은 객체에 대해 여러 개의 프로퍼티를 연속으로 변경할 때 사용
✅ ..을 이용하면 객체를 계속 참조하면서 값을 변경할 수 있음
✅ 예제 코드
class Player {
String name;
int age;
String description;
Player({
required this.name,
required this.age,
required this.description,
});
void showInfo() {
print("이름: $name, 나이: $age, 설명: $description");
}
}
void main() {
var jisoung = Player(name: "jisoung", age: 17, description: "Happy code is end coding");
// ❌ 기존 방식 (매번 객체를 호출해야 함)
jisoung.name = "nico";
jisoung.age = 20;
jisoung.description = "Best Project is End Project";
// ✅ `..` 연산자를 사용한 간결한 방식
var sushi = jisoung
..name = "sushi"
..age = 12
..description = "Love sushi!";
sushi.showInfo();
}
✅ 실행 결과
이름: sushi, 나이: 12, 설명: Love sushi!
📌 정리
- .. 연산자를 사용하면 객체를 계속 참조하면서 프로퍼티를 변경 가능
- 코드를 짧고 가독성 좋게 만들 수 있음
🎯 2. Enum (열거형)
✅ 여러 개의 고정된 값들을 관리할 때 사용
✅ 실수를 줄이고, 가독성을 높이는 역할
✅ 예제 코드
enum Team {
red,
blue,
}
class Player {
String name;
int age;
Team team;
Player({
required this.name,
required this.age,
required this.team,
});
void showInfo() {
print("이름: $name, 나이: $age, 팀: $team");
}
}
void main() {
var jisoung = Player(name: "jisoung", age: 17, team: Team.red);
// ✅ `..` 연산자 활용하여 값 변경
var sushi = jisoung
..name = "sushi"
..age = 12
..team = Team.blue;
sushi.showInfo();
}
✅ 실행 결과
이름: sushi, 나이: 12, 팀: Team.blue
📌 정리
- enum을 사용하면 특정 값들만 선택 가능 (Team.red, Team.blue 등)
- 실수를 줄이고, 코드의 가독성 및 안정성을 높여줌
🎯 3. 추상 클래스 (abstract)
✅ 직접 인스턴스화할 수 없고, 반드시 자식 클래스에서 구현해야 하는 메서드를 정의
✅ 일종의 설계도 역할을 함
✅ 예제 코드
// ✅ 추상 클래스
abstract class Human {
void walk(); // 자식 클래스에서 반드시 구현해야 함
}
// ✅ 상속받은 클래스
class Player extends Human {
@override
void walk() {
print("플레이어가 걷고 있습니다!");
}
}
void main() {
var player = Player();
player.walk();
}
✅ 실행 결과
플레이어가 걷고 있습니다!
📌 정리
- abstract 키워드를 사용하면 직접 인스턴스를 생성할 수 없음
- 반드시 자식 클래스에서 구현해야 하는 메서드를 정의 가능
- 공통된 기능을 여러 클래스에서 재사용할 때 유용
🎯 4. 상속 (extends) & 부모 클래스 접근 (super)
✅ extends를 사용하면 부모 클래스의 속성과 메서드를 물려받을 수 있음
✅ super 키워드를 사용하면 부모 클래스의 생성자를 호출할 수 있음
✅ 예제 코드
// ✅ 부모 클래스 (Super Class)
class Human {
final String name;
Human(this.name);
void sayHello() {
print("Hello! 내 이름은 $name");
}
}
// ✅ 자식 클래스 (Sub Class)
class Player extends Human {
String team;
// ✅ 부모 클래스 생성자 호출
Player({required this.team, required String name}) : super(name);
@override
void sayHello() {
super.sayHello(); // 부모 클래스 메서드 호출
print("나는 $team 팀 소속입니다!");
}
}
void main() {
var player = Player(name: "jisoung", team: "red");
player.sayHello();
}
✅ 실행 결과
Hello! 내 이름은 jisoung
나는 red 팀 소속입니다!
📌 정리
- extends를 사용하면 부모 클래스의 기능을 물려받음
- super 키워드를 사용하면 부모 클래스의 생성자 및 메서드 호출 가능
- @override를 사용하면 부모 메서드를 재정의 가능
궁금증 !
여기서 만약 :super(name)을 하지 않으면 어떻게 될까가 궁금했는데 초기화 되지 않아 null이 된다고 한다 ~
🎯 5. Mixin (with)
✅ 다중 상속이 불가능한 Dart에서, 여러 기능을 추가할 때 사용
✅ 생성자가 없는 클래스로, 재사용 가능한 기능을 모아놓은 것
✅ 예제 코드
// ✅ Mixin 정의 (생성자 없음!)
mixin Tall {
final double height = 190.0;
void showHeight() {
print("내 키는 $height cm 입니다!");
}
}
// ✅ Mixin을 사용한 클래스
class Human with Tall {
final String name;
Human(this.name);
void sayHello() {
print("안녕하세요! 저는 $name 입니다.");
}
}
void main() {
var person = Human("jisoung");
person.sayHello();
person.showHeight();
}
✅ 실행 결과
복사편집
안녕하세요! 저는 jisoung 입니다.
내 키는 190.0 cm 입니다!
📌 정리
- mixin은 with 키워드를 사용하여 여러 클래스에 기능을 추가 가능
- 생성자가 없으며, 프로퍼티나 메서드를 제공하는 역할
- 다중 상속이 안 되는 Dart에서 재사용 가능한 코드 작성 시 유용
🎯 최종 요약
Cascade Notation (..) | 같은 객체에 대해 연속적인 작업 수행 | player..name = "sushi"..age = 12 |
Enum (열거형) | 제한된 값 목록을 정의 | enum Team { red, blue } |
추상 클래스 (abstract) | 공통 기능 정의, 직접 인스턴스화 불가 | abstract class Human { void walk(); } |
상속 (extends) | 부모 클래스의 기능을 자식 클래스에서 상속받음 | class Player extends Human {} |
부모 클래스 접근 (super) | 부모 클래스 생성자 및 메서드 호출 | super.sayHello(); |
Mixin (with) | 다중 기능을 추가할 때 사용 | class Human with Tall {} |
반응형
'Flutter > Dart' 카테고리의 다른 글
Dart OOP (Object Oriented Programming) (0) | 2025.03.27 |
---|---|
Dart 핵심 개념 한눈에 정리! (변수, 타입, Nullable, Enum, Loop 등) (1) | 2025.03.26 |
Dart 클래스 classes (1) (0) | 2025.02.03 |
함수 | Function (0) | 2025.02.03 |
데이터 타입 Data Type (0) | 2025.01.31 |