[TIL] Dart 기본문법 part.2

한철희·2024년 11월 2일
0

TIL

목록 보기
57/57

4. 함수

함수는 여러 코드 또는 반복 사용되는 코드를 묶어둔 것이다.

void 함수이름() {
	print("함수 실행코드입니다")
}

이런 형식으로 작성한다
작성한 함수를 호출하여 사용하려면

함수이름();

이런식으로 함수의 이름을 호출하여 사용하면 된다.

다음은 함수의 입력, 출력 기능을 추가했을 때의 방법도 알아보자

1) 입력

hello("영희");

void hello(String name) {
	print(name + " 안녕?"); // 영희 안녕?
}

위는 입력값을 한개 받을 경우이다
"영희"라는 문자열 값을 name 변수로 받아서 함수가 동작한다.

입력값을 여러개 받는 방법도 있다.

hello("영희", "오늘 하루 어때?");

void hello(String name, String message) {
	print("$name : $message"); // 영희 : 오늘 하루 어때?
}

위처럼 ,를 이용해서 여러값을 받을 수 있다.
이때는 순서대로 매개변수 값이 전달된다.

매개변수의 이름을 지정해서 전달해 줄수도 있다.

hello(from: "영희"); // 변수명을 같이 작성
hello(); // 전달하지 않을 수도

void hello({String? from}) {
	print("$from : 오늘 어때?");
}

4번째 줄에 중괄호가 씌워진 {String? from} 부분이 이름지정 매개변수(Named Parameter) 라고 불린다
그리고 이것은 함수 호출시 값을 전달하지 않아도 되므로 null이 될 수 있는 String?으로 선언되었다

그러나 회원가입 시 입력하는 이메일처럼 꼭 입력이 필요한 경우가 있을것이다
그럼 null 값을 안받고 싶으면 어떻게 하면될까?
requred 라는 키워드를 사용하면 된다.

hello(from: "영희"); // 변수명을 같이 작성

void hello({required String from}) {
	print("$from : 오늘 어때?");
}

required 키워드를 붙이이고 String?String 으로 변경했다.
이렇게 하면 함수 호출시 필수적으로 해당 매개변수를 전달하게 된다.


2) 출력

입력을 알아봤으니 출력도 있겠죠?

String id = getId();
print(id); // myhan601

String getId() {
	return "myhan601";
}

String최종적으로 반환하는 값의 타입
그리고 반환하고자 하는 값 앞에 return 을 적습니다

이렇게 하면 String id = getId(); 부분에서 함수 호출 때 id 에 myhan601 값이 들어가게 됩니다.

3) 입출력

입력과 출력을 할 줄 알게되었으니 둘을 동시에 해봅시다!

String coffee = getCoffee("바닐라");
print(coffee); // 바닐라라떼

String coffee(String material) {
	return material + "라떼";
}

여기서 입력값으로 "바닐라" 가 들어가고
반환값에서는 String 값에 "라떼'를 붙여서 "바닐라라떼"를 반환한다
참 쉽죠?


5. 클래스

1) 형식

클래스는 별수와 함수를 모아둔 틀입니다

class 클래스이름 {

}

이 처럼 작성합니다
변수에서 카멜케이스를 쓰는것과 달리 클래스는 파스칼케이스를 따릅니다
ex) class Bread {}


2) 클래스 구성 요소

클래스는 3가지의 요소로 구성됩니다

속성(property) : 클래스 내부 변수
메소드(method) : 클래스 내부 함수
생성자(constructor) : 클래스 명과 동일함 함수

  • 속성 : 클래스 내의 변수를 속성이라고 부릅니다.
    저는 주로 프로퍼티라고 합니다
class Latte {
	String content = "바닐라"; // Latte 클래스가 가진 속성
}
  • 메소드 : 클래스 내부의 함수를 메소드라고 합니다
class Latte {
	String content = "바닐라";
    
    // Latte 클래스가 가진 메소드
    String getDescription() {
    	return "맛있는 $content라떼입니다."; // 맛있는 바닐라라떼입니다.
    }
}
  • 생성자 : 클래스명과 동일한 함수를 생성자라 부릅니다
class Latte {
	
    // 생성자
    Latte() {
    }
}

생성자는 반환타입을 명시하지 않습니다
또한 중괄호를 생략하여 쓸 수도 있습니다

class Latte {
	
    // 생성자
    Latte()
}

생성자 함수에 입력 값을 전달 받아 속성(property)에 넣어 줄 수도 있습니다

class Latte {
	String? content;
    
    // 생성자 호출시 core를 전달 받는다
    Latte(String core) {
    	content = core; // 전달 받은 core를 content에 대입
    }
}

4) 인스턴스

이제는 그래도 제법 익숙해진 개념 인스턴스다
가장 많이 드는 예로 빵틀(클래스)로 찍어낸게 빵(인스턴스)이다.

생성자 함수를 호출해서 클래스에 정의된 프로퍼티와 메소드를 가진 객체인스턴스 입니다!
간단한 예제로 살펴보죠!

void main() {
	// 인스턴스 생성
	Latte latte1 = Latte('딸기');
    Latte latte2 = latte('바닐라');
    
    // 프로퍼티 호출
    print(latte1.content); // 딸기
    print(latte2.content); // 바닐라
    
    // 메소드 호출
    print(latte1.getDecription()); // 딸기라떼입니다.
    print(latte2.getDecription()); // 바닐라라떼입니다.
}

class Latte() {
	// 프로퍼티
	String? content;
    
    // 생성자
    Latte(String core) {
    	content = core;
    }
    
    // 메서드
    String getDecription() {
    	return "$content라떼입니다.";
	}
}

latte1latte2는 각각 Latte 클래스로 생성한 인스턴스입니다
따라서 Latte 클래스가 가지고있는 conent 프로퍼티와 getDecription() 메서드 를 똑같이 가지고있죠.
그래서 latte1.content 같이 호출하여 조회할 수 있습니다


4) 상속

상속도 클래스에서 중요하게 다루어지는 항목입니다
쉽게 말하면 다른 클래스B의 프로퍼티와 메서드를 클래스A에서도 사용할 수 있게 해주는 겁니다
그래서 물려받았다는 의미의 상속(extends) 라고 표현합니다

물려받은 클래스A를 자식(child), 물려준 클래스B를 부모(super)라고 합니다

void main() {
	// 인스턴스 생성
	IcedLatte icedStrawberryLatte = IcedLatte('딸기');
	
	// 프로퍼티 호출
	print(icedStrawberryLatte.content); // 딸기
	
	// 메소드 호출
	print(icedStrawberryLatte.getDescription()); // 시원한 딸기라떼입니다.
}

class Latte {
	// 프로퍼티
	String? content;
	
	// 생성자
	Latte(String core) {
    	content = core;
    }
	
	// 메서드
	String getDescription() {
		return "$content라떼입니다.";
	}
}

class IcedLatte extends Latte { // Latte 클래스를 상속한 IcedLatte
	// 생성자
	IcedLatte(String core) : super(core);
	
	// 메서드 오버라이드
	
	String getDescription() {
		return "시원한 $content라떼입니다.";
	}
}

간단한 예시를 작성해봤습니다
이전에 사용한 Latte 클래스를 IcedLatte클래스가 상속을 받고있군요

다른건 이전과 비슷한데 IcedLatte클래스에서 다른점이 보입니다
super@override라는 키워드가 보이네요

super 키워드는 부모 클래스의 구성 요소들에 접근할 때 사용합니다

IcedLatte(String core) : super(core);

여기서 super(core)super를 사용해서 Latte 클래스의 생성자에 core값을 전달합니다
IcedLatteLatte의 content 프로퍼티를 초기화할 수 있도록 해주죠


override 키워드는 부모클래스의 메서드를 자식 클래스에서 재정의 할때 쓰입니다


String getDescription() {
    return "시원한 $content라떼입니다.";
}

위 코드에서 @override 키워드를 통해 부모 클래스의 메서드를 재정의하여
자식 클래스만의 버전을 만듭니다.
그래서 getDescription() 메서드의 내용이 달라진것이죠


이렇게 기본적인 dart 문법에 대해서 간략히 알아보고 정리했습니다
이제 실습 문제만 몇개 풀어보고 예제 앱 제작을 시작할거같네요

profile
초보 개발자 살아남기

0개의 댓글