어플리케이션에서 데이터 교류 및 state 관리를 쉽고 효율적으로 하게 해준다.

Redux는 React.js 외에도, jQuery 혹은 Angular 를 사용하는 어플리케이션에서도 사용 될 수 있다.

즉, JavaScript 어플리케이션에서 data-state 와 UI-state 를 관리해주는 도구이다.


React에서의 데이터 흐름은 단일 방향으로만 흐른다.

parent-child 관계를 통하여 데이터를 교류하게 된다.

컴포넌트 갯수가 많아진다면.. 혹은 데이터를 교류 할 컴포넌트들이 복잡해지기떄문에 한계가 있다. 

그렇다고 parent-child 관계를 지키지않고 컴포넌트끼리 직접 데이터를 교류하는 방법이 가능하다. 

하지만, React 에선 절대 권장되지 않는 방법이다. 

코드 및 구조가 정말 복잡해지고, 잘못하다간 스파게티와 같은 코드가 만들어질 수있기 때문이다.


이러한 문제를 해결하기 위해 나온 개념이 바로 Flux이다. 

Flux는 디자인패턴이다. 이것은 기존의 MVC 패턴을 좀 더 발전시켜 만든 디자인 패턴이다.

MVC 패턴은 Model과 View가 늘어난다면 매우 복잡해진다. 

위 문제를 해결하기 위해서 FLUX 라는 디자인 패턴이 만들어졌다. 

시스템에서 어떠한 Action 을 받았을 때, Dispatcher는 받은 Action들을 통제하여 Store에 있는 

데이터를 업데이트한다. 그리고 변동된 데이터가 있으면 View가 다시 렌더링된다. 

그리고, View에서 Dispatcher로 Action을 보낼 수도 있다. 

Dispatcher은 작업이 중첩되지 않도록 해준다. 

즉, 어떤 Action이 Dispatcher를 통하여 Store에 있는 데이터를 처리하고, 

그 작업이 끝날 때 까지 다른 Action들을 대기시킨다.


Redux는 Flux 아키텍쳐를 좀 더 편하게 사용 할 수 있도록 해주는 라이브러리이다.

store에서 모든 데이터를 담고 있고, 

컴포넌트끼리는 직접 교류하지 않고 store 중간자를 통하여 교류한다.

Posted by sungho88
,

1. 패키지 매니져..  초콜렛을 설치한다.


$choco install nodejs.install $choco install python2


노드 js와 python2를 설치한다. 그다음, 


$npm install -g react-native-cli

좀 오래걸린다.  설치를 다 했다면,


1. 안드로이드 스튜디오가 깔려있지 않다면 다운로드 받아야 한다.

2. 원하는 디렉토리로 이동 후,

3  AVD를 실행시킨 뒤, 켜지면, 명령어를 입력하러 cmd로 들어간다.


$react-native init <원하는 폴더명> $cd <원하는 폴더명> $react-native run-android // 에뮬레이터에 react-native앱을 실행시키겠다는 명령어

 

이렇게 하면, 에뮬레이터에 뜬다.


만약 에러가 발생한다면, sdk의 환경 변수 문제이므로 시스템 속성 - 환경 변수에 

platform-tools와 tools의 경로를 추가해주면 된다.


에뮬레이터에 Welcome 어쩌고가 나오면 예제 띄우기 성!공!

3. Android Debugging Menu 띄우기 : 에뮬레이터에서 Ctrl + M을 입력하여 띄울 수 있음.


 

Posted by sungho88
,

이게 정말 열받는다!! 스페이스로 인위적으로 맞춰보려했으나. 아무리해도 실패!!

찾아보니 씨언어와 같이 해주면 된다고 하더라.

%5d : 정수를 전체 자릿수 5자리로 오른쪽 정렬로 출력하라.

코드 

System.out.printf("%5d  PERFECT",number);


이렇게 하면 



요렇게 잘 정렬되어 나오게 된다...

Posted by sungho88
,

예를들어 4를 입력받으면 1 2 4가 출력되고, 6을 입력받으면 1 2 3 6이 나오도록 코드를 짜보자.

약수란, 나누어 떨어지는 것을 의미하므로 코드상으로 아래와 같이 작성하면 결과가 출력된다.


import java.util.Scanner;

public class Main {

public static void main(String[] args) {

Scanner scanner = new Scanner(System.in);

int number = scanner.nextInt();

if (number <= 10000) {

for (int j = 1; j <= number; j++) {

if(number%j==0)

System.out.println(j+" ");

}

}

}

}

Posted by sungho88
,

C언어에서 포인터를 잘 이해하기 위해서는 메모리 공간에 대한 그림을 잘 그리는 것이 중요하다.

또한, C언어에서는 시작번지만을 가지고 위치를 표현한다.

자료형 int num = 7; 의 위치가 어디냐?

라는 질문을 했을 때, 4바이트이므로 어디부터 어디까지입니다. 라는 대답을 할 수 있다.

하지만, 시작번지를 알면 int형이 4바이트임을 알고 있으므로 끝은 쉽게 계산할 수 있기 때문이다.

이 시작번지가 바로 주소값이며 이 역시 정수이다. 따라서, 이것 역시 저장 가능하며 이를 저장하기 위한 변수가

바로 포인터 변수이다.

즉, 포인터 변수는 어떤 변수에 대한 메모리에 할당된 주소값을 저장하기 위한 변수이다.   

int num = 7;          // 일반적인 변수 선언

int *ptr = &num;    // 포인터 변수 선언 후 num의 주소값을 포인터 변수 ptr에 저장

ptr는 포인터 변수명이며, int *는 int형 변수의 주소값을 저장하겠다는 의미의 포인터 변수의 선언이다.

&연산자 : 주소값을 가져오는 연산자이므로. 즉 ptr = &num의 경우 num의 주소값을 ptr변수에 저장한다.

그리고 이러한 것을 포인터 변수 ptr이 int형 변수 num을 가리킨다.  라고 표현한다.

말그대로, 포인터 변수 ptr에는 변수 num의 주소값이 들어있고, 아래 그림과 같이 가리키고 있다. 

 

-

[포인터 변수 선언하기~!]

포인터 변수는 가리키고자 하는 변수의 자료형에 따라서 선언하는 방법이 달라진다.

  • int형 변수를 가리키는 포인터 변수의 자료형은 int

  • double형 변수를 가리키는 포인터 변수의 자료형은 double

  • char형 변수를 가리키는 포인터 변수의 자료형은 char

아래와 같은 변수의 자료형에 맞지 않는 포인터 변수의 선언은 문제가 발생할 수 있다.

int main(void) {

double number = 10.123;

int * ptr = &number;

printf("%d", *ptr);

}

컴파일 에러는 발생하지 않지만, 많은 문제를 일으킬 수 있다.

다양한 포인터 형이 존재하는 이유는 메모리 공간을 참조하는 기준이 된다.

즉, 포인터 형의 정의는 *연산자를 통핸 메모리 공간의 접근 기준을 마련하기 위해서이다.

위에 같은 코드에서는 변수는 double형 8바이트이지만, int *이므로 ptr 포인터변수는

intg형이므로 4바이트의 값을 구하게 되고 결국은 쓰레기값이 생성되므로 무의미하다. 

[포인터와 관련이 있는 연산자들~!]

&연산자 : 변수의 주소값을 반환하는 연산자.

- 피연산자의 주소값을 반환하는 연산자이다.

 - &num 과 같이 우측에 변수가 와야하고, 상수가 올 수 없다.

*연산자 : 포인터가 가리키는 메모리를 참조하는 연산자.

- 포인터가 가리키는 메모리 공간에 접근할 때 사용하는 연산자이다.

- 여태껏 포인터 변수에 주소값을 저장만 했고, 사용하지 않았다. 사용하지 않을거면 왜 포인터변수를 만드나?

바로 이 연산자를 이용하여 포인터 변수가 가리키는 메모리 공간인 변수에 접근하여 값을 조작할 수 있다.

다음과 같이 사용이 가능하다.

int main(void) {

int num = 20;

int * pnum = &num;

*pnum += 50;                    // pnum  = pnum + 50

printf("%d", *pnum);        

}

결과는 : 70

 

[잘못된 포인터의 사용과 널 포인터의 사용]

포인터 변수에는 메모리 주소값이 저장되고, 이를 이용하여 해당 메모리 공간에 접근도 가능하기 때문에

상당히 주의를 기울여야 한다.

1. 포인터 주소값을 넣지 않을 때.

int * ptr;        // 주소값을 저장하지 않았다!!!!

ptr = 500;      // 그리고 500을 대입하였다!!!!

이럴 경우. 쓰레기값이 삽입된다. 그런데 그 쓰레기값이 하필 OS에서 중요한 메모리 공간이었다면?

치명적인 문제가 발생할 수도 있다. 요즘은 컴퓨터가 많이 좋아져서 자동적으로 프로그램을 중지시켜

메모리에 접근을 방지한다고 한다.

하지만, 이렇게 쓰게 되면 쓰나마나.

2. 변수의 주소값을 이상하게 넣었을때.

int * ptr = 255;  // 주소값이 255가 어디여???

ptr = 500;      // 그리고 500을 대입하였다!!!!

255가 어딘줄 알고 저장을 해? 이것 역시 쓰레기값이다.

3. 포인터 변수 초기화 시키는 방법 -> NULL

포인터 변수를 먼저 선언해놓은 뒤, 나중에 사용하고자 한다면 0 또는 NULL로 초기화를 해준다.

int *ptr1 = 0;

int *ptr2= NULL;

0을 널 포인터라고 하며, 0은 0번지가 아니라 아무것도 가리키지 않는다는 의미이다.

NULL 역시 이는 실제로 상수 0으로 정의되어 있다.

 

 

 

Posted by sungho88
,