22일차 과제 링크 👉 22일차 과제
클래스의 장점
- 코드의 재사용성
코드를 반복해서 작성하지 않고, 클래스를 만들어서 필요할 때마다 재사용할 수 있음
- 코드의 가독성과 유지 보수
코드가 구조화되어 있고, 클래스의 역할과 책임이 분명하게 정의되어 있기 때문에 가독성이 좋아짐
- 데이터 은닉성 (캡슐화)
클래스 내부의 데이터가 외부에 노출되지 않도록 할 수 있음 (getter, setter 메소드)
- 상속과 다형성
부모 클래스의 속성과 메서드를 자식 클래스가 상속받아 사용할 수 있도록 해줌 (상속)
부모 클래스 타입으로 자식 클래스의 객체를 참조할 수 있음 (다형성)
Dart class 특징
1. Mixins
다른 클래스에서 코드를 재사용하기 위해 사용
다른 언어에서는 인터페이스와 비슷한 기능을 하지만 Dart에서는 믹스인이 인터페이스보다 더 강력하며 다른 클래스에서 코드를 재사용하기 위해 사용됨
mixin MyMixin { void doSomething() { print("Doing something..."); } } class MyClass with MyMixin { // MyClass는 MyMixin의 doSomething() 메서드를 사용할 수 있음 } void main() { var myClass = MyClass(); myClass.doSomething(); // "Doing something..." 출력 }
2. Named constructors
생성자를 특정 이름으로 정의하여 객체를 생성할 때 편리하게 사용할 수 있음
class MyClass { String name; MyClass(this.name); // Named constructor MyClass.fromInt(int number) { name = number.toString(); } } void main() { var myClass = MyClass.fromInt(10); print(myClass.name); // "10" 출력 }
3. Factory constructors
일반적으로 객체를 생성하고 반환하기 전에 추가적인 로직을 수행하려는 경우에 사용됨
class MyClass { String name; MyClass(this.name); // Factory constructor factory MyClass.fromInt(int number) { return MyClass(number.toString()); } } void main() { var myClass = MyClass.fromInt(10); print(myClass.name); // "10" 출력 }
4. Getters and setters
Dart 클래스는 자체적으로 getter와 setter를 지원함
객체의 속성을 읽고 쓰는 데 사용됨
class MyClass { String _name; String get name => _name; set name(String value) { _name = value; } } void main() { var myClass = MyClass(); myClass.name = "John"; print(myClass.name); // "John" 출력 }
5. Extension methods
클래스의 기능을 확장할 수 있는 extension methods를 통해 기존 클래스에 새로운 기능을 추가할 수 있음
extension StringExtension on String { String capitalize() { return "${this[0].toUpperCase()}${this.substring(1)}"; } } void main() { var myString = "hello"; print(myString.capitalize()); // "Hello" 출력 }
class User {
// 멤버 변수
String name;
// 생성자 함수
User(this.name);
}
void main() {
var user1 = User('user1'); // 생성자를 통한 객체생성 및 변수에 할당
var user2 = User('user2'); // 생성자를 통한 객체생성 및 변수에 할당
}
class User {
// 멤버 변수
String name;
// 생성자 함수
User.withName(String inputName) : name = inputName;
}
void main() {
var user1 = User.withName('user1');
}
class User {
// 멤버 변수
String name;
// 이름 없는 생성자 함수
User(this.name);
User.withName2({required this.name});
}
void main() {
var user1 = User.withName2(name: 'user1');
}
class User {
String userId;
String nickname;
String password;
List<User> friends;
User(this.userId, this.nickname, this.password, this.friends) {
print('${this.nickname} 생성');
}
User.createUser(String nickname, String password)
: userId = 'newUserID',
nickname = nickname,
password = password,
friends = [];
}
void main() {
var user = User('id', '햄버거', '****', []);
}
class Person {
String name;
int age;
Person(this.name, this.age);
void sayHello() {
print("안녕하세요 나는 $age살 $name");
}
void incrementAge() {
age++;
}
}
void main() {
var person = Person("홍길동", 12);
person.sayHello(); // "안녕하세요 나는 12살 홍길동"
person.incrementAge();
person.sayHello(); // "안녕하세요 나는 13살 홍길동"
}