Flutter/Dart 언어

[Dart] 클래스와 인스턴스

공돌이 출신 개발자 2025. 1. 4. 21:57
728x90

클래스와 객체란?


클래스(Class)

클래스는 객체를 정의하는 설계도입니다.

  • 클래스 = 설계도
    예: 자동차의 설계도

객체(Object)

객체는 클래스를 기반으로 생성된 실제 인스턴스를 의미합니다.

  • 객체 = 설계도를 바탕으로 만들어진 실제 자동차
  • 객체는 속성(상태)과 행위(메서드)를 가질 수 있습니다.
    • 속성: 자동차의 색상, 모델, 속도
    • 행위: 가속, 정지

객체 지향 프로그래밍(OOP)

객체 지향 프로그래밍은 객체 간의 관계와 상호작용을 통해 애플리케이션을 설계하고 구현하는 프로그래밍 패러다임입니다.

  • 객체 간의 협력을 중심으로 문제를 해결합니다.
  • OOP의 주요 목적: 복잡한 문제를 더 작은 객체로 나누어 해결하기 쉽고 유지보수 가능한 프로그램을 만드는 것.

클래스 생성
  //Dog d1 = new Dog(); // 인스턴스화 되었다.
  Dog d1 = Dog(); // 인스턴스화 되었다. Dart에서는 new 키워드를 대 부분 생략한다.

  print('강아지 이름 ${d1.name}');
  print('강아지 나이 ${d1.age}');
  print('강아지 색상 ${d1.color}');
  print('강아지 현재 갈증 지수 ${d1.thirsty}');

  d1.thirsty = 50;
  print('강아지 현재 갈증 지수 ${d1.thirsty}');
} //end of main
// 자바 --> .하나의 자바 파일에 public class 를 두개 선언할 수 있나요?

class Dog {
  // 변수의 선언과 동시에 초기화(값을 넣다)
  String name = '토토';
  int age = 5;
  String color = '블랙';
  int thirsty = 100;
}
메소드 생성
void main() {
  //Dog d1 = new Dog(); // 인스턴스화 되었다.
  Dog d1 = Dog(); // 인스턴스화 되었다. Dart에서는 new 키워드를 대 부분 생략한다.

  print('강아지 이름 ${d1.name}');
  print('강아지 나이 ${d1.age}');
  print('강아지 색상 ${d1.color}');
  print('강아지 현재 갈증 지수 ${d1.thirsty}');
  // d1.thirsty = 50;
  d1.drinkWater();
  d1.drinkWater();
  d1.drinkWater();
  d1.drinkWater();
  d1.drinkWater();
  print('강아지 현재 갈증 지수 ${d1.thirsty}');
} //end of main
// 자바 --> .하나의 자바 파일에 public class 를 두개 선언할 수 있나요?

class Dog {
  // 변수의 선언과 동시에 초기화(값을 넣다)
  String name = '토토';
  int age = 5;
  String color = '블랙';
  int thirsty = 100;

  // 2. 물을 마실 때 마다 갈증 지수가 10씩 내려간다.
  void drinkWater() {
    thirsty = thirsty - 10;
  }
}

class Water {
  double liter = 2.0; // 물 2리터

  void drink() {
    // liter = liter - 0.1;
    liter -= 0.1;
  }
}

 

협력하기(상호작용)

 

상호작용: 객체 및 메서드와 효율적으로 상호작용하여 애플리케이션의 동작을 정의할 수 있다.

// 코드의 진입점
void main() {
  Dog d1 = Dog();
  Water w1 = Water();
  Water w2 = Water();
  d1.drinkWater(w2);
  print(w2.liter);
} // end of main

// 자바 ---> .하나의 자바 파일에 public class 를 두개 선언할 수 있나요?

class Dog {
  // 변수에 선언과 동시에 초기화(값을 넣다)
  String name = '토토';
  int age = 5;
  String color = '블랙';
  int thirsty = 100;

  // 2. 물을 마실 때 마다 갈증 지수가 10씩 내려간다.
  void drinkWater(Water water) {
    thirsty = thirsty - 10;
    water.drink();
  }
}

class Water {
  double liter = 2.0; // 물 2리터

  void drink() {
    // liter = liter - 0.1;
    liter -= 0.1;
  }
}

 

생성자 만들기와 생성자 오버로딩은 없다.
void main() {
  // 생성자
  Dog(age: 5, name: '토토', color: '블랙', thirsty: 100);
}
// 선택적 매개변수를 알아 보자.
// 선택적 위치 매개변수 (Optional Positional Parmters)
// 선택적 명명 매개변수 (Optional Named Parmters)

// dart 라는 언어는 기본적으로 null 값을 허용 하지 않는다.
class Dog {
  String name;
  int age;
  String color;
  int thirsty;

  // {} 붙이면 선택적 명명 매개 변수

  Dog(
      {required this.name,
      required this.age,
      required this.color,
      required this.thirsty}); // 생성자 구현 부분 생략 가능
  // Dog(this.name, this.age); 이거 안됨 --> dart에서는 생성자 오버로딩이 없다.
}

class Water {
  double liter = 2.0; // 물 2리터

  void drink() {
    // liter = liter - 0.1;
    liter -= 0.1;
  }
}
선택적 명명 매개변수

 

선택적 명명 매개변수: 함수 호출 시 선택적으로 매개변수를 제공할 수 있으며, {}를 사용해 명명된 매개변수와 기본값을 지정할 수 있다.

void main() {
  // 생성자
  Dog(name: '토토', age: 5);
}
// 선택적 매개변수를 알아 보자.
// 선택적 위치 매개변수 (Optional Positional Parmters)
// 선택적 명명 매개변수 (Optional Named Parmters)

// dart 라는 언어는 기본적으로 null 값을 허용 하지 않는다.
class Dog {
  String name;
  int age;
  // String 옵셔널 타입은 null 값을 허용 시키는 타입이다.
  String? color;
  int? thirsty;

  // {} 붙이면 선택적 명명 매개 변수

  Dog(
      {required this.name,
      required this.age,
      this.color = '블랙',
      this.thirsty = 100}); // 생성자 구현 부분 생략 가능
  // Dog(this.name, this.age); 이거 안됨 --> dart에서는 생성자 오버로딩이 없다.
}

class Water {
  double liter = 2.0; // 물 2리터

  void drink() {
    // liter = liter - 0.1;
    liter -= 0.1;
  }
}
캐드케이스 연산자 (cascade)

 

캐스케이드 연산자 (..): 동일한 객체에서 여러 메서드 호출이나 속성 설정을 체인 형태로 수행할 수 있어 코드가 간결해짐.

// 코드의 진입점
// 캐스케이스 연산자
// ..연산자를 사용하면 동일 객체에서 여러 메서드나 속성을 연속적으로 호출할 수 있는
// 유용한 연산자 이다.
void main() {
  // 오버로딩 보다 더 강력한 선택적 매개 변수가 잇기 때문에 dart 에서는 오버로딩이 없다.
  Person(name: '홍길동');
} // end of main

class Person {
  String name;
  int money = 0;

  Person({required this.name});

  void setName(String newName) {
    this.name = newName;
  }

  void addMoney(int amount) {
    //this.money = this.money = amount;
    this.money += amount;
  }
}