플러터 앱 개발

Chapter 10. 객체 지향 프로그래밍과 Dart B - 클래스와 메서드

yuna 2026. 1. 8. 18:53

안녕하세요!

 

저번에 이어 클래스 두 번째 시간이 돌아왔습니다~~

워후~~~~ 쏴리 질러~~~!!!~~!~!!!

 

이 게시글도 언젠간 많은 분들이 보셨으면 하는 마음에

크게 소리 한 번 질러봤습니다..! ㅎㅎ

 

 

저번 시간에 클래스는 속성과 메서드로 구성되어 있다고 했죠?

지난 시간에는 속성에 대해서 배웠으니,

오늘은 메서드에 대해서 이야기 해보려고 합니다!

 

클래스에서는 속성과 행동을 정의하는 곳이라고 했으니,

메서드가 어떤 역할을 하는 친구인지 어느정도 감이 오시나요??!!!

 

맞아요,, 행동(동작)을 정의하는 함수입니다!

그럼 자세히 한번 들여다 봅시다!!

 

레쑤고

윙꾸

 


 

메서드

  • 객체의 동작을 정의하는 함수 -> 함수는 혼자 존재, 메서드는 객체에 소속되어 있으므로 '함수'와 구분해서 부름!
  • 속성을 변경하거나 객체를 가지고 특정 작업을 수행

 

종류

1. 인스턴스 메서드: 객체에 소속된 메서드

class Person {
  String name;

  Person(this.name); //생성자

  void sayHello() { //인스턴스 메서드
    print("안녕, 나는 $name 이야");
  }
}

 

  • 특징
    • this를 통해 접근 가능
    • 클래스의 모든 곳에서 접근 가능
class Person {
  String name = '유남이';
  int age = 27;
  
  void printName() {
    print(name);
  }
  
  void printNameAgain() {
    printName();
  }
}

 

 

2. 정적 메서드: 객체가 아니라 클래스 자체에 소속된 메서드

-> 이 행동은 어떤 특정 객체의 상태와 상관없을 때, 객체를 만들 필요 없이 클래스에 소속되게 사용

class Counter {
  static int count = 0;

  static void increase() {
    count++;
  }
}

 

 

  • 특징
    • 클래스 이름을 통해 호출(클래스에 소속되어 있기 때문)
class Counter {
  static int count = 0;

  static void increase() {
    count++;
  }
}

void main() {
  Counter.increase();
  Counter.increase();

  print(Counter.count); // 2
}

 

  • 객체를 통해 호출 불가능
  • this를 통해 호출 불가능
  • 코드 블록에서 인스턴스 변수 사용 불가능
  • 인스턴스 메서드의 코드 블록에서 정적 변수는 사용 가능!
  • 객체마다 개별적으로 동작하지 않고, 모두 동일하게 동작!

 

 

속성과 메서드는 클래스의 공식 멤버인데요!

여기서 또 하나의 생성자라는 친구가 등장합니다...!

 


생성자

: 객체를 생성하고, 초기화하기 위해 사용하는 특수한 메서드

 

특징

  • 클래스와 이름이 같다.
  • 반환값이 없으므로 void 타입이다.
  • 클래스를 통해 객체가 생성될 때 자동으로 호출
  • 생성할 수 있는 객체의 수에는 제한이 없다.
  • 생성한 객체들은 서로 같지 않은 독립된 개체이다.

사용 이유: 객체를 정상적인 상태로 태어나게 하기 위해

  • 하나의 클래스로 여러 객체를 생성할 수 있기 때문에
    공통된 속성과 동작을 갖는 코드를 여러 번 작성하지 않아도 돼서 재사용성 높은 코드를 만들 수 있음

 

1. 기본 생성자

: 매개 변수를 갖지 않는 생성자

 

형태

[클래스 이름]( );

class Car {
  Car();
}

 

특징

  • 자동으로 정의되기 때문에 클래스에 따로 명시하지 않아도 됨
  • 인스턴스 변수들이 모두 초기화되어 있는 상태여야 함
class Car {
 String name = '';
 List<String> models = [];
  
  Car();
}

 

 

2. 매개변수 생성자

: 매개 변수를 갖는 생성자

-> 매개변수를 통해 외부에서 인스턴스 변수들의 초기값을 설정

 

형태(완전 중요!)

 

  • [클래스 이름](this.변수);
class Car {
 String name;
 List<String> models;
  
  Car(this.name, this.models); //name과 models 값을 받아와서 인스턴스 변수로 대입
}
  • [클래스 이름]([타입] [매개변수 이름]) : this.변수;
class Car {
  String name;
  List<String> models;

  Car(String name, List<String> models)
      : this.name = name,
        this.models = models;
}
  • [클래스 이름]([타입] [매개변수 이름]) { this.변수; }
class Car {
  String name = '';
  List<String> models = [];

  Car(String name, List<String> models) {
    this.name = name;
    this.models = models;
  }
}

 

 

특징

  • 객체를 생성할 때 매개 변수를 넣지 않으면 오류 발생!💥

 

2. 네임드 생성자: 이름이 붙은 생성자

: 클래스 메서드와 같은 형식으로 호출하는 생성자

 

 

형태

 

  • [클래스 이름].[메서드 이름]([타입] [매개변수 이름]) : this.변수;
class Car {
  String name;
  List<String> models;

  Car.fromList(List values)
      : this.name = values[0],
        this.models = values[1];
}

 

사용

class User {
  String name;
  int age;

  User(this.name, this.age);

  User.guest() {
    name = "Guest";
    age = 0;
  }
}

User u2 = User.guest();

 

특징

  • 클래스에 있는 변수와 타입이 맞지 않는 값을 넣으면 오류

 

제네릭 클래스

형태

  • [클래스 이름]<타입 파라미터>
class Box<T> {
  T value;

  Box(this.value);

  T getValue() {
    return value;
  }
}

 

-> 제네릭 함수와 마찬가지로 특정 타입에 의존하지 않고,

여러 타입에 대해 동일한 코드를 적용할 수 있어서

재사용성 높은 코드를 짤 수 있음!