VScode c++ 개발환경 설정

VScode 설치

https://code.visualstudio.com/download

플러그인 설치

작업폴더 추가

  • 작업폴더 생성 및 추가

WSL - 리눅스에서 GCC 컴파일러 설치

sudo apt-get update
sudo apt-get install build-essential gdb

whereis g++
whereis gdb

Visual code에서 compiler 지정

  • Ctrl + Shift + P -> C/C++: Edit Configuration (UI) 선택
  • 내 작업영역 폴더 선택
  • Configuration name (구성 이름)
    • win32 선택
  • Compiler path (컴파일러 경로)
    • /usr/bin/g++ 입력
  • IntelliSense mode (IntelliSense 모드)
    • gcc x64 선택

확장 플러그인으로 C++ 프로젝트 생성

  • 설치했던 Easy C++ Projects 확장 플러그인으로 CPP 프로젝트 생성
    • Ctrl + Shift + P -> Easy CPP/C++ : Create new C++ project
  • Compiler 지정
    • [WSL] Windows Subsystem for Linux
  • 완료 후 작업영역 안에 bin, include, lib, src 폴더 등등 프로젝트 환경이 만들어진 것을 확인

빌드 테스트

  • main.cpp 파일 확인 후 오픈한 다음 하단 상태바의 Build & Run 버튼으로 실행 확인

디버깅 및 환경 설정

  • c_cpp_properties.json

    {
      "configurations": [
          {
              "name": "Win32",
              "includePath": [
                  "${workspaceFolder}/**"
              ],
              "defines": [
                  "_DEBUG",
                  "UNICODE",
                  "_UNICODE"
              ],
              "compilerPath": "/usr/bin/g++",
              "cStandard": "c11",
              "cppStandard": "c++17",
              "intelliSenseMode": "gcc-x64"
          }
      ],
      "version": 4
    }
  • launch.json

    {
      "version": "0.2.0",
          "configurations": [
              {
                  "name": "(gdb) Launch",
                  "type": "cppdbg",
                  "request": "launch",
                  "program": "(작업폴더영역)/bin/main", // 빌드 완료 후 바이너리 파일이 생성되는 경로
                  "args": [""],
                  "stopAtEntry": true,
                  "cwd": "(작업폴더영역)", // 만든 작업영역 경로 (ex) /mnt/c/vscode/cpp_test
                  "environment": [],
                  "externalConsole": true,
                  "windows": {
                      "MIMode": "gdb",
                      "miDebuggerPath": "/usr/bin/gdb", // 위에서 설치한 gdb의 path, wsl 에서 whereis gdb 명령어로 확인 가능
                      "setupCommands": [
                          {
                              "description": "Enable pretty-printing for gdb",
                              "text": "-enable-pretty-printing",
                              "ignoreFailures": true
                          }
                      ]
                  },
                  "pipeTransport": {
                      "pipeCwd": "",
                      "pipeProgram": "c:\\windows\\sysnative\\bash.exe",
                      "pipeArgs": ["-c"],
                      "debuggerPath": "/usr/bin/gdb"
                  },
                  "sourceFileMap": {
                      "/mnt/c": "c:\\"  // 작업영역 폴더 위치 드라이브로 설정 (ex) D드라이브 -> "/mnt/d": "d:\\"
                  }
              }
          ]
      }
  • task.json

    {
      "version": "2.0.0",
      "tasks": [
          {
              "label": "Build C++ project",
              "type": "shell",
              "group": {
                  "kind": "build",
                  "isDefault": true
              },
              "command": "bash",
              "args": [
                  "-c",
                  "make"
              ]
          },
          {
              "label": "Build & run C++ project",
              "type": "shell",
              "group": {
                  "kind": "test",
                  "isDefault": true
              },
              "command": "bash",
              "args": [
                  "-c",
                  "make run"
              ]
          }
      ]
    }

'공부 > 프로그래밍' 카테고리의 다른 글

[React] 기본 공부  (0) 2018.12.04

Android Kotlin 을 통한 개발

DAY1, SESSION5 Android Kotlin을 통한 개발 전략


  • 개발 전략

    • 기존 코드를 어떻게 전환하고 확장할 것인가?
    • 넌 어느 별에서 왔니? (코틀린 주요기술의 근원)
      • 람다와 함수형
      • 프로퍼티와 함수
      • 연산자 재정의
      • Method Extension
      • Pipe Filter Model
    • 자바에서 코틀린으로 변환 과정
      • 멤버 변수의 초기화
      • @Nullable 처리
      • 중펍 클래스 쪼개기
      • Optional(?.)최적화
    • 코드 효율화를 위한 툴킷 정의와 활용
      • 전역변수와 프로퍼티
      • 연산자 재정의
      • 고차함수 활용
    • 거버넌스의 필요성
    • 맺음말 : 어떤 프로그램이 될 것인가?
  • 기존 코드를 어떻게 전환하고 확장할 것인가?

    • 기존 코드를 어떻게 전환할 것인가?
      • 바뀌는 부분만이라도 변환해 가자?
      • 새로 짜는 부분만?
    • 컴퓨터 언어도 습관이다 -> 잘 안바뀐다
    • 헤어날 수 없는 자바
      • 자바 스타일의 코틀린 코드
      • 기존 자바 코드에서 호출이나 참조가 쉽지 않다.
    • ? 를 이용한 null 처리가 너무 많다.
    • ...........영상을 보자
    • 정적 호출, 클래스 안에 상수 입력 등..

  • 이후 코드 설명 너무 많음...

'공부 > 기본' 카테고리의 다른 글

'머티리얼 디자인' 영상 시청  (0) 2019.04.23
'UX 디자인 시작하기' 영상 시청  (0) 2019.04.23

머티리얼 디자인의 철학과 적용 사례

DAY1, SESSION4 Material Design의 철학과 적용 사례


  • 머티리얼 디자인을 왜 만들었을까?

    • 구글 디자인.. 너무 안좋았다...
    • UX, UI 에 대한 개념이 보편적이지 않았음
    • 2011년 holo 디자인으로 조금씩 개선됨
    • 구글에게 필요했던 것
      • 다양한 폼팩터와 서비스를 아우르는 일관된 디자인 시스템
      • 현대적이고 아름다운 디자인
      • 개발자가 이해하기 쉬운 디자인
  • 머티리얼 디자인의 등장

    • 생산자가 생각한 방식보다도...
    • 사용자는 스스로가 편한 패턴으로 사용한다.
    • 아날로그 고유 속성에 중점
      • 물리적 속성
      • 형태 변환
      • 움직임
      • 높이
      • 음영
      • 객체 간 계층 구조
  • 머티리얼 디자인의 중요 특징

    • 입체적 표면
    • 의미있는 모션
    • 인쇄물 같은
  • 다량의 우수한 머티리얼 디자인 앱이 등장


어려웠던 점

  • 부족한 엔지니어링 리소스

    • 제공되는 라이브러리의 한계
    • 디자인과 개발 프로세스 간의 연결이 자연스럽지 않음
  • 비주얼 표현의 제약

    • 나만의 개성을 표한하기가 어려움
    • 안드로이드 앱을 위한 디자인이라고 착각하기 쉬움(편견)
  • 새로운 머티리얼 디자인 둘러보기

    • 머티리얼 디자인 목표
      • 다양한 플랫폼에서 사용자에게 일관된 경험을 제공한다
      • Create
    • 머티리얼 디자인 주요 특징
      • 기존 3가지
      • 유연한 기반
      • 크로스 플랫폼
  • 머티리얼 디자인

    • 머티리얼 시스템
    • 머티리얼 파운데이션
      • 머티리얼 디자인의 기반
      • 좋은 디자인이란? 질문에 대한 머티리얼 디자인의 제안
        • Environment
        • Layout
        • Navigation
        • Collaboration
        • Typography
        • Iconography
        • Shape
        • Motion
        • Interaction
        • Communication
      • 높이와 그림자
        • Before
          • 너무 까다롭다
        • After
          • 좀더 유연하게 허용해 주자
        • 모든 표면은 높이 값을 갖는다
        • 높이는 계층을 표현할 수 있다
        • 같은 계층에 속한 아이템은 동일한 높이 값을 갖는다
        • 사용자가 서로 다른 높이 값을 구분 할 수 있도록 테두리나 그 회 다른 시각적 요소가 사용되어야 한다.
        • 허용하지 않는 예시
          • 시각적으로 서피스(계층적인 콘텐츠)를 구분할 수 없을 때
    • 머티리얼 가이드라인
  • 머티리얼 디자인 연구 사례 (프로토타이핑 앱)

    • 레시피 앱 - Basil
      • 메뉴 (새롭게 구성한 네비게이션 드로워)
  • 머티리얼 가이드라인

    • 이전보다 훨씬 유연해짐
    • Material Theming (더 큰 우산 - Material Theme)
    • 독창적인 디자인 가능
    • 컬러 테마 (하나의 색을 선택하면 그에 알맞는 계층 색을 맞춰줌?)
      • 컬러 시스템 (색 세트)
      • 컬러 접근성
    • Typography (글자체) : 한글 적용됨
    • Iconography (아이콘)
    • Motion (Animation)
      • 더 과장되고 독창스러운 애니메이션도 허용
    • Tools
      • Theme Editor
        • 디자인 개발
        • Sketch (?)
        • Sticker Sheet (?)
      • Gallery
        • 개발된 디자인 공유 및 협업
        • 검토, 개선, 업데이트, 히스토리
  • 새로운 Components

    • Bottom App Bar
    • Banner
    • Extended FAB (Floating Action Button)
    • Chips : 상단의 메뉴를 끄고 킬수 있도록
    • Image Lists
    • Text Fields
    • Backdrop
  • 안드로이드에서 Material Design Components 사용하기

    • Develop (github)
    • Dependencies
      • com.android.material ~
    • lib
      • Custom View + Custom Style
    • .......... 글로 요약이 힘들다.

'공부 > 기본' 카테고리의 다른 글

'Android Kotlin 을 통한 개발' 영상 시청  (0) 2019.05.14
'UX 디자인 시작하기' 영상 시청  (0) 2019.04.23

디자인 1도 모르는 개발자, UX디자인 시작하기

DAY1, SESSION3 디자인 1도 모르는 개발자, UX디자인 시작하기


  • 앱스토어에 등록되어 있는 앱 수
    • 앱스토어 : 320만
    • 플레이 스토어 : 290만
  • 잘나가는 앱을 만들려면?
    • 버그가 없어야하나?
    • 기발한 아이디어가 필요한가?
    • 새로운게 필요한가?
    • UX 디자인을 해야한다
  • 사용자에게 중요한건
    • 기술력 X
    • 새로움 X
    • 기발한 X
    • 나에게 어떤 가치를 주는가 O
  • UX 디자인은 디자이너가 하는것이 아닌가?
    • UX 디자인은 하나의 Framework
  • 의자 하나를 바라보는 관점
    • 생산자
      • 이윤이 날을까
      • 어떻게 팔까
      • 어떤 소재를 쓸까
      • 완제품, 조립품
      • 어떻게 만들까
    • 사용자
      • 누가 이 의자를 쓸까
      • 왜 이 의자를 쓸까
      • 이 의자의 장점이 뭘까
  • 모든 인간은 디자이너 일까?
    • 절반의 대답은 디자이너는 직업
    • 절반은 디자인 이라는 행위를 하는 사람은 모두 디자이너
      • '지금의 디자인은 보다 근본적인 삶의 문제를 다루고 있다고 생각한다'
      • '디자인적 사고는 문제를 발견해 해결 방법을 제시하는 것이다. 이러한 면에서 모든 인간은 디자인적 사고가 가능하며 디자이너라고 할 수 있다.'
    • 우리는 모두가 디자인적 사고를 하고 디자이너가 되어야 한다.
  • 하나의 팀에서 각자의 역할
    • 리더, 디자이너, 개발자 모두 UX 디자인이라는 하나의 목적지를 목표로 해야한다.

  • Lean UX Cycle

    • Think -> Make -> Check -> Think -> ...
    • 낭비를 줄이는 것이 최우선 목적
    • 효율을 높이기 위해서는 협업이 가장 중요.
    • 삼성 패밀리 ?
      • 초기 UX 디자인 분석 단계부터 개발팀과 함께 진행
      • 기능 목적과 목표를 이해, 구현 가능한 스펙 정의
      • 완성도 높아짐
      • 개발자랑 친해짐
    • AIR
      • UX 디자인 워크샵
      • 서비스 목표와 전략 수립
      • 핵심 기능 도출
      • 플랫폼 전체를 바라보는 시각 형성
    • 기타 프로젝트 설명...
  • UX 디자인 함께 하면 좋은점

    • 공동의 목표를 세워, 자발적이고 주체적인 의사결정이 가능하다.
    • 시간과 비용 중심이 아닌 사용자 가치 중심의 스펙 정의가 가능하다.
    • 밀접한 협업이 가능하다.
    • 신속하게 결과를 도출하고 검증할 수 있다.
    • 낭비를 줄이고 위험요소를 미리 감지할 수 있다.
    • 서비스의 질이 좋아진다.
  • UX 디자인 팩트 체크

    • (O) UI 와 UX 디자인 다르다
      • UI : 기술적인 부분, 사용성, 일관성, 심미성
      • UX : 감정적인 부분, 어떻게 느끼는가, 사용자의 가치, 사용 환경, 지속 사용 여부
      • 사용자 경험?
        • Organic Experience : 자연적인 경험 (비, 바람, 냄새, 자연 환경)
        • Designed Experience : 설계된 경험 (테마파크, 방탈출)
      • 사용자 경험을 설계하는 일이 UX 디자인
      • 경험 순서
        • 경험(자극) - 관심(사용자 가치) - 긍정적 감정(사용자 만족) - 지속 사용
    • (X) 사용성만이 전부이다
      • 매슬로의 욕구 단계 이론
      • UX 욕구 단계 이론 (하위 -> 상위)
        • 유용성 - 신뢰성 - 사용성 - 편의성 - 즐거움 - 의미부여
      • 카노의 만족 모델
        • 매력적인 기능 (Delighter) : 기대하지 않았던 기능 - 있어도 없어도 그만
        • 일차원적 기능 (Performance) : 성능, 가격 - 있으면 좋음 - 비례하여 올라감
        • 당위적 기능 (Must-be) : 사용성, 편의성 - 반드시 있어야 함 - 한계가 있음
      • 사용성이 부족하더라도 매력적인 기능으로 만족도를 올릴 수 있다.
      • 사용성보다 사용자 가치가 높으면 사람들은 잘 사용한다.
    • (X) 시간이 오래 걸리고 비싸다
      • 효율적인 UX 디자인 프로세스 = Lean UX + Agile UX
      • 시간과 비용을 효율적으로 쓸 수 있다. (애자일)
    • (X) UX 디자인은 창의성에 의존한다
      • UX 는 Data 를 매우 좋아한다.
  • UX 디자인 프로세스

    • UX 의 질을 높이는 과정
    • 사용자의 만족을 궁극적인 목표로 삼는다
    • 어떻게 만들 것인가 -> 무엇을 만들 것인가
    • Collaboration 을 넘어서 Co-Create
  • 공동의 비전과 목표

    • 5Q : 서비싕 존재 이유를 정의한다.
      • 프로젝트의 목표는?
      • 내가 이 프로젝트를 통해 얻고자 하는 것은?
      • 우리의 주요 고객은 누구인가?
      • 프로젝트 진행에 걸림돌이 되는 것은? 위험 요소는?
      • 서비스의 성공적인 완성은 무엇으로 판단할 것인가?
  • 사용자를 이해하고 니즈를 구체화

    • 사용자 환경을 이해하고 필요한 것과 원하는 것을 찾는다.
    • Pain & Gain : 사용자의 힘든점
  • 사용자 경험 전략과 가치를 정의

    • 제품 고유한 특징과 사용자 가치를 정의한다.
    • Elevator Pitch
      • 제품 고유의 특징을 바탕으로 제품이 완성되면 가장 이상적
      • 사용자 들이 앱을 사용한 후 (이득인 부분)을 이야기 하면 좋겟다
      • 이것이 가능하기 위해서 (핵심 기능)이 필요하다
  • 기능 도출 : 카노 모델

  • 핵심 기능 실현 가능성 평가

    • NUF Test
      • 프로젝트 초기에 기능을 평가할 때 사용
      • 새로움(New) : 예전에 시도된 적이 있는가?
      • 유용함(Useful) : 문제를 해결할 수 있는가?
      • 실현 가능성(Feasible) : 실행이 가능한가? 리소스와 비용이 적게 들어가는가
  • 사용자 유효성 평가

    • Userbility Test
      • Userbility Test != Focus Groups Interview
        • Userbility Test : 사용자를 직접 대면하며 서비스 이용 상황을 직접 관찰
        • Focus Groups Interview : 사용자를 모아놓고 서비스에 대해 어떻게 대화하는지
      • 사용자에게 일정한 과제를 중 후 앱을 사용하는 것을 관찰
      • 시급한 문제를 구별하고, 다음 업무를 할당하는 것이 주 목적
      • 모든 문제를 찾을 필요 없다. 가장 심각한 문제에 집중
      • 당신이 옳다고 생각하는 때보다 더 일찍 시작하라
      • 프로젝트 진행 중 반복적으로 계속, 자주 하는 것이 중요
  • UX 디자인을 시작하려는 개발자에게

    • 우리는 팀입니다.
    • 우리는 사용자가 아닙니다. 될 수도 없고 되어서도 안됨 (개인의 취향일 뿐)
    • UX 디자인에 참여하는 것에 주저하지 마세요.

'공부 > 기본' 카테고리의 다른 글

'Android Kotlin 을 통한 개발' 영상 시청  (0) 2019.05.14
'머티리얼 디자인' 영상 시청  (0) 2019.04.23



(1~4번 영상)
리액트 소개 및 특징



(5번 영상)
  • webpack
  1. 코드들을 의존하는 순서대로 하나 또는 여러개의 파일로 만들어줌
  2. gulp 와 비슷. 더 좋다
  1. 여러개의 자바스크립트 파일을 하나도 만들어 주거나 규칙에 따라 분리할 수도 있다.
  2. ES6 - 모던 자바스크립트 사용할 때 구형브라우저에서 지원이 안되서 바벨을 이용해 변환하여 여러종류의 브라우저에서 실행 하능
  3. 프로젝트를 만들 때 전체적으로 파일들을 관리해 주는 도구

  • babel
  1. 자바스크립트 변환 도구
  2. 노드나 자브스크립트 엔진에서 모든 문법을 지원해 주지는 않음
  3. 리액트는 JSX 문법을 사용해 컴포넌트를 작성하는데 이때 바벨을 사용함

codesandbox 사용 (https://codesandbox.io/)
리액트 샘플) http://bit.ly/beginreact


[문법]
import : 모듈을 사용함
class : Component 를 만듬 (다른 방법 - 함수를 통해서 만들 수 잇음)
render : 반드시 JSX 형태의 코드를 return 해줘야 함




(6번 영상)
  • JSX : HTML 처럼 생긴 문법이 자바스크립트 코드로 변환됨
  1. 태그는 반드시 받혀야 한다
  2. 최상위 element는 꼭 하나여야 한다. (태그가 2개 이상일 경우 최상위에 하나의 태그로 감싸줘야함)
    이 경우 불필요한 최상위 element가 하나 생기게 되는데 React 16.2 이상에서 fragment 기능으로 방지할 수있다.
  3. JSX 안에서 자바스크립트 값을 사용할 때는 {변수명} 으로 사용한다
  4. var 변수는 scope 가 함수 단위이다.
function foo(){                scope 단위    ┐
    var a = 'hello'                          │
    if(true) {                               │
        var a = 'bye'                        │
        console.log(a) // bye                │
    }                                        │
    console.log(a) // bye                    ┘
  1. const, let 변수는 scope 가 블록 단위이다.
function foo(){                scope 단위         ┐
    let a = 'hello'                               ┘
    if(true) {                               ┐
        let a = 'bye'                        │
        console.log(a) // bye                ┘
    }                                             ┐
    console.log(a) // bye                         ┘
  1. ES6 에서 var 은 더이상 쓰지 않음
    고정 상수는 const, 일반 변수는 let 사용
  2. JSX 내부에서 조건식 사용하기
    1)  삼항 연산자 사용 ( 조건 ? true : false )
    2)  && 연산자 사용
    3)  function 함수 작성 ( => 화살표 함수로도 사용 가능. 화살표 함수는 this, argument super 가 없는 함수임)


+ self closing tag : <input />



(7번 영상)
@ JSX 에서 css 스타일과 class 사용방법

React 사용방법은 기존 css 사용법과 조금 다르다
  1. Style 을 객체 형태로 넣어줌
  2. 속성은 기존 단어가 아닌 특수문자를 제외하고 camel case 로 적는다.
  3. class 는 className 으로 입력해야 한다.
const style = {
    backgroudColor : 'red',   // 기존 : backgroud-color
    color : 'white',
    fontSize : '36px'         // 기존 : font-size
}

// 적용방법
<div style={style} className="app">
</div>

  1. JSX 내부에서 주석은 그냥 출력되어 버린다.
    일반 주석 및 멀티라인 주석 모두 출력됨.
    일반적으로 주석은 멀티라인으로 작성하고 {} 로 감싸준다
return {
    <div>
        // 주석
        /*
            주석
        */
        위 두 주석 모두 오류
        일반적으로 주석은 멀티라인
        {/* 주석 사용 */}
        태그 사이에는 그냥 주석 사요 가능
        <h1
            // 주석 가능
        >
        </h1>
    </div>
}





(8번 영상)
주제 : Props

  • Props : 부모에서 자식으로 일방적으로 전달. 자식에서 값을 변경할 수 없다.(읽기 전용)
  1. <Child value = "value">    : value 가 props 이다
  2. default props 값을 class 내부에 static 으로 지정해 놓을 수 있다
    class 외부에 설정할 수 있지만 static 으로 사용하는게 최신 자바스크립트 문법에 더 알맞다.
- 기본 static 사용법 (최신 사용법)
import React, { Component } from 'react';
import logo from './logo.svg';
import './App.css';

class App extends Component {

static defaultProps = {
name : 'basic'
}
render() {
return (
<div className="App">
props test : {this.props.name}
</div>
);
}
}
export default App;

- 외부 설정
import React, { Component } from 'react';
import logo from './logo.svg';
import './App.css';

class App extends Component {

render() {
return (
<div className="App">
props test : {this.props.name}
</div>
);
}
}

App.defaultProps = {
name : 'basic'
}

export default App;


  • 단순히 불러오기만 할 class 일 경우 함수형 component 로 만든다
- SampleFunctionalCoimponent.js
import React from 'react'

const SampleFunctionalComponent = ({ test }) => {
return (
<div>hi this is sample functional component : {test}</div>
);
};

SampleFunctionalComponent.defaultProps = {
test : 'test hi'
}

export default SampleFunctionalComponent;

- App.js
import React, { Component } from 'react';
import logo from './logo.svg';
import './App.css';

import SampleFunctionalComponent from './SampleFunctionalComponent'

class App extends Component {

static defaultProps = {
name : 'basic'
}
render() {
return (
<SampleFunctionalComponent />
);
}
}
export default App;

1) import 에 Componenet 선언이 필요없다
2) class 선언이 아니고 하나의 변수로 만든다
3) 함수형 컴포넌트의 파라미터 (=test) 는 비구조화 할당 문법이 사용됨.
4) 

* 비구조화 할당 문법
 : 여러 변수 또는 파라미터를 각각의 값에 맞게 할당할 때 하나씩 지정해 주지 않고 객체로 한번에 지정해 주는 방식

  • 함수형 컴포넌트와 클래스형 컴포넌트의 차이점 (함수형 컴포넌트 기준)
  1. state 기능이 없음
  2. life cycle 없음
    > 장점
  1. 초기 마운트 속도가 미세하게 빠르다
  2. 불필요한 기능이 없어서 메모리 자원을 덜 사용한다
- 어떤값을 가져와서 단순히 보여주기만 한다면 함수형 컴포넌트가 약간 더 효율적이다
- 컴포넌트가 매우매우 많다면 조금 더 효율적이겠지만 크게 차이나지는 않을 것이다.



Class Field 문법 : https://tc39.github.io/proposal-class-fields/

(9번 영상)
주제 : state


* state : 컴포넌트 스스로가 가지고 있는 객체. 따라서 컴포넌트 스스로가 값을 변경 할 수 있다. (setState 사용)


- 카운터 하는 소스 작성... ( 카운터에 나오는 숫자는 유동적. 숫자가 바뀔때 마다 rerender 해줘야 한다. )

* 아래는 전부 class 안에 정의한다.

1) state 정의 : 객체여야 한다. 문자열, 숫자 안됨.

2) 객체 안에 요소를 정의 한다.

3) 카운터 값을 변경하기 위해 custom method 를 만든다.

4) 카운터 기능을 위해 증가 감소 함수를 만드는데, 함수 안에서 state 값을 직접 조절하면 안된다.

    컴포넌트에서 state 값이 update 된지 모른다.

5) state 값이 변경되는걸 component 가 알기 위해서는 항상 setState 함수를 통해 변경해줘야 한다.


- 잘못된 state 사용방법

handleIncrease = () => {
this.state.counter = this.state.counter + 1;
}


- 올바른 사용방법

import React, { Component } from 'react';

class Counters extends Component {
state = {
counter : 0
}
handleIncrease = () => {
this.setState({
counter : this.state.counter + 1
})
}
handleDecrease = () => {
this.setState({
counter : this.state.counter - 1
})
}
render(){
return(
<div>
<h1>counter</h1>
<div>value : {this.state.counter}</div>
<button onClick={this.handleIncrease}>+</button>
<button onClick={this.handleDecrease}>-</button>
</div>
);
}
}

export default Counters;


* render 함수는 그냥 함수로 작성했는데 increase, decrease 함수는 왜 화살표 함수( => )로 작성했을까?

  : 증감 함수를 화살표가 아닌 기본 함수로 작성하게 되면 함수 안에서 this 가 어느것을 가리키는지 모르게 된다.

  : 해당 문제를 해결해주기 위해서는 constructor 를 이용해야 한다.

    1) counter component 가 생성될 때 항상 constructor 가 제일 먼저 실행되고,

    2) constructor 에서는 상속받은 Component 의 기본 생성함수를 먼저 호출해주도록 한다. ( super 사용 )

    3) 그 다음 counter component 에서 사용되는 increase, decrease 함수의 this 가 constructor 의 this 라는걸 명시해 준다. ( binding 해줌 )


- 예시

import React, { Component } from 'react';

class Counters extends Component {
state = {
counter : 0
}

constructor(props){
super(props);
this.handleIncrease = this.handleIncrease.bind(this);
this.handleDecrease = this.handleDecrease.bind(this);
}

handleIncrease() {
this.setState({
counter : this.state.counter + 1
})
}
handleDecrease = () => {
this.setState({
counter : this.state.counter - 1
})
}
render(){
return(
<div>
<h1>counter</h1>
<div>value : {this.state.counter}</div>
<button onClick={this.handleIncrease}>+</button>
<button onClick={this.handleDecrease}>-</button>
</div>
);
}
}

export default Counters;



* props 는 부모자 자식에게 넘겨주는 변경 불가능한 값

* state 는 자기 자신이 가지고 있는 변경 가능한 값




lifecycle api : https://react-anyone.vlpt.us/05.html




(10번 영상)
주제 : life cycle api

* life cycle api 사용 시기

 1) component 가 브라우저에 나타날 때

 2) component 가 브라우저에서 업데이트 될 때

 3) component 가 브라우저에서 사라질 때



* 종류 (매우 많다)


1. Mount - Component 가 브러우저에 나타남

  1) constructor : Component 가 만들어질 때 가장 먼저 실행되는 함수

  2) getDerivedStateFromProps : props 로 받은 값을 그대로 state 에 동기화 시키고 싶을 때 사용 (mount, update 두 부분에서 사용)

  3) render : DOM, 태그 등등 정의

 * 이후 브라우저에 표시되고 난 다음

  4) componentDidMount : 외부 라이브러리, 차트 라이브러리 등등 사용할 때, ajax, api 요청을 할 때 이곳에서 실행

                                    뷰가 다 그려지고 스크롤을 이동, 이벤트 listening


2. Update - Component 에서 props, state 값이 변경됨

  1) getDerivedStateFromProps : props 로 받은 값을 그대로 state 에 동기화 시키고 싶을 때 사용 (mount, update 두 부분에서 사용)

  2) shouldComponentUpdate : (중요) component 가 update 되는 성능을 최적화 시킬 때 사용

   - 부모 component 가 rerender 되면 자동적으로 자식 component 도 rerender 된다. 하지만 불필요할 때가 있다.

   - react 는 virtual DOM 을 사용하지만 기본적으로는 rerender가 발생하면 기본 DOM 과 virtual DOM 둘 다 다시 그린 후 변경점을 비교하게 된다

   - 이 기능을 사용하게 되면 virtual DOM 에 그리는 것조차 막아서 뷰의 변경을 방지 할 수 있다. (성능 최적화 관점)

   - 해당 함수는 true, false 값을 반환하며, true 는 render 실행, false 는 실행 안함

 * render 가 실행되고 브라우저에 반영되기 바로 직전

  3) getSnapshotBeforeUpdate : render 되고 브라우저에 표시되기 전에 이 함수에서 특정 로직을 수행한다.

   - 스크롤 위치, DOM 크기 가져오기 등등

 * 위 작업들을 모두 마치고 component 가 모두 update 되고난 후

  4) componentDidUpdate : state 가 변경되었을 때 이전 상태와 현재 상태를 비교해서 특정 작업을 해야할 때


3. Unmount - Component 가 브러우저에서 사라짐

  1) componentWillUnmount : 마운트 때 listen 시킨 이벤트들을 해제할 때 사용됨





lifecycle api : https://react-anyone.vlpt.us/05.html

(11번 영상)
주제 : life cycle api

* 코드 샘플

1. constructor
 - 컴포넌트가 제일 먼저 만들어질 때 호출됨.
 - super 사용 용도 : 상속받은 Component 의 원래 가지고 있던 생성자를 먼저 호출해 주고 작업을 하도록 하기 위함

class App extends Component {
constructor(props){
super(props);
console.log('constructor')
}
........
}

2. componentWillMount
 - 사라짐

3. componentDidMount

class App extends Component {

constructor(props){
super(props);
console.log('constructor')
}
componentDidMount(){
console.log('componentDidMount')
}

.................

}


* 특정 DOM 에 어떤 작업을 하고 싶을 때 ref 사용. ( 태그에 아이디를 붙이는 것과 비슷함. ref 로 직접 가져올 수 있다. )
class App extends Component {
constructor(props){
super(props);
console.log('constructor')
}
componentDidMount(){
console.log('componentDidMount')
console.log(this.myDiv.getBoundingClientRect())
}
render() {
return (
<div ref={ref => this.myDiv = ref}>
hi
</div>
);
}
}



4. componentWillReceiveProps

 - 16.3 부터 사라짐


5. getDerivedStateFromProps

 - 16.3 부터 사용 가능

 - setstate 사용 불가.

 - 변경 할 state 값을 바로 return 해주면 setState 사용하지 않고도 state 에 값이 적용된다.

 - state 와 props 값의 동기화


[StateComponent.js]

import React, { Component } from 'react';
class StateComponent extends Component {
state = {
value : 0
}
static getDerivedStateFromProps(nextProps, prevState){
if(prevState.value != nextProps.value){
return {
value : nextProps.value
}
}
return null;
}
render(){
return(
<div>
<p>props : {this.props.value}</p>
<p>value : {this.state.value}</p>
</div>
);
}
}

export default StateComponent;


[App.js]

import React, { Component } from 'react';
import StateComponent from './StateComponent'
class App extends Component {
state = {
count : 1
}
constructor(props){
super(props);
console.log('constructor')
}
componentDidMount(){
console.log('componentDidMount')
// console.log(this.myDiv.getBoundingClientRect())
}

handleClick = () => {
this.setState({
count : this.state.count + 1
})
}

render() {
return (
<div>
<h1>hi</h1>
<StateComponent value={this.state.count} />
<button onClick={this.handleClick}> click </button>
</div>
);
}
}
export default App;



6. shouldComponentUpdate

 - 다음 받아올 props, state 값을 가져옴

 - return 값에 따라 값의 업데이트 여부가 결정됨 ( true : 업데이트 , false : 안함 )

 - 특정 조건에서 update 를 막아줄 수 있는 함수


7. componentWillUpdate

 - 사용하지 않음



8. getSnapshotBeforeUpdate

 - update 되기 바로 직전 DOM 상태를 return

 - 직전 상태 (스크롤 위치 등) 를 componentDidUpdate 를 통해서 유지 시킬 수 있다.



9. componentDidUpdate

 - getSnapshotBeforeUpdate 에서 획득한 이전 상태를 3번째 파라미터로 받아 작업 진행



10. componentWillUnmount

 - component 가 사라질 때 호출됨


* sample : count 가 10이 넘어가면 StateComponent 를 더이상 표시하지 않게되고

              StateComponent 가 사라지면 StateComponent 클래스에 구현된 componentWillUnmount 에 의해 특정 로직이 수행됨


[App.js]

render() {
return (
<div>
<h1>hi</h1>
{ this.state.count < 10 && <StateComponent value={this.state.count} /> }
<button onClick={this.handleClick}> click </button>
</div>
);
}



11. componentDidCatch

 - component 에서 에러가 발생했을 때 확인할 수 있음

 - render 함수 안에서 에러가 나면 app 자체가 crash 발생함

 - 에러를 캐치하기 위해서는 자식 component 에서는 불가능하고 부모 component 에서만 가능하다





(12번 영상)
주제 : 필요 도구 설치

* 개발환경 설정

1. Node.js 설치 (webpack, babel 을 사용하기 위해 필요)
 - NVM (Node Version Manager) 사용하면 편하다 (추천)  : https://github.com/creationix/nvm


2. yarn 사용 : https://yarnpkg.com/en/docs/install#windows-stable
 - Node.js 를 설치하면 기본적으로 NPM 이 설치되지만, 대신 yarn 을 사용하는걸 추천.
 - NPM 보다 좀더 개선된 버전이라고 보면 됨.


3. IDE
 - 익숙한것 사용하기
 - vscode : https://code.visualstudio.com/


4. git : https://gitforwindows.org/
 - 형상관리


자세한 설치방법은 추후 업데이트



(13번 영상)
주제 : create react app 사용

1. 설치 확인

 - Node.js 버전 확인 :  $ node -v

 - yarn 버전 확인 :  $ yarn -v


2. create-react-app 설치 : https://github.com/facebook/create-react-app

 - 페이스북에서 만든 react 프로젝트를 통합 설치해주는 툴

 - webpack, babel 설치 및 설정을 간소화 시켜줌


설치

$ npm install -g create-react-app

$ create-react-app hello-react

or

$ npx create-react-app my-app



* 프로젝트가 생성되면 개발을 시작해보자!




14번






15번

[배열에 데이터 삽입하기]

(참고)


* 자식 컴포넌트에서 부모 컴포넌트로 값 전달하기


1. 부모 컴포넌트에서 handleCreate 라는 메소드를 만들고 자식 컴포넌트로 props 로 전달한다.
2. 자식 컴포넌트에서 props 로 전달받은 handleCreate 메소드를 호출해서 데이터가 부모 컴포넌트로 전달되도록 한다.

* 기본 form 속성으로 버튼 type 이 submit 일 경우 클릭하면 페이지가 새로고침 된다.
  해당 새로고침을 방지하기 위해 handleSubmit 함수를 작성해준다.

* 리액트에서는 불변성을 꼭 유지해 줘야한다.
* 어떤 값을 수정할때는 꼭 setState 를 사용해야하며, 그 내부의 배열이나 객체를 수정해야 할 때는
   기존 배열, 객체를 수정하지 않고 원본을 기준으로 새로운 배열, 객체를 만들어서 값을 주입해 주어야 함.
* 배열에 추가하는 방식은 concat 사용 (C 언어에서 문자열 이어붙이기와 같은 명령어)

* 배열에 고유한 id 값이 증가하면서 추가되도록 할 때는
  1. '... spread 전개 연산자'를 사용
  2. 기존 속성 값을 그대로 입력
  3. object.assign 객체 사용

* state 에 변수를 선언하는 이유는, render 함수에서 사용하면서 변수가 수정되었을 때 꼭 rerender 되게끔 만들게 하기 위함

[App.js - 새로고침 방지]

handleSubmit = (e) => {
e.preventDefault();
this.props.onCreate(this.state);
this.setState({
name: '',
phone: '',
})
}


[자식 컴포넌트]
- 부모 컴포넌트로 props 전달


[App.js - 배열에 고유 id 값 증가 방법]
1)
handleCreate = (data) => {
const { information } = this.state;
this.setState({
information: information.concat({
...data,
id: this.id++,
})
});
}

2) 
handleCreate = (data) => {
const { information } = this.state;
this.setState({
information: information.concat({
name: data.name,
phone: data.phone,
id: this.id++,
})
});
}

3) 
handleCreate = (data) => {
const { information } = this.state;
this.setState({
information: information.concat( Object.assign({}, data, {
id: this.id++
}))
});
}




16번


[자바스크립트 배열 내장 함수 - map]

(참고)

* 기본 배열 선언 : numbers = [1,2,3];
* map 사용 : squared = numbers.map(n => n * n);
* 사용 -> squared : [1, 4, 9]  -> 기존 numbers 배열을 제곱으로 만들어줌

- defaultProps 지정해 줄때는 항상 static 으로 선언해야 한다.


* 배열에서 키가 없다면 리스트 항목을 추가 제거할 때 매우 비효율적으로 동작한다.

[PhoneInfoList.js]
render() {
const { data } = this.props;

const list = data.map(
info => (<PhoneInfo info={info} key={info.id} />)
);
return (
<div>
{list}
</div>
);
}




17번

[배열 조작]


(참고)

* 배열은 항상 불변성을 유지해야 한다.
* slice 와 concat 을 혼합해서 배열의 중간 값만 제거할 수 있다.
* 제거 방법
 1) slice : 파라미터 (a,b) - a번째에서 시작해서 b번째 까지만 가져온다
 2) filter : 조건으로 값을 가져올 수 있다. - 기존 배열을 변경하지 않는다.

ex) slice


ex) filter

[App.js]
handleRemove = (id) => {
const { information } = this.state;
this.setState({
information: information.filter(info => info.id !== id)
});
}



1





(18번 영상)
[배열 안의 데이터 수정하기]

*  일반적인 데이터 수정 방법 2가지
[
...numbers.slice(0,2),
9,
...numbers.slice(3,5)
]

numbers.map(n => {
if (n == 3) {
return 9;
}
})







(19번 영상)
[shouldComponentUpdate 를 통한 최적화. 불변성을 왜 유지하는가?]

(참고)
Immutable.js : https://facebook.github.io/immutable-js/
Immer.js : https://github.com/mweststrate/immer

* 중첩된 render 가 호출되면 변하지 않는 항목이 다시 render 되는 불필요한 상황이 발생한다
* shouldComponentUpdate 를 통해 방지 할 수 있다.

* 배열, 객체는 call by reference 이므로 하나의 변수를 다른 변수에 동일하게 지정하도록 하면 하나를 변경하면 둘 모두 변경된다.
ex) a = [0,1,2]
     b = a
     b.push(3)
     b = [0,1,2,3]
     a = [0,1,2,3]

* 이럴때는 지정이 아닌 새로운 변수로 만들어지도록 해야한다.
ex) a = [0,1,2]
     b = [...a, 3]

이러한 객체나 배열이 길어지거나 깊어지면 복잡해지는데, 이럴 때 사용하기 좋은 라이브러리가 있다. (참고 확인)




(20번 영상)

[이름으로 전화번호 찾기]

* keyword state 를 추가하고 render 안에서 PhoneInfoList 컴포넌트의 data 속성에 바로 filter 기능을 넣어 검색 가능하도록 만든다





(21번 영상)

[Ref 를 통하여 DOM 에 직접 접근하기


* Ref 사용법 2가지

 1) 함수 사용 : 태그 속성에 ref 함수를 작성. id 를 지정해주는 것과 비슷한듯


 2) (react 16.3 버전 이상에서만 가능)

     상단에 id 설정해 줄때 React.createRef() 를 사용한다

     focus 를 호출할 때는 1번과 다르게 이름 뒤에 current 를 꼭 붙여줘야한다.


input1 = null
input2 = React.createRef();

handleSubmit = (e) => {
e.preventDefault();
this.props.onCreate(this.state);
this.setState({
name: '',
phone: '',
});
// this.input1.focus()
this.input2.current.focus();
}

render() {
return (
<form onSubmit={this.handleSubmit}>
<input
name="name"
placeholder="이름"
onChange={this.handleChange}
value={this.state.name}
ref={this.input2}
// ref={ref => this.input1 = ref}
/>
<input
name="phone"
placeholder="전화번호"
onChange={this.handleChange}
value={this.state.phone}
/>
<button type="submit">등록</button>
</form>
);
}






(22번 영상)

[마치면서]


추천)


1. prettier : 코드 정리

2. 리액트 컴포넌트 스타일링 : css, sass 스타일 컴포넌트를 쉽게 사용할수 잇음

3. immutable.js : 불변성 변수 사용

4. immer.js : 3번과 비슷한데 엄청 비슷

5. 리덕스 : 데이터 관리 시 update 로직을 다른 파일로 분리, 컴포넌트 등 프로젝트 구조를 체계적으로 만들 수 있음

              상태 관리 라이브러리

6. 몹X 라이브러리 : 리덕스랑 비슷? 찾아봐야함

7. 리액트 라우터 v4 : 여러 페이지로 프로젝트를 구성해야 할 때

8. 타입스크립트 : 컴포넌트를 더 확실하게 사용하고 싶을때

9. Jest, Enzyme : 테스트 코드 개발 시 사용


























'공부 > 프로그래밍' 카테고리의 다른 글

[VScode] c++ 개발환경 설정  (0) 2020.01.25

* 책, 인터넷 검색 등으로 확인한 내용을 적어두었습니다.

* 원 출처분들이 원하지 않을 시 수정하도록 하겠습니다.

* https://m.blog.naver.com/lifadviser/221276226054

* http://vlee.kr/1855



코스피 : 증권거래소에 상장된 기업 주식시장. - 대부분의 대기업이 여기 속함

코스닥 : 장외거래주식을 사고 파는 전자거래시스템 - 중소, 벤쳐기업 대상이 많다


시고저종 : 시가/고가/저가/종가


펀더멘털

PER

PBR

PCR

EV / EBITDA

EPS

BPS

EBITDA

현금DPS

현금배당수익률

회계기준


-------------------------------------------------------------------------------------------------------------



* 당기순이익(기업 가치분석 기준지표) = 높을수록 좋다

  - 기업이 일정 기간 동안 얻은 모든 수익에서 지출한 모든 비용을 공제하고 순수하게 남은 이익

  - 년간 순이익이 기업 시가총액의 10% 이상이면 좋음


* 부채비율(재무건전성을 판단하는 기준) = 낮을수록 좋다

  - 계산방법 : 부채비율= 부채/자본 x 100(%)

  - 예를 들면, 자산 150억원, 자본 50억원, 부채 100억원일 경우 부채비율은 200% (100억원/50억원 x 100%)

    즉, 자기돈(자본) 1원을 투입하고 남의 돈(부채) 2원을 투입하여 기업을 경영하고 있는 경우 임

  - 부채비율이 100% 이하인 경우에는 재무구조가 매우 우량한 기업임


* PER = 시가총액 / 당기순익

        = 주가 / 1주당 순이익 (EPS)

  - (Price Earnings Ratio : 주가수익률) = 낮을수록 좋다 

  - 종목의 상대적 수익 가치를 나타내주기 때문에 투자결정시 가장 우선적으로 봐야되는 비율 

  - 계산방법 : 주가/주당 순이익

  - 낮다 = 저평가 / 높다 = 고평가 (잡주에는 해당사항 없음)

  - 10 이하면 괜찮고 6~4 정도로 낮으면 낮을수록 좋다

  - 단! 이익을 내지 못하거나, 이익 변동성이 큰 경우에는 적정 주가수준을 계산하기 어렵다

=> 수익성 지표로 시총을 투자금이라고 한다면 몇년 뒤면 본전을 뽑을 수 있는가의 의미입니다. 적정주가를 구하는 가장 기본적인 지표로 널리 사용됩니다. 낮을수록 저평가되었다고 볼 수 있으며 일반적으로 8이하이면 저평가되었다고 할 수 있습니다.


# PER (주가 수익률, Price Earnings Ratio)는 대충 영어 단어가 주는 의미만 생각하면 주가(Price)와 이익(Earnings) 간의 비율이며 구체적으로 주가를 1주당 순이익으로 나눈 값이다. 여기서 1주당 순이익은 전체 이익을 주식 수로 나눈 값이다. 예를 들어 주가 1만원짜리 기업이 주당 1000원 순익을 거뒸다면 PER은 10이 된다. 따라서 PER이 낮으면 이익에 비해 주가가 저 평가된 종목인 셈이다. 시스템 트레이딩에서 저평가 종목을 검색할 때 유효하게 사용될 수 있는 지표이다.



* PBR = 시가총액 / 자본총액

        = 주가 / 1주당 순자산가치 (BPS)

  - (Price Book - value Ratio : 주가 순자산 비율) = 낮을수록 좋다

  - 회사 청산시 주주가 배당받을 수 있는 자산의 가치

  - 계산방법 : 주가/주당순자산 (순자산 = 자산 - 부채)

  - 수치가 낮으면 낮을수록 자산가치가 저평가되어 있다고 본다

  - PBR이 1 미만이면 주가가 장부상 순자산가치(청산가치)에도 못미친다는 의미 임

  - 단! 은행, 투자회사, 보험 등 자산이 많은 기업이나 

          엔터, 게임, 중소엔지니어링 회사 등 인적자원이 기업의 가치인 회사는 PBR로 회사의 가치를 판단하기 어렵다.

=> 안전성 지표로 시총과 회사의 자기자본의 비율로 회사의 청산가치를 의미하며 낮을수록 안전성이 좋다고 할 수 있습니다. 일반적으로 1이하이면 자산주라고 할 수 있습니다.


# PBR( 주가 순자산 비율, Price Book Ratio)는 주가(Price)와 자산(Book)간의 비율로 이해하면 되고 구체적으로는 주가를 1주당 순자산가치로 나눈 것이다. 1주당 순자산가치는 전체 자산을 주식 수로 나눈 값이다. PER은 이익을 창출하는 가치와 주식간의 비율이며 PBR은 보유하고 있는 가치와 주식간의 비율이다. PBR이 1미만이라면 기업 장부가치보다 주가가 낮다는 뜻이다. 그러나 PBR이 1미만인 기업을 덥석 매수해서는 안된다. 자산을 정확히 측정하기에는 어렵기 때문이다. 하지만 국내 퀀트의 최고 권위자인 서울대학교 컴퓨터공학부 문병로 교수에 따르면 한국에서는 PER보다는 PBR이 효과적이라고 한다. (나무위키 발췌)



* ROE = 당기순익 / 자본총액

        = PBR / PER

  - (Return On Equity : 자기자본이익률) = 높을수록 좋다

  - 투입한 자기자본으로 1년간 얼마만큼의 이익을 냈는지를 나타내는 수익성 지표

  - 계산방법 = 당기순이익/평균 자기자본 ×100

  - ROE 가 높다는 것은 당기순이익을 많이 내 효율적인 영업활동을 했다는 의미

  - ROE 가 회사채수익률보다 높으면 양호한 것으로 평가되며 최소한 정기예금 금리는 넘는 것이 좋다

=> 성장성 지표로 이 지표를 통해 주어진 자본으로 얼마나 효율적으로 수익을 창출하느냐를 알 수 있으며 높을수록 성장성이 우수하고 자본이 빨리 늘어난다고 볼 수 있습니다. 일반적으로 12% 이상이면 자본 효율이 우수하다고 할 수 있습니다.


# ROE(수익률, Return On Equity)는 자본을 이용해 얼마만큼의 이익을 냈는지를 나타낸다. 이왕이면 같은 자본을 이용해서 더 많은 이익을 내면 더 좋은 것이다. ROE 는 자본과 이익간의 비율(배율)이기에  PBR / PER 로 계산될 수 있다. 예를 들어 자본총액이 1억원인 회사가 천만원의 이익을 냈다면, ROE는 10(%)이 된다.

  브라운스톤은 ROE/PER > 3보다 클 경우 투자 가치가 있다고 했다. PER 지표 하나만 보기에는 미래 기대감으로 주가가 높게 형성될 수도 있기에 이를 견제하는 의미로 ROE를 연관시킨 것이라 이해할 수 있다. PER보다 최소 3배만큼 ROE도 커져야 한다는 의미이다. 가령 PER이 10이면 ROE는 30(%) 이상되어야 한다. PER이 높을수록 그에 대응하는만큼 수익률도 커져야 투자가치가 있다고 판단한 것이다. 왜 3일까는 일종의 통계자료에서 추정된 값이 아닐까 생각된다. 미국의 통계에 맞춘 자료이니 참조만하길 바란다.


-------------------------------------------------------------------------------


BPS(주당순자산) Book-value Per Share

순자산(자산-부채)을 발행 주식수로 나눈 값. ‘청산가치’라고도 불린다.

예시)

BPS는 회사의 자산 가치를 반영한 지표이므로 BPS가 클수록, 현재 주가와 격차가 적을수록 좋다.

실제)

다음은 2016년도 기준 카카오의 재무정보의 일부이다. 정말 단순하게 계산하면 아래와 같이 54,763원이 BPS값이 된다. 하지만, 실제 증권사이트에서 계산된 값을 보면 50,769원으로 나온다. 상세 계산에는 추가로 고려되어야 할 것이 있겠지만 대략 아래와 같다고 보면 된다.

즉, BPS가 현재 주가와 큰 차이가 없거나 높다면 해당 주가는 투자하기에 매우 좋은 가격이라고 할 수 있다.

PBR (주가순자산비율) Price Book-value Ratio

PBR은 현재 주가가 순자산에 비해 얼마의 비율을 갖는지를 나타내는 지표이다.

예시)

위와 같은 경우 주당순자산 대비 주가가 2.2 배 높은 주식이다. 일반적으로 PBR이 높은 주식은 상대적으로 가치대비 높은 주가를 가졌다고 볼 수 있다.


EPS(주당순이익) Earning Per Share

EPS는 기업이 벌어들인 수익을 발행주식수로 나눈 값이다. EPS가 높다는 것은 그 회사가 주당 이익율이 높다는 것으로 경영실적이 양호하여 투자 가치가 좋은 회사로 평가 할 수 있다.


PER(주가수익비율) Price Earning Ratio

PER은 현재 주가를 EPS로 나눈 값으로,  현재 주가가 순수익의 몇 배의 비율을 갖는지 나타내는 지표이다. PER이 높으면 현재 주가가 회사가 내는 이익보다 높은 평가를 받고 있는 것이다


ROE(자기자본이익률) Return On Equity


ROA(총자산이익율) Return On Assets

PBR은 1미만, PER은 낮은, ROE는 높은 종목이 우량


참고

http://soulgraphy.com/97

https://md2biz.tistory.com/318?category=713073

+ Recent posts