[TIL] Dart 객체 지향 프로그래밍

티라노·2024년 10월 30일
0

Today I Learned

목록 보기
9/21
  • Dart 언어를 이용한 객체 지향 프로그래밍, 예외 처리, 라이브러리, 비동기 프로그래밍 학습
  • 쇼핑몰 프로그램 도전 기능 개발

객체 지향 프로그래밍

객체(Object)를 사용하여 프로그래밍을 구성하는 방식이다.

클래스

객체의 구조와 동작을 정하는 틀이다. dart에서는 아래처럼 선언한다.

class ClassName{
	// 멤버 변수
    // 멤버 함수
}
인스턴스 변수와 정적 변수의 차이
인스턴스 변수정적 변수
키워드-static
접근법객체를 통해서클래스 이름을 통해서
개체끼리 값 공유XO

메서드

객체의 동작을 정의하는, 클래스에 의존하는 함수이다.
함수를 정의할 때 정적 메서드 안에서는 정적 변수만 쓸 수 있고, 인스턴스 메서드 안에서는 타입에 상관 없이 전부 쓸 수 있다.

제네릭 클래스

타입이 유연한 클래스이다. 특정 타입에 의존하지 않고 여러 타입에 동일한 클래스 양식을 적용할 수 있어서 효율적이다.

class ClassName<T> {
	T value;
    T function(){}
}

상속

새로운 클래스를 만드는 방식 중 하나로, 기존 클래스의 기능을 다른 클래스에게 물려줌으로써 확장할 수 있지만 동시에 중복되는 코드를 두 번 작성할 필요가 없어 편리하다.

class Person {}
class Student extends Person {}
  • 부모 -o-> 자식 : 속성, 메서드
  • 자식 -x-> 부모 : 속성, 메서드
  • 자식 클래스에서 부모 클래스의 속성, 메서드를 사용하려면 super키워드를 쓴다.
  • ※ 자식 클래스 객체가 부모 클래스 객체의 구성요소를 사용할 때는 그냥 써도 되지만 자식 클래스 자체적으로 사용하려면 super가 필요하다.
  • 클래스 앞에 final을 붙이면 부모 클래스로서 기능하지 않는다.

오버라이딩

자식 클래스는 부모로부터 상속받은 속성, 메서드를 재정의할 수 있는데 이를 오버라이딩이라고 부른다.


void functionToOverride(){}

오버라이딩을 하면 함수 이름이 바뀌지 않지만, 자식클래스의 함수를 호출할 때 자동으로 부모 클래스의 원본이 아닌 재정의된 함수를 호출한다.
데코레이터(@override)를 생략해도 되기는 하지만 써주는 것이 좋다.


쇼핑몰 프로그램(2)

필수 기능 2 / 도전 기능 3 - 장바구니 구현

우선 장바구니에 담긴 물건의 집합을 표현하기 위해 Set을 선언했다.

var cartSet=<Product>{};

Dart에서 SetList와 같은 방식을 써서 공백으로 선언하면 Map이 되어버리기 때문에 위처럼 선언했다.

다음은 예외 처리 단계이다. Exeption을 이용해서 사용자의 입력이 올바른지 판단하는 InputExeption 클래스를 생성해주었다.

class InputExeption implements Exception{
  String? alertMessage;
  InputExeption(String? alertMessage){
    this.alertMessage=alertMessage;
  }
}

그리고 나서 판매 목록에 사용자가 입력한 상품명이 존재하는지 알아보는 기능을 만들다가 막혔다.

문제 : Dart에서 class로 이루어진 List가 있을 때, contains()를 이용해서 해당 클래스의 멤버변수를 검색할 수 있나?

튜터님께 질문을 드렸는데 불가능하다고 해서 상품 목록을 Map으로 바꿔보았다.

문제 : 사용자가 장바구니에 담고 싶은 상품 이름을 한글로 전달하는데 인식이 안 된다. -> Windows 인코딩 오류 (해결못함)


도전 기능 4 - 나만의 기능 추가 (상품 개수 표기, 상품 삭제)

현재 코드에서는 장바구니에 담은 상품의 종류와 모든 상품 가격 총합만을 다루고 있는데, 이런 형태이면 어떤 물건이 몇 개 있는지 알기 어렵다.
또한 장바구니에서 물건을 삭제하는 로직을 만들 수 없다. 예시를 들어 보자.

5,000원짜리 양말 4장, 10,000원짜리 셔츠 1장을 담은 장바구니의 총합 금액은 30,000원이다. 이 때 장바구니에서 양말 6장을 삭제하여도 오류가 발생하지 않는다.

따라서 각 물건마다 몇 개를 담았는지 명시할 필요가 있다. 도전 기능 3번에서 장바구니에 담긴 물건의 목록을 Set으로 표현하였는데, 이를 Map으로 바꿔서 물건의 이름과 개수를 짝지어 저장해보았다. 이때 key는 물건의 이름, value는 개수가 된다.

처음부터 Map에 모든 상품의 개수를 0으로 해서 미리 넣어두면 나중에 상품 개수를 조절하기 편할 것이다.
하지만 이렇게 하면, 지금 만드는 프로그램처럼 상품 종류가 5개 정도인 경우에는 괜찮지만, 상품을 1000개씩 파는 쇼핑몰에서는 하나하나 넣어주기 곤란할 것이다. 따라서 다음과 같은 로직으로 만들었다.

  1. 사용자가 상품 담기를 요청한다.
  2. 담은 상품 이름과 동일한 keyMap에 존재하는지 확인한다.
    2-1. 처음 담는 상품일 경우 Map에 새 데이터를 추가한다.
    2-2. 1개 이상 담겨있던 상품일 경우 개수(key)만 조절한다.

필수 기능 1번 : 판매하는 상품 목록
필수 기능 2번 : 상품을 장바구니에 추가
필수 기능 3번 : 금액 총합 출력
필수 기능 4번 : 프로그램 종료

도전 기능 1번 : 프로그램을 종료할지 한 번 더 묻는 기능
도전 기능 2번 : 장바구니 초기화

도전 기능 3번 : 장바구니 상품 목록+금액 총합 출력
도전 기능 4번 : 자유롭게 기능 추가(구상)

0개의 댓글