1. 클래스 (Class)
💡 오브젝트를 가상세계 용으로 구체화 한 것 (설계도, 템플릿, 붕어빵 틀)
Person이라는 클래스(붕어빵 틀)를 만들어보자.
- 필드: 클래스 안의 변수를 필드라고 한다. 필드는 String, int, bool 등 다양한 데이터 유형일 수 있으며 보통 camelCase로 작성한다.
- 메서드: 클래스 안에서 정의된 함수를 메서드라 한다. 보통 camelCase로 작성한다.
class Person {
// 필드
String name = '치즈';
int age = 4;
// 메서드
void sayHi() {
print('안녕하세요 제 이름은 $name이고 나이는 $age살 입니다.');
}
}
2. 인스턴스 (Instance)
💡 클래스를 활용해 메모리 상에 만들어 낸 것 (실제 제품, 붕어빵)
Person 클래스를 만들었고, 만들어진 틀에 찍어 나온 내용물을 인스턴스라고 한다. 그럼 인스턴스를 생성해 보자.
void main() {
// 인스턴스 생성
var person1 = Person();
final person2 = new Person(); // new 키워드는 생략 가능하다
person1.sayHi(); // 안녕하세요 제 이름은 치즈이고 나이는 4살 입니다.
person2.sayHi(); // 안녕하세요 제 이름은 치즈이고 나이는 4살 입니다.
}
class Person {
String name = '치즈';
int age = 4;
void sayHi() {
print('안녕하세요 제 이름은 $name이고 나이는 $age살 입니다.');
}
}
❓ person1.sayHi(); 와 person2.sayHi(); 의 출력값이 동일한 이유는 class 작성시 name값과 age값을 지정해줬기 때문이다.
3. 생성자 (Constructor)
💡 인스턴스를 생성하는 방법을 제공하는 메서드
인스턴스에 각각의 값을 넣고 싶으면 생성자를 사용하여 인자로 값을 받을 수 있다.
void main() {
var person1 = Person('치즈', 4);
final person2 = new Person('초코', 5);
person1.sayHi(); // 안녕하세요 제 이름은 치즈이고 나이는 4살 입니다.
person2.sayHi(); // 안녕하세요 제 이름은 초코이고 나이는 5살 입니다.
}
class Person {
String name;
int age;
// 생성자
// 기본형은 Person();이며 괄호안에 파라미터를 추가하면 됨
Person(this.name, this.age);
void sayHi() {
print('안녕하세요 제 이름은 $name이고 나이는 $age살 입니다.');
}
}
⚙️ const 키워드를 사용했을 때 인스턴스 비교
1. const 키워드 사용없이 인스턴스를 생성한 경우
class Person {
final String name;
final int age;
const Person(this.name, this.age);
void sayHi() {
print('안녕하세요. 제이름은 $name이고 나이는 $age살 입니다.');
}
}
void main() {
var person1 = Person('초코', 5);
var person2 = Person('초코', 5);
print(person1 == person2); // false
}
❓ person1 과 person2 에 같은 값을 넣었으나 두 변수를 비교했을 때 false가 나오게 된다. 인스턴스를 생성할 때에는 컴퓨터 메모리 공간에 새로 올라가기 때문이다.
2. const 키워드를 사용하여 인스턴스를 생성한 경우
class Person {
final String name;
final int age;
const Person(this.name, this.age);
void sayHi() {
print('안녕하세요. 제이름은 $name이고 나이는 $age살 입니다.');
}
}
void main() {
const person1 = Person('초코', 5);
const person2 = Person('초코', 5);
print(person1 == person2); // true
}
❓ const로 인스턴스 생성시에는 person1 과 person2 가 같은 값이라는것을 확인할 수 있다.
4. 레퍼런스 타입과 참조
💡 Dart에서 일부 변수는 참조 유형이라는 객체를 저장할 수 있다. 참조 유형에는 클래스에서 생성된 객체가 포함되며 이러한 객체는 힙이라는 컴퓨터 메모리의 영역*(컴퓨터의 번지수 라고 생각하면 됨)*에 저장된다.
예시 코드를 보며 이해해보자.
void main() {
var person1 = Person('치즈');
var person2 = person1;
print(person1.name); // 치즈
person2.name = '초코';
print(person1.name); // 초코
}
class Person {
String name;
Person(this.name);
}
❓ person1은 Person을 참조하고 있고 person2에 person1을 지정해줬다. 그 결과 person1 과 person2는 동일한 Person을 참조하고 있기때문에 person2.name 의 값을 변경했지만 person1.name의 값도 바뀌게 되는 것이다.
'Dart' 카테고리의 다른 글
[Dart] 변수 / 조건문 / 반복문 / final, const / null safety (0) | 2023.05.22 |
---|