
객체 지향 프로그래밍과 Dart , 클래스와 속성, 클래스와 메서드 , 객체 지향과 상속 , 과제풀이
class Person {
String name;
int age;
Person(this.name, this.age);
void introduce() {
print('안녕 ? 나는 $age살 $name !');
}
}
속성 : name, age
생성자 : Person(this.name, this.age);
메서드 : introduce()
일단 이렇게 구성하는구나 ~ 정도로만 하고 넘어갑시다 !
지금부터 구성 요소 하나 하나 알려 드릴게요 🎶
class Person {
String name = '강미래';
int age = 25;
}
name 이랑 age 가 인스턴스 변수 에 해당해요.
this를 통해 접근 가능class Person {
String name = '강미래';
int age = 25;
void printName() {
print(this.name);
}
void printNameAndAge() {
this.printName();
print(this.age);
}
}
this.name 은 인스턴스 변수 인 name ,
this.printName() 은 printName() ,
this.age 는 인스턴스 변수 인 age 를 가리켜요 !
class Person {
String name = '강미래';
int age = 25;
void changeName(String name) {
this.name = name;
}
}
this.name = name; 에서
this.name 은 인스턴스 변수 인 name ,
name 은 매개변수 인 name 을 가리켜요.
참고로, this 가 붙지 않은 변수는
더 가까이 있는 변수로 우선 취급돼요 !
class Person {
String name = '강미래';
int age = 25;
void printName() {
print(name);
}
void printNameAndAge() {
printName();
print(age);
}
}
변수를 구분할 필요가 없다면
this 를 굳이 사용하지 않아도 되겠죠 ?
class Person {
String name = '강미래';
int age = 25;
void introduce() {
print('안녕 ? 나는 $age살 $name !');
}
}
Person 클래스의 인스턴스 변수인 name 과 age 를
introduce() 메서드 안에서 사용해 주었네요 !
class Person {
String name = '';
int age = 0;
}
void main() {
Person paul = Person();
paul.name = 'Paul';
paul.age = 25;
Person mark = Person();
mark.name = 'Mark';
mark.age = 30;
paul.age = 27;
print<(paul.age); // 27
print(mark.age); // 30
}
paul 과 mark 는 모두 Person 클래스로 만든 객체들이지만,
각자 고유한 name 과 age 를 갖기 때문에
paul 의 age 를 바꿔 주어도 mark 의 age 는 바뀌지 않아요.
참고로, 객체 는 . 을 통해
클래스 에 정의되어 있는 속성 과 메서드 를 사용해요.
final 사용class Person {
final String name = '강미래';
int age = 25;
}
void main() {
Person paul = Person();
paul.name = 'Paul'; // 오류 발생
paul.age = 30;
}
Person 의 name 에 final 이 붙었기 때문에
객체 를 통해 값을 변경할 수 없어요 😅
class Person {
String name = '강미래';
void sayName() {
String nameSentence = '내 이름은 $name !';
print(nameSentence);
}
}
sayName() 안의 nameSentence 가 지역 변수 랍니다 !
name 은 지역 변수 가 아니라 인스턴스 변수 겠죠 👀
class Person {
String name = '강미래';
void sayName() {
String nameSentence = '내 이름은 $name !';
print(nameSentence);
}
void sayNameAgain() {
print(nameSentence); // 오류 발생
}
}
sayName() 안에 선언된 nameSentence 는
sayName() 안에서만 사용할 수 있는 지역 변수 랍니다 !
그래서 sayName() 의 코드 블록 밖에서는 사용할 수 없어요 😅
class Person {
String name = '강미래';
void sayName() {
String nameSentence = '내 이름은 $name !';
print(nameSentence);
}
}
nameSentence 는 sayName() 의 실행이 끝나면
메모리에서 해제되기 때문에 생명 주기가 짧다고 할 수 있어요 😢
class Circle {
static double pi = 3.14159;
}
pi 의 맨 앞에 static 이 붙은 것 보이시나요 ?
static 이 붙은 변수는 정적 변수 랍니다 !
class Circle {
static double pi = 3.14159;
double radius = 0;
}
void main() {
print(Circle.pi); // 3.14159
print(Circle.radius); // Error: Member not found: 'radius'.
}
radius 는 인스턴스 변수 여서 클래스 이름으로 접근할 수 없지만,
pi 는 정적 변수 여서 클래스 이름으로 접근할 수 있어요.
정적 변수 는 클래스 꺼니까 클래스 이름으로 접근하는게 당연 .. 🙂
class Circle {
static double pi = 3.14159;
double radius = 0;
}
void main() {
Circle circle = Circle();
print(circle.radius); // 0
print(circle.pi); // 오류 발생
}
radius 는 인스턴스 변수 여서 객체 로 접근할 수 있지만,
pi 는 정적 변수 여서 객체 로 접근할 수 없어요.
정적 변수 는 객체 에 종속된 친구가 아니기 때문에
객체 로 접근할 수 없는게 당연 .. 🙂
class Circle {
static double pi = 3.14159;
void printPi() {
print(this.pi); // 오류 발생
}
}
this 는 객체 를 가리키는 키워드인데,
정적 변수 는 객체에 종속되는 친구가 아니기 때문에
당연히 정적 변수 에 this 를 못 쓰지 않을까요 ? 🤔
class Circle {
static double pi = 3.14159;
void printPi() {
print(pi);
}
}
void main() {
Circle circle1 = Circle();
circle1.printPi(); // 3.14159
Circle circle2 = Circle();
circle2.printPi(); // 3.14159
Circle.pi = 3.14;
circle1.printPi(); // 3.14
circle2.printPi(); // 3.14
}
Circle.pi = 3.14; 라고 해주면
Circle 로 만든 객체들의 pi 가 모두 3.14 로 바뀐답니다 😱
그렇기 때문에 정적 변수 의 값을 바꿔 주기 전에
다른 객체에 미치는 영향을 꼭 생각해야 해요.
class Circle {
static double pi = 3.14159;
void printPi() {
print(pi);
}
}
void main() {
Circle circle1 = Circle();
circle1.printPi(); // 3.14159
Circle circle2 = Circle();
circle2.printPi(); // 3.14159
Circle.pi = 3.14;
circle1.printPi(); // 3.14
circle2.printPi(); // 3.14
print(circle1 == circle2); // false
}
circle1 과 circle2 는 서로 다르다는군요 !
서로 다르지만, pi 를 서로 값을 공유할 뿐이랄까요 🤔
| 인스턴스 변수 | 지역 변수 | |
|---|---|---|
| 사용 가능 범위 | 클래스 내의 모든 범위 | 해당 코드 블록 내의 모든 범위 |
| 생명 주기 | 객체가 존재하는 동안 (객체가 소멸할 때 까지) | 해당 코드 블록이 실행되는 동안 |
| 인스턴스 변수 | 정적 변수 | |
|---|---|---|
| 키워드 | static | |
| 접근 방식 | 객체를 통해 접근 | 클래스 이름을 통해 접근 |
| 객체끼리 값을 고유하는지? | X | O |

