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