dorergiverny의 등록된 링크

키자드에 등록된 총 568개의 포스트를 확인하실 수 있습니다.

Naver Blog

[JK 농원] 광교 테크노밸리 수제버거 맛집 - 프랭크 버거 에듀타운점 출장 점심

오늘은 수원 광교 테크노밸리 근처에 있는 수제버거 맛집을 소개합니다. 경기 R&DB 센터에서 걸어서 5분이면 갈 수 있는 곳이에요. 이름은 프.랭.크.버.거. 광교 에듀타운점 입니다. 주소: 경기도 수원시 영통구 에듀타운로 102 B동 141호 주차: 빌딩 주차권 지원 가능 전화번호: 031-212-5355 버거가 땡기는 날이었는데, 건너편에 롯데리아가 있어서 롯데리아 갈까 하다가 수제버거라고 해서 수제버거 집으로 직행~!! 순 소고기 수제 패티에 가격도 이정도면 괜찮은 편이라고 생각되어 들어가봤습니다. 넓지 않은 홀이지만 두명씩 앉을 수 있는 곳과 4명이 앉을 수 있는 곳이 있어요. 주문과 동시에 굽기 시작한다고 해서.. 믿을만 하더라고요. 콜라는 옆에서 셀프로 담아서 먹는 곳이에요. 물론 콜라를 시켜야 컵을 주죠. ㅋㅋ 주문은 여느 식당과 비슷하게 키오스크로 받아요. 벽면에 있는 광고 보니까 벌써부터 군침이~ 저는 JG 버거 세트를 시켰어요. 콜라 대신 밀크쉐이크를 시켰고요. 콜

Naver Blog

[JK 농원] 화성 동탄 정통 철판구이 테판야끼 불쇼 맛집 - 테판갑 연인 데이트 직장 회식

이번엔 제2동탄에서 정통 철판구이를 맛볼 수 있는 맛집을 소개합니다. 서울과 경기도, 제주도에 몇 안되는 테판야끼 맛집이 있는데, (테판야끼는 철판을 사용하여 요리하는 조리법) 동탄에 2022년에 생겼다고 합니다. 쉐프님께서는 25년 이상 경력이 있으신 좋은 분이시더라고요. 저희는 팀 회식으로 갔는데 눈도 즐겁고 입도 즐거운 시간이었습니다. 주소: 경기도 화성시 동탄 치동천로3길 18 영업시간: 10:00~21:00 주차: 가게 앞 조금과 건너편 주차 공간 있음 룸은 아니지만 파티션으로 비교적 프라이빗한 공간을 만들어 놓으셨더라고요. 4인석부터 10인 이상 까지 다양한 공간이 있어요 그래서 그런지 가족끼리, 팀끼리 와서 즐기다 가기 좋은 곳이에요. 저희는 테판갑 스페셜 코스를 시켰어요. 코스요리의 첫번째는 스프와 샐러드에요. 정갈하고 깔끔한 맛이 일품입니다. 그 다음에는 본격적으로 철판 구이를 해 주세요. 철판 구이 첫번째는 야채에요. 계절야채 5종 세트!! 호박, 버섯, 양파 등을

Naver Blog

[JK 농원] 천안 아산 물놀이 워터파크 - 아산 스파비스 (2023년 리뉴얼 이후 최신 정보)

이번에는 지난주 금요일(4/14)에 다녀왔던 아산 온천 관광지 내에 있는 아.산.스.파.비.스. 정보를 알려드리려고 합니다. 주소: 충남 아산시 음봉면 아산온천로 157번길 67 주차: 주차장 무료 완비 아산스파비스에 들어서면 오른쪽, 왼쪽 어디나 주차가 가능합니다. 주차를 하신 후 입구로 들어 오시면 됩니다. 할인 정보는 아래와 같아요. 하지만 전 카톡 플러스 친구 찬스를 사용해서 구매했어요(이게 제일 싼듯). 네이버 최저가 검색을 해도 구매하실 수 있습니다. 스파비스가 3월에 휴장을 했었고, 리뉴얼을 했다고 해서 기대하고 갔는데, 시설이 새걸로 바뀐 건 없는 것 같아요. (개인적인 느낌이라서요..) 홈페이지에 있는 요금과 영업 시간을 알려드릴께요. 아산스파비스 (spavis.co.kr) 저는 금요일에 갔기 때문에 야외풀은 하지 않았어요. 그게 좀 아쉬웠어요. 비수기 4월말까지는 평일에 야외풀은 하지 않는다는 사실!!! 입장 시 음료수와 물 반입 관련해서 물어봤는데, 유리병 같이

Naver Blog

[JK 농원] 김포 월곶 농원 평탄화/배수로 작업

이번에는 4주 전에 진행했던 농원 평탄화 작업에 대해 공유할까 합니다. 겨울내내 얼어있던 땅이 녹기 시작하면서 먼저 해야 할 작업이 평탄화 작업 입니다. 평탄화 작업을 하기 전에 계획을 짜시는게 가장 중요한 것 같아요. 어떻게 평탄화 할 것인지, 배수로는 어디에 어느 정도 깊이/넓이로 해야 할지 등 땅 사용 계획을 미리 세우셔야 합니다. 평탄화 하는 방법은 여러가지가 있어요. 제일 많이 사용되는 것은 로터리를 친 후 평탄화 하는 방법 입니다. 로터리는 땅을 갈아 엎는 방법인데, 그래야 땅이 부드러워지고 땅심을 받아 작물들이 잘 자라기 때문입니다. 저는 초보이지만 한번 로터리 작업을 해 봤어요. 이렇게 로터리 기계로 2~30cm 깊이로 한번 갈아 엎는 거에요. 로터리를 친 후 부드러워진 땅에 롤러(테니스장 같은 곳) 같은 것으로 땅을 평탄화 할 수 있습니다. 그런데 저희 땅은 그 전에 다른 작물들이 심겨져 있었고, 골이 많이 파여 있었고, 장마 등을 대비한 배수로가 필요하기 때문에 로

Naver Blog

[OpenCV][C++] 영상 라벨링(Labeling) 총정리(2) - 동전 개수 세기 총 금액 알아내기

이번에는 지난번에 이어 응용편으로 꾸며 봤어요. https://m.blog.naver.com/dorergiverny/223075828736 [OpenCV][C++] 영상 라벨링(Labeling) 총정리(1) - 이미지 레이블링 이번에는 영상 라벨링(레이블링)이라고 하는 기법에 대해 설명할께요. 영상 라벨링(Image Labeling) 이란... blog.naver.com 영상 라벨링을 통한 동전 개수 세기와 총 금액 알아내기를 해 볼 꺼에요. 동전 개수, 총 금액 알아내기 1. 영상 로딩하기 동전 개수를 알아내기 위해서는 먼저 영상을 로딩합니다. 어짜피 gray-scale로 변환을 해야 해서 gray-scale로 로딩을 하였습니다. cv::Mat src = cv::imread("../coins.jpg", cv::IMREAD_GRAYSCALE); 2. 영상 사이즈 조절하기 영상 사이즈가 커서 일단 사이즈를 줄입니다. cv::resize(src, src, cv::Size(src.cols

Naver Blog

[JK 농원] 김포 강화 갯벌 장어 맛집 - 일대교 몽돌 장어 가족모임 몸보신 회식

이번에는 제가 정말 단골로 가는 저희 농원 근처에 있는 장어 대박 맛집을 소개시켜 드립니다. 김포에서 강화로 넘어가는 길목에 있어요. 큰길에서 살짝 골목으로 들어가야 하지만 그래도 찾기 쉬워요. 몽돌에서 구워 먹는 장어를 먹고 싶으시다면, 주말 저녁 주변 식당이 문을 닫아 헤매고 계시다면 (제가 그런 적이 있어요) 일.대.교.몽.돌.장.어 를 기억해 주세요~ 주소: 경기도 김포시 월곶면 김포대로 3023번길 83 주차: 주차장 완비(편리함) 영업시간: 11:00~21:00, (15:00~16:00 BreakTime, 평일만) TV에도 여러번 방영이 되었고, 유명한 연예인도 많이 다녀간 장어 맛집~ 항상 밝게 인사해 주시는 사장님~ 식당에 들어설때면 기분이 좋아집니다. 사장님의 인심은 그야말로 타의 추종을 불허해요. 푸짐한 반찬과 강화도만의 순무 깍두기 먹을수록 정이 가요~ 메뉴를 소개해야죠. 뭐니뭐니해도 1타 메뉴는 갯벌 장어!!! 몽돌에서 직접 구매한 돌 위에서 하얀 속살이 보였던

Naver Blog

[JK 농원] 코엑스 삼성역 봉은사역 맛집 - 쉑쉑버거 주말 점심 나들이 연인 데이트 전시회

이번에는 쉑쉑버거 코엑스 점을 다녀왔어요. 쉑쉑버거가 어디에 있는지 못찾으시는 분이 계시더라고요. 저도 한참을 찾았거든요. 코엑스 영화관, 메가박스 앞에 있어요. 강남에 위치한 쉑쉑버거와 분위기는 비슷해요. 일단 쉑쉑버거를 찾으시려면 영화관 표지판을 따라 가시면 됩니다. 주소: 서울 강남구 영동대로 513(삼성동) 코엑스몰 지하1층 메가박스 앞 주차: 코엑스 내 유료주차, 쉑쉑버거 영수증 지참 후 메가박스 매표소에서 주차도장 가능(1시간) 쉑쉑버거는 바닐라/초코 쉐이크를 주력으로 판매하는 곳이에요. 그래서 쉑쉑버거에요. 버거랑 바닐라 쉐이크랑 잘 어울려요 저는 이날 쉑스택이랑 프라이, 그리고 콜라를 시켰어요. 쉑쉑버거 가서 촌스럽게 콜라를.... 전 이날따라 갈증이 심해서 콜라를 먹고 싶었거든요. ㅋㅋ 쉑스택은 버섯 패티와 비프 패티가 함께 있는 버거로 살짝 푸짐하게 먹고 싶을 때 먹는 거에요. 먹음직스럽죠? 프랜치 프라이도 두툼해서 일반 수제버거집에서 나오는 맛이에요 쉑쉑버거에 들

Naver Blog

[OpenCV][C++] 영상 라벨링(Labeling) 총정리(1) - 이미지 레이블링

이번에는 영상 라벨링(레이블링)이라고 하는 기법에 대해 설명할께요. 영상 라벨링(Image Labeling) 이란? 영상 라벨링은 영상 내에서 주위 같은 밝기의 픽셀값을 가지는 픽셀들을 그룹화하여 그룹별로 번호를 매기는 방법을 말합니다. object detection, segmentation 등에 많이 사용되는 기법이에요. 이전에 이진화 기법을 통해 배경과 전경을 구분할 수 있었는데요. https://blog.naver.com/dorergiverny/223059732009 [OpenCV][C++] Thresholding 이진화 영상 만들기 총정리 (1) - cv::threshold() 이번에는 그레이 영상을 이진화 하는 방법에 대해 알아보겠습니다. 이진화는 특정 밝기 범위 또는 밝은 영... blog.naver.com 전경을 객체(Object)라고 표현할 수도 있겠죠. 하나의 객체들은 덩어리로 있기 때문에 몇개의 객체가 있는지를 확인하기 위해서는 연결된 덩어리를 구분할 필요가 있습니

Naver Blog

[JK 농원] 강남 신논현 분위기 좋은 퓨전한식 막걸리 맛집 - 무월 연인 데이트 소그룹모임

이번에는 강남에서 분위기 좋은 퓨전 한식집, 과일 막걸리 맛집으로 유명한 무.월. 을 소개해드립니다. 주소: 서울특별시 강남구 봉은사로4길 21 영업시간: 15:00 ~ 23:00 강남역 보다는 신논현역에서 가까워요. 쉑쉑 버거 골목으로 들어가면 가장 가까운 길이에요. 맛있는 모듬 전이 땡기신다면 맛있는 과일 막걸리가 생각 나신다면 분위기 있는 퓨전 술집이 생각 나신다면 무월을 생각하세요~ 한 여름에 먹으면 정말 시원할 것 같아요. 과일 막걸리로는 자두, 수박, 청포도, 딸바우유, 홍자몽, 하와이안요거트, 블루베리, 유자 막걸리가 있고, 건강 막걸리 세트도 있어요. 저는 모듬 전을 먹어봤는데요. 아래와 같이 푸짐합니다. 막걸리랑 정말 잘 어울리는 전이네요. 살짝 기름지긴 했지만 뭐. 전이 기름지지 않다면 전이 아니죠? 그리고 한방 보쌈도 시켰어요. 야들야들 보쌈, 정말 맛있었어요. 무월의 대표메뉴는 뭐니뭐니해도 한방 보쌈, 모둠전 그리고 과일 막걸리 아니겠습니까? 강남, 신논현에서

Naver Blog

[C++] 직선(선분)의 방정식 표현 총정리

이번에는 직선 또는 선분을 나타내는 다양한 방법과 제가 추천하는 방법에 대해 정리해볼까 합니다. 직선 (선분) 표현 방식 직선을 표현할 수 있는 방법은 아래 6가지 정도로 요약할 수 있습니다. 각각의 표현식의 장단점이 있는데 저는 ax + by + c = 0 꼴의 직선의 방정식을 선호합니다. 어떠한 장점이 있는지 알아볼까요? ax + by + c = 0 사용하기 이 방식은 geometry에서 많이 사용하는 표현 방식 입니다. 이 표현식을 사용하기 위해서는 동차 좌표계(homogeneous coordinate)에 대해 간단히 설명을 하겠습니다. 1. homogeneous coordinate 란? homogeneous coordinate는 2차원 좌표 (x, y)를 (x, y, 1)로 표현 하는 것 입니다. 다시 말하면 임의의 상수 w에 대해 (x, y)를 (wx, wy, w)로 표현하는 것 입니다. 3차원 좌표 (X, Y, Z) 도 (wX, wY, wZ, w)로 표현을 할 수 있습니다

Naver Blog

[C++] Windows 10 에 Git (깃) 쉽게 설치하기 총정리

우리가 소프트웨어 개발을 하다보면 github, gitlab, gerrit 등을 사용하게 됩니다. 이 저장소들을 사용하기 위해서는 git이 설치되어야 합니다. Git 설치 파일 다운로드 및 설치하기 1. Git SCM에 접속하여 설치 파일 다운로드하기 https://git-scm.com/ Git About The advantages of Git compared to other source control systems. Documentation Command reference pages, Pro Git book content, videos and other material. Downloads GUI clients and binary releases for all major platforms. Community Get involved! Bug reporting, mailing list, chat, development and ... git-scm.com Git 사이트에 접속하면 오른쪽

Naver Blog

[C++] 두 선분의 교차 여부 판단 방법 - CCW를 이용한 방법

이번에는 두 선분이 교차하는지를 판단하는 방법에 대해 알아보도록 하겠습니다. 외적(cross product) 두 선분의 교차를 판단하기 위해서는 약간의 수학 기본이 필요하여 외적에 대해 간략히 알아보겠습니다. 두 벡터를 외적하면 두 벡터에 수직인 벡터를 구할 수 있습니다. 이는 오른손법칙에 의해 방향이 결정되는데, 아래와 같습니다. 출처: https://assortrock.com/24 즉 연산 순서에 따라 외적 값이 양수 또는 음수가 나올 수 있다는 의미 입니다. 그럼 만약 두 벡터가 평행한 경우에는 수직 벡터는 0이 나오게 됩니다. 수식을 간단히 살펴보면 아래와 같이 나타낼 수 있습니다. CCW(Conter Clock Wise) 알고리즘 CCW는 "외적을 이용하여 세 점의 방향 관계를 구하는 알고리즘"이라고 정의할 수 있습니다. 다시 말하면 CCW를 이용하면 아래와 같이 세 점이 주어졌을 때 이 세점이 시계 방향의 관계인지 반시계 방향의 관계인지 평행 관계인지를 알아낼 수 있습니다

Naver Blog

[C++] 난수(random number) 생성하는 방법 총정리 - random 라이브러리

알고리즘을 개발하다보면 난수(random number)가 필요할 때가 있습니다. 이번에는 난수를 생성하는 방법에 대해 알아보겠습니다. C 스타일의 난수 생성 방법, rand() rand() 를 사용하는 방법은 우리가 예전에 많이 사용했던 방법입니다. %를 사용하여 0~9까지의 숫자를 생성하는 예시 입니다. #include <iostream> int main() { for (int i = 0; i < 10; ++i) { int num = rand() % 10; std::cout << num << ", "; } return 0; } 결과는 아래와 같습니다. 자 그럼 다시 돌려볼까요? 똑같은 값이 나옵니다. 못믿으시겠다고요? 그럼 제가 이전에 말씀드린 것과 같이 현재 시간을 적어서 여러번 돌려볼께요. https://m.blog.naver.com/dorergiverny/223040055108 [C++] 현재 시간 알아내기, time_t, chrono 클래스 총정리 지난번에 windows 에

Naver Blog

[OpenCV][C++] 모폴로지(morphology) 연산 총정리(2) - 열림, 닫힘, 탑햇, 그래디언트

지난번에는 모폴로지 연산 기본에 대해서 알아 봤습니다. https://blog.naver.com/dorergiverny/223063828290 [OpenCV][C++] 모폴로지(morphology) 연산 총정리(1) - 침식(Erode), 팽창(Dilate) 이번에는 영상에서 은근히 많이 사용되는 모폴로지(morphology) 연산에 대해 알아보겠습니다. 노이즈 제거,... blog.naver.com 이번에는 기본 연산인 침식과 팽창을 응용한 모폴로지 연산에 대해 알아보겠습니다. 열기 연산은 침식 → 팽창 하는 연산이고, 닫기 연산은 팽창 → 침식 하는 연산입니다. 팽창과 침식 연산 순서에 따라 효과가 달라집니다. 이번에 살펴볼 모폴로지 연산 원형은 아래와 같습니다. 나머지 변수는 앞에서 살펴본 기본 모폴로지 연산과 같고, 여기에서 추가된 모폴로지 연산 타입(type)에 대한 상수값들은 아래와 같습니다. MORPH_ERODE 침식 연산 MORPH_DILATE 팽창 연산 MORPH_O

Naver Blog

[OpenCV][C++] 모폴로지(morphology) 연산 총정리(1) - 침식(Erode), 팽창(Dilate)

이번에는 영상에서 은근히 많이 사용되는 모폴로지(morphology) 연산에 대해 알아보겠습니다. 노이즈 제거, hole 채우기, 끊어진 선 이어 붙이기 등에 많이 사용되고 있습니다. 모폴로지 연산은 이진화 영상에서 가장 많이 사용되며, OpenCV에서는 binary 영상 뿐만 아니라 gray-scale 영상, color 영상까지 지원이 됩니다. 모폴로지를 알기 위해서는 먼저 Structuring Element를 알아야 합니다. Structuring Element 가장 많이 사용되는 형태는 아래와 같습니다. 일단 3x3 window로 설명을 드리자면 4가지 정도의 모양을 넣을 수 있고, 가운데 노란색 부분은 anchor point 로써 주변 값을 보고 변경할 값의 위치를 나타냅니다. 기본형은 아래와 같습니다. shape: 모폴로지 수행 시 참조할 주변 픽셀 모양으로 아래와 같은 3가지가 있습니다. cv::MORPH_RECT 사각형 모양 cv::MORPH_CROSS 십자가 모양 cv:

Naver Blog

[JK 농원] (동탄 북광장) 조용하고 고급스러운 중식당 - 몽연 가족 행사 중요한 모임 연인 데이트

오늘은 동탄에서 놀거리와 즐길거리, 먹을 거리가 많아서 늘 즐거운 동탄 북광장에 위치한 조용하고 고급스러운 중식당을 소개합니다. 몽. 연. 주소: 경기도 화성시 반송동 90-7 전화번호: 031-613-9991 주차: 건물 지하 1층(주차타워식이라서 SUV는 공영 주차장 추천) 또는 북광장 한빛공영주차장 운영시간: 11:30 ~ 22:00, Break Time(15:00~17:00, 평일) 몽연은 코스모타워 2층에 있어요 엘리베이터를 타고 올라가시면 짜잔~ 입구가 나옵니다. 룸이 많아서 회식이나 가족모임으로 좋을 것 같습니다. 우리는 라벤더 코스 요리로 시켰어요. 이 코스 요리 하나 하나가 다 맛있었어요. 그중 하나만 고르라고 한다면, 가장 맛있었던 음식은 어향 가지 새우 였습니다. 지금까지 먹어보지 못한 맛과 음식이었던 거 같아요 몽연을 가신다면 꼭~~ 드셔야 하는 메뉴 입니다. 그 다음으로 맛있던 것은 아래 동파육인가?? 이었습니다.

Naver Blog

[OpenCV][C++] 트랙바(trackbar) 사용하기 총정리

이번에는 opencv 에서 제공하는 trackbar 사용하는 방법에 대해 알아보겠습니다. trackbar 사용하기 우리가 영상처리를 하면서 threshold 와 같이 변수를 가변하면서 영상의 변화량을 실시간으로 보고 싶을 때가 있습니다. 이럴 때 사용할 수 있는 것이 trackbar 기능 입니다. 트랙바는 슬라이더 컨트롤(slider control)이라고도 부르기도 합니다. 1. 영상 읽어오기 영상처리할 영상을 읽어옵니다. cv::Mat src = cv::imread("lena_gray.bmp", cv::IMREAD_UNCHANGED); 2. 영상을 보여줄 window 생성하기 Result라는 이름을 가진 창을 하나 생성합니다. cv::namedWindow("Result"); 3. Trackbar 생성하기 createTrackbar() 로 trackbar를 생성합니다. cv::createTrackbar("threshold", "Result", 0, 255, trackbar, (voi

Naver Blog

[OpenCV][C++] Thresholding 이진화 영상 만들기 총정리 (1) - cv::threshold()

이번에는 그레이 영상을 이진화 하는 방법에 대해 알아보겠습니다. 이진화는 특정 밝기 범위 또는 밝은 영역과 어두운 영역 등으로 이분화해서 전경과 배경으로 나누는 방법입니다. Thresholding (이진화) 이진화는 영상의 픽셀들을 두 개의 부류로 나누는 작업입니다. 아래와 같은 사진에서 흰색 탁구공을 구분하려고 합니다. 그 때 아래와 같이 cv::threshold() 함수를 사용하면 됩니다. 픽셀 밝기가 180 이상인 값을 255로, 180보다 작은 값은 0으로 처리하는 함수는 아래와 같습니다. cv::threshold(src, binImage, 180, 255, cv::THRESH_BINARY); 결과 영상은 아래처럼 나오네요. 자 그럼 threshold 함수에 대해 좀 더 알아봐요. src 입력 영상 dst 출력 영상, 이진화 영상 thresh 임계값(threshold) maxval 임계값 이상일 때 이진화 영상의 최대값(보통 255 사용) type thresholding 연산

Naver Blog

[OpenCV][C++] Thresholding 이진화 영상 만들기 총정리(2) - adaptiveThreshold()

지난 번에는 일반적인 이진화 방법(binarization)에 대해 알아 보았습니다. 영상 내 밝기가 균일한 경우 적용할 수 있는 기본적인 이진화 방법이었습니다. https://blog.naver.com/dorergiverny/223059732009 [OpenCV][C++] Thresholding 이진화 영상 만들기 총정리 (1) - cv::threshold() 이번에는 그레이 영상을 이진화 하는 방법에 대해 알아보겠습니다. 이진화는 특정 밝기 범위 또는 밝은 영... blog.naver.com 이번에는 영상 내에서 밝기가 불균일 할 때 사용할 수 있는 적응형 이진화(adaptive threshold) 기법에 대해 알아보겠습니다. 이번에는 opencv에서 제공하는 trackbar를 이용하여 실시간으로 값을 조정하면서 영상 변화를 확인해보도록 하겠습니다. 적응 이진화(adaptive threshold) 적응형 이진화는 지역 이진화(local binarization)이라고도 하는데, 이는

Naver Blog

[JK 농원] 천안 성환 가야 밀면 성환 맛집 - 자꾸 생각나는 밀면집

이번에는 한번도 안가본 사람은 있어도 한번만 가본 사람은 없다는 천안 제일의 밀면 맛집~!! 가.야.밀.면. 입니다. 맛집 치고는 주차장이 편리하여 쉽게 가는 곳 입니다. 주차는 편하지만 점심 시간에는 줄을 서서 먹을 수 있으니 시간을 잘 맞춰서 오세요~! 주소는 충남 천안시 서북구 성환읍 성환1로 151 입니다. 모든 메뉴가 포장이 가능합니다. 대표 메뉴는 아래와 같아요. 저는 물밀면, 비빔밀면, 온밀면을 먹어봤는데 다 기가막히게 맛있습니다. 그리고 여기서 꼭 먹어야 하는 것~! 바로 만.두. 입니다. 정말 쫄깃하고 자면서도 또 생각나는 그러한 맛 입니다. 밀면하고 수육 가격이 작년에 비해 소폭 상승했지만 이런 맛에 이 가격이면 아직도 저렴하다고 생각됩니다. 만두 사진만 봐도 쫄깃함이 느껴지지 않나요? 제가 이번에 갔을 때에는 곱빼기를 시켜봤는데, 정말 두덩이를 주더라고요. 양이 진짜 두배에요 두배~!! 제가 너무 맛있어서 사진 찍는 걸 깜빡해서 다른 분꺼 사진 가져왔어요. 죄송합

Naver Blog

[OpenCV][C++] 영상에 문자열 출력하기 cv::putText(), cv::getTextSize() 총정리

영상에 문자열을 이용하여 필요한 정보를 표시해야 하는 경우가 있습니다. OpenCV에서는 영상에 문자열을 출력할 수 있는 cv::putText()를 제공합니다. cv::putText는 다음과 같은 인자를 받을 수 있습니다. src 문자열을 출력할 영상 text 출력할 문자열, const String& pos 문자열 출력할 위치의 좌하단 좌표, cv::Point fontFace 폰트 종류, cv::HersheyFonts에서 선택 가능 fontScale 폰트 크기 확대 축소 비율 color 문자열 색상 thickness 문자열 선 두께 lineType 선타입, LINE_4, LINE_8, LINE_AA bottomleftOrigin true: 영상 좌하단을 원점으로, false: 영상 좌상단이 원점으로 여기에서 cv::HERSHEY 에 어떠한 종류의 글씨체가 있는지 살펴보면, FONT_HERSHEY_SIMPLEX 설명 보다는 직접 영상으로 확인하는 것이 좋을 것 같아요. FONT_HER

Naver Blog

[소프트웨어] 챗GPT 시작하기, 코딩시키기 - OpenAI

이번에는 요즘 핫한 챗GPT 시작하기 부터 코딩을 시켜보는 것까지 해 보겠습니다. ChatGPT(챗GPT) 란? AI 연구 개발 단체인 OpenAI에서 2022년 12월에 테스트 버전을 공개하고 문맥을 이해하는 챗봇이라는 타이틀을 얻을 정도로 뛰어난 챗GPT는 신기할 정도로 높은 이해력과 답변력을 가지고 있습니다. 현재는 GPT-4.0이 공개되었고, GPT(Generative Pre-trained Transformer) 기술을 기반으로 하고 있습니다. 여기에서 GPT 중 'T'에 해당하는 '트랜스포머'가 핵심적인 기술 원리입니다. 문장 속의 단어와 같은 순차적인 데이터 내의 관계를 추적해 맥락과 의미를 학습하기 때문입니다. 챗GPT 사이트 가입하기 챗GPT를 사용하시려면 먼저 OpenAI 사이트에 접속하셔서 회원 가입을 하셔야 합니다. https://openai.com/blog/chatgpt Introducing ChatGPT We’ve trained a model called Ch

Naver Blog

[OpenCV][C++] 영상 이어 붙이기 총정리, hconcat(), vconcat()

이번에는 영상을 이어 붙이는 방법에 대해 알아보겠습니다. 가로 이어 붙이기, cv::hconcat() 두 영상을 가로로 이어 붙이려면 두 영상의 높이가 같아야 합니다. 저는 이번에 사이즈가 다른 두 영상을 준비했습니다. lena 영상은 512x512 이고, JK농원 영상은 295x230 사이즈 입니다. 이 두 영상을 가로로 붙여 보겠습니다. 일단 높이가 같아야 겠죠? cv::resize()를 사용하여 높이만 맞추고 가로로 붙여 볼께요. 1. 두 영상 읽기 일단 두 영상을 읽어 옵니다. cv::Mat lena_gray = cv::imread("./lena_gray.bmp", cv::IMREAD_UNCHANGED); cv::Mat JK_org = cv::imread("./JKGarden_1.bmp", cv::IMREAD_GRAYSCALE); 2. 영상 높이 맞추기 JK_org 영상의 높이를 cv::resize()를 이용하여 lena_gray와 동일하게 맞춥니다. JK_resized 영상

Naver Blog

[OpenCV][C++] 최신 OpenCV 설치하기 (CMake 사용하여 소스 빌드하기), visual studio 2019

OpenCV를 설치하여 사용하는 방법은 두가지가 있는데, 아래와 같은 차이점이 있습니다. 설치 실행 파일 소스 직접 빌드 장점 설치가 쉬움 Dll, Lib 빌드 필요 없음 OpenCV 추가 모듈 사용 가능 자신의 시스템 환경에 맞는 Dll, Lib 빌드 가능 단점 OpenCV 추가 모듈 사용 불가 Windows 64 비트만 지원 빌드 작업 어렵고 오래 걸림 설치 실행 파일을 이용하는 방법은 지난번에 다뤘고요. https://blog.naver.com/dorergiverny/223057719024 [OpenCV][C++] 최신 OpenCV 설치하기 (쉬운방법), visual studio 2019 영상처리, 컴퓨터 비전을 공부하시는 분들은 OpenCV에 대해 들어보셨을 꺼에요. 이번에는 최신 버전 Op... blog.naver.com 이번에는 CMake 를 이용하여 소스를 직접 빌드하는 방법을 알아보겠습니다. OpenCV 최신 소스 다운 받기 이번에는 OpenCV github 사이트에서

Naver Blog

[JK 농원] 천안 성환읍 카페 동민목장 배꽃 고풍스러운 카페 맛집 연인 데이트 가족 모임

이번엔 제가 얼마전에 다녀온 천안에 있는 박물관 스러운 볼거리도 많은 카페를 소개해드립니다. 이름은 동.민.목.장. 주소는 충남 천안시 서북구 성환읍 왕림길 154 주차 공간은 있으나 사람이 몰리게되면 좁다고 느껴질 정도입니다. 아직 배꽃이 필 때가 아니라 꽃을 보지는 못했지만 동민목장 업체에서 네이버에 등록한 사진을 한장 가져오면, by 동민목장 이렇게 이쁩니다. 이 배꽃이 활짝 펴 있으면 벚꽃 못지않게 화려합니다. 4월 중순부터 꽃이 피기 시작하니까 서둘러서 계획 잡으세요. 천안이 배로 유명한 곳이라 축제도 한다고 합니다. 동민목장 입구 입니다. 뭔가 박물관스럽죠? 저 앞에 보이는 건물로 가면 음료를 시키실 수 있고 2층 테라스도 있어요. 배꽃이 필 때면 뷰가 기가 막히다고 합니다. 그리고 별관도 있는데, 별관은 거의 박물관 수준입니다. 마이마이와 옛날 냉장고폰들도 보이죠? 스타텍이라고 아시나요? 삐삐도 있고, (단 가져가시면 절도입니다~!!) 주인장께 물어보니 옛날에 진짜 목장

Naver Blog

[OpenCV][C++] 최신 OpenCV 설치하기 (쉬운방법), visual studio 2019

영상처리, 컴퓨터 비전을 공부하시는 분들은 OpenCV에 대해 들어보셨을 꺼에요. 이번에는 최신 버전 OpenCV를 설치하고 사용하는 방법에 대해 알아볼께요. 만약 CMake를 통해 소스를 직접 빌드하고 싶으시면 아래 링크를 확인해보세요. https://blog.naver.com/dorergiverny/223057902921 [OpenCV][C++] 최신 OpenCV 설치하기 (CMake 사용하여 소스 빌드하기), visual studio 2019 OpenCV를 설치하여 사용하는 방법은 두가지가 있는데, 아래와 같은 차이점이 있습니다. 설치 실행 파일... blog.naver.com OpenCV 란? OpenCV(Open source Computer Vision Library)는 지금 이순간에도 활발히 개발되고 있는 약 2,500 여개가 넘는 최신 컴퓨터 비전 알고리즘과 머신 러닝 알고리즘을 포함하고 있는 라이브러리 입니다. 기본적인 영상 파일 입/출력, 영상의 화질 향상, 객체 검

Naver Blog

[JK 농원] 강남 분위기 있고 조용한 수비드 고기 맛집 - 아올(AOL), 강남 데이트 소고기 우대갈비

오늘은 어제 저녁에 다녀온 강남의 분위기 있고 조용한 수비드 우대갈비 맛집을 소개할까 합니다. 오랫만에 친구들을 만나는데 조용히 얘기를 나눌 수 있는 곳을 찾다가 발견한 곳!! 바로 "고기를 맛있게 먹는 모든 방법"이란 신념을 가지고 레스토랑을 운영하는 '아올(AOL)'이란 곳이에요 입구는 아래 사진의 붉은 화살표 방향이에요. 주소는 강남구 강남대로94길 28 유니언타운 G층이에요 강남역 11번, 12번 출구 쪽으로 나오셔서 조금만 걸어가시면 됩니다. 자리는 연인끼리 앉을 수 있는 원형 식탁과 가족이나 친구들이 앉을 수 있는 사각 식탁이 있어요. 목요일 6시 30분에 방문했는데 손님도 많지 않고 테이블 간격이 넓어서 조용하고 얘기하기 편했던 것 같아요. 메뉴판은 아래와 같은데요. 우대갈비랑 한우 라구 파스타가 가장 인기 있는 메뉴에요. 우대갈비는 약 1.5인분 정도 되는 것 같으니 참고하세요 식전 웰컴 드링크를 줘요. 메실이랑 어떤 차를 섞었다고 했는데 기억이 나질 않네요. 아뭏튼

Naver Blog

[JK 농원] 상토의 중요성 (골든 스마라그의 겨울나기)

조경수를 전문으로 판매하는 주니퍼 가든 블로그를 통해 상토의 중요성을 알게 되었어요. https://blog.naver.com/juniper_garden/222684630647 상토/분갈이흙 고르는 법 화분갈이 흙은 아무거나 사지 마세요 원예용 상토를 아무거나 사면 바로는 티가 안나도 1년뒤 쯤엔 이런 문... blog.naver.com 저는 작년 12월, 1년생 골든 스마라그 약 800주를 포트에 심었어요. 공부한대로 주니퍼 가든 님께서 추천하는 상토인 (주)건곤지오텍 침엽수용 상토를 구매해서 심었지요. 비닐하우스도 추울 것 같아 아래와 같이 비닐 터널까지 덮여 줘서 보온에 신경을 썼어요. 겨울이기 때문에 물은 한달에 한번 정도씩 비닐을 걷어내고 물을 듬뿍 줬어요. 사실 상토가 약간 모자라서 700주 정도는 (주)건곤지오텍 상토에 심었고, 100주 정도는 상토 조금과 주변에 있던 일반 흙을 섞어서 심었어요. 모든 아이들에게 동일한 주기로 물을 주었고, 동일한 환경에서 지냈죠. 올해

Naver Blog

[C++] 람다 표현식(lambda expression) 문법 (람다 함수) 총정리

이번에는 람다 표현식의 기본에 대해 알아보겠습니다. C++11 이후부터 제공이 되는 람다 표현식은 "익명의 함수(객체)를 만드는 문법" 이라고 할 수 있습니다. 이는 함수나 함수 객체를 별도로 정의하지 않고, 필요한 지점에서 곧바로 함수 형태로 직접 만들어 쓸 수 있는 클로저(Closure) 입니다. 람다 표현식의 이해 람다 표현식을 쉽게 이해하기 위해 예시를 먼저 보겠습니다. 벡터를 내림차순으로 정렬하는 소스를 보면 아래와 같습니다. #include <iostream> #include <vector> #include <algorithm> bool comp(int a, int b) { return a > b; } int main() { std::vector<int> v{ 1,3,2,4,5 }; std::sort(v.begin(), v.end(), comp); for (auto e : v) std::cout << e << ", "; std::cout << std::endl; retur

Naver Blog

[JK 농원] 조경수 전문, 국내 최저가 보장

안녕하세요? JK 농원 대표 이.재.광. 입니다. 고객님의 정원을 고급스럽게 장식해 줄 다양한 조경수를 사랑과 정성으로 키우고 있습니다. 항상 저렴한 가격으로 (조경수 국내 최저가 보장) 좋은 품질의 조경수를 제공해 드릴 것을 약속 합니다. 대표는 누구? 컴퓨터 공학과를 졸업하고 대전의 국책연구기관에서 5년간, 서울의 전자회사 대기업에서 13년간 소프트웨어를 개발해왔습니다. 현재는 대기업에 재직 중이면서 소프트웨어 개발 경력을 살려 농업 사회의 혁신을 줄 수 있는 자동화 시스템을 개발하고 이를 이용하여 건강한 조경수를 정성스럽게 키워 저렴하게 공급한다는 목표를 가지고 있습니다. 농원은 어디에 있나요? JK 농원은 김포 월곶에 위치해 있습니다. 물과 햇빛이 풍부한 곳에 자리하고 있습니다. 바람이 좀 많이 불고, 온도가 낮은 편이긴 하나 이런 환경에서 건강하게 자란 조경수는 어느 환경에서도 잘 자라지 않을까요? (사실 아직은 잘 모르겠습니다.) 어떤 종류의 조경수를 키우시나요? 에메랄드

Naver Blog

[JK농원] 눈부시게 화려한 경기도 벚꽃 명소 Best 추천

어느새 봄이 성큼 다가왔어요. 어제부터 봄을 시샘하듯 좀 추워지긴 했는데요. 경기도는 곧 날씨가 다시 풀리고 이번주, 다음주(4월 둘째주) 까지해서 벚꽃이 만발할 것으로 보입니다. 경기도 벚꽃 명소를 추천합니다. 용인시 가실 벚꽃길 경기도 용인시 처인구 포곡읍 가실리 출처: 용인시청 주소: 경기도 용인시 처인구 포곡읍 에버랜드로 562번길 38 주차: 주차장은 별도로 없어서 길가에 주차 특징: 용인 가실 벚꽃길은 용인 8경에 속할 정도로 정말 아름다운 곳입니다. 가실 벚꽃은 호암미술관 입구 왕벚나무 터널과 삼만육천지라는 독특한 이름을 가진 호수 주변을 환상의 세계로 만듭니다. 매년 4월 에버랜드가 주관하고 용인시가 후원하는 용인에버 벚꽃축제가 개최됩니다. 호암 미술관 주변에는 잔디밭으로 되어 있어 도시락과 같은 간식을 갖고 나들이를 즐기기 좋습니다. 용인 호암 저수지 근처에 위치하고 있어 벚꽃나무 군락지로 유명한 벚꽃 명소 입니다. 상갈공원 경기도 용인시 기흥구 상갈동 129-17

Naver Blog

[C++] 함수 실행 시간 측정 방법 - chrono 총정리

지난번에 현재 시간 얻는 방법에 대해 언급하면서 chrono에 대해 잠시 알아봤습니다. https://blog.naver.com/dorergiverny/223040055108 [C++] 현재 시간 알아내기, time_t, chrono 파헤치기 지난번에 windows 에서 제공하는 api를 기반으로 현재시간을 알아보는 시간을 가졌었어요. https://blog.na... blog.naver.com 현재 시간을 알아낼 수 있다는 것은 어떠한 함수 시작 부분에서의 시간을 얻어오고 함수의 끝 부분의 시간을 얻어온 후 두 시간의 차이를 측정하면 그 함수(이벤트)의 수행 시간을 알 수 있겠죠. chrono 클래스란? chrono는 C++11 에서 추가된 시간 관련된 라이브러리입니다. clock, getTickCount, timeGetTime 등 어떠한 함수(이벤트)의 수행 시간을 측정하는 방법들이 많이 있지만 정밀도와 사용성 측면에서 chrono 를 사용하는 것을 추천한다. 정밀도는 nano

Naver Blog

[C++] 배열(array)을 벡터(vector)로 변환하는 방법 총정리

이번에는 배열을 vector로 변환하는 여러가지 방법에 대해 알아보겠습니다. 벡터 생성자 사용 int x[3] = {1, 2, 3}; std::vector<int> v(x, x + sizeof(x) / sizeof(x[0]); int x[3] = {1, 2, 3}; std::vector<int> v(std::begin(x), std::end(x)); assign() 사용 int x[3] = {1, 2, 3}; std::vector<int> v; v.assign(x, x + sizeof(x) / sizeof(x[0])); insert() 사용 int x[3] = {1, 2, 3}; std::vector<int> v; v.insert(v.begin(), std::begin(x), std::end(x)); push_back() 사용 int x[3] = {1, 2, 3}; std::vector<int> v; for(int i : x) v.push_back(i); std::copy() 사용

Naver Blog

[C++] std::move 총정리 (효율적인 자원 관리)

이번에는 C++11에서 추가된 것 중 가장 중요하다고 여겨지는 std::move()에 대해 알아보겠습니다. std::move() 의 개념 이해를 확실하게 하기 위해 하나의 예제와 메모리 그림을 함께 살펴볼께요. #include <iostream> #include <string> int main() { std::string s1 = "Move Semantics"; std::string s2 = s1; std::string s3 = "Move Semantics"; std::string s4 = std::move(s3); std::cout << "s1: "<< s1 << std::endl; std::cout << "s2: "<< s2 << std::endl; std::cout << "s3: "<< s3 << std::endl; std::cout << "s4: "<< s4 << std::endl; return 0; } 첫번째 줄부터 실행될 때의 메모리 그림을 보면, std::string s

Naver Blog

마크다운 뷰어(markdown viewer) 총정리(2) - notepad++ 이용하기

마크 다운 파일을 제가 제일 좋아하는 notepad++을 이용하여 편집하고 보는 방법을 알려드릴께요. notepad++의 플러그인>>플러그인 관리... 로 들어가시면, 아래와 같이 플러그인 관리자가 뜨게되는데, '찾기' 란에 markdown 이라고 검색을 합니다. 그러면 Markdown Viewer++ 이란게 보일꺼에요. 왼쪽 체크 박스 체크를 한 후 "설치"를 합니다. 그럼 잽싸게 프로그램이 재실행 되면서 아무일도 안일어나요. 엥? 뭐지? 플러그인 메뉴를 다시 눌러보니 Markdown Viewer++이 설치되었어요. Ctrl + Shift + M 을 누르셔도 되고, 직접 메뉴를 누르시면 아래와 같이 마크다운 편집창과 미리보기 창이 뜹니다. 가볍고 무료이고 쉽게 사용할 수 있어서 좋아요. 편집을 한 후 View>>Refresh를 눌러봐도 업데이트가 되지 않아요. 그럴 땐 마크다운 플러그인을 설치하면서 생긴 위와 같은 버튼을 두번 누르시면 MarkdownViewer++가 없어졌다가 생

Naver Blog

마크다운 뷰어 (markdown viewer) 총정리(1) - 뷰어 종류 - 크롬 뷰어

마크다운에 대해 들어보셨나요? 개발을 하면서 깃허브 같은 곳에서 README.md 란 파일을 보셨을꺼에요. 나를 읽어달라고 하는데, 읽기가 어렵더라고요. 마크다운은 사용법이 쉽고 문서를 빠르게 정리할 수 있어서 최근 많이 사용되는 파일 형식 입니다. 그런데 md 파일을 어떻게 열어야 이쁘게 작성된 폼으로 보이는지 어려우셨죠? 가장 많이 사용되는 방법이 바로, 크롬 웹 스토어에서 제공하는 마크다운 뷰어입니다. 크롬 마크다운 뷰어 설치 구글에서 markdown viewer를 치면 제일먼저 검색되는 것이 크롬 웹 스토어에요. 웹스토어에 가면 크롬에 추가를 할 수 있어요 '크롬에 추가' 버튼을 누르고 확장 프로그램 추가를 누르면 크롬에 추가가 되었다고 나와요. 위에 써 있는대로 크롬 브라우져의 오른쪽 상단에 보면 웹 주소 입력란 오른쪽에 보면 확장 프로그램이 있습니다. Markdown Viewer가 보이고, 오른쪽 핀을 클릭하시면 아래와 같이 m 마크가 보여 집니다. m 마크를 눌러보면 아

Naver Blog

마크다운 뷰어(markdown viewer) 총정리(3) - visual studio 사용하기

마크다운 뷰어에 대한 다른 툴들은 이전에 간단히 알아봤어요. https://blog.naver.com/dorergiverny/223047100900 마크다운 뷰어 (markdown viewer) 파헤치기(1) - 뷰어 종류 - 크롬 뷰어 마크다운에 대해 들어보셨나요? 개발을 하면서 깃허브 같은 곳에서 README.md 란 파일을 보셨을꺼에... blog.naver.com https://blog.naver.com/dorergiverny/223047095077 마크다운 뷰어(markdown viewer) 파헤치기(2) - notepad++ 이용하기 마크 다운 파일을 제가 제일 좋아하는 notepad++을 이용하여 편집하고 보는 방법을 알려드릴께요. notepad+... blog.naver.com 이번엔 우리가 소프트웨어 개발을 하면서 가장 많이 사용하는 IDE인 Visual Studio 를 이용한 방법을 공유할께요. markdown 편집을 visual studio에서도 할 수 있어요.

Naver Blog

[OpenCV][C++] 영상에 다른 영상(로고) 삽입하기(1) - ROI 설정, 영상 가중합 로고 넣기

이번에는 영상에 다른 영상을 삽입하는 방법에 대해 알아볼께요. ROI(Region Of Interest, 관심영역) 설정 한 영상에 로고와 같은 다른 영상을 삽입하려고 하면 ROI를 먼저 알아야 합니다. ROI(Region Of Interest)는 관심영역이란 뜻으로, 영상 내에서 특정 작업을 하고자 하는 일부 영역을 뜻합니다. 에지를 찾거나 특정 물체를 찾는 시간을 단축시키기 위해 ROI를 설정하여 찾기도 합니다. 만약 얼굴 영역 (좌표가 (225, 230)이고, width: 130, height: 160인 사각형) 을 관심영역으로 설정한다면 아래와 같이 하면 됩니다. #include <iostream> #include <opencv2/opencv.hpp> int main() { cv::Mat src_lena_org = cv::imread("../lena_color.bmp", cv::IMREAD_UNCHANGED); cv::Rect roiRect = cv::Rect(225, 230

Naver Blog

[OpenCV][C++] 영상에 다른 영상(로고) 삽입하기(2) - mask 생성, copyTo(), bitwise_and()

지난번엔 관심영역과 blending을 통한 영상 삽입에 대해 알아봤다면, https://blog.naver.com/dorergiverny/223051510275 [OpenCV][C++] 영상에 다른 영상(로고) 삽입하기(1) - ROI 설정, 영상 가중합 로고 넣기 이번에는 영상에 다른 영상을 삽입하는 방법에 대해 알아볼께요. ROI(Region Of Interest, 관심영역)... blog.naver.com 이번에는 로고를 좀 더 멋지게 삽입해 봐요. 오늘은 좀 Quick 하게 진행할께요. copyTo() 이용하기 이번에도 같은 영상을 가지고 로고를 넣어 볼께요. 1. 영상 준비하기 원본 영상과 로고 영상을 준비합니다. cv::resize()를 이용하여 영상 사이즈를 적절히 조절해줍니다. cv::Mat src_lena_org = cv::imread("../lena_color.bmp", cv::IMREAD_UNCHANGED); cv::Mat src_lena; cv::resize(s

Naver Blog

마크다운 (markdown) 문법 총정리

지난번에 마크다운 뷰어에 대해 알아보았습니다. https://blog.naver.com/dorergiverny/223047153032 마크다운 뷰어(markdown viewer) 파헤치기(3) - visual studio 사용하기 우리가 소프트웨어 개발을 하면서 가장 많이 사용하는 IDE가 바로 Visual Studio 입니다. markdown 편... blog.naver.com 이번에는 visual studio 기반으로 마크다운 문법을 파헤쳐 봅시다. 마크다운이란? 2004년 존 그루버에 의해 만들어졌고, 쉽게 쓰고 읽을 수 있으며, HTML로 변환이 가능합니다. 마크다운이 각광받기 시작한 이유는 github 덕분이라고 해도 과언이 아닙니다. 깃헙 저장소에 관한 정보를 기록하는 README.md 는 깃헙을 사용하는 사람이라면 누구나 가장 먼저 접하게 되는 마크다운 문서이기 때문입니다. 마크다운 장/단점 1. 장점 a. 문법이 간결하고 쉬움 b. 별도의 도구 없이 작성이 가능함 c.

Naver Blog

[소프트웨어] 소프트웨어(SW) 품질 평가 지표/기준

SW 품질 평가 지표/기준에 대해 고민해보는 시간을 가져볼까 합니다. 우리가 SW를 많이 개발하고 있지만 이정도의 지표를 지킨다면 좀 더 좋은 소프트웨어를 만들 수 있다?? 뭐 이런 느낌의 글 입니다. 좋은 소프트웨어란? 좋은 소프트웨어란 무엇일까요? 아무래도 구현이 잘 되어 있는지, 신뢰성이 있는지, 사용성이 편한지, 유지보수성이 좋은지, 빠르게 동작하는지, 이식성이 좋은지, 보안성이 보장되는지 등을 만족하는 SW일 것입니다. 다시 정리해보면, 모듈의 복잡도는 낮추고, 모듈의 독립성은 높이고, 모듈의 결함은 없고, 모듈의 공용성을 높이면 SW는 좋다고 할 수 있을 것 입니다. SW 품질이 나빠지는 원인은? SW 품질이 나빠지는 원인은 뭘까요? 자꾸 신규 기능이 추가되거나 요구사항이 변경되거나 일정 단축 등의 이유로 코드의 품질, 설계에 신경을 쓰지 못하고 당면한 이슈 해결을 빨리 수정하는 방법으로만 처리 하다 보니까 품질이 나빠집니다. SW 품질을 평가한다? 그럼, 품질을 평가한다

Naver Blog

[C++] 표준 입력/출력 함수 cin, cout 총정리

이번에는 가장 많이 사용되지만 또 정확히 모르는 부분이 많은 cout과 cin에 대해 알아보겠습니다. 출력문 std::cout cout은 Console OUTput의 약자로 콘솔에 출력해주세요. 란 뜻입니다. cout을 사용하시려면 #include <iostream>을 추가해 주셔야 합니다. using namespace std; 를 사용하시면 std::cout, std::endl 에서 std:: 한정자를 제외시킬 수 있는데, 저는 매번 붙이는 것을 선호합니다. #include <iostream> int main() { std::cout << "Console Output" << std::endl; return 0; } 위와 같이 std::cout을 이용하여 console에 정보를 출력할 수 있습니다. 위 코드 실행 결과는 아래와 같아요. 여기에서, '<<' 연산자는 bit를 왼쪽으로 이동하는 연산자인데 어떻게 사용이 가능할까요? 바로 '<<'는 기본 자료형에 오버로딩이 되어 있어서 그

Naver Blog

[C++] std::string 클래스(문자열) 완벽 총정리

이번엔 문자열(string)을 다루는 클래스인 string 클래스를 파헤쳐봐요. std::string 의 모든 것을 정리해봤습니다. std::string 입/출력 방법 이전에 C에서는 char* 나 char[]의 형태로 문자열을 다뤘다면, c++에서는 문자열을 하나의 변수 type으로 간주하여 다룰 수 있게 합니다. char*나 char[]와 다르게 문자열 끝에 '\0'이 포함되지 않아 문자열의 길이를 동적으로 변경이 가능합니다. 지난번에 말씀드린 것과 같이 cin을 통해 string을 입력받을 수 있었죠. #include <iostream> #include <string> int main() { std::string str; std::cout << "cin 입력:" << std::endl; std::cin >> str; std::cout << "cin 결과:" << str << std::endl; return 0; } cin>>str : 공백(space)가 입력될 때까지 값을 받습

Naver Blog

[OpenCV][C++] cv::Mat 클래스 총정리(5) - 16bit, 32bit, 64bit 원소 접근(short, int, float, double)

우리는 그동안 cv::Mat 원소 접근에 대해 살펴보았어요. 우리가 다루는 대부분의 영상이 8bit 영상이지만 필터링을 하거나 산술 덧셈, 산술 뺄셈 등을 하다보면 8bit 를 넘어가는 숫자가 생기게 됩니다. opencv 에서는 산술 덧셈, 산술 뺄셈을 하면 입력 영상과 같은 type으로 결과를 내 줍니다. bit를 넘어가는 수, 예를 들어 200 + 150 = 350 이 되어야 하는데, 255로 표시가 되는 거죠. 아래와 같이 강제로 16bit 영상을 선언한 후 연산을 해도 다시 8bit로 바뀌네요. 그래서 filtering을 준비해봤어요. 대표적인 것이 Laplacian 필터인데요. cv::Laplacian()은 출력 포맷을 정할 수 있는데, lena 영상을 Laplacian을 해 보니 계산 값들이 아래와 같이 음수 값도 갖고, 255를 넘어가는 값도 갖습니다. 만약 이 결과를 8bit 영상에 담아내면 아래와 같이 255 이상 값은 255로 0 이하 값은 0으로 되기 때문에 정보

Naver Blog

[OpenCV][C++] cv::Mat 클래스 총정리(1)

OpenCV를 사용하기 위해서 가장 기본이 되는 클래스는 바로 cv::Mat 클래스 입니다. 1. cv::Mat 클래스란? 2. cv::Mat 생성 방법 3. cv::Mat 복사하기 3.1 얕은 복사 3.2 깊은 복사 cv::Mat 클래스란? cv::Mat 클래스는 행렬(matrix)를 표현하기 위한 클래스에요. n차원 단일/멀티 채널 배열을 다 표현할 수 있습니다. OpenCV 공식 문서 https://docs.opencv.org/4.x/d3/d63/classcv_1_1Mat.html OpenCV: cv::Mat Class Reference n-dimensional dense array class More... #include <opencv2/core/mat.hpp> Inheritance diagram for cv::Mat: Public Types enum { MAGIC_VAL = 0x42FF0000, AUTO_STEP = 0, CONTINUOUS_FLAG = CV_MAT_CONT

Naver Blog

[OpenCV][C++] cv::Mat 클래스 총정리(2) - 원소 접근

지난번엔 cv::Mat 클래스를 선언하고 생성하는 기본적인 방법에 대해 알아봤어요. https://blog.naver.com/dorergiverny/223035698739 [OpenCV][C++] cv::Mat 클래스 파헤치기(1) OpenCV를 사용하기 위해서 가장 기본이 되는 클래스는 바로 cv::Mat 클래스 입니다. 1. cv::Mat 클래... blog.naver.com 이번에는 cv::Mat 의 원소 접근 방법과 사용할 수 있는 멤버 변수와 함수에 대해 좀 더 자세히 살펴봐요. 1. cv::Mat 멤버 변수/함수 2. cv::Mat 원소 접근 방법 cv::Mat 멤버 변수 cv::Mat src; 를 기준으로 멤버 변수와 함수를 설명할께요. 영상 사이즈는 640x480, 1ch/3ch, 8bit/16bit 기준으로 계산해봤어요. 표현식 설명 8bit 1ch 8bit 3ch 16bit 1ch 16bit 3ch src.cols 열의 개수 640 640 640 640 src.ro

Naver Blog

[OpenCV][C++] cv::Mat 클래스 총정리(3) - 원소 접근 속도 분석

오늘은 인터넷 어디에도 없는 정보를 드릴까 합니다. 그러니 귀 쫑긋 눈 활짝 떠 주시고. 이번에는 여러가지 cv::Mat 원소 접근 방법들의 속도를 직접 측정해 보았습니다. 아울러 속도 최적화 하는 꿀팁!(정말 빠릅니다.)도 포함되니 끝까지 읽어 주세요. cv::Mat 원소 접근 방법에 대해서는 아래 글을 참조하세요. https://blog.naver.com/dorergiverny/223035763914 [OpenCV][C++] cv::Mat 클래스 파헤치기(2) - 원소 접근 지난번엔 cv::Mat 클래스를 선언하고 생성하는 기본적인 방법에 대해 알아봤어요. https://blog.naver.com... blog.naver.com 실험 개요 - Test 환경: CPU: i7-1165G7, 2.80 GHz RAM : 16GB OpenCV 버전: 4.6.0 - 비교군: at, ptr, ptr 개선, data, parallel_for 이용 ptr, parallel_for 이용 ptr 개

Naver Blog

[OpenCV][C++] cv::Mat 클래스 총정리(4) - 컬러(color) 원소 접근, 3채널

지난번에는 gray scale 영상에서 원소에 접근하는 방법에 대해 알아봤는데, https://blog.naver.com/dorergiverny/223035763914 [OpenCV][C++] cv::Mat 클래스 파헤치기(2) - 원소 접근 지난번엔 cv::Mat 클래스를 선언하고 생성하는 기본적인 방법에 대해 알아봤어요. https://blog.naver.com... blog.naver.com 오늘은 color 영상 원소에 어떻게 접근하는지 알아볼께요. 3채널, 즉 컬러 영상은 한 화소를 구성하는 게 3개라는 뜻이다. 다시 말하면, 빛의 3원소인 R, G, B가 하나의 색깔을 표현한다는 것이다. opencv에서는 보통 B, G, R 순서로 저장을 해요 (R, G, B 순서로 저장할 수도 있어요) at 사용 가장 직관적으로 픽셀에 접근하는 방법입니다. 하나의 위치에 b, g, r 3개의 원소가 있기 때문에 cv::Vec3b type을 사용하여 원소에 접근할 수 있어요. 아래 mat

Naver Blog

[OpenCV][C++] Image Watch 설치/사용 방법 (Visual Studio 영상 디버깅)

이번에는 영상처리 개발자들이 가장 많이 하고 개발 효율성을 높일 수 있는 Visual Studio 에서 영상을 디버깅 하는 방법을 알아 보겠습니다. Image Watch는 디버그 모드에서 break point를 걸어 놓고 중간 영상 처리 결과를 볼 수 있어서 영상처리를 하는데 필수 아이템이죠. Visual Studio에서 도구>>확장 및 업데이트(U)... 을 선택합니다. 그럼 아래와 같은 창이 뜹니다. 여기에서 온라인>>검색 → image watch 를 검색 하시면 Visual Studio에 맞는 버전의 image watch가 검색됩니다. 전 2017이므로 Image Watch 2017이 검색되었습니다. 다운로드 버튼을 누릅니다. 그리고 Visual Studio 창을 닫으면 아래와 같이 VSIX 설치 관리자가 동작되면서 수정 버튼을 누르면 설치가 시작 됩니다. 그럼 설치 관리자는 닫으시고, Visual Studio를 다시 시작 시켜 주세요. 그럼 아래와 같이 Image Watch가

Naver Blog

[C++] min, max, min_element, max_element 사용법 총정리

소프트웨어 개발을 하다보면 값을 비교하여 최대값, 최소값을 찾거나 array, vector 등 객체에서 최대값, 최소값을 찾는 경우가 많이 발생한다. 물론 for 문으로 작성할 수 있지만 간혹 실수할 때가 발생하기도 한다. std::min(), std::max(), std::minmax() 사용법 min(), max(), minmax()를 사용하기 위해서는 #include <algorithm>을 해야 한다. #include <iostream> #include <algorithm> int main() { int a = 10; int b = 3; int c = 32; int d = 1; int maxVal = std::max(a, b); int minVal = std::min({ b, c, d }); std::pair<int, int> minmax_val = std::minmax({ a, b, c, d }); int minNum = minmax_val.first; int maxNum =

Naver Blog

[C++] 현재 시간 알아내기, time_t, chrono 클래스 총정리

지난번에 windows 에서 제공하는 api를 기반으로 현재시간을 알아보는 시간을 가졌었어요. https://blog.naver.com/dorergiverny/223036013271 [C++] 시스템 시간/날짜 얻어오기, SYSTEMTIME, GetLocalTime, GetSystemTime 코딩을 하다보면 시스템 시간과 날짜가 필요한 경우가 많습니다. 보통 로깅을 하기 위해서죠. 다행히 Wind... blog.naver.com 그런데 현재 시간 알아보는 다른 방법에 대해 문의를 주신 분이 계셔서 짧은 지식으로 시간을 내어 정리해보려고 합니다. time_t 사용 c언어에서는 time.h에, c++ 언어에서는 ctime에 typedef를 통해 정의되어 있어요. 즉, #include <ctime>을 해주셔야 해요. 유닉스와 POSIX 시스템에서는 time_t 를 정수 혹은 부동소수점으로 정의하고 있어요. 이 때 값은 1970년 1월 1일 자정(UTC)에서부터 현재까지 흐른 초수를 의미합

Naver Blog

[C++][중급] safe bool, optional explicit(C++20이후) 이란?

이번에는 safe bool, optional explicit 에 대해 알아보겠습니다. 1. safe bool 이란? 2. optional explicit 이란? safe bool 이란? 아래와 같은 예시를 보겠습니다. Machine m 이란 객체의 유효성을 if 문으로 조사하고 싶다.... 라고 한다면 어떻게 해야 할까요? #include <iostream> class Machine { int data = 10; bool state = true; public: }; int main() { Machine m; if(m) { } } if 문 내에서는 bool 타입이 되어야 합니다. 그럼 이것을 동작 시키려면 어떻게 하면 될까요? operator bool() 만 제공하면 되겠죠. #include <iostream> class Machine { int data = 10; bool state = true; public: operator bool() {return state;} }; int m

Naver Blog

[C++][중급] nullptr, return type resolver 란?

이번엔 nullptr과 return type resolver에 대해 알아 보아요. 1. nullptr 이란? 2. return type resolver란? 3. 람다 표현식과 변환 nullptr 이란? nullptr 이란 녀석에 대해 알아 보아요. 일단 NULL과 nullptr이 같아 보이지만 다른 차이가 있습니다. C++11 이전 버전에서는 컴파일러가 NULL을 포인터가 아니라 정수 0과 동일하게 간주합니다. 하지만 nullptr은 상수값이 아닌 포인터 입니다. 포인터 초기화 시 0을 사용하지 말고 nullptr 을 사용하세요 란 말을 들어보셨죠? 이는 boost library에 있는 도구를 C++11을 만들면서 표준에 추가한 것으로 현재는 C++ keyword로 지정되어 있죠. nullptr을 직접 만들어 보면서 살펴 보시죠. void foo(int* p) {} void goo(char* p) {} struct nullptr_t { template<class T> constexp

Naver Blog

[C++][중급] 생성자, 소멸자 호출 원리는?

오늘은 생성자, 소멸자 호출 순서와 이를 간과했을 때 발생할 수 있는 문제점에 대해 알아 보아요. 1. 생성자(소멸자) 호출 순서는? 2. 발생 가능한 문제점?해결책? 생성자(소멸자) 호출 순서는? 오늘은 생성자, 소멸자의 호출 원리를 정확히 알아보기 위해 아래 조금 복잡해 보이는 예제를 만들어 봤어요. 생성자 호출 순서?? 이게 뭐가 중요하냐? 라고 생각하실 수 있겠지만 모듈 설계를 하고 코딩을 하다 보면 초기화, 생성자 호출 순서 때문에 이상하게 동작하는 경우가 많습니다. 물론 디버깅도 어렵겠죠? #include <iostream> struct BM // base member { BM() { std::cout<< "BM()" << std::endl;} ~BM() { std::cout<<"!BM()" << std::endl;} }; struct DM // derived member { DM() { std::cout<< "DM()" << std::endl;} DM(int) { std

Naver Blog

[C++][중급] 생성자와 가상함수

이번에는 생성자와 가상함수에 대해 간단히 알아보겠습니다. #include <iostream> class Base { public: Base() {} void foo() { vfunc(); } virtual void vfunc() { std::cout<<"Base vfunc" <<std::endl; } }; class Derived : public Base { int data{10}; public: virtual void vfunc() override { std::cout<<"Derived vfunc" << data << std::endl; } }; int main() { Derived d; d.foo(); } Base class 에서 vfunc()라는 가상함수를 만들었고, 파생클래스인 Derived 에서 vfunc()를 재정의 했습니다. main() 에서 Derived의 객체를 생성하고 foo() 함수를 호출했는데, 결국 Base class의 foo() 함수를 부르게 되고, Base

Naver Blog

[C++][중급] 멤버 함수의 호출 원리(this call)

오늘은 멤버 함수와 static 멤버 함수의 호출 원리에 대해 살펴 보겠습니다. 멤버 함수의 호출 원리 (this call) class Point { int x{0}; int y{0}; public: void set(int a, int b) { x = a; y = b; } }; int main() { Point pt1; Point pt2; pt1.set(10, 20); pt2.set(10, 20); } 멤버 데이터는 객체당 한 개씩 생성됩니다. Point 객체는 아래와 같이 두 개를 생성해서 멤버 데이터는 메모리에 두개씩 있게 될텐데, 과연 멤버 함수(set())는 메모리에 두 개가 놓일지, 한 개가 놓일지 생각해 봅시다. 정답은 메모리에 1개만 있겠죠? 그럼 x가 어떤 객체의 멤버인지 어떻게 알 수 있을까요? 만약 pt1.set(10, 20); pt2.set(10,20); 이 Point의 set() 함수로 10, 20만 던져준다면 set()은 어느 놈 것인지 알 수 없겠죠? 이게

Naver Blog

[C++][중급] 멤버 함수의 포인터, invoke, mem_fn

이번에는 멤버 함수의 포인터 에 대해 알아볼까 합니다. 1. 멤버 함수 포인터란? 2. 멤버 함수 호출 방법 2.1 std::invoke() 2.2 std::mem_fn() 멤버 함수 포인터란? class X { public: void mf1(int a) {} static void mf2(int a) {} }; void foo(int a) {} int main() { void(*f1)(int) = &foo; // ok void(*f2)(int) = &X::mf1; // error void(*f3)(int) = &X::mf2; // ok } C언어에서의 함수 포인터 기억 나시나요? void(*f1)(int) = &foo; void(*f1)(int) 로 함수의 포인터를 가져오는데, void를 return 값으로 갖고, int 를 인자로 가진 함수의 포인터(주소)를 담는 표현이라고 생각하시면 됩니다. 그럼 X의 멤버함수인 mf1() 도 함수 형태가 foo()와 동일하니까 같은 방법으로 포

Naver Blog

[C++][중급] 멤버 데이터 포인터, invoke

오늘은 멤버 데이터를 가리키는 포인터에 대해 알아볼까 합니다. #include <iostream> struct Point { int x; int y; }; int main() { int num = 0; int* p1 = &num; int Point::*p2 = &Point::y; *p1 = 10; // ok // *p2 = 10; // error Point pt; pt.*p2 = 10; // pt.y = 10; // *((char*)&pt + p2) = 10; } 멤버 데이터를 가리키는 포인터를 일반 데이터의 포인터와 비교해보면 별거 아닌데 어려워 보이죠? 일반 데이터 포인터 int* p1 = &num; 멤버 데이터 포인더 int Point::*p2 = &Point::y; 포맷은 똑같은데 이 클래스의 멤버야. 정보만 넣어 주면 됩니다. 여기에서 잠깐, 분명히 Point 타입 객체를 선언하지 않았는데, p2는 무엇을 담고 있을까요? p2에는 offset 값이 들어 있습니다. 공식 표준

Naver Blog

[C++] 시스템 시간/날짜 얻어오기, SYSTEMTIME, GetLocalTime, GetSystemTime

코딩을 하다보면 시스템 시간과 날짜가 필요한 경우가 많습니다. 보통 로깅을 하기 위해서죠. 다행히 Windows API에서 시스템 시간과 날짜를 가져오는 interface를 제공합니다. SYSTEMTIME은 아래와 같이 정의되어 있어요 typedef struct _SYSTEMTIME { WORD wYear; WORD wMonth; WORD wDayOfWeek; WORD wDay; WORD wHour; WORD wMinute; WORD wSecond; WORD wMilliseconds; }SYSTEMTIME, *PSYSTEMTIME; SYSTEMTIME을 사용하기 위해서는 #include <windows.h>를 해 줘야 해요. 1. GetSystemTime() GetSystemTime은 UTC 시간을 가져옵니다. UTC 시간은, 원자시계를 기준으로 한 표준시로써, 1972년 1월 1일부터 시행된 국제 표준시 입니다. 한국 시간으로는 KST(Korean Standard Time) UTC

Naver Blog

소프트웨어 개발 방법론(2)

오늘은 소프트웨어 개발 프로세스에 대해 알아 보아요. 1. 소프트웨어 개발 프로세스란? 2. 폭포수 모델 3. 나선형 모델 4. 통합 모델 5. 애자일 모델 소프트웨어 개발 프로세스란? 소프트웨어 개발 프로세스란 무엇일까요? 소프트웨어를 개발할 때 해야 하는 일의 순서를 정의하는 것이죠. 일의 순서는 입니다. 이 순서를 어떻게 수행하느냐에 따라 개발 프로세스의 종류가 나뉩니다. 1년짜리 프로젝트를 예로 들어보겠습니다. Waterfall (폭포수) Process (1970년대) 분석(1~3월) 설계(4~6월) 구현(7~10월) 테스트(11, 12월) 이렇게 하게 됩니다. 위키 백과에 보면 아래와 같은 그림이 있습니다. 출처: https://ko.wikipedia.org/wiki/%ED%8F%AD%ED%8F%AC%EC%88%98_%EB%AA%A8%EB%8D%B8 개발 순서를 그대로 나열하고 폭포처럼 흐르죠? 이는 순차적으로 한 단계, 한 단계 진행해 나가는 것으로 전 단계가 수행되어 완

Naver Blog

[C++] MinGW 설치하기 (g++ 컴파일러 Windows 에서 사용하기)

MinGW는 GNU gcc 컴파일러를 windows 환경에서 사용할 수 있도록 만든 도구 입니다. MinGW를 사용하기 위해서 먼저 설치해봐야겠죠? mingw.org 라는 공식 사이트도 있지만, 좀 복잡합니다. 따라서 sourceforge 에서 다운을 받겠습니다. MinGW - Minimalist GNU for Windows Download MinGW - Minimalist GNU for Windows for free. A native Windows port of the GNU Compiler Collection (GCC) This project is in the process of moving to osdn.net/projects/mingw, you can continue to follow us there. MinGW: A native Windows port of the GNU Compiler Collection (GCC), with freely di... sourceforge.n

Naver Blog

[C++] Windows에 MinGW 설치하기(쉬운방법), gcc 컴파일러

이번에는 MinGW를 쉽게 설치하고 사용하는 방법에 대해 알아보겠습니다. Windows 에서 GNU gcc 컴파일러를 사용하려면 MinGW를 사용하시면 됩니다. 하지만 sourceforge를 이용하여 설치를 하게 되면, 생각보다 복잡합니다. 여기에서는 쉽게 설치하고 사용하는 방법을 알려드릴께요. 먼저 nuwen.net 에 들어갑니다. News - nuwen.net News - nuwen.net So high, so low, so many things to know Site Info: Favorites: C++: Fun: Newer Stuff: Old Fun: Old Tech: Old Other: News Rating System MinGW Distro Image Hacking SF Reviews Origami Polyhedra bwtzip Quotations Stephan T. Lavavej Paper Airplane Random Work Book Reviews Deus Ex PNG

Naver Blog

[C++] windows에서 cl 컴파일러 사용하기

이번에는 cl 컴파일러에 대해 알아보아요. c/c++ 컴파일러에는 gcc 와 cl 컴파일러가 있습니다. 일반적으로 Linux에서는 gcc 컴파일러를, Windows 에서는 cl 컴파일러를 사용하신다고 보면 됩니다. cl 컴파일러는, Microsoft 사가 제공하는 c/c++ 컴파일러로 visual studio 에서 사용하는 컴파일러 입니다. c/c++ 개발자라면 visual studio IDE를 사용해 보셨거나 들어보셨을 거에요. cl 컴파일러를 직접 사용하려면 시작 >> VisualStudio 2017 폴더 >> VS 2017에 대한 개발자 명령 프롬프트 를 선택하시면 됩니다. 이 걸 클릭해 보시면, 아래와 같은 창이 뜨는 것을 볼 수 있습니다. 여기에서 소스가 있는 폴더로 이동 후 (저는 D:\ 에 있습니다.) cl 파일명 을 입력하시면 아래와 같이 컴파일이 되어 sample.exe 와 obj 파일이 생성된 것을 볼 수 있습니다. exe 파일을 실행 시켜보려면 실행파일 이름을 아

Naver Blog

[C++][중급] std::string 과 std::string_view 차이

오늘은 std::string 과 std::string_view의 차이에 대해 알아보겠습니다. std::string_view는 C++17에서부터 추가되었습니다. string_view는 내부적으로 문자열에 대한 pointer와 길이만 가지므로 임시객체를 생성하지 않고 문자열을 생성할 수 있습니다. 주의할 점은 string_view는 내부적으로 null 종료 문자를 가지지 않습니다. 이는 길이 정보가 있기 때문이죠. 먼저 짧은 예제를 보겠습니다. #include <string> #include <string_view> void foo(const std::string& s) { } int main() { foo("Practice makes Perfect!"); } 분명히 "Practice makes Perfect!"란 문자열을 foo() 함수의 인자로 넘겼는데, string 객체로 받는다? 이상하죠? 이 원리는요. 컴파일러가 문자열을 받으면 string 생성자로 보내서 임시객체를 만드는 것

Naver Blog

[C++][중급] 임시 객체(Temporary)란?

이번에는 임시객체란 무엇이고, 어떠한 특징이 있는지 알아보겠습니다. 1. 임시 객체란? 2. 임시 객체의 특징(3가지) 임시 객체란? "임시 객체"는 "unnamed object"라고 불립니다. 객체가 언제 생성되고 언제 파괴되는지를 확인하기 위해 생성자와 소멸자에서 print를 하는 역할만 하는 클래스를 하나 생성합니다. #include <iostream> class Point { int x, y; public: Point(int x, int y) : x(x), y(y) { std::cout << "Point(int, int)" << std::endl;} ~Point() {std::cout << "~Point()" << std::endl; } }; 만약 main() 함수에서 아래와 같이 불렀다면 Point란 객체는 언제 생성되고 언제 파괴될까요? int main() { Point pt(1, 2); std::cout << "-------" << std::endl; } 실행 결과는 아

Naver Blog

[C++][중급] 변환 연산자와 변환 생성자, explicit 생성자

이번에는 객체의 변환에 대한 다양한 문법과 기법에 대해 알아볼께요. 1. 변환 연산자란? 2. 변환 생성자란? 3. explicit 생성자란? 변환 연산자란? 변환 연산자는 객체가 다른 타입으로 변환될 때 호출되는 함수 입니다. 변환 연산자를 알아보기 위해 예제를 하나 만들어 봤습니다. int를 대체하는 클래스 입니다. #include <iostream> class INT32 { int value; public: Int32() : value(0) {} }; int main() { int pn; //primitive type Int32 un; // user type pn = un; } Int32는 사용자 정의 type 이므로 생성자를 만들었고, 0으로 초기화 됩니다. int pn; 처럼 사용 시 초기에 쓰레기 값이 들어가니까 보다 안전하게 사용할 수 있습니다. 만약 pn = un; 이라고 하면 user type 을 primitive type으로 대입하라는 의미인데, 서로 타입이 다르기

Naver Blog

[C/C++] Technical Debt 란?

이율이 높아지는 요즘 같은 시대에 빚이란 걸 생각하기도 싫다. 어려운 길과 쉬운 길이 있다면 누구나 쉬운 길을 선택할 것이다. 하지만 지금 쉬운 길을 선택했을 경우 간과했던 것들이 결국 나에게 빚으로 다가와 그것을 수정할 때 더 많은 노력과 시간이 필요한 경우가 많다. 이런 것을 기술 부채(Technical Debt) 라고 한다. Technical Debt 란 무엇인가? Technical Debt(=Design Debt, Code Debt)는 직역하자면 "기술적인 빚"이란 뜻으로, 소프트웨어 개발 시 최상의 방법(The Best Overall Solution) 대신에 단기적으로 구현이 쉬운 방법을 선택하여 구현함으로써 발생한 나중으로 미뤄 둔 작업을 나타내는 용어이다. 즉, 소프트웨어 개발 시 처음부터 제대로 구현을 하지 않으면 그게 빚이 되고, 결국 더 큰 빚으로 돌아오기 때문에 나중에 유지/보수 비용이 많이 발생하게 된다는 뜻이다. Technical Debt는 왜 생기죠? 일반적

Naver Blog

소프트웨어 개발 방법론(1)

오늘 알아볼 내용은 아래와 같습니다. 1. 소프트 웨어와 프로그래밍의 차이 2. 소프트웨어는 언어다? 3. 구조적(절차적) 개발 방법론 4. 객체지향 개발 방법론 소프트 웨어 vs. 프로그래밍 소프트웨어 개발 방법론을 논하기에 앞서, 소프트웨어가 무엇인가? 생각해 봅시다. 예를 들어, "1부터 100까지 더하는 프로그램을 짜시오." 라고 하지, "1부터 100까지 더하는 소프트웨어를 짜시오." 라고 하지는 않습니다. 또한, "네비게이션 소프트웨어를 만드세요." 라고 하지, "네이게이션 프로그램을 만드세요." 라고 하지는 않습니다. 소프트웨어와 프로그램의 차이.. 감이 오시나요? 소프트웨어와 프로그램(코딩)과의 차이는 바로 모호성에 있습니다. 그래서 소프트웨어를 만드는게 어려운 이유 입니다. 이걸 수식으로 표현해보면, 아래와 같이 쓸 수 있겠네요. 소프트웨어는 언어다? 그럼 소프트웨어를 만들기 위해서 필요한 것이 무엇일까요? 소프트웨어의 목적이죠. 목적을 정하기 위해서는 사용자들의 의

1 2 3 4 5 6