241125

lililllilillll·2024년 11월 25일

개발 일지

목록 보기
1/350

🎮 Lotus on Frog


플레이스토어에 출시해보기

https://velog.io/@psb7391/%EA%B5%AC%EA%B8%80-%ED%94%8C%EB%A0%88%EC%9D%B4-%EC%8B%A0%EC%9B%90-%ED%99%95%EC%9D%B8

이거 보고 주민등록등본 pdf로 받아서 신청
돈 받을 때 신원 등록이 필요한거지 앱 등록 자체는 그냥 할 수 있는듯?

https://www.youtube.com/watch?v=RNYQZ0h4e-c

이거 보고 광고 붙여보려고 했는데

https://disquiet.io/@chochemong/makerlog/%EB%84%88%EB%AC%B4%EB%82%98-%ED%9E%98%EB%93%A4%EC%97%88%EB%8D%98-%ED%94%8C%EB%A0%88%EC%9D%B4%EC%8A%A4%ED%86%A0%EC%96%B4-%EC%B6%9C%EC%8B%9C-%ED%9B%84%EA%B8%B0-feat-%EB%B9%84%EA%B3%B5%EA%B0%9C-%ED%85%8C%EC%8A%A4%ED%8A%B8

앱 등록하는게 생각보다 오래 걸리는 일이었다.



📖 게임 엔진 아키텍처


블리치 바이패스

  • 원래 의미:
    • 필름 현상 과정에서 은염(흑백 정보)을 제거하는 '표백(Bleach)' 과정을 건너뛰는(Bypass) 방식.
    • 이로 인해 필름에 은염이 남아 있어, 이미지의 흑백 정보와 색상 정보가 동시에 표현됩니다.
  1. 고대비 이미지:

    • 밝은 부분은 더욱 밝게, 어두운 부분은 더욱 어둡게 표현됩니다.
  2. 낮은 채도:

    • 색상이 감소하여 흑백에 가까운 색감을 가집니다.
  3. 시각적 느낌:

    • 색이 강조되지 않아 현실적이고 차가운 느낌.
    • 무거운 감정이나 극적인 분위기를 전달할 때 효과적.

스마트 포인터

스마트 포인터는 동적 메모리 관리를 자동화하기 위해 만들어진 특수한 포인터 클래스입니다. C++에서는 일반적으로 동적 메모리 할당(new/delete)이 필요한 상황에서 이를 직접 관리해야 하는데, 이 과정에서 메모리 누수와 같은 문제가 발생할 수 있습니다. 스마트 포인터는 이를 방지합니다.

스마트 포인터의 역할

  • 동적 메모리를 자동으로 관리.
  • 객체의 소유권과 수명을 추적.
  • 메모리 누수 방지.

그럼 이것만 쓰면 gc 필요없는거 아님?

스마트 포인터만 사용하면 Garbage Collector(GC)가 필요 없다고 생각할 수 있지만, 이는 완전히 사실은 아닙니다.

순환 참조(Circular Reference):

  • 두 객체가 서로를 std::shared_ptr로 참조하면, 참조 카운트가 0이 되지 않아 메모리 해제가 이루어지지 않습니다.
    이 문제를 해결하기 위해 std::weak_ptr를 사용해야 하지만, 프로그래머가 직접 관리해야 합니다.

객체 수명 관리가 필요 없는 경우

  • 스마트 포인터는 객체의 소유권을 관리하기 때문에, 단순히 일시적인 참조만 필요한 경우(예: 특정 함수에서 사용 후 제거될 임시 객체)에 사용하면 불필요한 오버헤드가 발생합니다

객체가 아닌 다른 자원

  • 스마트 포인터는 동적 메모리(힙)에 할당된 객체를 관리합니다. 파일 핸들, 소켓, GPU 리소스 등 비메모리 자원은 스마트 포인터로 관리되지 않으므로 수동 관리가 필요합니다.

소스 파일, 헤더 파일, 번역 단위

소스 파일
: c++로 작성한 프로그램. 번역 단위 (translation unit) 라고도 부르는데, 컴파일러가 한 번에 기계어 코드로 바꾸는 단위이기 때문.

헤더 파일
: 특수한 형태의 소스 파일. 타입 선언, 함수 프로토타입 같은 정보를 번역 단위 간에 공유하는 데 쓰임. 컴파일러는 헤더 파일이 존재하는지 모름. c++ 전처리기가 컴파일에 앞서 모든 #include 구문을 헤더 파일로 교체하기 때문.

라이브러리, 실행 파일, 동적 링크 라이브러리

번역 단위 1개가 컴파일된 결과물인 기계어는 목적(object) 파일에 저장됨.

목적 파일 안의 기계어 특성

  • 재배치 가능 코드가 위치할 메모리 주소가 아직 결정되지 않은 상태
  • 링크되지 않음 번역 단위 안에 들어 있지 않은 외부 참조 함수나 전역 데이터가 아직 확정되지 않음.

목적 파일 여러 개 묶은게 '라이브러리'.

목적 파일과 라이브러리는 링커를 거쳐 실행 파일로 변환되는데, 이 과정을 '링크한다'고 말함.
컴파일러에서 안 정했던 메모리 주소 값이나 외부 참조를 확정한 상태의 기계어가 실행 파일.
실행 파일은 운영체제에서 로드하고 실행 가능.

실행 파일의 기계어 코드는 여전히 relocatable함.
모든 기계어와 데이터를 가리키는 메모리 주소는 절대 주소가 아니라 기준 값에 더해질 상대 값이라는 뜻.

동적 링크 라이브러리 (DLL, Dynamic Link Library) 는 라이브러리의 한 종류인데, 정적 라이브러리와 실행 파일의 중간 형태를 띰.
함수 담고 있다는 점에선 라이브러리와 같고, 운영체제가 따로 로드한다는 점은 실행 파일과 같음.
시작과 끝 처리 코드 있다는 것도 실행 파일과 유사.

실행 파일이 DLL 쓰려면 부분적으로 링크된 (partially linked) 기계어 코드가 있어야 함.
링크 거치면 대부분 메모리 주소 결정되는데 DLL 함수 참조는 결정 안됨.
나중에 실행 파일 실행 할 때 운영체제에서 참조 결정 안된 함수 찾아서 필요한 DLL을 메모리에 로드.

실행 파일과 상관 없이 DLL만 교체할 수 있다는 점에서 매우 유용.



📖 생활 코딩! 리액트 프로그래밍


리액트는 속성을 prop이라 부름.
인자 받아서 동적으로 컨텐츠 변경 가능하다.

function Nav(props) {
  const lis = [
    <li>
      <a href="/read/1">html</a>
    </li>,
    <li>
      <a href="/read/2">css</a>
    </li>,
    <li>
      <a href="/read/3">js</a>
    </li>,
  ];
  return (
    <nav>
      <ol>{lis}</ol>
    </nav>
  );
}

배열을 넣었다가 푸는 것도 가능

  for (let i = 0; i < props.topics.length; i++) {
    let t = props.topics[i];
    lis.push(<li>{t.title}</li>);
  }

저대로는 쓸모가 없으니 for문으로 동적으로 받은 props를 받아오기

    lis.push(
      <li key="{t.id}">
        <a href={"/read/" + t.id}>{t.title}</a>
      </li>
    );

동적으로 만든 각각의 <li> 태그는 key라는 props를 가지고 있어야 하고, 반복문 안에서 고유해야 함.
자동으로 생성하는 태그의 경우 리액트가 태그들을 추적해야 하는데, 이렇게 추적해야 할 때는 근거가 있어야 하고, 그 근거로써 key라는 약속된 prop을 부여하는 것.
이렇게 함으로써 리액트가 성능을 높이고 정확한 동작을 할 수 있게 협조.

profile
너 정말 **핵심**을 찔렀어

0개의 댓글