1. 클래스
클래스는 설계도입니다.
예를 들어 우리가 게임을 만든다고 생각해 볼게요.
먼저 캐릭터가 있어야겠죠?
캐릭터는 이름, 체력, 공격력 같은 속성을 가지고 있고, 공격한다, 점프한다 같은 행동도 할 수 있습니다.
그렇다면 이 캐릭터를 사용하는 사람들이 10명이라고 가정했을 때, 10개의 캐릭터마다 속성과 행동을 일일이 정의해야 할까요?
정답은 아닙니다!
캐릭터의 설계도(클래스)를 하나 만들어 놓고, 복사(인스턴스화)해서 사용하면 됩니다.
class Character {
// 속성
String name;
int health;
int attackPower;
// 생성자 (Character 객체를 만들 때 필요한 것들)
Character(this.name, this.health, this.attackPower);
// 행동 (메서드)
void attack() {
print('$name이(가) 공격했습니다! 공격력: $attackPower');
}
void jump() {
print('$name이(가) 점프했습니다!');
}
}
void main() {
// 캐릭터 생성 (클래스의 인스턴스화)
Character alice = Character('Alice', 100, 20);
Character bob = Character('Bob', 120, 10);
// 캐릭터 정보 출력
print('${alice.name}의 체력 : ${alice.health}'); // Alice의 체력 : 100
print('${bob.name}의 체력 : ${bob.health}'); // Bob의 체력 : 120
// 캐릭터 행동
alice.attack(); // Alice이(가) 공격했습니다! 공격력: 20
bob.jump(); // Bob이(가) 점프했습니다!
}
Character라는 설계도(클래스)를 한 번 만들어 놓으면 사용자가 증가해도 캐릭터의 속성과 행동을 따로 정의하지 않아도 돼요!
그저 만들어놓은 설계도를 가지고 사용자에 맞는 캐릭터를 만들면 되거든요.
여기서 클래스(설계도)를 가지고 만들어진 캐릭터를 객체라고 합니다.
그러니까 클래스를 기반으로 생성된 실제 데이터예요.
여기서는 alice라는 객체와 bob이라는 객체를 생성한 거예요.
그리고 클래스를 기반으로 객체를 만드는 과정을 인스턴스화라고 합니다.
아마 이 코드를 제대로 이해하긴 어려울 것이라 생각해요.
자세한 사항은 다음 챕터에서 소개할게요!
2. 클래스의 구성요소
1) 속성 (Property)
class Character {
// 속성
String name;
int health;
int attackPower;
// 생성자 (Character 객체를 만들 때 필요한 것들)
Character(this.name, this.health, this.attackPower);
}
속성은 클래스 안에서 작업을 수행할 때 사용하는 데이터예요.
즉, 클래스가 가지는 데이터(변수)입니다.
속성의 종류에는 인스턴스 변수 (Instance Variable), 지역 변수 (Local variable) , 정적 변수 (Static Variable)가 있어요.
먼저 인스턴스 변수(Instance Variable)는 객체에 속해 있는 변수입니다.
this를 통해 접근할 수 있으며, 클래스의 모든 곳에서 접근이 가능합니다.
또한, 객체가 존재하는 동안은 계속 메모리 상에 존재해요.
주의할 점은 동일한 클래스로 생성한 객체들이어도
각 객체들은 값을 공유하지 않고, 개별적인 값을 가져요.
alice와 bob은 같은 Character라는 클래스로 만들었지만 각 속성이 다른 모습을 확인할 수 있습니다.
두 번째로 로컬 변수라고도 불리는 지역 변수(Local variable)는 특정 코드 블록 안에 선언된 변수입니다.
class Character {
// 속성
String name;
int health;
int attackPower;
// 생성자 (Character 객체를 만들 때 필요한 것들)
Character(this.name, this.health, this.attackPower);
// 행동 (메서드)
void attack() {
print('$name이(가) 공격했습니다! 공격력: $attackPower');
}
void criticalAttack() {
var critical = attackPower * 2;
print('$name이(가) 공격했습니다! 공격력 : $critical');
}
}
criticalattack라는 함수를 추가해 봤습니다.
이 함수 내부에 critical이라는 변수를 선언하고 있는 있는데요.
이 critical 변수는 변수가 선언된 코드 블록 안에서만 사용할 수 있으며,
변수가 선언된 코드 블록의 실행이 끝나면 메모리 상에서 사라져요.
세 번째로 정적 변수(Static Variable)는 클래스 변수라고도 불러요.
이는 객체에 종속되지 않고, 클래스 자체에 속하는 변수예요.
정적 변수를 만들 때는 앞에 static을 붙입니다.
class Character {
// 속성
String name;
int health;
int attackPower;
// 정적 변수 (게임 내 캐릭터 수를 세는 변수)
static int totalCharacters = 0;
// 생성자 (Character 객체를 만들 때 필요한 것들)
Character(this.name, this.health, this.attackPower) {
totalCharacters++;
}
// 행동 (메서드)
void attack() {
print('$name이(가) 공격했습니다! 공격력: $attackPower');
}
void criticalAttack() {
var critical = attackPower * 2;
print('$name이(가) 공격했습니다! 공격력 : $critical');
}
void jump() {
print('$name이(가) 점프했습니다!');
}
}
void main() {
print(Character.totalCharacters);
}
totalCharacters라는 정적 변수를 추가하고, Character 객체가 생성될 때 totalcharacters의 값을 1씩 증가했어요.
클래스 이름을 통해 접근할 수 있지만 객체나 this를 통해 접근할 수는 없어요.
클래스에 속하는 변수이기 때문이죠.
또 같은 클래스로 만들어진 객체들은 개별적인 값을 갖지 않고, 모든 객체가 서로 값을 공유한다는 특징이 있습니다.
2) 메서드 (Method)
다음으로 알아볼 것은 메서드입니다.
메서드는 클래스 내부에 정의된 함수로,
객체가 수행할 행동을 정의하는 역할을 합니다.
그런데 함수와 메서드는 같은 용어일까요?
엄밀히 말하면, 완전히 같지는 않습니다.
둘 다 동작을 정의한다는 점에서는 같지만,
메서드는 클래스에 의존하고, 함수는 클래스에 의존하지 않는다는 차이가 있어요.
이러한 메서드에도 종류가 있는데요.
인스턴스 메서드(Instance Method), 정적 메서드 (Static Method)가 있습니다.
먼저 인스턴스 메서드는 객체에 속해 있는 메서드로 this를 통해 접근 가능하며, 클래스의 모든 곳에서 접근 가능합니다.
앞서 말했던 인스턴스 변수와 비슷하죠?
class Character {
// 속성
String name;
int health;
int attackPower;
// 정적 변수 (게임 내 캐릭터 수를 세는 변수)
static int totalCharacters = 0;
// 생성자 (Character 객체를 만들 때 필요한 것들)
Character(this.name, this.health, this.attackPower) {
totalCharacters++;
}
// 행동 (메서드)
void attack() {
print('$name이(가) 공격했습니다! 공격력: $attackPower');
}
void criticalAttack() {
var critical = attackPower * 2;
print('$name이(가) 공격했습니다! 공격력 : $critical');
}
void jump() {
print('$name이(가) 점프했습니다!');
}
void jumpAndAttack() {
this.jump();
this.attack();
}
}
void main() {
// 캐릭터 생성 (클래스의 인스턴스화)
Character alice = Character('Alice', 100, 20);
Character bob = Character('Bob', 120, 10);
alice.jumpAndAttack();
}
어떤 메서드가 인스턴스 메서드인지 감이 오시나요?
바로 attack(), criticalAttack(), jump(), jumpAndAttack()입니다.
jumpAndAttack() 내부를 보면 this로 jump와 attack을 호출하는 모습을 볼 수 있습니다.
정적 메서드(Statkc Method)는 클래스 메서드라고도 불리며,
객체에 종속되지 않고, 클래스 자체에 속하는 메서드입니다.
때문에 객체를 생성하지 않고, 클래스 명으로 직접 호출합니다.
또한, this를 통해 호출할 수 없으며, 코드 블록에서 인스턴스 변수를 사용할 수 없어요.
정적 메서드를 만들 때는 앞에 static을 붙입니다.
class Character {
// 속성
String name;
int health;
int attackPower;
// 정적 변수 (게임 내 캐릭터 수를 세는 변수)
static int totalCharacters = 0;
// 생성자 (Character 객체를 만들 때 필요한 것들)
Character(this.name, this.health, this.attackPower) {
totalCharacters++;
}
static void showTotalCharacters() {
print('총 생성된 캐릭터 수: $totalCharacters');
}
// 행동 (메서드)
void attack() {
print('$name이(가) 공격했습니다! 공격력: $attackPower');
}
void criticalAttack() {
var critical = attackPower * 2;
print('$name이(가) 공격했습니다! 공격력 : $critical');
}
void jump() {
print('$name이(가) 점프했습니다!');
}
void jumpAndAttack() {
this.jump();
this.attack();
}
}
void main() {
// 캐릭터 생성 (클래스의 인스턴스화)
Character alice = Character('Alice', 100, 20);
Character bob = Character('Bob', 120, 10);
Character.showTotalCharacters(); // 총 생성된 캐릭터 수: 2
}
이러한 속성과 메서드는 클래스 안에 있는 요소이기 때문에 클래스의 멤버 (Member)라고 부르기도 합니다.
3) 생성자 (Constructor)
생성자는 객체를 생성하고, 초기화하기 위해 사용하는 특수한 메서드입니다.
즉, 객체가 처음 생성될 때 필요한 초기값을 설정하는 역할을 합니다.
이 생성자에도 종류가 있는데요.
기본 생성자 (Default Constructor)와 매개변수 생성자 (Parameterized Constructor), 네임드 생성자 (Named Constructor)가 있습니다.
기본 생성자 (Default Constructor)는 매개변수를 갖지 않는 생성자입니다.
Dart에서는 생성자를 선언하지 않으면 기본 생성자가 자동으로 제공됩니다.
class Character {
// 속성
String name = 'Unknown';
int health = 100;
int attackPower = 10;
// 기본 생성자 (명시하지 않아도 자동 제공됨)
}
void main() {
// 기본 생성자 사용
Character c = Character();
print('${c.name} - 체력: ${c.health}, 공격력: ${c.attackPower}');
// Unknown - 체력: 100, 공격력: 10
}
두 번째는 매개변수를 가지는 생성자(Parameterized Constructor)입니다.
매개변수를 갖는 생성자로
기본 생성자 대신 직접 생성자를 정의할 수도 있습니다.
이 매개변수를 통해 외부에서 인스턴스 변수들의 초기값을 설정할 수 있습니다.
대표적인 예시는 앞의 코드인데요.
alice와 bob이라는 이름을 가진 Character 객체를 생성할 때 name, health, attackPower를 매개변수로 전달하는 모습을 확인할 수 있습니다.
마지막으로는 네임드 생성자(Named Constructor)입니다.
클래스 메서드와 같은 형식으로 호출하는 생성자로,
클래스에 여러 개의 생성자를 만들고 싶을 때 사용합니다.
class Character {
// 속성
String name;
int health;
int attackPower;
// 정적 변수 (게임 내 캐릭터 수를 세는 변수)
static int totalCharacters = 0;
// 기본 생성자
Character(this.name, this.health, this.attackPower) {
totalCharacters++;
}
// 네임드 생성자 : 체력을 기본값 100으로 설정하는 생성자
Character.withDefaultHealth(this.name, this.attackPower) : health = 100 {
totalCharacters++;
}
// 정적 메서드 (총 캐릭터 수 출력)
static void showTotalCharacters() {
print('총 생성된 캐릭터 수: $totalCharacters');
}
void attack() {
print('$name이(가) 공격했습니다! 공격력: $attackPower');
}
void criticalAttack() {
var critical = attackPower * 2;
print('$name이(가) 크리티컬 공격을 했습니다! 공격력 : $critical');
}
void jump() {
print('$name이(가) 점프했습니다!');
}
void jumpAndAttack() {
this.jump();
this.attack();
}
}
void main() {
// 기본 생성자 사용
Character alice = Character('Alice', 100, 20);
// 네임드 생성자 사용
Character bob = Character.withDefaultHealth('Bob', 30);
alice.attack(); // Alice이(가) 공격했습니다! 공격력: 20
bob.attack(); // Bob이(가) 공격했습니다! 공격력: 30
Character.showTotalCharacters(); // 총 생성된 캐릭터 수: 2
}
'Dart' 카테고리의 다른 글
[Dart] 예외 처리 (Error Handling) (0) | 2025.03.17 |
---|---|
[Dart] 상속 (Inheritance) (0) | 2025.03.14 |
[Dart] 함수형 프로그래밍 (Functional Programming) (0) | 2025.03.12 |
[Dart] 제네릭 (Generics) - 제네릭 함수 & 클래스 (0) | 2025.03.12 |
[Dart] 함수 (Functions) (0) | 2025.03.11 |
1. 클래스
클래스는 설계도입니다.
예를 들어 우리가 게임을 만든다고 생각해 볼게요.
먼저 캐릭터가 있어야겠죠?
캐릭터는 이름, 체력, 공격력 같은 속성을 가지고 있고, 공격한다, 점프한다 같은 행동도 할 수 있습니다.
그렇다면 이 캐릭터를 사용하는 사람들이 10명이라고 가정했을 때, 10개의 캐릭터마다 속성과 행동을 일일이 정의해야 할까요?
정답은 아닙니다!
캐릭터의 설계도(클래스)를 하나 만들어 놓고, 복사(인스턴스화)해서 사용하면 됩니다.
class Character {
// 속성
String name;
int health;
int attackPower;
// 생성자 (Character 객체를 만들 때 필요한 것들)
Character(this.name, this.health, this.attackPower);
// 행동 (메서드)
void attack() {
print('$name이(가) 공격했습니다! 공격력: $attackPower');
}
void jump() {
print('$name이(가) 점프했습니다!');
}
}
void main() {
// 캐릭터 생성 (클래스의 인스턴스화)
Character alice = Character('Alice', 100, 20);
Character bob = Character('Bob', 120, 10);
// 캐릭터 정보 출력
print('${alice.name}의 체력 : ${alice.health}'); // Alice의 체력 : 100
print('${bob.name}의 체력 : ${bob.health}'); // Bob의 체력 : 120
// 캐릭터 행동
alice.attack(); // Alice이(가) 공격했습니다! 공격력: 20
bob.jump(); // Bob이(가) 점프했습니다!
}
Character라는 설계도(클래스)를 한 번 만들어 놓으면 사용자가 증가해도 캐릭터의 속성과 행동을 따로 정의하지 않아도 돼요!
그저 만들어놓은 설계도를 가지고 사용자에 맞는 캐릭터를 만들면 되거든요.
여기서 클래스(설계도)를 가지고 만들어진 캐릭터를 객체라고 합니다.
그러니까 클래스를 기반으로 생성된 실제 데이터예요.
여기서는 alice라는 객체와 bob이라는 객체를 생성한 거예요.
그리고 클래스를 기반으로 객체를 만드는 과정을 인스턴스화라고 합니다.
아마 이 코드를 제대로 이해하긴 어려울 것이라 생각해요.
자세한 사항은 다음 챕터에서 소개할게요!
2. 클래스의 구성요소
1) 속성 (Property)
class Character {
// 속성
String name;
int health;
int attackPower;
// 생성자 (Character 객체를 만들 때 필요한 것들)
Character(this.name, this.health, this.attackPower);
}
속성은 클래스 안에서 작업을 수행할 때 사용하는 데이터예요.
즉, 클래스가 가지는 데이터(변수)입니다.
속성의 종류에는 인스턴스 변수 (Instance Variable), 지역 변수 (Local variable) , 정적 변수 (Static Variable)가 있어요.
먼저 인스턴스 변수(Instance Variable)는 객체에 속해 있는 변수입니다.
this를 통해 접근할 수 있으며, 클래스의 모든 곳에서 접근이 가능합니다.
또한, 객체가 존재하는 동안은 계속 메모리 상에 존재해요.
주의할 점은 동일한 클래스로 생성한 객체들이어도
각 객체들은 값을 공유하지 않고, 개별적인 값을 가져요.
alice와 bob은 같은 Character라는 클래스로 만들었지만 각 속성이 다른 모습을 확인할 수 있습니다.
두 번째로 로컬 변수라고도 불리는 지역 변수(Local variable)는 특정 코드 블록 안에 선언된 변수입니다.
class Character {
// 속성
String name;
int health;
int attackPower;
// 생성자 (Character 객체를 만들 때 필요한 것들)
Character(this.name, this.health, this.attackPower);
// 행동 (메서드)
void attack() {
print('$name이(가) 공격했습니다! 공격력: $attackPower');
}
void criticalAttack() {
var critical = attackPower * 2;
print('$name이(가) 공격했습니다! 공격력 : $critical');
}
}
criticalattack라는 함수를 추가해 봤습니다.
이 함수 내부에 critical이라는 변수를 선언하고 있는 있는데요.
이 critical 변수는 변수가 선언된 코드 블록 안에서만 사용할 수 있으며,
변수가 선언된 코드 블록의 실행이 끝나면 메모리 상에서 사라져요.
세 번째로 정적 변수(Static Variable)는 클래스 변수라고도 불러요.
이는 객체에 종속되지 않고, 클래스 자체에 속하는 변수예요.
정적 변수를 만들 때는 앞에 static을 붙입니다.
class Character {
// 속성
String name;
int health;
int attackPower;
// 정적 변수 (게임 내 캐릭터 수를 세는 변수)
static int totalCharacters = 0;
// 생성자 (Character 객체를 만들 때 필요한 것들)
Character(this.name, this.health, this.attackPower) {
totalCharacters++;
}
// 행동 (메서드)
void attack() {
print('$name이(가) 공격했습니다! 공격력: $attackPower');
}
void criticalAttack() {
var critical = attackPower * 2;
print('$name이(가) 공격했습니다! 공격력 : $critical');
}
void jump() {
print('$name이(가) 점프했습니다!');
}
}
void main() {
print(Character.totalCharacters);
}
totalCharacters라는 정적 변수를 추가하고, Character 객체가 생성될 때 totalcharacters의 값을 1씩 증가했어요.
클래스 이름을 통해 접근할 수 있지만 객체나 this를 통해 접근할 수는 없어요.
클래스에 속하는 변수이기 때문이죠.
또 같은 클래스로 만들어진 객체들은 개별적인 값을 갖지 않고, 모든 객체가 서로 값을 공유한다는 특징이 있습니다.
2) 메서드 (Method)
다음으로 알아볼 것은 메서드입니다.
메서드는 클래스 내부에 정의된 함수로,
객체가 수행할 행동을 정의하는 역할을 합니다.
그런데 함수와 메서드는 같은 용어일까요?
엄밀히 말하면, 완전히 같지는 않습니다.
둘 다 동작을 정의한다는 점에서는 같지만,
메서드는 클래스에 의존하고, 함수는 클래스에 의존하지 않는다는 차이가 있어요.
이러한 메서드에도 종류가 있는데요.
인스턴스 메서드(Instance Method), 정적 메서드 (Static Method)가 있습니다.
먼저 인스턴스 메서드는 객체에 속해 있는 메서드로 this를 통해 접근 가능하며, 클래스의 모든 곳에서 접근 가능합니다.
앞서 말했던 인스턴스 변수와 비슷하죠?
class Character {
// 속성
String name;
int health;
int attackPower;
// 정적 변수 (게임 내 캐릭터 수를 세는 변수)
static int totalCharacters = 0;
// 생성자 (Character 객체를 만들 때 필요한 것들)
Character(this.name, this.health, this.attackPower) {
totalCharacters++;
}
// 행동 (메서드)
void attack() {
print('$name이(가) 공격했습니다! 공격력: $attackPower');
}
void criticalAttack() {
var critical = attackPower * 2;
print('$name이(가) 공격했습니다! 공격력 : $critical');
}
void jump() {
print('$name이(가) 점프했습니다!');
}
void jumpAndAttack() {
this.jump();
this.attack();
}
}
void main() {
// 캐릭터 생성 (클래스의 인스턴스화)
Character alice = Character('Alice', 100, 20);
Character bob = Character('Bob', 120, 10);
alice.jumpAndAttack();
}
어떤 메서드가 인스턴스 메서드인지 감이 오시나요?
바로 attack(), criticalAttack(), jump(), jumpAndAttack()입니다.
jumpAndAttack() 내부를 보면 this로 jump와 attack을 호출하는 모습을 볼 수 있습니다.
정적 메서드(Statkc Method)는 클래스 메서드라고도 불리며,
객체에 종속되지 않고, 클래스 자체에 속하는 메서드입니다.
때문에 객체를 생성하지 않고, 클래스 명으로 직접 호출합니다.
또한, this를 통해 호출할 수 없으며, 코드 블록에서 인스턴스 변수를 사용할 수 없어요.
정적 메서드를 만들 때는 앞에 static을 붙입니다.
class Character {
// 속성
String name;
int health;
int attackPower;
// 정적 변수 (게임 내 캐릭터 수를 세는 변수)
static int totalCharacters = 0;
// 생성자 (Character 객체를 만들 때 필요한 것들)
Character(this.name, this.health, this.attackPower) {
totalCharacters++;
}
static void showTotalCharacters() {
print('총 생성된 캐릭터 수: $totalCharacters');
}
// 행동 (메서드)
void attack() {
print('$name이(가) 공격했습니다! 공격력: $attackPower');
}
void criticalAttack() {
var critical = attackPower * 2;
print('$name이(가) 공격했습니다! 공격력 : $critical');
}
void jump() {
print('$name이(가) 점프했습니다!');
}
void jumpAndAttack() {
this.jump();
this.attack();
}
}
void main() {
// 캐릭터 생성 (클래스의 인스턴스화)
Character alice = Character('Alice', 100, 20);
Character bob = Character('Bob', 120, 10);
Character.showTotalCharacters(); // 총 생성된 캐릭터 수: 2
}
이러한 속성과 메서드는 클래스 안에 있는 요소이기 때문에 클래스의 멤버 (Member)라고 부르기도 합니다.
3) 생성자 (Constructor)
생성자는 객체를 생성하고, 초기화하기 위해 사용하는 특수한 메서드입니다.
즉, 객체가 처음 생성될 때 필요한 초기값을 설정하는 역할을 합니다.
이 생성자에도 종류가 있는데요.
기본 생성자 (Default Constructor)와 매개변수 생성자 (Parameterized Constructor), 네임드 생성자 (Named Constructor)가 있습니다.
기본 생성자 (Default Constructor)는 매개변수를 갖지 않는 생성자입니다.
Dart에서는 생성자를 선언하지 않으면 기본 생성자가 자동으로 제공됩니다.
class Character {
// 속성
String name = 'Unknown';
int health = 100;
int attackPower = 10;
// 기본 생성자 (명시하지 않아도 자동 제공됨)
}
void main() {
// 기본 생성자 사용
Character c = Character();
print('${c.name} - 체력: ${c.health}, 공격력: ${c.attackPower}');
// Unknown - 체력: 100, 공격력: 10
}
두 번째는 매개변수를 가지는 생성자(Parameterized Constructor)입니다.
매개변수를 갖는 생성자로
기본 생성자 대신 직접 생성자를 정의할 수도 있습니다.
이 매개변수를 통해 외부에서 인스턴스 변수들의 초기값을 설정할 수 있습니다.
대표적인 예시는 앞의 코드인데요.
alice와 bob이라는 이름을 가진 Character 객체를 생성할 때 name, health, attackPower를 매개변수로 전달하는 모습을 확인할 수 있습니다.
마지막으로는 네임드 생성자(Named Constructor)입니다.
클래스 메서드와 같은 형식으로 호출하는 생성자로,
클래스에 여러 개의 생성자를 만들고 싶을 때 사용합니다.
class Character {
// 속성
String name;
int health;
int attackPower;
// 정적 변수 (게임 내 캐릭터 수를 세는 변수)
static int totalCharacters = 0;
// 기본 생성자
Character(this.name, this.health, this.attackPower) {
totalCharacters++;
}
// 네임드 생성자 : 체력을 기본값 100으로 설정하는 생성자
Character.withDefaultHealth(this.name, this.attackPower) : health = 100 {
totalCharacters++;
}
// 정적 메서드 (총 캐릭터 수 출력)
static void showTotalCharacters() {
print('총 생성된 캐릭터 수: $totalCharacters');
}
void attack() {
print('$name이(가) 공격했습니다! 공격력: $attackPower');
}
void criticalAttack() {
var critical = attackPower * 2;
print('$name이(가) 크리티컬 공격을 했습니다! 공격력 : $critical');
}
void jump() {
print('$name이(가) 점프했습니다!');
}
void jumpAndAttack() {
this.jump();
this.attack();
}
}
void main() {
// 기본 생성자 사용
Character alice = Character('Alice', 100, 20);
// 네임드 생성자 사용
Character bob = Character.withDefaultHealth('Bob', 30);
alice.attack(); // Alice이(가) 공격했습니다! 공격력: 20
bob.attack(); // Bob이(가) 공격했습니다! 공격력: 30
Character.showTotalCharacters(); // 총 생성된 캐릭터 수: 2
}
'Dart' 카테고리의 다른 글
[Dart] 예외 처리 (Error Handling) (0) | 2025.03.17 |
---|---|
[Dart] 상속 (Inheritance) (0) | 2025.03.14 |
[Dart] 함수형 프로그래밍 (Functional Programming) (0) | 2025.03.12 |
[Dart] 제네릭 (Generics) - 제네릭 함수 & 클래스 (0) | 2025.03.12 |
[Dart] 함수 (Functions) (0) | 2025.03.11 |