+ 의 기능
- 문자열 + 문자열은 가능하다 ( 단, -, * , / 은 불가능)
- 서로 다른 데이터 표기를 더하기 위해서는 $ { } 사용!
(다만 점 연산자 사용시 축약이 불가능하다)
void main(){
String name1 ='홍길동';
String name2 ='이순신';
print(name1 + name2);
print('${name1} ${name2}');
print('$name1 $name2');
print('${name1.runtimeType} $name2.runtimeType');
}
null
nullable ( ?를 사용해서 나타냄 )
|
non-nullalbe
|
변수가 null이 될 수 있다.
|
변수가 null이 될 수 없다.
|
null 이란 ? 아무런 값도 없는 것
|
|
만약 변수에 !를 붙인다면 null이 아니라는 것을 의미하므로 null값이 들어오면 오류~
|
void main(){
//nullable - 변수가 null이 될 수 있다.
//non-nullable - 변수가 null이 될 수 없다.
// null - 아무런 값도 없다.
String name = '텐코딩';
// name = null; // 컴파일 시점에 오류 (불가능)
String? name3 = '홍길동';
// 타입을 지정 할 수 있고, null도 사용가능하다
name3 = null; //?를 사용하여 null 허용시킴
print(name3);
// print(name3!);
// ! : 여기 값은 반드시 null이 아니야라는 의미임
// 현재 null이므로 오류 발생
}
캡슐화 / 추상화
캡슐화
|
어떤 객체가 어떠한 목적을 수행하기 위해
데이터 (멤버 변수)와 기능 (메서드)을 적절하게 모으는 과정
|
추상화
|
어떤 객체에 공통된 데이터와 메서드를 묶어서 이름을 부여하는 것
즉, 공통 속성을 추출해 나가는 과정을 추상화라고 한다.
|
[접근 제어 지시자]
Dart에서 접근 제어 지시자는 딱 2가지 종류이다
1. public
|
2. private
|
기본적으로 아무런 키워드가 없을 경우 public
|
private 멤버의 접근 범위는 동일 클래스가 아니라
라이브러리 기준이다 (자바로는 패키지 기준)
|
다른 패키지를 불러오려면
import 선언을 해주어야한다.
|
private으로 선언하기 위해서는
변수나 메서드 앞에 _(밑줄)을 붙여야한다.
|
대상은 클래스, 메서드(함수), 변수 이다
접근 지시자의 연관된 개념은 내부 정보를 공개하거나 하지 않는 정보 은닉 방법 중 하나이다.
|
void main () {
Warrior warrior1 = Warrior('다리우스', 1);
warrior1.attack();
warrior1._level = 2;
warrior1._upgradeLevel();
}
class Warrior {
String name;
int _level;
// 생성시 매개변수로 들어오기 때문에 null이 아님을 보장한다
Warrior(this.name, this._level);
attack(){
print("전사가 기본 공격을 합니다!");
_upgradeLevel();
}
_upgradeLevel(){
_level++;
print("전사가 레벨업 합니다~");
}
}
import 'package:my_flutter_04/main_07.dart';
void main(){
//다른 패키지면 import 선언을 해주어야 한다.
Warrior w1 = Warrior('야스오', 10);
// w1._level private으로 접근불가
String myName = w1.name;
print(myName);
}
[Getter / Setter]
자바의 Getter와 Setter 같은 개념
형태
|
||
Getter
|
데이터타입? get 변수명 => 기본 변수명 ;
|
|
ex)
|
String get name => name; (non-nullalbe)
String? get name => _name; (nullalbe)
get 이라는 것을 적어두면 더 명확히 알 수 있다
ex) Stirng? get getName =? _name;
|
|
Setter
|
set 변수명 (데이터타입? 입력값) => 기본 변수명 = 입력값;
|
|
ex)
|
set name (String name) => name = name; (non-nullalbe)
set name (String? name) => _name = name; (nullalbe)
set 이라는 것을 적어두면 더 명확히 알 수 있다
ex) set setname (String? name) => _name = name;
|
void main(){
Person person =Person() ;
}
class Person{
String? _name;
String? get name => _name; //getter 기본 형태
set name(String? name) => _name = name; //setter 기본 형태
String? get getName => _name;
set setName(String? name) => _name = name;
String? get getName => (_name == null) ? '홍' : _name;
set setName(String? name) => (name == null) ? 'Part' : _name = name;
}
import 'package:my_flutter_04/Main_08.dart';
void main(){
Person person = Person();
person.name = '홍길동';
print(person.name);
//즉, getter / setter로 접근할 때도 name 이라는 이름으로 사용된다.
person.setName = '홍길동';
print(person.getName);
// 헷갈릴 수 있으므로 get,set을 붙여주는 것이 좋다.
person.setName = null;
print(person.getName);
}
[상속과 다형성]
super 키워드는 자식이 부모 객체를 참조할 수 있는 키워드!
void main () {
// Dart 상속 -> 다형성
// 단일 상속만 지원한다.
CheeseBurger cheeseBurge = new CheeseBurger('통새우 치즈');
}
class Burger{
String name;
Burger(this.name){
print('${name} 버거');
}
}
class CheeseBurger extends Burger{
//super 키워드는 자식이 부모 객체를 참조할 수 있는 키워드
CheeseBurger(super.name);
}
이니셜라이져
( : ) 이니셜 라이져 키워드
: 생성자의 내부 스택이 실행되기 전에
다른 무언가를 호출하고 싶을 때 사용
아래 코드를 확인해보면 부모의 Buger 클래스에 이름이 없으나, 자식 클래스인 CheeseBurger에서 이니셜 라이져(:)를
사용하여 이름을 호출 하게 만들었다!
void main () {
CheeseBurger cheeseBurger = new CheeseBurger('치즈버거');
print(cheeseBurger.name);
}
class Burger{
String name;
Burger(this.name);
}
class CheeseBurger extends Burger{
CheeseBurger(name) : super(name);
}
[Mixin] - with 키워드!
- 여러 클래스 계층에서 클래스의 코드를 재사용하는 방법
- Mixin을 사용하게 되면 다중 상속 문제를 해결 할 수 있고, 컴퍼지션을 사용하지 않고 다른 클래스의 코드를 재사용 할 수 있다.
Dart는 클래스와 Mixin 기반 상속이 있는 객체 지향 언어 모든 객체는 클래스의 인스턴스이며 Null 자식을 제외한
모든 클래스는 Object 클래스를 상속 받는다
★ Mixin으로 선언시 객체 생성(new) 불가능하다.
void main(){
BMW bmw = BMW();
print(bmw.power);
print(bmw.wheelName);
Wheel2 car = new Wheel2();
print(car.color);
}
class Engine{
int power = 5000;
}
class Wheel{
String wheelName = '4륜 구동 바퀴';
}
class BMW with Engine , Wheel {
}
// 문법상 오류가 없으나, 의미상은 어색하다!
class Wheel2 with MyCar {
String wheelName = '4륜 구동 바퀴';
}
class MyCar {
String color = 'black';
}
void main() {
// Musical musical = Musical(); // 오류 발생
// mixin으로 선언시 객체 생성이 불가능함!
}
class Performer {
var name;
}
mixin Musical {
bool canPlayPiano = false;
bool canCompose = false;
bool canConduct = false;
void entertainMe() {
if (canPlayPiano) {
print('Playing piano');
} else if (canConduct) {
print("Waving hands");
} else {
print("Humming to self");
}
}
} // end of musical
class Musician extends Performer with Musical {
var company;
@override
String toString() {
return "[이름 : ${name}, 소속 : ${company} ]";
}
}
[생성자]
1. 기본 생성자 - default constructor
: (이름이 없는 생성자)
※ 이름이 없는 생성자는 단 하나만 만들 수 있음!
2. 이름이 있는 생성자 - Named constructor
: 다트에서는 오버로딩이라는 기능이 없다!
3. 초기화 리스트 - Initializer list
4. 리다이렉 생성자 - Redirecting constructor
5. 상수 생성자 - Constant constructor
6. 팩토리 생성자 - Factory constructor
void main (){
Person person1 = Person();
Person person2 = Person.init();
Person person3 = Person.ageInit(100);
print(person1);
print(person2);
print(person3);
}
class Person{
var name;
var age;
// 이름이 없는 생성자
// 주의 ! 이름이 없는 생성자는 단 하나만 만들 수 있다.
Person(){
}
//이름이 있는 생성자
Person.init(){
this.name = '홍길동';
this.age = 1;
}
// 이름이 있는 생성자
Person.ageInit(this.age);
@override
String toString() {
return 'Person{name: $name, age: $age}';
}
}
'개발일지 > Dart' 카테고리의 다른 글
제네릭, Isolate (0) | 2022.11.08 |
---|---|
생성자, 추상 클래스 (0) | 2022.11.08 |
Collections, List, Set, Map (0) | 2022.11.07 |
do while, break, continue, Switch and Case, (0) | 2022.11.06 |
for문, forEach문, StringBuffer, whil (0) | 2022.11.06 |
댓글