
클래스 (Class)
객체 지향 프로그래밍 (Object-Oriented Programming)의 핵심 개념이자 기본 단위
객체의 구조와 동작을 정의하는 틀
객체: 클래스에서 정의한 구조를 기반으로 생성된 실제 데이터 — 개별적 실체
class [클래스 이름] { ... }class Person {
String name;
int age;
Person(this.name, this.age);
void introduce() {
print("안녕? 나는 $age살 $name!")
}
}속성:
name, age생성자:
Person(this.name, this.age);매서드:
introduce()클래스의 구성
클래스 = 여러 속성과 메서드를 하나로 묶어서 만든 설계도
클래스라는 설계도에 의해 실제로 만들어진, 생성된 결과물 = 객체 = 인스턴스 = 실체
인스턴스가 가진 변수 (인스턴스 변수) = 필드
메서드에서 그 인스턴스를 가리키는 포인터 = this
상속 시 부모 초기화 = super가 담당
속성 (Attribute)
클래스 안에서 작업을 수행할 때 사용하는 데이터
인스턴스 변수 (Instance Variable)
객체에 속해있는 변수
객체(Class를 통해서 실제로 생성될 유닛)에 속하는 변수, ‘필드’라고도 함.
this
class Person {
String name = "박정민"; // name은 인스턴스 변수. 정확하게는 인스턴스 변수 선언. "박정민"은 인스턴스 변수의 초기값.
void rename(String name) { // rename은 인스턴스 메서드. 인자로 받은 name(지역 변수)의 값을 인스턴스 변수 this.name에 대입한다.
this.name = name;
}
}
void main() {
var p = Person(); // Person 설계도에 따라 인스턴스 하나 만들고 그것을 p에 담는다.
p.rename("구교환"); //p에 rename 메서드를 적용하고, 그때 지역 변수의 값은 "구교환"이다.
print(p.name); // 인스턴스 p가 갖고 있는 name이라는 필드에 들어있는 값을 출력하라.
}- 키워드
this를 통해 인스턴스 변수를 호출할 수 있다.
this는 “현재 만들어지고 있는 인스턴스”를 가리킨다. 클래스의 정의를 읽는 시점이 아니라, 객체가 실제로 생성되는 런타임 시점에this가 활성화되는 것.
- 즉, 생성자나 메서드가 호출될 때, “그 순간 만들어진 객체”를 참조하는 포인터.
- 인스턴스가 생성된 이후 실행되는 메서드 내부에서 사용되는 포인터.
- this.name은 메서드를 호출한 객체의 name을 가리킨다.
→ this 는 호출하는 객체에 따라 달라지는 “동적 포인터”
- name과 this.name은 기본적으로 같다.
→ 스코프에 충돌하는 이름이 없으면 동일한 의미
- this는 “필드와 지역변수를 구분할 때” 필요하다.
→ 이름이 충돌하면 this로 명확히 구분해준다.
지역 변수 (Local Variable)
특정 코드블록 안에 선언된 변수
class fruit {
String name = "귤";
void sayName() {
String favorite = "제일 좋아하는 겨울의 맛은 $name !";
print(favorite);
}
}지역변수 :
favorite 인스턴스 변수:
name변수가 선언된 코드 블록 안에서만 사용할 수 있음.
변수가 선언된 코드 블록의 실행이 끝나면 메모리 상에서 사라짐. = 생명주기가 짧다.
정적 변수 (Static Variable)
= 클래스 변수
객체에 종속되지 않고 클래스 자체에 속하는 변수
class Circle {
static double pi = 3.14;
}- 클래스 이름을 통해 접근한다.
class Circle {
static double pi = 3.14;
double radius = 0;
}
void main () {
print(Circle.pi); // 3.14
print(Circle.radius); // Error: Member not found: 'radius'
}radius는 클래스 이름으로 접근 불가pi는 클래스 이름으로 접근 가능- 객체를 통해 접근 불가
class Circle {
static double pi = 3.14;
double radius = 0;
double pi2 = 2.0;
}
void main () {
Circle circle = Circle(); // 클래스 Circle의 설계도에 따라 인스턴스 하나를 생성하고 그것을 circle이라는 이름에 담는다.
print(circle.radius); // 0 -- 인스턴스 circle의 인스턴스 변수인 radius를 호출한다.
print(circle.pi); // Error -- 인스턴스인 circle은 `pi`라는 이름의 인스턴스 변수를 갖고 있지 않으므로 호출이 불가함.
print(circle.pi2); // 2.0
}
print(Circle.pi); // 3.14 -- 클래스 Circle의 정적 변수인 pi를 호출한다.this를 통해 접근 불가
this는 객체(인스턴스)를 가리키는 키워드. 정적 변수는 객체에 종속되는 것이 아니므로 this를 통해 접근할 수 없음.- 객체마다 개별적인 값을 갖는 것이 아니라, 모든 객체가 서로의 값을 공유함.
class Circle {
static double pi = 3.14;
void printPi() {
print(pi);
}
}
void main() {
Circle c1 = Circle();
c1.printPi(); // 3.14
Circle c2 = Circle();
c2.printPi(); // 3.14
print(Circle.pi); // 3.14
}실습
책의 제목(
title)과 저자(author)를 속성으로 가지고 있는 Book 클래스를 만들어보세요. 클래스를 만든 후 객체를 생성하여 제목과 저자를 출력해보세요.▼ 내가 푼 것
class Book {
String title;
String author;
Book(this.title, this.author);
}
void main() {
Book littlePrince = Book("어린왕자", "생떽쥐베리");
print("제목: ${littlePrince.title}");
print("저자: ${littlePrince.author}");
}▼ 제시된 예시 코드
class Book {
String title = 'Dart 프로그래밍';
String author = '김개발';
}
void main() {
Book myBook = Book();
print('제목: ${myBook.title}'); // 제목: Dart 프로그래밍
print('저자: ${myBook.author}'); // 저자: 김개발
}두 코드는 어떤 차이가 있는가?
🔥 “객체마다 값이 달라질 수 있는가?”
네 코드
Book a = Book("어린왕자", "생떽쥐베리");
Book b = Book("해리포터", "롤링");
👉 완전히 다른 객체 생성 가능 ⭕
정답 예시 코드
Book a = Book();
Book b = Book();
👉 둘 다 항상
Dart 프로그래밍 / 김개발 ❌
그럼 왜 정답 예시는 저렇게 냈을까?
👉 의도는 “클래스 + 객체 생성” 연습
생성자 개념 ❌
인스턴스 변수 접근 ⭕
. 연산자 연습 ⭕
그래서 최소 문법만 보여준 예제야.Share article