페르소나 

 

고객 파헤치기 ->

  첫째 고객페르소나 분석의 중요성을 이해하는것 

  둘째 페르소나를 설정하는 방법을 습득하는것

  셋째 실제 창업 과정에서의 적용을 배우는 것 

 

페르소나란 ->

  내 솔루션의 필요성을 느끼는 구체적인 가상의 인물 

  내 서비스를 써줄 사람이 누구인가?

 

페르소나를 설정하면 특성에 맞는 맞춤형 MVP를 설계할 수 있음

 

페르소나를 하는 이유

  효율적인 접근을 할수 있음(일반적인 타겟이 아닌 인원이 아니고 실제적인 타겟을 가정함)

  스타트업에서 넓은 대상을 타겟을 하면 소요되는 리소스가 많기 때문에 매출을 낼수있는 특정 고객군에게 어필해보기 위함

 

페르소나 작성 가이드

  기본정보

  이름,나이,성별

  직업,소득, 교육 수준

 

  가족구성,거주지역

  심리적 및 행동적특성

  가치관, 관심사

 

  주요문제점

  집중하는 목표

  구매행동, 소비패턴

 

  상황적 정보

  하루일과, 생활 패턴

  자주방문하는 장소

  온라인 활동 등

 

최대한 디테일하게 묘사하는게 포인트

가상인물에게 목표를 만들어주는게 아니고, 목표를 파악하는게 목표다 

 

[사용자]는, [사용자의필요]가 핋요하다 왜냐하면 [인사이트] 이기 때문이다 

 

고객은 무엇을 원하는가

 

유져 리서치를 왜하는가?

사용자의 행위와 동기를 이해하는 활동

고객의 진짜 문제와 니즈를 발견하고 제품의 개선방안을 도출

 

리서치에서 질문을할때 절대 하지말아야 할 질문은?

만약으로 시작하는 질문, 주관에 기대면 안된다 

 

flutter create를 통해 프로젝트를 생성하면 아래 사진과 같은 구조로 파일구조가 생성되게 된다. 

파일구조를 살펴보자 

 

제일먼저 lib 폴더는 프로그램에서 사용되는 dart파일을 넣어두는 폴더이다.(사진에서도 main.dart가 포함되어있다)
실제 여기서 여러 폴더구조를 만들고 파일을 생성하여 코딩을 하는 폴더이다 

 

다음 android, ios, linux, macos, web폴더인데 각각 디바이스에서 사용할 수 있는 센서등을 사용할때
native언어로 코드를 작성해서 사용하면 된다고 한다 

 

test폴더는 TDD를 위해 lib폴더의 테스트를 생성하기 위한 폴더이다 

 

다음으로 pubspec.yaml은 프로젝트 구성에 대해 선언이 있는곳인데, SDK버전이나, 사용할 라이브러리등을 선언한다
사용방법은 pub.dev에서 선언되있는 dependency를 긁어서 복붙하거나 flutter pub add명령어를 사용해서 라이브러리를 추가하는 방식이다 

 

그 외 파일들은 딱히 프로젝트 사용에 있어 건드릴 필요가 없어 소개는 여기까지 하기로 한다. 

이번주차는 저번주 강의를 이어서 듣고 

심화 프로젝트를 진행하는 주였다. 

 

저번주 강의내용은 모두 이해해서 더 추가로 들을 필요는 없다고 판단이 들어서

프로젝트를 먼저 진행하였다. 

 

문제를 보면 어느정도 프로그래밍 난이도가 있는지 감이 좀 잡히는데 

이번주차 프로젝트는 턴제 롤플레잉 전투 게임을 콘솔로 만드는 것으로 

딱 보았을때 이렇게 만들어야겠다고 아이디어가 떠오르지 않았다.

생각보다 난이도가 있었다

 

하지만 생각보다 아이디어를 쉽게 얻었고(두명의 플레이어가 진행하는 게임으로  (i%2)로 해결함)

그이후의 개인프로젝트 과정에서는 어려움이 없었다. 

도전과제도 생각보다 요구하는 코딩양이 많지 않았다 

 

머리를 회전시키는 일은 너무 즐겁다. 

 

또한 이번주는 팀원간 네트워킹을 통해 앞으로의 팀원을 꾸리는 자리가 있었는데

총 30명이 모두 10분씩 돌아가면서 이야기를 나누었다 

I 인 나로써는 굉장히 노력과 공수가 들어가는 일이였는데, 

다행히 딱 맞는 팀원이 눈에 띄어서 팀을 잘꾸렸다

 

팀을 꾸리고보니 개발/기획/디자이너 가 딱 모였다. 

그리고 아이디어의 방향성에 대해서도 모두 의견이 일치했다

앞으로의 여정이 기대된다. 

 

 

 

'창업 > WIL(Weekly I Learned)' 카테고리의 다른 글

[내일배움] WIL-2  (2) 2024.11.01
[내일배움] WIL-1  (1) 2024.10.25

이번주는 dart의 전반적인 문법을 학습하였다. 

굉장히 많은 개념이 있었는데, 다행히 js를 사전에 공부한 적이 있어 이해를 하면서 넘어갔던거 같다. 

 

개발 프로젝트로는 간단한 쇼핑몰 프로그램을 CUI로 만드는 과제가 있었는데, 난이도가 생각보다 낮아 수월하게 끝낼 수 있었다. 

 

다만 창업 프로젝트는 생각보다 어려웠는데, 무엇을, 왜 분석해야하는지 감이 잘 안잡혔다. 

우리조는 여행 관련 앱을 분석했는데, 관심을 가져본적없는 주제여서 그런지 분석하는데 감이 잘 안잡혔다..

다행히 조원들이 열심히 해주셔서 역시 잘 끝냈던거 같다. 

 

다음주는 문법 심화 과정인데, 과연 얼마나 심화된 과정이 나오는지 기대된다. 

 

https://teem0.tistory.com/25

 

[내일배움] Dart 기초 - 1

컴파일러란?   -> 사람이 쓰는 고급 프로그래밍언어를 컴퓨터의 저급 프로그래밍 언어(Assembly, 기계어)로 변환 시키는 프로그램 컴파일러 종류에는 크게 2가지로 나누어진다  -> JIT(Just-In-Time)컴

teem0.com

https://teem0.tistory.com/26

https://teem0.tistory.com/27

 

[내일배움] dart 심화 문법 - 1 (컬렉션, Enum)

Collection(컬렉션)  - 여러 값을 그룹으로 묶어서 효율적으로 관리하는 데이터 셋  - 종류는 List Set Map이 있다    - List -> 순서가 있는 데이터 셋, 선언할 때 꺽쇠() 사이에 데이터 형을 넣어줘야한

teem0.com

https://teem0.tistory.com/27

 

[내일배움] dart 심화 문법 - 2 (Function, Generic)

Function(함수)   - 입력을 받아 특정작업을 수행하고 반환값을 return하는 코드 블록  - 구성요소로는 (반환타입, 함수이름, 매개변수, 실행할 코드, 반환 값)이 있음  - 아래 코드에서 각각     

teem0.com

https://teem0.tistory.com/28

 

[내일배움] dart 심화 문법 - 3 (Functional Programming)

함수형 프로그래밍에 대해서 배워보자 첫번째 정의는 함수의 연속으로 프로그램을 구성하는 것이라고 생각하면 된다고 한다 Method Chaining이라고도 한다고 한다   - ' . ' 을사용해서 여러개의

teem0.com

https://teem0.tistory.com/29

 

[내일배움] dart 심화 문법 - 4 (Class)

클래스는 개념이 좀 많다알아보자 클래스란?   -> 객채의 구조와 동작을 정의하는 틀객체는?  -> 클래스에서 정의한 구조를 바탕으로 생성된 실제 엔티티 혹은 데이터 클래스를 생성하려면 다

teem0.com

https://teem0.tistory.com/30

 

[내일배움] dart 심화 문법 - 5 (Class상속)

클래스간 상속에 대해서 간단하게 배워보자 정의는?  기존 클래스의 기능을 확장하여 새로운 클래스를 만드는것  하나의 클래스가 다른 클래스의 속성과 메서드를 물려받는것   물려주는 클

teem0.com

https://teem0.tistory.com/31

 

[내일배움] dart 심화 문법 - 6 (Exception)

예외(Exception)에 대해서 알아보자 정의는 프로그램 실행동안 발생할 수 있는 예외적인 상황에서 발생하는 Exception 객체 종류에는 2가지로 나누어질 수 있다  -> Dart가 사전정의한 예외. 자주 발

teem0.com

 

'창업 > WIL(Weekly I Learned)' 카테고리의 다른 글

[내일배움] WIL-3  (1) 2024.11.08
[내일배움] WIL-1  (1) 2024.10.25

비동기 프로그래밍이란?

 

일단 동기(Syncronous)는 무엇이고 비동기(Asyncronous)는 무엇인가?

  -> 동기는 blocking되는 코드 -> 이전 명령이 안끝나면 다음명령이 실행 되지 않음

  -> 비동기는 blocking되지 않는 코드 -> 이전 명령이 안끝나도 다음명이 실행 됨 

 

왜 동기적인 작업이 문제가 될까? 예를들어

  -> 파일을 불러올때

  -> 데이터베이스에 데이터를 쓸때

  -> 네트워크로부터 데이터를 불러올때

등등 여러 케이스에서 한 작업이 끝날때까지 뒤의 모든 작업이 기다리게 된다. 

이럴 경우 시간적으로 손해가 크기때문에 동기화된 작업은 추천 되지 않는다 

 

그렇다면 비동기는? 작업이 완료될때까지 기다리지 않고 다음 작업을 바로 실행함(병렬적)

그렇다면 결과값은? 작업이 마무리되면 그때 데이터를 받음 

 

dart에서는 dart.async 라이브러리를통해 Future, Stream기능, 비동기 프로그래밍을 지원하게 된다 

 

Future을 알아보자

Future을 사용할 때 반환 되는 타입은 Future타입이다. Future타입안에 데이터타입이 명시 된다. 

Future<int> number = Future.value(1);
Future<String> name = Future.value('스트링');
Future<bool> isTrue = Future.value(true);

 

언제 쓰일까?

  -> 하나의 작업에 대해 이벤트가 한번 발생하는 단일 비동기 작업에 사용된다. 

void main(){
  int seconds = 2;
  print('start');
  Future.delayed(Duration(seconds: seconds), () {
    print("waited $seconds");
  });
  print('done');
}

// 출력되는 결과
/*
  start
  done
  waited 2
*/

 

비동기 작업을 동기화 처럼 사용하고자 할때(순서를 지켜서 실행해야할때) async, await키워드를 사용해서 코드를작성한다 

void main() async{
  int seconds = 2;
  print('start');
  await Future.delayed(Duration(seconds: seconds), () {
    print("waited $seconds");
  });
  print('done');
}

// 출력되는 결과
/*
  start
  waited 2
  done
*/

 

하지만 Future은 단 한번만 결과값을 받게 된다. 그래서 Stream을 사용한다

 

Stream에 대해 알아보자

제일 큰 특성은 시간에 따라 연속적인 데이터 흐름을 제공한다

연속적으로 데이터를 받을 수 있기 때문에 프로그램이 임의로 Stream을 종료하지 않는다

사용자가 Stream을 시작하고 끝을 내야한다.

 

예제로 알아보기전에 yield와 listen() method를 알아야 한다 

 

yield는 값을 방출하도록 하는 키워드 -> return 과 비슷하다고 생각하면 된다

listen()은 yield로 방출되는 값을 얻기위해 사용되는 메서드다

 

예제로 알아보자 

참고로 Stream을 적용한 함수에는 async* 키워드를 달아주어야한다 async가 아니다 

아래 예제는 입력받은 숫자부터 0까지 1초를 기다리면서 출력한는 예제이다 

Stream<int> emitNUmbers(int first) async* {
  for(var i = first; i >= 0; i--){
    yield i;
    
    await Future.delayed(Duration(seconds:1));
  }
}

void main() {
  emitNumbers(10).listen((number) {
    print(number);
  }
}

/*
  10
  9
  8
  7
  6
  5
  4
  3
  2
  1
  0
  이 차례대로 출려 됨 
*/

 

참고로 고차함수로 체이닝하여 사용할 수도 있다고 한다. 

체이닝을 사용하면 특정 값만 걸러내서 받을 수도 있을거같다. 

예외(Exception)에 대해서 알아보자

 

정의는 프로그램 실행동안 발생할 수 있는 예외적인 상황에서 발생하는 Exception 객체

 

종류에는 2가지로 나누어질 수 있다

  -> Dart가 사전정의한 예외. 자주 발생하는 예외로는 아래와 같이 있다

    -> DeferredLoadException - 라이브러리 사용시점에 라이브러리가 로드 되지 않았을떄

    -> FormatException - 타입이 서로 안맞을때(int를 String에 넣는다거나..)

    -> IOException - 입출력 관련 동작중 발생하는 예외(FIleDecriptor, socket, protocol등등..)

    -> OSError - 운영체제 레벨에서 발생하는 예외, 운영체제 관련해서 에러코드를 가지고 있다 

    -> TimeoutException - 비동기 결과 돌릴때 시간이 넘 오래걸리거나 할때 발생하는 예외 

  -> 사용자가 정의한 예외

    -> 위 예외에 없을때 사용자가 정의한 모든 예외 

    -> Exception클래스를 상속받아서 아래와 같이 예외 클래스를 만들면 됨. 

// 예외 클래스 생성
class AgeException implements Exception {
  final String message;
  
  AgeException(this.message);
  
  void printAge(int age){
    if (age < 0){
      throw AgeException(null);
    }
  }
  @override
  String toString() => messsage ?? 'AgeException 발생';
}

// 실제 예외 발생 코드
void main(){
  try {
    printAge(-8);
  } catch (e){
    print(e);
  }
}

 

구문을 좀더 자세히 살펴보면

  -> try - 시도하고자 하는 코드 

  -> catch - 발생한 예외를 잡는 코드 

  -> on - catch와 같이 쓰이며 try에서 발생하는 특정타입의 예외를 다루기 위해 사용

on IOException catch(e){
  ...
}

  -> finally - 예외 발생과 상관없이 무조건 마지막에 실행되는 구문

finally{
  ...
}

4개로 나누어진다 

 

마지막으로 throw가 있는데 특정 exception을 발생시키는 구문이다

throw [Exception이름];

 

위와 같이 예외를 발생 시킬수 있다 

클래스간 상속에 대해서 간단하게 배워보자

 

정의는?

  기존 클래스의 기능을 확장하여 새로운 클래스를 만드는것

  하나의 클래스가 다른 클래스의 속성과 메서드를 물려받는것 

  물려주는 클래스는(Super, Parent)라고 부르고 물려받는 클래스는(Sub, Child)라고 부른다

 

어떻게?

  extends 키워드를 사용해서 상속 받는다. 아래 예재가 있다 

class Person{
  void eat(){
    print("냠냠");
  }
}

class Student extends Person {
  void Stury(){
    print('열공');
  }
}

 

특징?

  super키워드를 통해 자식클래스가 부모 클래스의 속성과 메서드를 사용할 수 있다

  자식 클래스는 상속받은 속성과 메서드를 재정의(Overriding)하거나 기능을 확장 할 수 있다(이때 super를 사용한다)

 

특이사항으로는 클래스를 만들때 final 키워드를 붙이면 자식클래스가 해당 클래스를 상속할 수 없다 

클래스는 개념이 좀 많다

알아보자

 

클래스란? 

  -> 객채의 구조와 동작을 정의하는 틀

객체는?

  -> 클래스에서 정의한 구조를 바탕으로 생성된 실제 엔티티 혹은 데이터

 

클래스를 생성하려면 다음과 같이 정의하면 된다

아래 코드는 Person 클래스를 정의하고 있다 

속성으로 name, int를 가지며 생성자를 통해 초기화 하고, method로 introduce를 정의하였다 

// class [클래스이름] { ... }

class Person {
  String name;
  int age;
  
  Person(this.name, this.age);
  
  void introduce() {
    print("안녕, 나이는 $age, 이름은 $name");
  }
}

 

아래코드는 실제로 Person클래스를 사용해서 Person객체를 생성하는 코드이다 

void main(){
  Person p1 = Person('john',24);
  p1.introduce(); // 안녕, 나이는 24, 이름은 john 출력
}

 

클래스는 다음과 같은 구성요소들로 이루어져 있다. 이 같은 구성요소를 클래스의 맴버라고 한다

  -> 속성

    -> 인스턴스 변수(instance variable)

      => 객체에 속해있는 global scope 변수

    -> 지역변수(local variable)

      => method 코드블럭 안에 scoped된 변수

    -> 정적변수(static variable)

      => 클래스 변수라고도 한다 - 객체에 종속되지 않고 클래스 자체에 속하는 변수

      => 같은 클래스를 가지는 객체는 이 변수를 공유한다. 

      => static키워드로 선언한다 

      => Class이름으로 접근한다( Person.[static변수이름] 이런식으로)

      => 따라서 객체를 통해 접근할 수 없다

      => 값을 변경할수 있는데 *매우매우* 조심해서 변경하자. 

 

-> method

    -> 객체의 동작응 정의한다(속성을 변경하거나, 정보를 프린트하거나 등)

    -> 함수와 method차이? 함수는 클래스에 의존하지 않는다 

 

    -> 종류에는 2가지 인스턴스 메서드, 정적 메서드로 나누어진다

    -> 인스턴스 메서드(Instance Method)

      => 객체에 속해있는 method

      => this를 통해 접근 가능함

      => 클래스의 모든 곳에서 접근할 수 있다(scoped)

    -> 정적 메서드(static Method 혹은 class method)

      => method 앞에 'static' 키워드를 붙여야 한다

      => 역시 변수와 마찬가지로 클래스 이름으로 접근한다.

      => *중요* 내부에서 인스턴스 변수 사용 금지 

 

  -> 생성자(constructor)

    -> 기본생성자(default constructor)

      => 자동으로 생성되는 생성자이다 

      => 인스턴스 변수가 모두 초기화 되어있는 상태여야 한다.     

    -> 매개변수 생성자(parameterized constructor)

      => [클래스](this.인스턴스변수);

      => [클래스]([타입] [매개변수]) : this.인스턴스변수;

      => [클래스]([타입] [매개변수]) { this..인스턴스변수; }

      => 위 3가지로 매개변수 생성자를 쓸 수 있다. 

    -> 네임드 생성자(Named constructor)

       => 클래스 method와 같은 형식으로 호출하는 생성자. 예제는 아래와 같다(처음보는 형식이라 적어둠)

Class Car {
  String name;
  List<String> models;
  
  Car.fromList(List values)
    : this.name = values[0],
      this.models = values[1];
}

 

    -> this는 현재 객체를 가르키는 키워드이다. 

      -> this 를 사용해서 맴버 변수와 method에 접근하고 사용할수 있다

+ Recent posts