본문 바로가기

Dart

[Dart] 클래스 / 인스턴스

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);
}

 

person1Person을 참조하고 있고 person2person1을 지정해줬다. 그 결과 person1person2는 동일한 Person을 참조하고 있기때문에 person2.name 의 값을 변경했지만 person1.name의 값도 바뀌게 되는 것이다.

그림으로 표현한 참조

 

'Dart' 카테고리의 다른 글

[Dart] 변수 / 조건문 / 반복문 / final, const / null safety  (0) 2023.05.22