class Person {
String name;
int age;
void greet() {
print('안녕하세요, 저는 $name이고 $age살입니다.');
}
}
void main() {
var person1 = Person(); // Person 클래스의 인스턴스 생성
person1.name = 'Alice'; // 인스턴스의 속성 설정
person1.age = 25;
person1.greet(); // 인스턴스의 메서드 호출
var person2 = Person(); // 또 다른 Person 클래스의 인스턴스 생성
person2.name = 'Bob';
person2.age = 30;
person2.greet();
}
인스턴스를 만들 설계도가 필요한데 그게 클래스다.
클래스 안에는 속성을 표현할 수 있는데 프로퍼티라고 한다.
person1.toString 이렇게 작성하면 toString이 프로퍼티다.
근데 toString은 사실 프로퍼티가 아니다. 메서드다.
hashCode는 프로퍼티가 맞다.
이 코드를 다시 보자
코드에는 이미 object의 존재가 있다.
class Person은 object의 클래스를 상속 받았다.
object는 객체의 일부 공통 기능과 메서드를 제공한다.
-toString : 객체의 문자열 표현을 반환
-hashCode : 객체의 해시코드를 반환(객체 저장되어있는 주소 출력하면 123124121 이런 모습으로 출력됨)
-operator : 객체의 메모리 주소 비교
-runtimeType : 객체의 실제 타입 반환
추상 클래스는 그냥은 인스턴스화 못한다.
다른 클래스에서 implement를 하여 기능을 완성하는 상속 재료로 사용된다.
내가 추상 메서드를 가져올 그 대상이 되는 클래스는 implement로 가져오고
그 클래스를 쓸 장소에서는 @Override 키워드를 사용해야한다.
*오준석의플러터생존코딩 책에서 발췌한 내용
코드를 보자
abstract Interface class VehicleInterface { // 추상 클래스는 abstract로 시작함
void honk(); // honk뜻은 경적 울릴 때 울리다 뜻임. 아무 기능도 안넣었기 때문에 추상메서드임
}
class Vehicle implements VehicleInterface { // implements를 사용해서 VehicleInterface를 추상클래스랑 도킹
String color;
Vehicle(this.color);
// 오버라이드를 사용함으로서 추상메서드를 가져옴
void honk() {
print("경적 빠앙");
}
void drive() {
print("드라이브하고 있는 차 색깔은 $color");
}
}
class Car extends Vehicle {
int carNumber;
Car(String color, this.carNumber) : super(color);
void drive() {
print("자동차로 드라이브");
}
void honk() {
print("경적을 울렸다");
}
}
void main() {
Vehicle myVehicle = Vehicle('blue'); // 부모 클래스에 있는 생성자
myVehicle.drive(); // 부모 클래스에 있는 Vehicle(this.color)에 blue를 전달.
Car myCar = Car('green', 486); // Car생성자로 green와 486를 넘김
myCar.drive(); // 인스턴스 호출
myCar.honk();
print("내 차 넘버는 ${myCar.carNumber}"); // 결과: 내 차 넘버는 8282
}
이런식으로 쓰면 된다.
mixin Flyable on Animal {
void fly() {
print('I am flying!');
}
}
class Animal {
String name;
Animal(this.name);
}
class Bird extends Animal with Flyable {
Bird(String name) : super(name);
}
void main() {
var bird = Bird('Bird');
bird.fly();
}
예제는 객체 지향 프로그래밍의 개념 중 하나인 "mixin"을 보여줍니다. 이해를 돕기 위해 코드를 단계별로 설명하겠습니다.
Flyable mixin 정의:
Flyable은 Animal 클래스에 적용할 수 있는 mixin입니다. Mixin은 다른 클래스에 일련의 메소드나 속성을 추가하기 위해 사용됩니다.
Animal 클래스 정의:
Animal 클래스는 동물의 이름을 저장하기 위한 속성 name을 가지고 있습니다.
Bird 클래스 정의:
Bird 클래스는 Animal 클래스를 확장하고(extends) Flyable mixin을 포함합니다. 이것은 Bird가 Animal 클래스의 모든 속성과 메소드를 상속받을 뿐만 아니라 Flyable mixin에서 제공하는 fly() 메소드도 가지게 됨을 의미합니다.
main 함수:
main 함수에서는 Bird 클래스의 인스턴스인 bird를 생성합니다. 이때 "Bird"라는 이름을 가진 새로운 동물 객체가 만들어집니다.
그리고 bird.fly()를 호출하여 새가 날아다니는 동작을 수행하고 "I am flying!"을 출력합니다.
이 코드를 사용하면 새로운 동물 종류를 정의하고, 필요한 경우에만 Flyable mixin을 사용하여 날기 기능을 추가할 수 있습니다. 이것이 객체 지향 프로그래밍의 장점 중 하나인 코드 재사용성을 강화하는 방법 중 하나입니다.