객체지향
1.
클래스
2.
객체
3.
생성자
4.
상속
5.
추상 클래스
6.
믹스인
7.
enum
8.
static
클래스
객체 정의하는 설계도
Dart에서 클래스는 객체의 구조와 행동을 정의하는 청사진입니다. 클래스는 다음과 같은 구성요소를 포함할 수 있습니다:
•
멤버 변수 (속성/필드): 객체의 상태를 저장하는 변수
•
생성자: 객체를 초기화하는 특별한 메서드
•
메서드: 객체가 수행할 수 있는 동작을 정의하는 함수
클래스를 통해 코드를 구조화하고, 재사용 가능한 컴포넌트를 만들 수 있으며, 객체지향 프로그래밍의 핵심 개념인 캡슐화, 상속, 다형성을 구현할 수 있습니다.
// Person 클래스 정의
class Person {
// 멤버 변수 (속성)
String name;
int age;
// 생성자
Person(this.name, this.age);
// 멤버 메서드
void introduceYourself() {
print('Hello, my name is $name and I am $age years old.');
}
}
void main() {
// Person 클래스의 인스턴스 생성
var person1 = Person('Alice', 25);
// 인스턴스의 속성에 접근
print('Name: ${person1.name}, Age: ${person1.age}');
// 인스턴스의 메서드 호출
person1.introduceYourself(); // 출력: Hello, my name is Alice and I am 25 years old.
// 또 다른 인스턴스 생성
var person2 = Person('Bob', 30);
person2.introduceYourself(); // 출력: Hello, my name is Bob and I am 30 years old.
}
Dart
복사
객체
실세계의 속성과 기능을, 프로그램의 변수와 메소드로 추상화한 것
객체 생성
var 객체명 = 객체명(인자1, 인자2);
Dart
복사
•
예시코드
void main() {
// Person 클래스의 인스턴스 생성
var person1 = Person('Alice', 25);
// 또 다른 인스턴스 생성
var person2 = Person('Bob', 30);
// 객체의 속성에 접근
print('Person 1: Name - ${person1.name}, Age - ${person1.age}');
print('Person 2: Name - ${person2.name}, Age - ${person2.age}');
// 객체의 메서드 호출
person1.introduceYourself(); // 출력: Hello, my name is Alice and I am 25 years old.
person2.introduceYourself(); // 출력: Hello, my name is Bob and I am 30 years old.
}
Dart
복사
생성자
객체를 생성할 때, 변수 또는 메소드를 초기화하기 위해서 실행되는 메소드
객체를 초기화하는 특수한 메서드
클래스의 이름과 동일한 이름을 가지며, 매개변수를 가질 수 있습니다.
클래스에 명시적인 생성자가 없는 경우 기본 생성자가 자동으로 생성됩니다.생성자의 종류
•
기본 생성자 (Default Constructor): 매개변수가 없는 생성자로, 클래스에 생성자를 정의하지 않으면 자동으로 생성됨
•
매개변수가 있는 생성자 (Parameterized Constructor): 객체 생성 시 초기값을 전달받는 생성자
•
명명된 생성자 (Named Constructor): 클래스 이름.식별자 형태로 정의되는 생성자
class Person {
String name;
int age;
// 기본 생성자
Person();
// 매개변수가 있는 생성자
Person(this.name, this.age);
// 명명된 생성자
Person.guest() {
name = 'Guest';
age = 18;
}
}
void main() {
var person1 = Person(); // 기본 생성자
var person2 = Person('John', 25); // 매개변수가 있는 생성자
var person3 = Person.guest(); // 명명된 생성자
}
Dart
복사
추상 클래스
클래스의 계층적인 설계를 위해, 구현 코드가 없는 추상 메소드로 구성된 클래스
추상 클래스는 일반 클래스와 인터페이스의 중간 형태로, 다음과 같은 특징을 가집니다:
•
추상 클래스는 직접 인스턴스화할 수 없습니다 (객체 생성 불가)
•
하나 이상의 추상 메서드를 포함할 수 있습니다
•
일반 메서드와 변수도 포함할 수 있습니다
•
다른 클래스가 상속(extends)하여 구현해야 합니다
추상 클래스의 장점:•
코드의 재사용성을 높입니다
•
공통된 특성을 한 곳에서 관리할 수 있습니다
•
확장성과 유지보수가 용이합니다
추상 클래스 키워드
abstract
Dart
복사
abstract class Shape {
double getArea(); // 추상 메서드
}
class Circle extends Shape {
double radius;
Circle(this.radius);
double getArea() {
return 3.14 * radius * radius;
}
}
Dart
복사
추상 클래스 키워드는 클래스뿐만아니라 믹스인에도 적용가능하다.abstract mixin class Musician {
// No 'on' clause, but an abstract method that other types must define if
// they want to use (mix in or extend) Musician:
void playInstrument(String instrumentName);
void playPiano() {
playInstrument('Piano');
}
void playFlute() {
playInstrument('Flute');
}
}
class Virtuoso with Musician { // Use Musician as a mixin
void playInstrument(String instrumentName) {
print('Plays the $instrumentName beautifully');
}
}
class Novice extends Musician { // Use Musician as a class
void playInstrument(String instrumentName) {
print('Plays the $instrumentName poorly');
}
}
Dart
복사
상속
부모 클래스의 변수와 메소드를 자식 클래스에서 재사용하는 것
Dart에서 상속은 extends 키워드를 사용하여 구현합니다. 상속을 통해 기존 클래스의 기능을 확장하고 재사용할 수 있습니다.
상속의 주요 특징:•
하나의 클래스만 상속 가능 (단일 상속)
•
부모 클래스의 모든 속성과 메서드를 자식 클래스가 물려받음
•
@override 어노테이션을 사용하여 부모 클래스의 메서드를 재정의할 수 있음
•
super 키워드를 통해 부모 클래스의 멤버에 접근 가능
상속의 장점:•
코드 재사용성 증가
•
유지보수 용이
•
프로그램의 확장성 향상
class Animal {
void makeSound() {
print('Some generic sound');
}
}
class Dog extends Animal {
void makeSound() {
print('Woof! Woof!');
}
}
void main() {
var dog = Dog();
dog.makeSound(); // 출력: Woof! Woof!
}
Dart
복사
믹스인(Mixin)
다중 상속을 지원하는 기법
믹스인(Mixin)은 Dart에서 클래스에 추가 기능을 제공하는 특별한 코드 재사용 메커니즘입니다. 일반적인 상속과는 달리, 여러 믹스인을 동시에 사용할 수 있어 다중 상속과 유사한 효과를 얻을 수 있습니다.
주요 특징:•
여러 클래스에서 코드를 재사용할 수 있습니다.
•
하나의 클래스에 여러 믹스인을 적용할 수 있습니다.
•
with 키워드를 사용하여 믹스인을 클래스에 추가합니다.
•
생성자를 가질 수 없습니다.
사용 방법:•
mixin 키워드로 믹스인을 정의합니다.
•
with 키워드로 클래스에 믹스인을 적용합니다.
•
여러 믹스인을 사용할 때는 쉼표로 구분합니다.
mixin Flying {
void fly() {
print('Flying high!');
}
}
class Bird with Flying {
// Bird 클래스에 Flying 믹스인 추가
}
void main() {
var bird = Bird();
bird.fly(); // 출력: Flying high!
}
Dart
복사
// Flying 믹스인
mixin Flying {
void fly() {
print('Flying high!');
}
}
// Swimming 믹스인
mixin Swimming {
void swim() {
print('Swimming gracefully!');
}
}
// Bird 클래스에 Flying 믹스인 적용
class Bird with Flying {
String name;
Bird(this.name);
}
// Fish 클래스에 Swimming 믹스인 적용
class Fish with Swimming {
String name;
Fish(this.name);
}
// Duck 클래스에 Flying과 Swimming 믹스인 적용 (다중 상속)
class Duck with Flying, Swimming {
String name;
Duck(this.name);
}
void main() {
var eagle = Bird('Eagle');
eagle.fly(); // 출력: Flying high!
var salmon = Fish('Salmon');
salmon.swim(); // 출력: Swimming gracefully!
var mallard = Duck('Mallard');
mallard.fly(); // 출력: Flying high!
mallard.swim(); // 출력: Swimming gracefully!
}
Dart
복사
믹스인에 대하여도 메소드 오버라이딩이 가능하다.// Flying 믹스인
mixin Flying {
void fly() {
print('Default flying behavior');
}
}
// Bird 클래스에 Flying 믹스인 적용
class Bird with Flying {
String name;
Bird(this.name);
// Flying 믹스인의 fly 메서드를 오버라이딩
void fly() {
print('$name is flying high!');
}
}
void main() {
var eagle = Bird('Eagle');
eagle.fly(); // 출력: Eagle is flying high!
}
Dart
복사
믹스인(Mixin) 제약 조건
믹스인은 가볍게 기능만 추가하는 구조이기 때문에, 생성·상속·초기화에 제한이 있다
1. 생성자를 가질 수 없음
•
믹스인 내부에서는 생성자 정의 불가
•
객체 생성 및 초기화 로직 작성 

2. 클래스 상속(extends) 불가
•
믹스인은 다른 클래스를 상속할 수 없음
•
단, on 키워드로 사용 가능한 대상 클래스 제한은 가능
3. 사용 대상 제한 (on 키워드)
•
특정 클래스 또는 그 하위 클래스에서만 사용 가능
mixin Flyable on Animal {}
Dart
복사
Animal을 상속한 클래스만 사용 가능
4. 상태 초기화 제한
•
필드는 선언 가능
•
하지만 생성자가 없기 때문에 복잡한 초기화 로직은 불가능
5. 메서드 충돌 시 우선순위 존재
•
여러 믹스인 사용 시 뒤에 선언된 믹스인이 우선
class Test with A, B {} // B가 우선
Dart
복사
6. super 사용 제한
•
super 호출은 가능하지만
•
반드시 on으로 지정된 클래스에 해당 메서드가 있어야 함
enum
상수들을 열거하여 묶어놓은 타입
enum Weekday { monday, tuesday, wednesday, thursday, friday }
void main() {
var today = Weekday.wednesday;
print(today); // 출력: Weekday.wednesday
}
Dart
복사
static
변수 또는 메소드를 프로그램 실행 시, 가장 먼저 메모리에 고정하는 키워드
class Calculator {
static double add(double a, double b) {
return a + b;
}
}
void main() {
var result = Calculator.add(5.0, 3.0);
print(result); // 출력: 8.0
}
Dart
복사







