Menu
Coddy logo textTech

인스턴스 vs 정적 멤버

Coddy Dart 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 110개 중 17번째.

Dart 클래스에서 멤버(변수 및 메서드)는 개별 객체 또는 클래스 자체에 속할 수 있습니다. 이러한 구분을 이해하는 것은 코드를 효과적으로 구성하는 데 필수적입니다.

인스턴스 멤버는 여러분이 생성하는 각 객체에 속합니다. 모든 객체는 인스턴스 변수의 자체 복사본을 가지며, 인스턴스 메서드는 해당 특정 객체의 데이터에서 작동합니다:

class Dog {
  String name;  // 인스턴스 변수
  
  Dog(this.name);
  
  void bark() {  // 인스턴스 메서드
    print('$name says woof!');
  }
}

Dog dog1 = Dog('Buddy');
Dog dog2 = Dog('Max');

dog1.bark();  // Buddy says woof!
dog2.bark();  // Max says woof!

Dog 객체는 자신만의 name을 가집니다. 한 강아지의 이름을 변경해도 다른 강아지에게는 영향을 미치지 않습니다.

정적 멤버(Static members)는 특정 객체가 아닌 클래스 자체에 속합니다. 이들은 모든 인스턴스 간에 공유되며 클래스 이름을 사용하여 접근합니다:

class Dog {
  String name;
  static int totalDogs = 0;  // 정적 변수
  
  Dog(this.name) {
    totalDogs++;
  }
}

Dog dog1 = Dog('Buddy');
Dog dog2 = Dog('Max');

print(Dog.totalDogs);  // 2

totalDogs 변수는 공유됩니다. Dog 객체가 얼마나 많이 존재하든 상관없이 오직 하나의 복사본만 존재합니다. 인스턴스가 아닌 클래스 이름인 Dog.totalDogs를 통해 접근합니다.

challenge icon

챌린지

쉬움

개별 전시관 방문 횟수와 박물관 전체 통계를 모두 추적하는 박물관 방문자 카운터 시스템을 구축해 보겠습니다.

코드를 두 개의 파일로 구성합니다:

  • exhibit.dart: 박물관 전시관을 나타내는 Exhibit 클래스를 정의합니다. 각 전시관은 다음을 포함해야 합니다:
    • 전시관 이름을 위한 인스턴스 변수 name (String)
    • 해당 특정 전시관을 방문한 인원수를 추적하기 위해 0으로 시작하는 인스턴스 변수 visitorCount (int)
    • 모든 전시관의 총 방문 횟수를 추적하기 위해 0으로 시작하는 정적 변수 totalVisitors (int)
    • 전시관 이름을 매개변수로 받는 생성자
    • 전시관의 visitorCount와 클래스의 totalVisitors를 모두 증가시키는 recordVisit() 메서드
    • 전시관 정보를 출력하는 displayStats() 메서드
  • main.dart: 전시관 클래스를 가져와서 두 개의 전시관을 생성합니다:
    • 'Dinosaur Bones' 전시관
    • 'Ancient Egypt' 전시관
    Dinosaur Bones 전시관에 3번의 방문을 기록한 다음, Ancient Egypt 전시관에 2번의 방문을 기록합니다. 모든 방문 기록이 끝나면, 생성된 순서대로 각 전시관의 displayStats()를 호출한 다음, 모든 전시관의 총 방문자 수를 출력합니다.

displayStats() 메서드는 반드시 다음 형식으로 출력해야 합니다:

[name]: [visitorCount] visitors

총 방문자 수 행은 다음과 같이 출력합니다:

Total museum visitors: [totalVisitors]

정적 변수는 클래스 이름인 Exhibit.totalVisitors를 사용하여 액세스합니다.

예상 출력 결과:

Dinosaur Bones: 3 visitors
Ancient Egypt: 2 visitors
Total museum visitors: 5

치트 시트

Dart의 클래스 멤버는 인스턴스 멤버(개별 객체에 속함) 또는 정적 멤버(클래스 자체에 속함)가 될 수 있습니다.

인스턴스 멤버는 각 객체마다 고유합니다. 모든 객체는 자신만의 인스턴스 변수 복사본을 가집니다:

class Dog {
  String name;  // 인스턴스 변수
  
  Dog(this.name);
  
  void bark() {  // 인스턴스 메서드
    print('$name says woof!');
  }
}

정적 멤버는 모든 인스턴스 간에 공유되며 static 키워드와 함께 클래스 이름을 사용하여 액세스합니다:

class Dog {
  String name;
  static int totalDogs = 0;  // 정적 변수
  
  Dog(this.name) {
    totalDogs++;
  }
}

// 클래스 이름을 통해 정적 멤버에 액세스
print(Dog.totalDogs);  // 2

정적 변수는 생성된 객체의 수에 관계없이 단일 공유 값을 유지합니다.

직접 해보기

import 'exhibit.dart';

void main() {
  // TODO: 'Dinosaur Bones' 전시회 생성
  
  // TODO: 'Ancient Egypt' 전시회 생성
  
  // TODO: Dinosaur Bones 전시회에 3회 방문 기록
  
  // TODO: Ancient Egypt 전시회에 2회 방문 기록
  
  // TODO: 각 전시회에 대해 순서대로 displayStats() 호출
  
  // TODO: Exhibit.totalVisitors를 사용하여 총 박물관 방문자 수 출력
  // Format: Total museum visitors: [totalVisitors]
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

객체 지향 프로그래밍의 모든 레슨