Search
Duplicate
moon
sun

객체지향

객체지향

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
복사