[Dart] Class(메모리, 생성자, 인스턴스, 정적 멤버)

김강태·2023년 12월 1일

Heap(힙)

  • 힙은 동적으로 할당된 메모리를 저장하는 곳
  • 객체와 데이터 구조 같은 크기가 동적으로 변하는 데이터는 힙에 할당
  • 힙 메모리는 생략가능한 'new' 키워드나 생성자를 통해 힙에 객체를 할당하며, GC(Garbage Collection)을 통해 더 이상 참조되지 않는 객체들을 정리

Stack(스택)

  • 스택은 지역 변수와 함수 호출 정보를 저장하는 곳
  • 각 함수가 호출될 때마다 핻당 함수의 지역변수와 함께 호출 스택에 새로운 프레임이 추가된다
  • 함수가 실행을 마치면 해당 함수의 프레임이 스택에서 제거
  • 스택은 후입선출 구조를 가지고 있어, 가장 최근에 추가된 프레임이 먼저 제거됨

ex)

void main() {
  int a = 5; // 스택에 정수 변수 a가 할당됨

  // 힙에 객체를 할당
  MyClass myObject = MyClass();
}

class MyClass {
  // MyClass 객체의 속성들이 힙에 할당됨
}

생성자

  • 생성자(Contstructor)는 객체가 생성될 때 호출되는 특별한 메서드로, 주로 객체의 초기화를 담당한다.

기본적인 생성자 형태

class MyClass {
  // 기본 생성자
  MyClass() {
    // 생성자의 내용
  }
}

생성자 예시

Cleric(this.name,this.hp,this.mp);

Named Parameter

Cleric({
    this.name,
    required this.hp,
    required this.mp,
  });
}

(생성자에 {} 를 사용하면 Named Parameter, null을 허용하지 않으면 required를 붙여야함)

안드로이드 스튜디오 플러그인

위와같은 Named Argument Constructor을 자동생성 해주는 안드로이드 스튜디오의 플러그인이 있다.

플러그인 설치 후 control(^) + enter => Named Argument Constructor 선택

필수 파라미터, 옵셔널 파라미터 동시 사용

class Hero {
String name;
int hp;
Sword? sword;

// 필수 파라미터와 옵셔널 파라미터를 동시에 사용할 수 있다
// 필수 parameter와 named(옵셔널) parameter를 동시에 사용할경우 필수 parameter가 앞에 와야됨
// 마지막 파라미터 뒤에 콤마를 찍을 수 없음
Hero(this.name, this.hp, {this.sword});

기본값 지정

Cleric(
    this.name, {
    this.hp = 50,
    this.mp = 10,
  });

(기본값을 지정 할 때는 required를 제거해야함)

인스턴스

  • 인스턴스(instance)는 클래스의 객체를 나타낸다.
  • 클래스는 객체를 만들기 위한 템플릿이며, 이 템플릿을 사용하여 생성된 실제 데이터 구조가 인스턴스이다.
  • 클래스를 사용하여 여러개의 인스턴스를 생성 가능

인스턴스 생성

final cleric1 = Cleric("아서스", hp: 40, mp: 5);

오버로딩

생성자를 다음과 같이 생성 하였을때, 다음과 같은 인스턴스들을 생성 할 수 있다

Cleric(
    this.name, {
    this.hp = Cleric.maxHP,
    this.mp = Cleric.maxMP,
  });

final cleric1 = Cleric("아서스", hp: 40, mp: 5);
final cleric2 = Cleric("아서스", hp: 40);
final cleric3 = Cleric("아서스");
  • JAVA의 오버로딩과 기능은 비슷하지만 훨씬 더 간단하게 작성되었다

정적 멤버(static)

  • 정적 멤버란 클래스의 인스턴스가 아닌 클래스 자체에 속하는 멤버를 나타낸다
  • 해당 멤버는 클래스의 모든 인스턴스에 대해 공유된다
  • 정적 메소드는 그 내부에 정적이지 않은 메소드나 필드를 이용하는 것이 불가능하다
  • static 키워드가 붙어있는 정적 멤버는 인스턴스를 1개도 생성하지 않아도 사용 가능하다

ex)

class Cleric {
static const int maxHP = 50;
}

위와같이 변수 maxHP가 Cleric 클래스 안에 선언되었지만
maxHP는 Cleric의 인스턴스가 아닌 모든 인스턴스가 공유하는 하나의 저장공간을 갖고 있다.
위 예제는 다음과 같이 Top level 변수와도 비슷하다.

const int maxHP = 50;
class Cleric {

}
profile
dart / flutter

0개의 댓글