Flutter 캠프 9일차

은성·2025년 12월 4일

Flutter 본캠프

목록 보기
9/57
post-thumbnail

오늘의 내용

객체 지향 프로그래밍과 Dart , 클래스와 속성, 클래스와 메서드 , 객체 지향과 상속 , 과제풀이

Class

  • 객체 지향 프로그램의 핵심 개념이자 기본 단위
    객체의 구조와 동작을 정의하는 틀

객체

  • 클래스에서 정의한 구조를 기반으로 생성된 실제 데이터
    (클래스 : 붕어빵 틀 , 객체 : 붕어빵)

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()

일단 이렇게 구성하는구나 ~ 정도로만 하고 넘어갑시다 !
지금부터 구성 요소 하나 하나 알려 드릴게요 🎶

속성

  • 클래스 안에서 작업을 수행할 때 사용하는 데이터

인스턴트 변수

  • 객체에 속해 있는 변수
class Person {
  String name = '강미래';
	int age = 25;
}

name 이랑 age 가 인스턴스 변수 에 해당해요.

특징

    1. this를 통해 접근 가능
    1. 클래스 모든곳 접근 가능
    1. 객체가 존재하는 동안 계속 메모리상에 존재함
    1. 동일한 클래스로 생성한 객체들이어도 각 객체들은 값을 공유하지 않고 개별적인 값을 가짐.

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 가 붙지 않은 변수는
더 가까이 있는 변수로 우선 취급돼요 !


this는 최대한 덜 쓰는게 좋음

class Person {
  String name = '강미래';
  int age = 25;
  
  void printName() {
    print(name);
  }
  
  void printNameAndAge() {
    printName();
    print(age);
  }
}

변수를 구분할 필요가 없다면
this 를 굳이 사용하지 않아도 되겠죠 ?

2

class Person {
  String name = '강미래';
	int age = 25;

  void introduce() {
    print('안녕 ? 나는 $age살 $name !');
  }
}

Person 클래스의 인스턴스 변수인 name 과 age 를
introduce() 메서드 안에서 사용해 주었네요 !

4

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 는 정적 변수 여서 객체 로 접근할 수 없어요.
정적 변수 는 객체 에 종속된 친구가 아니기 때문에
객체 로 접근할 수 없는게 당연 .. 🙂

this를 통해 접근할 수 없음.

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 로 바뀐답니다 😱
그렇기 때문에 정적 변수 의 값을 바꿔 주기 전에
다른 객체에 미치는 영향을 꼭 생각해야 해요.

circle1 과 circle2는 각자 독립적인 애들임

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 를 서로 값을 공유할 뿐이랄까요 🤔

인스턴스 변수 vs 지역 변수

인스턴스 변수지역 변수
사용 가능 범위클래스 내의 모든 범위해당 코드 블록 내의 모든 범위
생명 주기객체가 존재하는 동안
(객체가 소멸할 때 까지)
해당 코드 블록이 실행되는 동안

인스턴스 변수 vs 정적 변수

인스턴스 변수정적 변수
키워드static
접근 방식객체를 통해 접근클래스 이름을 통해 접근
객체끼리 값을 고유하는지?XO

과제

0개의 댓글