Develop/Flutter
다트 객체지향 프로그램
HaeYoung_12
2024. 8. 13. 18:12
1. 객체지향 프로그래밍의 필요성
객체지향프로그래밍을 이용하면 변수와 메서드를 특정 코드에 종속되게 코딩하여 코드관리에 용이함.
1.1 클래스란
일종의 설계도로서 데이터가 보유할 속성과 기능을 정의하는 자료구조
인스턴스(instance) 클래스를 이용해서 객체를 선언하면, 해당 객체를 클래스의 인스턴스라 부름
인스턴스화(instantiation): 클래스에서 인스턴스(객체)를 생성하는 과정
객체지향 프로그래밍의 시작, 클래스
// class 키워드를 입력 후 클래스명을 지정해 클래스를 선언합니다.
class Idol {
// 1 클래스에 종속되는 변수를 지정할 수 있습니다.
String name = '블랙핑크';
// 2 클래스에 종속되는 함수를 지정할 수 있습니다.
// 클래스에 종속되는 함수를 메서드라고 부릅니다.
void sayName() {
// 3 클래스 내부의 속성을 지칭하고 싶을 때는 this 키워드를 사용하면 됩니다.
// 결과적으로 this.name은 Idol 클래스의 name 변수를 지칭합니다.
print('저는 ${this.name}입니다.');
// 4 스코프 안에 같은 속성 이름이 하나만 존재한다면 this를 생략할 수 있습니다.
print('저는 $name입니다.');
}
}
1.2 this 키워드
클래스에 종속되어 있는 값을 지칭할때 사용. 함수내부에 같은 이름의 변수가 없으면 this 키워드를 생략할수 있음
클래스 사용 예시
void main() {
// 변수 타입을 Idol로 지정하고
// Idol의 인스턴스를 생성할 수 있습니다.
// 인스턴스를 생성할 때는 함수를 실행하는 것처럼
// 인스턴스화하고 싶은 클래스에 괄호를 열고 닫아줍니다.
Idol blackPink = Idol(); // 1 Idol 인스턴스 생성
// 메서드를 실행합니다.
blackPink.sayName();
}
▼ 실행 결과
저는 블랙핑크입니다. // this를 사용한 출력
저는 블랙핑크입니다. // this를 사용 안 한 출력
2. 생성자
클래스의 인스턴스를 생성하는 메서드
- 생성자에서 입력받을 변수들은 일반적으로 final 키워드를 사용.
class Idol {
// 1 생성자에서 입력받는 변수들은 일반적으로 final 키워드 사용
final String name;
// 2 생성자 선언
// 클래스와 같은 이름이어야 합니다.
// 함수의 매개변수를 선언하는 것처럼 매개변수를 지정해줍니다.
Idol(String name) : this.name = name;
// this를 사용할 경우
// 해당되는 변수에 자동으로 매개변수가 저장됩니다.
Idol(this.name);
void sayName() {
print('저는 ${this.name}입니다.');
}
}
Idol 클래스로 인스턴스 만들기
void main() {
// name에 '블랙핑크' 저장
Idol blackPink = Idol('블랙핑크');
blackPink.sayName();
// name에 'BTS' 저장
Idol bts = Idol('BTS');
bts.sayName();
}
▼ 실행 결과
저는 블랙핑크입니다.
저는 BTS입니다.
2.1 네임드 생성자
클래스를 생성하는 여러 방법을 명시하고 싶을때 사용
{클래스.네임드생성자명} 형식으로 지정됨.
class Idol {
final String name;
final int membersCount;
// ① 생성자
Idol(String name, int membersCount)
// 1개 이상의 변수를 저장하고 싶을 때는 , 기호로 연결해주면 됩니다.
: this.name = name,
this.membersCount = membersCount;
// ② 네임드 생성자
// {클래스명.네임드 생성자명} 형식
// 나머지 과정은 기본 생성자와 같습니다.
Idol.fromMap(Map<String, dynamic> map)
: this.name = map['name'],
this.membersCount = map['membersCount'];
void sayName() {
print('저는 ${this.name}입니다. ${this.name} 멤버는
${this.membersCount}명입니다.');
}
}
코드 실행하기
void main() {
// 기본 생성자 사용
Idol blackPink = Idol('블랙핑크', 4);
blackPink.sayName();
// fromMap이라는 네임드 생성자 사용
Idol bts = Idol.fromMap({
'name': 'BTS',
'membersCount': 7,
});
bts.sayName();
}
▼ 실행 결과
저는 블랙핑크입니다. 블랙핑크 멤버는 4명입니다.
저는 BTS입니다. BTS 멤버는 7명입니다.
2.2 프라이빗 변수
일반적 프라이빗 변수: 클래스 내부에서만 사용하는 변수
다트에서의 프라이빗 변수: 같은 파일에서만 사용하는 변수
'_' 기호로 시작해서 선언 가능
class Idol {
// ① '_'로 변수명을 시작하면
// 프라이빗 변수를 선언할 수 있습니다.
String _name;
Idol(this._name);
}
void main() {
Idol blackPink = Idol('블랙핑크');
// 같은 파일에서는 _name 변수에 접근할 수 있지만
// 다른 파일에서는 _name 변수에 접근할 수 없습니다.
print(blackPink._name);
}
2.3 게터/세터
게터: 값을 가져올때사용
세터:값을 지정할때 사용
사용시 변수처럼 사용함. 즉, 메서드명뒤에 ()를 붙이지 않음
class Idol {
String _name = '블랙핑크' ;
// ① get 키워드를 사용해서 게터임을 명시합니다.
// 게터는 메서드와 다르게 매개변수를 전혀 받지 않습니다.
String get name {
return this._name;
}
// ② 세터는 set이라는 키워드를 사용해서 선언합니다.
// 세터는 매개변수로 딱 하나의 변수를 받을 수 있습니다.
set name(String name) {
this._name = name;
}
}
void main() {
Idol blackPink = Idol();
blackPink.name = '에이핑크'; // ① 세터
print(blackPink.name); // ② 게터
}
▼ 실행 결과
에이핑크