coding-factory의 등록된 링크

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

Tistory

[Linux] 리눅스 mkdir 명령어(디렉토리 생성) 사용법 & 옵션 정리

mkdir mkdir의 뜻은 make directory의 약자로 디렉토리(폴더)를 생성할 때 사용하는 명령어입니다. mkdir [옵션][생성 할 디렉토리] new_folder 디렉토리 생성 ex) mkdir new_folder /home/user/위치에 new_folder 디렉토리 생성 ex) mkdir /home/user/new_folder new_folder, new_folder2, new_folder3 디렉토리 생성 ex) mkdir new_folder new_folder2 new_folder3 경로를 지정하지 않으면 현 위치를 Defualt로 합니다. 생성할 디렉토리를 여러개 나열하여 한번의 명령어로 복수의 디렉토리를 생성할 수 있습니다. 자주 사용하는 옵션 -m : 디렉토리를 생성할 때 권한을 ..

Tistory

[Linux] 리눅스 touch 명령어(파일 생성, 갱신) 사용법 & 옵션 정리

touch touch는 아무것도 없는 빈 파일을 생성하거나 touch는 파일의 날짜와 시간을 수정하는 명령어입니다. touch의 파일명이 이미 존재한다면 서버의 현재 시간으로 파일의 최근 사용한 시간(access time)과 최근 변경 시간(modification time)을 변경하고 파일명이 존재하지 않는다면 파일의 크기가 0인 빈 파일을 생성합니다. touch [옵션][파일명] # 파일이 없다면 file txt 파일 생성, 있다면 file.txt의 시간 정보 수정 touch file.txt 수정 할 파일이 존재하지 않는다면 크기가 0 인 빈 파일을 생성합니다. 수정 할 파일이 존재한다면 해당 파일의 최근 사용한시간과 최근 변경 시간을 현재 시간으로 수정합니다. 별다른 옵션이 없다면 atime, cti..

Tistory

[DB] 데이터베이스 결합 인덱스에 대하여

결합 인덱스란? 결합 인덱스란 두 개 이상의 컬럼을 합쳐서 인덱스를 만드는 것을 말합니다. 주로 단일 컬럼으로는 나쁜 분포도를 가지지만 여러 개의 컬럼을 합친다면 좋은 분포도를 가지고, Where절에서 AND 조건에 많이 사용되는 컬럼들을 결합 인덱스로 구성합니다. 결합 인덱스 컬럼 선택 1. where절에서 and 조건으로 자주 결합되어 사용되면서 각각의 분포도 보다 두 개 이상의 컬럼이 결합될 때 분포도가 좋아지는 컬럼들 2. 다른 테이블과 조인의 연결고리로 자주 사용되는 컬럼들 3. order by에서 자주 사용되는 컬럼들 4. 하나 이상의 키 컬럼 조건으로 같은 테이블의 컬럼들이 자주 조회될 때 결합 인덱스의 컬럼 순서 결정 결합 인덱스를 만들 때 결합 인덱스를 구성하는 컬럼들의 배열 순서는 아주..

Tistory

[Linux] 리눅스 cp 명령어 사용법 & 옵션 정리 (파일, 디렉토리 복사)

cp cp의 뜻은 copy의 줄임말로 파일이나 디렉토리를 복사할 때 사용하는 명령어입니다. cp [옵션][복사 할 디렉토리/파일][복사 될 디렉토리/파일] 현재 디렉토리에 있는 test.txt 파일을 new_test.txt라는 이름으로 현 위치에 복사 ex) cp test.txt new_test.txt /user/jtaewu 경로의 test.txt 파일을 new_test.txt라는 이름으로 현재 위치에 복사 ex) cp /user/jtaewu/test.txt new_test.txt /user/jtaewu 경로의 test.txt 파일을 new_test.txt라는 이름으로 /user/guest에 복사 ex) cp /user/jtaewu/test.txt /user/guest/new_test.txt cp 명령어..

Tistory

[Linux] 리눅스 mv 명령어 사용법 & 옵션 정리 (파일 이동, 이름 바꾸기)

mv mv의 뜻은 move의 줄임말로 파일이나 디렉토리를 이동 시킬때 사용하는 명령어입니다. mv [옵션][이동 할 파일][이동 될 위치] 현재 디렉토리에 있는 test.txt 파일을 디렉토리 내부의 new_folder 디렉토리로 이동 ex) mv test.txt new_folder 현재 디렉토리에 있는 test.txt 파일을 new_test.txt라는 파일로 이름 바꾸기 ex) mv test.txt new_test.txt /user/jtaewu 경로의 test.txt 파일을 /user/jtaewu 디렉토리로 이동 ex) mv test.txt /user/jtaewu/new_folder /user/jtaewu 경로 test.txt 파일을 /user/guest 디렉토리에 new.txt로 바꾸어 이동 ex) ..

Tistory

[Linux] 리눅스 rm 명령어 사용법 & 옵션 정리 (파일, 디렉토리 삭제)

rm rm의 뜻은 remove의 약자로 파일이나 디렉토리( -r 옵션시 삭제가능)를 삭제 시킬때 사용하는 명령어입니다. 한번 지운 파일은 복구가 어렵기 때문에 rm 명령어를 실행시키기전에 두번 세번 확인하는 습관을 가집시다. rm [옵션][삭제 할 디렉토리/파일] test.txt 삭제 ex) rm test.txt new_folder /home/user/test.txt 삭제 ex) rm /home/user/test.txt new_folder 디렉토리 삭제 ex) rm -r new_folder new_folder 디렉토리 삭제 시 삭제 확인 메시지를 출력하지 않음 ex) rm -rf new_folder 경로를 지정하지 않으면 현 위치를 Defualt로 합니다. 비어있지 않은 디렉토리는 -r 옵션 없이는 삭제..

Tistory

[Linux] 리눅스 현재 경로 표시 pwd 명령어 사용법

리눅스 설정에 따라 좌측에 터미널에서 현재 내가 있는 위치가 안보이는 경우가 종종 있습니다. 이럴 때 현재 내가 있는 디렉토리의 경로를 알고 싶다면 pwd 명령어를 사용하시면 됩니다. pwd pwd의 뜻은 print working directory의 줄임말로 현재 위치한 디렉토리의 경로를 출력하는 명령어입니다. [jtaewu@localhost ~]$ pwd /home/jtaewu 터미널에 pwd라는 명령어를 입력하여 내가 /home/jtaewu라는 폴더안에 있다는 것을 확인하실 수 있습니다. pwd 명령어 옵션 pwd -L : 심볼릭 링크안에 있다면 심볼릭 링크의 경로를 표시합니다. pwd -P : 심볼릭 링크 안에 있다면 심볼릭 링크가 가리키는 디렉토리 경로를 표시합니다. 심볼릭 링크(Symbolic ..

Tistory

[Linux] 리눅스 ls 명령어 사용법 & 옵션 정리 (디렉토리 목록 확인)

ls ls의 뜻은 list의 줄임말로 현재 위치한 디렉토리에 있는 내용(디렉토리, 파일) 리스트를 출력하는 명령어입니다. ls [디렉토리] ex) ls / : root에 있는 파일 목록 출력 ex) ls /project : /project 경로의 디렉토리에 있는 파일 목록 출력 디렉토리를 지정하여 파일 목록을 출력할수도 있습니다. 옵션을 사용하지 않으면 숨김 파일은 나오지 않습니다. 디렉토리명을 생략하면 현재 위치한 디렉토리의 파일 목록을 출력합니다. 자주 사용하는 옵션 -l : 파일들을 나열할때 자세히 출력한다. -a : 경로안의 모든 파일을 나열한다.(숨김파일도 포함) -R : 위치한 디렉토리 하부 디렉토리의 파일까지 모두 출력한다. -h : 파일크기를 해석파기 편하게 출력한다. -r : 출력 결과를..

Tistory

[Linux] 리눅스 cd 명령어 사용법 정리 (디렉토리 이동)

CD의 뜻은 change directory의 줄임말로 현재 작업하고 있는 디렉토리의 위치를 이동하는 명령어 입니다. CD 명령어 뒤에 디렉토리 이동경로를 입력해주시면 해당 디렉토리로 즉시 이동합니다. 이 디렉토리 이동경로를 입력하실때는 키보드 TAB 버튼을 함께 사용하시면 어느정도 경로를 자동으로 지정해주기에 좀 더 편하게 디렉토리 이동을 하실 수 있습니다. cp [이동 할 디렉토리 경로] ex) cd / : root로 이동 ex) cd project : 현재 디렉토리 내부에 있는 project 디렉토리로 이동 ex) cd /user/jtaewu : /user/jtaewu 경로의 디렉토리로 이동 현재 위치한 디렉토리의 위치를 이동할 수 있습니다. CD 명령어에는 별도의 옵션이 존재하지 않습니다. 이동할 ..

Tistory

[DB] 데이터베이스 실행 계획에 대하여

실행 계획이란? 실행계획이란 사용자가 SQL을 실행하여 데이터를 추출하려고 할 때 옵티마이저가 수립하는 작업 절차입니다. 이렇게 만들어진 실행 계획은 여러 가지 방법을 통해 확인할 수 있습니다. 실제 프로젝트에서 SQL 튜닝 업무를 하다 보면 개발자들이 DBMS 툴을 활용하여 실행 계획을 확인하는 것을 자주 보실 수 있습니다. SQL을 실행한 후 실행 계획을 판단하여 이 SQL이 어떠한 방식으로 실행되는지 확인이 가능합니다. [DB] 데이터베이스 옵티마이저(Optimizer)에 대하여 쿼리문의 실행 계획을 확인하는 방법 쿼리문의 실행 계획을 확인하는 방법은 EXPLAIN PLAN, AUTOTRACE, SQL TRACE 이렇게 3가지가 있습니다. 실행 계획을 판단하는 방법은 아래 포스팅에 오라클을 활용하여..

Tistory

[Oracle] 오라클 실행 계획 확인하기 (EXPLAIN PLAN, SET AUTORACE, SQL TRACE)

실행 계획 확인하기 실행 계획이란 SQL이 실행되어 데이터를 처리하고자 할 때 옵티마이저에서 수립되는 SQL 실행 방법론입니다. 이 실행 계획을 구성하는 내용의 분석을 통해 SQL의 비 효율적인 부분을 확인할 수 있고 쿼리의 성능 향상을 위한 튜닝 포인트도 도출해낼 수 있습니다. 실행 계획을 알아내는 방법은 크게 EXPLAIN PLAN과 SET AUTORACE, SQL TRACE 이렇게 세 가지 방법이 있습니다. [DB] 데이터베이스 옵티마이저(Optimizer)에 대하여 [DB] 데이터베이스 실행 계획에 대하여 EXPLAIN PLAN 사용 예시 EXPLAIN PLAN -- EXPLANIN PLAN 선언부 SET STATEMENT_ID = 'PLAN1' INTO PLAN_TABLE -- SQL에 PLAN..

Tistory

[DB] 데이터베이스 인덱스(Index) 란 무엇인가?

인덱스(Index)란? 인덱스는 데이터베이스 테이블에 대한 검색 성능의 속도를 높여주는 자료 구조입니다. 특정 컬럼에 인덱스를 생성하면, 해당 컬럼의 데이터들을 정렬하여 별도의 메모리 공간에 데이터의 물리적 주소와 함께 저장됩니다. 이렇게 인덱스가 생성하였다면 앞으로 쿼리문에 "인덱스 생성 컬럼을 Where 조건으로 거는 등"의 작업을 하면 옵티마이저에서 판단하여 생성된 인덱스를 탈 수가 있습니다. 만약 인덱스를 타게 되면 아래의 그림과 같이 인덱스를 타게 되고 먼저 인덱스에 저장되어 있는 데이터의 물리적 주소로 가서 데이터를 가져오는 식으로 동작을 하여 검색 속도의 향상을 가져올 수 있습니다. 즉 인덱스는 책에 있는 목차라고 생각하시면 편합니다. 우리가 책에서 정보를 찾을때도 먼저 원하는 카테고리를 목..

Tistory

[Web] Web Server와 WAS(Web Application Server)에 대하여

Web Service의 전체적인 흐름 웹 개발을 진행한다고 하면 위의 그림과 같은 구조로 시스템을 구성하게 됩니다. 전체적인 흐름을 보면 웹 브라우저에서 Web Server로 HTTP 요청을 보내고 정적 요청인 경우에는 즉각적으로 Web Server에서 응답을 합니다. 하지만 동적 요청인 경우에는 Web Sever에서 대응하지 못하고 Web Server에 연결되어 있는 Web Application Server 중 한 곳에 처리를 위임합니다. Web Application Sever는 Web Server에서 요청을 받게 되면 컨테이너가 응답하여 동적 콘텐츠를 삽입할 수 있는 프로그래밍 언어인 Java를 사용할 수 있게끔 JSP / Servlet을 실행한 뒤 DB에서 값을 가져오는 등의 동적인 값을 확정하고 ..

Tistory

[Web] 서블릿(Servlet)이란 무엇인가? 서블릿 총정리

서블릿(Servlet)이란? 서블릿이란 Dynamic Web Page를 만들 때 사용되는 자바 기반의 웹 애플리케이션 프로그래밍 기술입니다. 웹을 만들때는 다양한 요청(Request)과 응답(Response)이 있기 마련이고 이 요청과 응답에는 규칙이 존재합니다. 이러한 요청과 응답을 일일이 처리하려면 굉장히 힘들겠죠? 서블릿은 이러한 웹 요청과 응답의 흐름을 간단한 메서드 호출만으로 체계적으로 다룰 수 있게 해주는 기술이라고 생각하시면 이해가 빠를듯 합니다. 서블릿은 자바 클래스로 웹 애플리케이션을 작성한 뒤 이후 웹 서버 안에 있는 웹 컨테이너에서 이것을 실행하고, 웹 컨테이너에서는 서블릿 인스턴스를 생성 후 서버에서 실행되다가 웹 브라우저에서 서버에 요청(Request)을 하면 요청에 맞는 동작을 ..

Tistory

[DB] 데이터베이스 옵티마이저(Optimizer)에 대하여

옵티마이저(Optimizer)란? 옵티마이저는 가장 효율적인 방법으로 SQL을 수행할 최적의 처리 경로를 생성해주는 DBMS의 핵심 엔진입니다. 컴퓨터의 두뇌가 CPU인 것처럼 DBMS의 두뇌는 옵티마이저라고 할 수 있습니다. 개발자가 SQL을 작성하고 실행하면 소프트웨어 실행파일처럼 즉시 실행되는 것이 아니라 옵티마이저(Optimizer)라는 곳에서 "이 쿼리문을 어떻게 실행시키겠다!"라는 여러 가지 실행계획을 세우게 됩니다. 이렇게 실행계획을 세운 뒤 시스템 통계정보를 활용하여 각 실행계획의 예상 비용을 산정한 후 각 실행계획을 비교해서 최고의 효율을 가지고 있는 실행계획을 판별한 후 그 실행계획에 따라 쿼리를 수행하게 되는 것입니다. 옵티마이저의 종류 옵티마이저는 실행 계획을 세우는 방식에 따라 규..

Tistory

[Windows] 특정 포트를 사용하고 있는 프로세스 죽이기 (Kill)

아파치 톰캣을 사용하다 보면 종종 위와 같은 에러가 뜰 수 있습니다. 톰캣에서 사용해야 할 포트를 다른 프로세스에서 실행 중이거나 시스템 프로세스가 포트를 사용하고 있어 실행을 할 수 없다는 내용인데요. 이럴 경우 톰캣에서 사용할 포트번호를 바꾸는 방법도 있겠지만 꼭 해당 포트를 사용해야 할 경우에는 그 포트를 사용하고 있는 프로세스를 강제로 KILL 해서 죽이고 톰캣을 재 실행하는 방법도 있습니다. 윈도우10 에서 특정 포트 번호 죽이기 (Kill) 저는 톰캣에서 80 포트를 사용하고 있으므로 80 포트를 사용하고 있는 프로세스를 죽이는 방법으로 예를 들겠습니다. 1. 작업표시줄 검색창에서 cmd를 입력하고 명령 프롬프트를 관리자 권한으로 실행시킵니다. 2. netstat -ano 명령어를 입력하여 8..

Tistory

[Windows] ping 테스트 하는 방법 (인터넷 연결 진단)

Ping 이란? ping이란 Paket Internet Groper의 약자이며 컴퓨터 네트워크 상태를 점검, 진단하는 명령어입니다. ping을 보내는 대상 컴퓨터를 향해 일정 크기의 패킷(packet, 네트워크 최소 전송 단위)을 보낸 후 (ICMP echo request) 대상 컴퓨터가 이에 ping에 대해 응답하는 메시지(ICMP echo reply)를 보내면 이를 수신, 분석하여 대상 컴퓨터가 작동하는지, 또는 대상 컴퓨터까지 도달하는 네트워크 상태는 어떠한지를 알 수 있습니다. 예를 들어 인터넷이 끊긴다고 가정하였을 때 공유기에 ping을 날려 주고받은 패킷의 손실률을 파악하여 인터넷의 연결 상태를 진단하실 수 있습니다. 인터넷 연결 진단 Ping 테스트 하는법 1. PC -> 공유기 까지의 연결..

Tistory

[Windows] 웹 사이트 도메인 IP 주소 확인하기 (nslookup)

가끔 필요로 인해 내가 개발하고 있는 사이트의 도메인 IP주소를 알아야 할 경우가 있습니다. 이럴때는 윈도우 cmd창에서 nslookup 명령어를 활용하여 도메인의 정보를 조회하시면 됩니다. nslookup명령어는 DNS 서버에 도메인이나 ip주소를 질의해서 DNS 서버에 있는 정보를 응답받는 명령어 입니다. nslookup 명령어를 활용하여 도메인 IP 주소 확인하기 명령 프롬프트(CMD)창을 켠 후 nslookup [도메인 명]으로 입력하면 설정된 DNS 서버에 질의하여 해당 도메인의 IP주소를 조회합니다. 서버의 숫자에 따라 응답되는 ip주소는 여러개일 수 있습니다. nslookup 명령어 옵션 및 사용법 cmd창에 nslookup ? 이렇게 명령어 + 물음표를 입력하면 nslookup 도움말을 확..

Tistory

[Java] 자바 문자열(String)에 " 큰 따옴표 넣기

자바에서는 문자열 String값의 값의 처음과 끝을 " " 이렇게 큰 따옴표로 인식하고 있습니다. 그렇기에 문자열 안에 큰 따옴표 자체를 넣을때는 \" 이런식으로 이스케이프 시퀀스를 활용하여 표현해주어야 합니다. 자바 문자열안에 큰 따옴표(") 넣기 String example = "\"url\" : \"https://www.naver.com\""; System.out.println(example); 위와 같이 \" 이스케이프 시퀀스를 통해 따옴표를 나타내면 문자열의 열고 닫음을 표현하는 예약문자로써의 기능이 아닌 따옴표 그 자체로 문자열 안에 포함시킬 수 있습니다. 이스케이프 시퀀스 위와 같이 이스케이프 시퀀스는 \와 다른 문자를 결합하여 프로그래밍 언어 특성상 표현할 수 없는 문자를 표현하거나 컴퓨터를..

Tistory

[Java] 날짜 포맷의 유효성 체크하기(Validation Date)

개발을 하다보면 데이터베이스에 지정된 포맷의 날짜를 넣어야 할 경우들이 종종 있고 그렇게 되면 자연스럽게 이 데이터가 정해진 날짜 포맷에 맞는지 검증하는 로직이 들어가야 합니다. 날짜 포맷의 유효성 검사하기 (Validation Date) public class test { public static void main(String[] args) { String exDate1 = "2021/01/01"; String exDate2 = "20210101"; System.out.println(checkDate(exDate1)); System.out.println(checkDate(exDate2)); } public static boolean checkDate(String checkDate) { try { Sim..

Tistory

[Java] 자바 두 날짜 사이의 차이 계산하기

자바에서 가끔 두 날짜의 간격 예를 들어 두 날짜의 일수나, 시간, 분, 초등을 구해야 할 때가 있습니다. 이럴 때는 대개 두 날짜를 getTime을 활용하여 밀리 세컨드로 변환한 후 두 날짜의 차이를 계산한 뒤 원하는 단위로 바꾸는 작업을 통해 계산합니다. Date.getTime() Date.getTime()은 Date를 밀리세컨드로 변환해서 long형 숫자 데이터로 반환합니다. 이를 이용하면 산술 연산으로 시간 차이를 쉽게 구할 수 있습니다. 1000밀리초는 1초로 계산되므로 getTime()으로 구한 값을 밀리초를 1000으로 나누면 초를 얻습니다. 이 초를 기본으로 하여 다른 시간 단위들도 계산할 수 있습니다. 초 : / 1000 분 : / (1000 * 60) 시 : / (1000 * 60 * ..

Tistory

[IDE] Can't load IA 32-bit .dll on a AMD 64-bit platform 에러 해결방법

개발환경 세팅 후 컴파일을 하면 아래처럼 Can't load IA 32-bit .dll on a AMD 64-bit platform이라는 에러가 뜰 때가 있습니다. 자바 프로젝트에서 DLL을 호출할때 나타나는 에러로 빌드한 DLL 파일은 32bit이지만 JVM은 64bit 이기 때문에 발생하는 에러입니다. 해결 방안 1. dll 파일을 64bit로 빌드한다. 2. JVM을 32bit로 설정하여 컴파일 한다. 이 중에서 2번째 방법이 더 간단하고 향후 똑같은 문제가 발생하는 것을 예방하실 수 있습니다. 현재 설치되어 있는 JDK 32bit / 64bit 확인하기 cmd창을 켜신 후 java -d64 -version 이라고 입력했을 때 위와 같이 나온다면 64bit JDK가 설치된 것입니다. JVM을 32B..

Tistory

[IDE] 이클립스 The Literal of type int is out of range 에러 해결

가끔 큰 숫자를 쓰다보면 위와 같이 The Literal of type int is out of range 라는 에러가 발생할 경우가 있습니다. 말 그대로 그대로 int유형 범위(–2,147,483,648 ~ 2,147,483,647) 의 값을 벗어났다는 의미입니다. 기본적으로 숫자의 Defualt 인식값이 int로 되어 있어서 나타나는 현상인데요 해결 방안 에러를 해결하기 위해서는 이 숫자는 Long타입이라는 것을 명시해주어야 합니다. 숫자끝에 위와 같이 알파벳L을 붙이시면 이 값은 Long타입이라는것을 명시할 수 있습니다.

Tistory

[Java] 자바 숫자에 천단위 콤마찍기 (금액 표기하기)

자릿수가 많은 금액은 가독성을 향상시키기위해 3자리수 금액의 1000단위마다 콤마( , )를 찍습니다. 단 콤마( , )는 문자열이기 때문에 String타입에 저장해야 합니다. 숫자 사이에 콤마( , )를 찍는 방법은 대표적으로 java.text.DecimalFormat 클래스를 활용하는 방법과 정규식을 활용하는 방법이 있습니다. DecimalFormat 클래스 활용 int amount = 1000000000; DecimalFormat df = new DecimalFormat("###,###"); String money = df.format(amount); System.out.println(money); 정규식 활용방법 String amount = "1000000000"; amount = amount.r..

Tistory

[Windows] 윈도우10 파일 확장자 변경 방법

업무를 하다 보면 xlsx를 xls로 바꾸어야 하는 등 확장자 변경을 해야 할 때가 종종 있습니다. 간단하게 파일 이름 바꾸기를 통해 확장자명을 변경해주면 되지만 윈도우10의 파일의 기본 확장자 설정이 파일 확장자 숨기기로 되어 있어 확장자명이 표시되지 않는 경우가 종종 있어 난감한 상황에 빠질 수 있는데요. 이번 포스팅에서는 윈도우10에서 파일 확장자 변경 방법에 대해 알아보도록 하겠습니다. 윈도우10 파일 확장자 변경 방법 1. 위의 그림과 같이 확장자명이 보이지 않다면 보기 -> 파일 확장자명을 체크박스를 체크합니다. 2. 바꾸고싶은 파일의 확장자명을 바꾸고싶은 확장자로 변경합니다. 저는 zip파일로 한번 바꾸어보겠습니다. 3. 파일 확장자를 변경하면 위와 같은 알림창이 나올텐데 여기서 예를 누릅니..

Tistory

[IDE] 이클립스 JVM is not suitable for this product 에러 해결

이클립스를 신규 설치 후 이클립스를 실행하였더니 위와 같은 에러가 떴습니다. 위의 에러를 그대로 해석하자면 JVM 버전 15.0.2이 이 이클립스에 적절하지 않고 JVM 16 이상이 필요하다는 내용입니다. 즉 이클립스에서 필요한 JDK의 버전과 현재 PC에 설치되어있는 JDK의 버전이 다르기 때문이고 이 문제를 해결하려면 이클립스에서 요구하는 JDK와 현재 PC에 설치되어있는 JDK의 버전을 맞춰주시면 됩니다. version 1.7.0_80 of the jvm is not suitable could not create the java virtual machine 이클립스 실행시 위와 같은 오류도 아래 해결방안을 통해 해결이 가능합니다. 해결방안 1. 이클립스를 구 버전으로 재설치한다. 2. JDK를 이클..

Tistory

[IDE] 이클립스 Editor does not contain a main type 에러 해결

이클립스에서 자바 프로젝트를 컴파일할때 위와 같은 Editor does not contain a main type이라는 에러가 발생하거나 Selection does not contain a main type 에러가 발생할때의 대처방법에 대해서 알아보도록 하겠습니다. 자바 파일이 src폴더 밖에 있는 경우 scr폴더가 없다면 프로젝트 우클릭 -> Java Build Path -> Source -> Add Folder를 눌러 src폴더를 만들어주고 그 안에 자바 클래스 파일을 넣으시면 됩니다. 프로젝트에서 JDK를 인식하지 못하고 있는 경우 프로젝트 우클릭 -> Project Facets -> Java를 사용하고 있는 버전으로 바꿔줍니다. 이밖에 발생할 수 있는 경우들 1. main함수가 존재하지 않거나 오..

Tistory

[Windows] 윈도우10 화면 창 깜빡거리는 현상 해결하기

새 노트북에 윈도우를 설치하고 사용하는데 어느 순간부터 계속 윈도우의 창들이 깜빡깜빡 거리는 현상이 발생하였습니다. 약 3초에 한 번씩 깜빡거렸는데 한번 깜빡일 때마다 커서 포커스가 튀어서 도저히 컴퓨터를 쓰기가 힘들었기에 왜 이러한 문제가 발생하였는지 알아보고 문제를 해결하였습니다. 혹시나 저와 같은 현상이 발생하는 분들께 조그마한 도움이 되었으면 좋겠다는 생각에 문제 해결 과정을 포스팅으로 남겨볼까 합니다. 그래픽 드라이버 업데이트 화면이 깜빡깜빡 거리는 현상들은 대부분 그래픽카드와 윈도우 운영체제 간의 호환이 잘 되지 않아 나타나는 현상입니다. 우선 장치 관리자 -> 드라이버 업데이트를 통해 그래픽 카드를 최신 버전으로 업데이트합니다. 윈도우 업데이트 그래픽 카드를 업데이트했음에도 문제가 해결되지 ..

Tistory

[Windows] 윈도우10 방화벽 해제 / 설정 방법

방화벽이란 미리 정의된 보안규칙에 기반하여 네트워크 트래픽을 제어하여 허락받지 않은 외부의 침입을 막고 내부에서 유출되는 정보를 관리하기 위여 보안을 높이는 수단입니다. 하지만 이러한 방화벽이 원격제어와 같은 특정 네트워크에서 PC에 접속을 해야하는 상황이 벌어지면 차단하지 말아야 할 트래픽을 차단하여 문제가 될 수 있는데 필요한 경우에는 방화벽을 해제해야하는 상황이 오기도 합니다. 이번 포스팅에서는 Windows 10에서 방화벽을 설정하고 해제하는 방법에 대해 포스팅하도록 하겠습니다. 윈도우 10 방화벽 해제하기 1. 작업표시줄 검색창에서 방화벽 상태 확인이라고 검색한 뒤 Windows Defender 방화벽을 실행시킵니다. 2. Windows Defender 방화벽의 좌측탭에 Windows Defen..

Tistory

[Windows] 윈도우10 방화벽 예외 설정 방법

이전 글에서도 설명했듯 방화벽은 보안규칙에 기반하여 네트워크 트래픽을 제어하여 허락받지 않은 외부의 침입을 막고 내부에서 유출되는 정보를 관리하기 위여 보안을 높입니다. 하지만 외부와 트래픽을 주고받아야 할 프로그램이 있다면 방화벽이 이 트래픽을 차단하여 특정 프로그램의 사용이 힘들어지는 상황이 벌어질 수 있습니다. 이러한 경우를 대비하여 Microsoft에서는 방화벽에 특정 프로그램만 예외사항에 추가하여 차단을 하지 않는 방법을 제공하고 있습니다. 이번 포스팅에서는 Windows 10에서 방화벽 예외 사항을 추가하는 방법에 대해 포스팅하도록 하겠습니다. 윈도우10 방화벽 예외 사항 추가 하기 1. 작업표시줄 검색창에서 방화벽 상태 확인이라고 검색한 뒤 Windows Defender 방화벽을 실행시킵니다..

Tistory

[Windows] 내 컴퓨터 PC의 성능 측정하기 (Windows10 자체 내장기능)

컴퓨터에 장착되어있는 하드웨어 장비들의 성능이 좋아도 발열 관리나 노후화등의 다양한 요인으로 인해 실제로는 제 성능이 안 나오는 경우가 있습니다. 자신의 컴퓨터의 사양이 구동하고자 하는 소프트웨어의 권장사항을 충족하고 있음에도 버벅거림과 같은 렉이 발생한다면 한번 내 PC의 성능을 테스트해보는 것도 좋을 듯합니다. 내 PC 체험지수 측정하기 1. 작업표시줄 검색창에서 Powershell을 입력하고 Windows PowerShell을 실행시킵니다. 2. PowerShell에서 winsat formal 명령어를 입력하여 Windows 시스템 평가 도구를 실행시킵니다. 3. Windows 시스템 평가 도구를 실행시키면 위와 같이 약 1분 남짓의 시간 동안 컴퓨터가 하드웨어의 작업 실행 시간을 측정하는 방식으로..

Tistory

[Windows] 내 컴퓨터 PC 성능 측정(벤치마크) 프로그램, 사이트 모음(2024년)

컴퓨터를 구성하고 있는 하드웨어 부품들은 절대적인 스펙이 같다고 결코 동일한 성능을 내는 것은 아닙니다. 오버클럭효과, 내부 최적화, 쿨러 등등 성능에 영향을 끼칠 수 있는 요인이 매우 많기 때문입니다. 그렇기에 절대적인 스펙을 비교하는 것보다는 컴퓨터에게 굉장히 어려운 일을 시키고 그 일을 수행하는 연산성능을 시험하여 수치화하는 벤치마크 프로그램으로 측정해 보는 것이 가장 정확합니다.  벤치마크 프로그램 3DMARK3DMARK 다운로드 링크전세계적으로 가장 인기 있는 벤치마크 프로그램 3DMARK입니다. 상당히 좋은 벤치마크 툴을 무료로 사용할 수 있으며 결괏값도 직관적으로 확인할 수 있습니다. 단 소프트웨어 용량이 많다는 점은 단점입니다. 사용법은 아래 링크를 참고해 주세요.3DMARK 사용법 시네벤..

Tistory

[Windows] 윈도우10 보안 해제 방법 (Windows Defender 끄기)

윈도우10에 기본으로 탑재된 마이크로소프트에서 만든 백신 프로그램인 Windows Defender는 멀웨어 방지 기능이 포함되어 있어 바이러스, 스파이웨어, 랜섬웨어와 같은 위협에서 PC를 보호해줍니다. 좋은 프로그램이지만 이러한 기능들이 가끔은 내가 다운받아야 할 파일을 받지 못하게 막는다던지, 네트워크에 장치를 연결되지 못하도록 막는다던지 하는 문제가 발생할 수 있어 Windows Defender사용을 잠시 중단하고 싶을때가 종종 있는데요. 이번 포스팅에서는 Windows Defender를 잠시 끄는 방법과 영구적으로 사용하지 않는 방법에 대해 포스팅하도록 하겠습니다. 보안 프로그램 랭킹보기 Windows Defender 실시간 보호 잠시 해제하는 방법 1. [ Windows Key ] + [ i ]..

Tistory

[Network] ARP(주소 결정 프로토콜)에 대하여

ARP(주소 결정 프로토콜)이란? 주소 결정 프로토콜(Address Resolution Protocol, ARP)은 네트워크 상에서 IP 주소를 MAC 주소로 대응시키기 위해 사용됩니다. 처음 통신을 시작할 때는 상대방의 Mac Address를 모르는데 그때 상대방의 Mac Address를 알아내기 위하여 사용하는 프로토콜입니다. ARP는 요청과 응답으로 구성된 프로토콜로 라우팅 되지 않는 단일 네트워크에서만 동작하며. IP와 MAC 주소를 캡슐화하기 때문에 위의 그림과 같이 L2와 L3 사이에 있는 프로토콜이라고 생각하시면 됩니다. ARP 프로토콜과는 반대로 해당 MAC 주소에 맞는 IP값을 알아오는 프로토콜을 역순 주소 결정 프로토콜(Reverse Address Resolution Protocol, ..

Tistory

[Windows] 내 PC의 MAC주소 확인하기 (Windows 10)

MAC주소 (Media Access Control Address) 물리적 네트워크 주소라고도 하며 데이터 링크 계층(2 계층)에서 사용하는 네트워크 인터페이스 카드(NIC) 즉, 하드웨어에 할당된 고유 식별번호 주소입니다. ex) D1-F2-FK-CC-12-34 MAC 주소(물리적 주소)는, 무선 LAN 카드 또는 무선 LAN 기능 내장 기기에 개별적으로 부여되는 16진수 12자리의 단말 식별 번호입니다. 네트워크 연동 시 종종 필요한 경우가 있어 윈도우10에서 내 PC의 MAC주소를 확인하는 방법에 대해 포스팅하려 합니다. CMD창에서 간단한 명령어를 통해 조회하실 수 있습니다. getmac /v 명령어를 통한 조회 1. 윈도우 + R 을 눌러 실행창을 켠 뒤 cmd를 입력하여 명령 프롬포트창에 들어갑..

Tistory

[Windows] 내 컴퓨터 PC의 사양 확인하기 (Windows 10)

PC성능에 과분한 무거운 프로그램이나 게임을 돌릴때 소프트웨어가 버벅거리는 현상이 생깁니다. 버벅임 없이 소프트웨어를 구동하기 위해서는 해당 소프트웨어가 요구하는 권장사양에 내 PC를 충족시켜주어야 하는데요. 이 과정에서 내 PC의 성능을 확인할 수 있는 방법 정도는 알고 있어야겠죠. 이번 포스팅에서는 내 Windows 10에서 내 PC의 성능을 확인하는 방법에 대해서 알아보도록 하겠습니다. 내 PC 사양 알아보기 1. [Windows Key] + [X] 버튼을 함께 누르면 좌측 하단에 위와 같은 창이 나타납니다. 여기서 시스템을 클릭해주세요. (내 PC 아이콘에 우클릭 -> 속성창을 클릭하시거나 제어판 -> 시스템으로 들어가셔도 됩니다.) 2. 그러면 위와 같이 간략한 내 PC의 사양을 확인할 수 있는..

Tistory

[IDE] 이클립스 프로젝트에 라이브러리 추가하기 +(cannot be resolved to a type 해결)

가끔가다 위와 같이 클래스에 cannot be resolved to a type이라는 오류메시지를 보신적이 있으실겁니다. 이 경우 대부분 프로젝트내에 라이브러리가 추가되지 않아서 생기는 문제입니다. JDK내부에 있는 클래스에서 오류가 난다면 JDK가 제대로 잡히고 있지 않다는것이니 아래글을 참고하셔서 해결해주시기 바랍니다. [Jsp] cannot be resolved to a type 오류해결 이클립스 프로젝트에 라이브러리 추가하기 1. 라이브러리를 추가하고 싶은 프로젝트에 우클릭을 한 후 Properties로 들어갑니다. 2. 좌측 트리에서 Java Build Path를 클릭하고 Libraries탭에서 추가해주시면 됩니다. 프로젝트 내부(lib폴더)에 라이브러리가 존재할 경우에는 Add Jars 버튼을..

Tistory

[Web] 톰캣 서버 자체 실행후 웹 프로젝트 페이지(html, jsp) 실행하기

대부분 웹 프로젝트를 할때 이클립스에서 톰캣을 연동하신 후 사용하시곤 합니다. 하지만 이클립스와 같은 IDE가 없이도 톰캣 자체적으로 서버를 올리고 웹 프로젝트의 파일들도 볼 수 있는 방법이 있습니다. 톰캣 서버 올리고 내리기 1. 톰캣이 설치된 폴더의 bin으로 들어가시면 위와 같이 startup과 shutdown이라는 윈도우 배치파일이 있습니다. startup.bat을 실행하면 톰캣 서버가 올라가고 shutdown.bat을 실행시키면 톰캣 서버가 내려갑니다. 그냥 아이콘을 더블클릭하여 실행시키셔서 실행이 된다면 그냥 이렇게 켜고 끄고 하셔도 되지만 만약 되지 않는다면 로그 확인을 위해 CMD에서 실행을 시켜보는것을 추천드립니다. 2. 먼저 CMD창을 켜신 후 CD bin경로를 입력하여 Tomcat의 ..

Tistory

[Network] 인터넷과 웹이 동작하는 과정과 원리에 대하여

인터넷이란? 인터넷이란 전 세계에 걸쳐 원거리 접속이나 파일 전송, 전자 메일 등의 데이터 통신 서비스를 받을 수 있는, 컴퓨터 네트워크의 시스템이라고 정의되어 있습니다. 인터넷은 접속하는 여러 디바이스가 이 거대한 망에서 상호간의 통신을 주고받고 데이터들이 오고 가면서 상당히 복잡한 과정의 절차를 거칩니다. 즉 인터넷이란 디바이스끼리 통신을 할 수 있는 네트워크라는 개념에서 조금 더 확장된 모든 디바이스가 통신을 할 수 있는 거대한 네트워크다 라고 생각할 수 있겠습니다. 그렇다면 각각의 디바이스끼리 어떻게 위치를 찾아가는것일까요? 이 문제를 해결하기 위해 우리가 사는 집에도 주소가 있듯 디바이스가 위치한 네트워크마다 고유의 주소를 지정해두었습니다. 그 주소의 이름을 바로 IP주소라고 합니다. (우리나라..

Tistory

[IDE] 이클립스(Eclipse) 프로젝트 추가(import)하기 + No Projects are found to import 해결

이클립스에서는 다른곳에서 받아온 프로젝트를 손쉽게 가져와서 작업할 수 있습니다. 꼭 WorkSpace안에 있는 프로젝트만 가져올 수 있는것이 아니라. 경로가 어디가 되었든 상관없이 가지고 올 수 있습니다. 오늘은 이클립스에서 프로젝트를 어떻게 가지고 오는지에 대해 포스팅 해보려합니다. 이클립스(Eclipse) 프로젝트 추가(import)하기 1. 상단바에서 File -> Import를 선택합니다. 2. 프로젝트의 형태마다 다르겠지만 폴더로 되어있는 프로젝트라면 General -> Existing Projects into Workspace를 클릭합니다. 프로젝트가 War파일로 되어있다면 Web-> War file로 import하시면 됩니다. 3. import할 프로젝트의 위치를 선택하고 Finish를 누릅..

Tistory

[IDE] 이클립스(Eclipse) 자바 프로젝트를 웹 프로젝트로 변환하기

기존에 Java Application으로 작업한 프로젝트도 필요에 따라서는 Dynamic Web Project로 변환할 수 있습니다. 기존에 Web Project였음에도 불구하고 이클립스에서 인식을 못하여 Java Project로 인식하는 경우에도 Web Project로 구조를 바꾸어 줄 수 있습니다. Java Project와 Web Project구분 Java Project와 Web Project의 구분은 아이콘으로 구분하시면 됩니다. 자세히 보시면 두개의 아이콘이 다르답니다. Java Project를 Dynamic Web Project로 변환하기 1. 변환하고자 하는 프로젝트에 오른쪽 클릭을 한 후 Properties창을 켭니다. 2. 좌측 트리에서 Project Facets를 클릭한 후 Convert..

Tistory

[IDE] 이클립스(Eclipse) 프로젝트 폴더 이동 및 절대주소 확인

가끔 프로젝트의 절대주소가 필요한 경우가 종종 있습니다. 하지만 여러군데에서 import한 프로젝트의 경우 프로젝트의 위치를 가끔씩 까먹을 경우가 있는데요. 오늘은 유용하게 사용할 수 있는 프로젝트의 절대주소를 확인하고 해당 위치로 이동하는 방법에 대해 포스팅하도록 하겠습니다. 절대주소 : 로컬에 저장되어 있는 프로젝트의 위치 상대주소 : 프로젝트를 실행시켰을 경우의 도메인 주소 이클립스 프로젝트 절대주소 및 저장된 폴더 이동 1. 프로젝트에 우클릭을 한뒤 Properties를 클릭합니다. 2. Resource의 Location에 프로젝트가 저장되어있는 절대주소 위치가 나타나 있습니다. 해당 폴더로 이동하고 싶다면 주소 옆에있는 이동 아이콘을 클릭하시면 됩니다. 3. 프로젝트가 있는 폴더의 위치로 이동됩..

Tistory

[Design Pattern] 프록시 패턴(Proxy Pattern)에 대하여

프록시 패턴이란? 프록시는 대리인이라는 뜻으로, 무엇인가를 대신 처리하는 의미입니다. 일종의 비서라고 생각하시면 됩니다. 사장님한테 사소한 질문을 하기보다는 비서한테 먼저 물어보는 개념이라고 생각할 수 있겠습니다. 이렇게 어떤 객체를 사용하고자 할때, 객체를 직접적으로 참조 하는것이 아니라, 해당 객체를 대행(대리, proxy)하는 객체를 통해 대상객체에 접근하는 방식을 사용하면 해당 객체가 메모리에 존재하지 않아도 기본적인 정보를 참조하거나 설정할 수 있고 또한 실제 객체의 기능이 반드시 필요한 시점까지 객체의 생성을 미룰 수 있습니다. 예를 들어 용량이 큰 이미지와 글이 같이 있는 문서를 모니터 화면에 띄운다고 가정하였을때 이미지 파일은 용량이 크고 텍스트는 용량이 작아서 텍스트는 빠르게 나타나지만 ..

Tistory

[Design Pattern] 템플릿 메소드 패턴(Template Method Pattern)에 대하여

템플릿 메소드 패턴(Template Method Pattern)이란? 템플릿 메소드 패턴이란 특정 작업을 처리하는 일부분을 서브 클래스로 캡슐화하여 전체적인 구조는 바꾸지 않으면서 특정 단계에서 수행하는 내용을 바꾸는 패턴입니다. 디자인 패턴이라고 하기도 뭐할정도로 객체지향 언어로 개발을 하다보면 무의식적으로 사용하는 패턴입니다. 주로 개발을 하다보면 구체적인 구현은 다르지만 기본적인 기능은 비슷한 경우가 종종 있습니다. 예를 들면 HTTP와 SMTP Client 프로그램의 경우, 주고받는 메시지의 내용이 서로 다를 뿐 둘 다 인터넷 프로토콜을 이용하여 서버에게 요청을 전달하고 결과를 수신한다는 점에서 동일합니다. 이처럼 두개 이상의 프로그램이 기본적으로 동일한 골격 하에서 동작할때 기본 골격에 해당하는..

Tistory

[Design Pattern] 데코레이터 패턴(Decorator pattern)에 대하여

데코레이터(Decorator pattern) 패턴이란? 데코레이터 패턴(Decorator Pattenr)은 주어진 상황 및 용도에 따라 어떤 객체에 책임(기능)을 동적으로 추가하는 패턴을 말합니다. 데코레이터라는 말 그대로 장식이라고 생각하시면 편합니다. 기본 기능을 가지고 있는 클래스를 하나 만들어주고 추가할 수 있는 기능들을 추가하기 편하도록 설계하는 방식입니다. Component : 실질적인 인스턴스를 컨트롤하는 역할 ConcreteComponent : Component의 실질적인 인스턴스의 부분으로 책임의 주체의 역할 Decorator : Component와 ConcreteDecorator를 동일시 하도록 해주는 역할 ConcreteDecoreator : 실질적인 장식 인스턴스 및 정의이며 추가된..

Tistory

[Design Pattern] 디자인 패턴 정의와 종류에 대하여

소프트웨어 디자인 패턴이란? 소프트웨어 개발 방법으로 사용되는 디자인패턴(Desigin Pattern)은 과거의 소프트웨어 개발 과정에서 발견된 설계의 노하우를 축적하여 그 방법에 이름을 붙여서 이후에 재사용하기 좋은 형태로 특정 규약을 만들어서 정리한 것입니다. 디자인 패턴은 소프트웨어 설계에 있어 공통적인 문제들에 대한 표준적인 해법과 작명법을 제안하며, 알고리즘과 같이 프로그램 코드로 바로 변환될 수 있는 형태는 아니지만, 특정한 상황에서 구조적인 문제를 해결하는 방식입니다. 즉 "효율적인 코드를 만들기 위한 방법론"이라고 생각하시면 됩니다. 디자인 패턴은 외우기보다는 어떠한 패턴이 있는지 알고 수많은 디자인 패턴에서 다양한 코딩 노하우를 습득하는것이 중요하다고 생각합니다. "이 코드에는 무조건 이..

Tistory

[Design Pattern] 싱글톤 패턴(Singleton Pattern)에 대하여

싱글톤 패턴(Singleton Pattern)이란? 싱글톤 패턴은 객체를 딱 하나만 생성하여 생성된 객체를 프로그램 어디에서나 접근하여 사용할 수 있도록 하는 패턴을 말합니다. 개발을 하다 보면 전역적으로 하나의 객체만을 사용해야 하는 경우가 종종 있습니다. 하지만 특별히 제한을 걸어두지 않는다면 객체들이 여러 개로 복제되는 경우가 생길 수 있겠죠. 싱글톤 패턴을 사용하면 객체 생성을 단 한 번으로 제한하여 객체들이 복제되는 경우를 방지할 수 있습니다. 또한 클래스를 사용하는 여러 곳에서 인스턴스를 계속 생성하여 불필요하게 메모리 낭비를 유발할 수 있다고 판단되는 경우에도 싱글톤 패턴을 사용할 수 있습니다. 싱글톤 패턴의 장점 1. 메모리 낭비를 방지할 수 있다. 2. 싱글톤으로 만들어진 클래스와 다른 ..

Tistory

[Design Pattern] 옵저버 패턴(Observer Pattern)에 대하여

옵저버 패턴(Observer Pattern)이란? 옵저버패턴이란 객체의 상태 변화를 관찰하는 관찰자들, 즉 옵저버들의 목록을 객체에 등록하여 상태 변화가 있을 때마다 메서드 등을 통해 객체가 직접 목록의 각 옵저버에게 통지하도록 하는 디자인 패턴입니다. 어떤 객체의 변경 사항이 발생하였을때 이와 연관된 객체들에게 알려주는 디자인 패턴이라고 생각하시면 됩니다. 옵저버 패턴에는 주체 객체와 상태의 변경을 알아야 하는 관찰 객체(Observer Object)가 존재하며 이들의 관계는 1:1이 될 수도 있고 1:N이 될 수도 있습니다. 옵저버 패턴의 장단점 장점 1. 실시간으로 한 객체의 변경사항을 다른 객체에 전파할 수 있습니다. 2. 느슨한 결합으로 시스템이 유연하고 객체간의 의존성을 제거할 수 있다. 단점..

Tistory

[자유여행] 경기도 파주시 헤이리 마을, 프로방스 여행 후기

주말을 틈타 경기도 파주로 가볍게 1박 2일 여행을 다녀왔다. 나로서는 마땅히 여행으로 갈만한 선택지가 파주밖에 없었다. 차가 없어 대중교통을 이용해야만 했고 그렇다 보니 멀리 가기는 힘들어서 서울 근교를 찾아봤는데 그중에서 파주가 제일 괜찮다는 생각이 들었기 때문이다. 파주가 큰 도시는 아니지만 은근히 볼거리가 굉장히 많다. 대충 리스트를 뽑았는데 8군데나 되었다. 1. 프로방스 2. 헤이리마을 3. 프리미엄 아웃렛 4. 영어마을 5. 파주 벽조 치수 목원 6. 파주 김 악산 출렁다리 7. 임진각 통일전망대 8. 평화누리 공원 내 성격 같아서는 8군데 모두 들리는 것을 목표로 하고 싶었지만 같이 온 일행이 걷는걸 누구보다도 극혐하여 위의 리스트 중에 (1번, 2번, 3번) 프로방스, 헤이리 마을, 프리..

Tistory

[C++] 예외 처리 (Exception Handling) try, catch ,throw

예외란? 예외란 문법적인 오류가 아닌 프로그램이 의도하지 않은 오류를 말합니다. 즉 개발자가 예상하는 동작을 제외한 나머지 전체라고 할 수 있습니다. 대부분의 경우 예외가 발생하면 시도했던 모든일들을 취소하고 그 전 상태로 되돌아가도록 프로그램을 작성합니다. 좀 더 심각한 경우라면 프로그램을 종료해야겠죠. 예외와 오류는 명백히 다릅니다. 오류가 났을때 프로그램이 터지는 현상을 막으려고 억지로 예외처리를 하여 동작시키려 하는것은 잘못된 행위입니다. 오류가 나지않도록 프로그래밍을 하는것이 가장 중요하고 오류가 난다면 그냥 프로그램이 터지도록 내버려두는 편이 낫습니다. try catch문 사용법 C언어에서는 예외처리를 조건문 if문으로 처리를 해왔습니다. if문으로 예외처리를 하는것도 잘못된것은 아니지만 좀 ..

Tistory

[Algorithm] 연결 리스트(LinkedList) 구현하기 (C++)

이중 연결 리스트 이번 포스팅에서는 더블 링크드 리스트라고도 하는 이중 연결 리스트에 대해서 알아보고 실제로 구현해보려고 합니다.이중 연결 리스트에는 prev, next라는 이전과 다음 노드를 가리키는 포인터를 가지고 있는 연결 리스트를 말합니다. prev라는 이전 노드를 가리키는 포인터, next라는 다음 노드를 가리키는 포인터를 갖고 있기 때문에 양쪽으로 탐색이 가능하다는 장점이 있습니다. 이중 연결 리스트는 Head라는 처음을 의미하는 노드와 Tail이라는 마지막을 의미하는 노드를 가지고 있습니다. 이것을 시작과 끝으로 노드들을 추가하고 삭제하게 됩니다. 노드 추가 노드의 추가는 기존의 마지막 노드와 Tail과의 연결을 끊고 새로운 노드를 추가하여 기존 노드의 Next를 새로운 노드의 Prev에 연..

Tistory

[C++] string 클래스 (문자열 다루기) 사용법 & 예제 총정리

C++ 문자열 클래스(string) 기존 C언어에서는 문자열을 다루기 위해서는 char[] 배열을 사용하였습니다. 그리고 끝에 null문자 '\0'을 넣어줌으로써 문자열이 끝이났다는것을 판별하였죠. 이렇게 사용하다보니 문자열 길이도 신경써줘야 하고 사용하는 과정에서 문자열도 자주 깨지는 등의 불편한 점이 굉장히 많았습니다. 이와 같은 불편함을 줄이기 위해 C++에서는 Java나 Python과 같이 문자열을 다루는 string 클래스를 만들어 사용할 수 있게끔 되었습니다. string 클래스에서는 문자열을 객체로 다룹니다. 사용하기 편리해진 만큼 컴퓨터가 해야할 일이 많아졌다는 것을 뜻합니다. string클래스를 사용하면 char[] 배열을 사용하는 방식보다는 다소 느려지는것은 어쩔수 없는 부분이긴 합니다..

Tistory

[일상] 원룸 에어컨 청소하기 (feat 공간 치유사)

제가 살고 있는 원룸은 저층이기도 하고 주변이 건물로 빽빽이 차 있어 환기가 쉽지 않아 항상 집안의 공기가 탁한 편이었습니다. 그래서 방 안의 공기의 질을 향상하고자 에어컨에 있는 공기청정 모드를 많이 사용하는데 요즘 들어 에어컨을 가동할 때마다 에어컨 특유의 꾸릿꾸릿한 냄새가 많이 났습니다. 이를 해결해보고자 에어컨 청소도 해보고 탈취제도 뿌려봤지만 냄새가 사라지지 않아 해결 방안을 찾아봤습니다. 청소하지 않은 에어컨에는 세균과 곰팡이가 득실거린다고 합니다. 에어컨을 켰을 때 축축한 곰팡이 냄새가 나면 즉시 청소를 해야한다고 하던데 그 특유의 에어컨 꾸릿꾸릿한 냄새가 곰팡이 냄새라는 생각이 갑자기 들더군요. 곰팡이를 제거하려면 에어컨 필터만 청소해서는 안되고 에어컨 전체를 뜯어서 내부의 곰팡이와 먼지를..

Tistory

[C++] 순수 가상 함수, 추상 클래스에 대하여

이 포스팅은 가상 함수에 대해 알고있다는 전제하에 작성되었습니다. 해당 내용을 모르시면 아래 링크되어 있는 글을 먼저 확인해주세요. [C++] 가상함수(virtual) 사용법 총정리 순수 가상함수란? 순수 가상함수란 선언(declaration)만 있고 구현(definition)이 없는 가상 함수를 의미합니다. virtual void func() = 0; 위와 같이 가상함수에 0을 대입하면 순수 가상함수가 됩니다. 순수 가상함수는 파생 클래스에서 재정의할 것으로 예상되는 함수에 대해 미리 호출 계획을 세워 두기 위해 정의합니다. 추상 클래스 위와 같은 순수 가상함수를 하나라도 가지고 있는 클래스를 추상클래스(abstract class)라고 합니다. 추상 클래스는 객체를 생성할 수 없습니다. 추상 클래스는 ..

Tistory

[C++] 복사 생성자, 복사 대입 연산자 (+깊은 복사)

클래스 생성 시 컴파일러가 자동으로 생성해주는 함수는 생성자, 소멸자, 복사 생성자, 복사 대입 연산자 이렇게 4가지가 있으며 이번 포스팅에서 다룰 내용은 복사 대상자와 복사 대입 연산자입니다. 생성자나 소멸자에 대해 궁금하시다면 아래 글의 생성자와 소멸자 부분을 참고해주세요. [C++] 클래스(Class) 사용법 & 예제 총정리 복사 생성자와 복사 대입 연산자란? 복사 생성자는 객체의 복사본을 생성할 때 호출되는 생성자입니다. 생성자나 소멸자와 마찬가지로 클래스를 작성할 때 복사 생성자를 생략하면 디폴트 생성자처럼 컴파일러가 알아서 만들어줍니다. 복사 대입 연산자는 같은 타입의 객체를 이미 생성되어 있는 객체에 값을 복사할 때 사용됩니다. 마찬가지로 따로 정의를 해주지 않을 경우 컴파일러가 알아서 생성..

Tistory

[C++] 연산자 오버로딩에 대하여

연산자 오버로딩이란? 연산자 오버로딩이란 연산자를 재정의하여 사용자가 원하는 형태로 사용이 가능하게끔 하는것을 말합니다. 대부분의 기본 제공 연산자 함수는 전역 함수 또는 클래스로 재정의 가능합니다. 오버로드 된 연산자는 함수로 구현됩니다. 이렇게 재정의된 연산자 함수는 연산자를 이용하듯 호출할 수 있습니다. 이렇게 연산자들을 함수로 만들어서 넣어주면 사용자는 훨씬 더 간결한 방법으로 코드를 작성할수도 있고 코드의 확장성도 높아집니다. 연산자 오버로딩 사용시 주의점 1. C++에서 사용되지 않는 연산자는 재정의 할 수 없습니다. 2 기본 제공 데이터 형식에 적용할때 연산자의 의미를 다시 정의할 수 없습니다. 3. 오버로딩 한 연산자는 클래스 멤버함수이거나 전역함수여야만 합니다. 연산자 오버로딩 할 수 없..

Tistory

[C++] 클래스(Class) 사용법 & 예제 총정리

클래스(Class)란? 클래스(class)는 객체 지향 프로그래밍(OOP)에서 특정 객체를 생성하기 위해 변수와 메서드를 정의하는 일종의 틀이며 내부적으로 객체를 정의하기 위한 상태 값을 의미하는 멤버 변수와 클래스의 동작인 메서드(함수)로 구성됩니다. 객체 지향 프로그래밍에서는 모든 데이터를 객체(object)로 취급하며 이 객체들의 조합으로 프로그래밍을 하는 방식을 의미합니다. C++에서 클래스(class)란 구조체(struct)의 상위 호환으로 이해할 수 있습니다. 구조체와 다른점은 접근 제어 지시자가 추가되었고 함수를 포함할 수 있게 된 점입니다. 접근 제어 지시자 지시자 설명 public 어디서든 접근이 가능 (외부에서도 모두 접근 가능) private 클래스 내부에 정의된 함수에서만 접근 허용..

Tistory

[C++] 프렌드(friend) 사용법 (함수, 클래스) 총정리

friend를 사용하는 이유 프렌드를 쓰는 이유는 친구나 동료처럼 수평적인 관계의 클래스간의 멤버 변수를 공유해야 할 경우 주로 쓰입니다. 예를 들면 하나의 클래스에서 다른 클래스의 내부 데이터에 접근 해야할 경우 프렌드를 써서 권한을 주는 경우를 예로 들수 있습니다. 이렇게 friend를 사용하면 자신의 개체뿐만이 아닌 다른 타입의 개체를 접근하는 것이 가능해지기 때문에 코드의 확장이 수월하게 이루어집니다. 단 이렇게 프렌드를 사용할 경우 개발자의 입장에서는 개발에 편리하겠지만 캡슐화 파괴의 주범이 되어 설계가 꼬여버리는 경우가 생길 수 있습니다. 클래스 내부에서만 써야할 멤버들이 다른곳에서 계속 접근을 허용하게 되면 데이터 보호도 어렵고 캡슐화를 지향하는 객체지향적 설계라고 보기 어렵겠죠. 프렌드는 ..

Tistory

[C++] 가상함수(virtual) 사용법 총정리

가상함수란? 가상함수는 부모 클래스에서 상속받을 클래스에서 재정의할 것으로 기대하고 정의해놓은 함수입니다. virtual이라는 예약어를 함수 앞에 붙여서 생성할 수 있으며 이렇게 생성된 가상함수는 파생 클래스에서 재정의하면 이전에 정의되었던 내용들은 모두 새롭게 정의된 내용들로 교체됩니다. 가상함수를 사용해야 하는 이유 컴파일러는 함수를 호출할 때 매우 복잡한 과정을 거치게 됩니다. 그렇기에 컴파일러는 함수를 호출하는 코드는 컴파일 타임에 고정된 메모리 주소로 변환시킵니다. 이것을 정적바인딩이라고 합니다. 일반 함수의 경우 모두 이러한 정적바인딩을 하게 됩니다. 하지만 일반 함수를 오버 로딩하게 되면 정적바인딩으로 인해 문제가 될 수 있습니다. 가상함수가 아닌 보통의 경우 부모 클래스형 포인터로 멤버 함..

Tistory

[C언어/C++] 인라인(inline) 함수 사용법 & 예제

인라인 함수 사용법 inline 함수의원형 inline 함수의정의 함수 앞에 inline이라는 키워드를 위치시키는 것으로 인라인 함수를 선언, 생성 할 수 있습니다. 인라인 함수란? 인라인 함수는 정의한 코드들이 인라인 함수 호출 시 그 자리에 인라인 함수 코드 자체가 안으로 들어간다는 뜻입니다. 즉, 함수의 내용을 호출을 통해서 실행시키는 것이 아니라, 호출하는 코드 자체가 함수 내용의 코드가 됩니다. 예를 들어 아래의 예제처럼 인라인 함수를 사용했다고 해보겠습니다. #include inline void PrintHello() { cout

Tistory

[C언어/C++] 매크로(define) 함수 사용법 & 예제

매크로 함수란? 매크로 함수는 함수처럼 인자를 설정할 수 있는 매크로를 의미합니다. 매크로 상수와는 달리 매크로 함수 이름에 괄호 와 함께 인자 목록이 주어져 있습니다. 매크로 함수라고 부르지만 단순히 치환하기만 하므로 실제로 함수는 아닙니다. 함수 선언과 비슷하지만 매크로 함수는 인자의 자료형을 신경 쓰지 않습니다. 즉, 자료형의 독립성을 보장합니다. 또 매크로 함수 내부에서 자기 자신을 호출할 수 없다는 특징이 있습니다. 매크로를 정의하는 경우에는 컴파일이 되면 해당 매크로 이름을 가진 것들이 지정해놓은 값으로 변해서 컴파일 됩니다. 매크로 함수 사용법 #define (매크로 함수 이름) (매크로 함수 기능) #define ADD(a,b) a+b //ex #define으로 시작되는 전처리 문장을 매크..

Tistory

[C++] 템플릿(template) 사용법 & 예제 총정리

템플릿이란? 템플릿은 어린시절에 한번쯤 사용했을 모양자와 같습니다. 모양자에는 다양한 종류의 도형들이 틀로 만들어져 있습니다. 이 틀을 활용하면 누구나 정말 반듯한 네모를 그릴수도 있고 별도 그릴수 있습니다. 템플릿의 생산성이 뛰어난 이유도 이와 같습니다. 정말 완성도 높은 코드를 모양자로 찍어내듯 생성할 수 있기 때문입니다. 특히 소스코드의 완성도를 높인 상태에서 STL처럼 확실하게 검증된 라이브러리를 사용한다면 완성도와 생산성, 두마리 토끼를 한꺼번에 잡을 수 있습니다. 템플릿을 많이쓰면 컴파일 속도가 느려지지만 최신 C++ 개발 트렌드를 따르려면 템플릿은 선택이 아니라 필수입니다. 생산성이 높고 유지보수성이 뛰어난 코드가 당연히 좋은 코드이기 때문입니다. ※ 누군가가 템플릿으로 만들어주거나 만든 템..

Tistory

[C언어/C++] 화면의 커서 안보이게 숨기기 (+커서 두께 조절)

콘솔 개발을 할때 화면에 커서가 계속해서 깜빡깜빡 거리고 있다면 화면이 지저분한 느낌을 줍니다. 이번 포스팅에서는 화면의 커서의 굵기를 조절하거나 없애버리는 방법에 대해 포스팅 해보려고 합니다. 커서 안보이게 숨기기 #include #include void CursorView() { CONSOLE_CURSOR_INFO cursorInfo = { 0, }; cursorInfo.dwSize = 1; //커서 굵기 (1 ~ 100) cursorInfo.bVisible = FALSE; //커서 Visible TRUE(보임) FALSE(숨김) SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursorInfo); } int main() { CursorView();..

Tistory

[C언어/C++] 화면 깜빡임 없애기 (더블 버퍼링)

콘솔로 개발을 진행할때 화면을 모두 지우고 재출력을 해야하는 상황에서 대개 while문 안에 system("cls") 명령어를 많이 사용하는데 콘솔의 내용을 지우고 다시 쓰고 하는 과정에서 정신산만한 깜빡임이 발생합니다. 이러한 문제가 생기는 원인은 싱글 버퍼링을 사용할 경우에 ( 화면 출력 -> 초기화 -> 화면 출력 ) 이 과정을 빠른속도로 무한 반복하는 도중 계속해서 공백이 노출되기 때문입니다. 이러한 현상을 없애주려면 그래픽스에서 많이 사용하는 더블 버퍼링이라는 기법을 사용하여야 합니다. 더블 버퍼링이란? 더블 버퍼링이란 싱글 버퍼링으로 화면을 그릴 경우 데이터를 저장하는 동안에는 다음 그림의 데이터를 전송할 수 없기 때문에 지우고 그리고 지우고를 반복 할 경우 필연적으로 발생하는 깜빡임 등의 상..

Tistory

[C언어/C++] 캐릭터 움직이기 (GetAsyncKeyState 함수 사용법)

다중키 입력이 가능한 GetAsyncKeyState C언어 / C++에서 입력키의 정보를 알아오기 위해 _getch()를 종종 사용하고는 합니다. 하지만 _getch() 함수는 마지막에 누른 키 하나만을 입력받습니다. 그렇기에 좌,우,상,하 키를 동시에 입력받지 못하여 "대각선 이동" 모션을 할수가 없습니다. 게임을 개발하기 위해서는 _getch()함수보다는 GetAsyncKeyState()함수를 사용하도록 합시다. GetAsyncKeyState()함수는 입력을 멀티로 받을 수 있습니다. →키와 ↑키를 동시에 누른다면 오른쪽 위의 대각선 방향으로 이동을 할 수 있게됩니다. GetAsyncKeyState 사용법 SHORT GetAsyncKeyState(int vKey) 함수의 형태는 위와 같습니다. 인자값..

Tistory

[수학] 길이의 단위 종류 + 변환 사이트

길이의 단위가 워낙 많아 단위를 외우기가 힘들어 포스팅 기록으로 남겨놓습니다. 가장 많이 사용하는 길이 단위 밀리미터(millimeter) : 국제단위계의 길이 단위로 1미터의 1,000분의 1에 해당하는 길이 단위입니다. 센티미터(centimeter) : CGS 단위계의 기본 단위로 1미터의 100분의 1에 해당하는 길이 단위입니다. 미터(meter) : 길이나 거리의 국제단위로 진공에서 빛이 299,792,458분의 1초 동안 진행한 거리로 정의되어 있습니다. 기이러한 정의는 최근에 측정 기술이 길이와 단위를 매우 높은 정확도로 재현할 수 있게 되면서 제안된 것으로, 시간의 경우에는 1013의 정확도로 재현할 수 있습니다. 킬로미터(kilometer) : 미터법에서 길이의 단위로 1,000미터와 같습..

Tistory

[C언어] 파일 입출력 (txt 파일 쓰기, 읽기)

파일을 입출력할 때는 먼저 파일 스트림을 생성해야 합니다. 그리고 이 파일 스트림을 생성하려면 파일 포인터가 필요합니다. 파일 포인터는 파일에 접근하는 데 사용되는 FILE 구조체 포인터를 말합니다. 즉, 파일 스트림의 실체가 FILE 구조체 포인터입니다. 이처럼 파일 스트림(FILE 구조체 포인터)을 생성하고 파일을 fopen() 함수를 활용하여 연 뒤 여러 가지 파일 입출력 함수를 이용해서 입출력 작업을 할 수 있습니다. 파일 입출력이 끝난 후에는 파일 포인터를 fclose() 함수를 활용해서 닫아주면 됩니다. 파일 입출력 과정 1. 파일 스트림을 생성한다.(파일 포인터 생성) 2. 파일을 연다. fopen()함수 사용 3. 파일 입출력을 수행한다. 4. 파일을 닫는다. fclose()함수 사용 TX..

Tistory

[C언어/C++] 원하는 좌표로 커서 이동하기 (SetConsoleCursorPosition)

콘솔 화면의 특정위치에 출력을 하기 위해 줄바꿈 printf("\n") 으로 이동한다면 화면이 밀릴 수 있어 화면이 깨질 위험이 있습니다. 그러므로 특정위치에 출력을 할때는 커서를 해당 좌표로 이동시킨 뒤 확실하게 출력하는 방법을 써야합니다. SetConsoleCursorPosition 함수를 통해 커서 이동 void gotoxy(int x, int y){ //x, y 좌표 설정 COORD pos={x,y}; //커서 이동 SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos); } windowswindows.h 헤더에 존재하는 SetConsoleCursorPosition 으로 좌표를 이동시킬 수 있습니다. 대부분 위와 같이 gotoxy라는 함수를..

Tistory

[C언어/C++] 타이머 만들기 (스톱워치)

이전 포스팅에서 C언어 / C++에서 정밀한 시간 측정하는 방법인 clock, getTickcount, timeGetTime 함수들에 대해서 알아보았습니다. 코딩을 하다보면 은근히 경과시간을 구해야할 경우가 많습니다. 이 함수들을 활용해서 경과시간을 측정하는 타이머도 만들 수 있습니다. 정밀한 시간 측정 방법이 궁금하시다면 아래 글을 참고해주세요. [C언어/C++] 정밀한 시간 측정 (clock, getTickcount, timeGetTime) 함수의 차이와 사용법 C언어 / C++ 타이머(스톱워치) 만들기 #include #include #include int main() { clock_t start = clock(); for (;;) { clock_t end = clock(); double time ..

Tistory

[C++] 나노초(ns)단위 시간 측정 chrono 함수 사용법 & 예제

이전 포스팅에서 컴퓨터에서 정밀한 시간 측정방법과 C언어 / C++에서 측정된 시간을 clock, getTickcount, timeGetTime함수를 통해 사용할 수 있는 방법을 알아보았습니다. 하지만 이 함수들은 전부 밀리초까지만 측정이 가능하여 그 보다 더 정밀하게는 측정이 불가능하다는 단점이 있었습니다. 이러한 단점을 보완하고자 C++ 11부터 chrono 함수가 새롭게 추가되어 나노초까지 측정할 수 있게 되었습니다. 측정방식은 CPU의 클럭 기준 (3G CPU면 300만 분의 1)이라고 합니다. [수학] 초 단위 종류 (극 미세 시간) + 변환 사이트 나노초 단위 측정이 필요한가? 사실 나노초 단위의 측정이 필요한지는 의문입니다. 기존의 밀리초 단위의 계측만으로도 충분하다는 생각때문입니다. 프로그..

Tistory

[수학] 초 단위 종류 (극 미세 시간) + 변환 사이트

초에도 단위가 있습니다. 밀리초, 마이크로초, 나노초, 피코초, 펨토초, 아토초가 그 단위들입니다. 흔히 미세한 시간의 단위들을 극 미세시간이라고 하며 밀리초(1000분의 1), 마이크로(100만분의 1), 나노(10억분의 1), 피코(1조분의 1), 펨토(1,000조분의 1), 아토(100경분의 1)로 극미세 세계의 단위로까지 시간을 나눌 수 있습니다. 너무나도 미세한 단위들이라 숫자들이 너무 커 외우기가 너무 힘들어 이렇게 포스팅 기록으로 남겨놓습니다. 밀리초(millisecond) 밀리초 (millisecond)는 시간의 단위로 1,000분의 1초. 물리나 공학 분야에서는 통상 msec, 또는 라고 쓰입니다. 컴퓨터 내부의 논리 회로(logic circuit) 등은 상당히 고속으로 작동하지만, 보..

Tistory

[C언어/C++] 소수점 n번째 자리까지 올림, 반올림, 버림 (cell, round, floor)

double형이나 floot같은 실수형 변수들을 사용하다보면 자릿수가 너무 길어 적절한 시기에 올림이나 반올림, 버림등을 해서 사용하고 싶은 경우가 있습니다. 이런경우 math 헤더안에 있는 cell(올림), round(반올림), floor(버림) 함수를 사용하시면 됩니다. C언어의 경우 반올림을 구하는 round()함수가 따로 없어서 round함수 대신 다른 방법을 사용해야 합니다. 올림(cell), 반올림(round), 내림(floor) 함수 사용법 #include //C언어 #include //C++ //C언어 double ceil(double n); //올림 double floor(double n); //내림 //C++ double ceil(double n); //올림 float ceil(floa..

Tistory

[C언어/C++] 정밀한 시간 측정 (clock, getTickcount, timeGetTime) 함수의 차이와 사용법

C언어나 C++에서 제공하고 있는 시간을 측정하는 함수들이 많이 있습니다. 그중에서는 time함수도 있습니다. 하지만 time함수의 경우 시간을 초(s) 단위 측정까지만 가능하므로 정밀한 시간측정에는 부적합한 함수 입니다. [C언어/C++] 현재 날짜/시간 원하는 형태로 출력하기 (time, localtime) 정밀한 시간 측정하기 어떻게 하면 컴퓨터에서 정밀한 시간을 측정할 수 있을까요? 사실 C언어나 C++같은 프로그래밍 언어에서 시간을 측정할 수 있는 기능을 제공하는 것은 아닙니다. 시간을 측정한다는것 자체가 OS의 힘을 빌려야만 가능합니다. 윈도우에서 여러가지 시간을 측정할 수 있는 함수들을 만들어놓고 그것을 C언어나 C++같은 프로그래밍 언어에서 그대로 가져다 쓰는것 뿐입니다. 그렇다면 OS에서..

Tistory

[C언어/C++] 거듭 제곱 구하기 pow 함수 사용법 & 예제

C언어나 C++에서 특정 값의 제곱을 구하려면 math 헤더에 있는 pow함수를 사용하시면 됩니다. 해당함수를 사용하면 따로 알고리즘 구현없이도 함수 호출 한번으로 원하는 값을 얻어낼 수 있습니다. pow함수 사용법 #include //C언어 #include //C++ //C언어 double pow(double base, double n) //C++ double pow(double base, double n) float pow(float base, float n) long double pow(long double base, long double n) pow함수를 사용하려면 먼저 pow함수가 포함되어 있는 math헤더를 include해야합니다. C++은 cmath입니다. C언어는 리턴값이 double로 고..

Tistory

[C언어/C++] 제곱근(루트) 구하기 sqrt 함수 사용법 & 예제

C언어나 C++에서 특정 값의 제곱근(루트)을 구하려면 math 헤더에 있는 sqrt함수를 사용하시면 됩니다. 해당함수를 사용하면 따로 알고리즘 구현없이도 함수 호출 한번으로도 원하는 값을 얻어낼 수 있습니다. sqrt 함수 사용법 #include //C언어 #include //C++ //C언어 double sqrt(double n) //C++ double sqrt(double n) float sqrt(float n) long double sqrt(long double n) sqrt함수를 사용하려면 sqrt함수가 포함되어 있는 math헤더를 include해야합니다. C++은 cmath을 포함하시면 됩니다. 제곱을 구할때 사용하는 pow함수와 같이 C언어는 오버로딩이 안되기에 리턴값이 double로 고정되..

Tistory

[C언어/C++] 절대값 구하기 (abs, labs, fabs) 함수 사용법 & 예제

코딩을 하다보면 가끔 숫자의 절대값이 필요한 경우가 있습니다. 이런 경우 따로 알고리즘 구현없이 abs, labs, fabs라는 절대값 반환 함수를 활용하여 절대값 숫자를 반환받을 수 있습니다. 절대값 반환 함수(abs, labs, fabs) 사용법 //C언어 헤더 #include //abs, labs #include //abs, labs, fabs //C++ 헤더 #include //abs, labs, fabs #include //abs, labs, fabs //사용법 int abs(int n); long labs(long n); double fabs(double n); sqrt절대값 함수를 사용하려면 절대값 함수들이 포함되어 있는 math헤더를 include해야합니다. C++은 cmath을 포함하시면..

Tistory

[C언어/C++] 특정 문자 찾기/검색 &치환 strchr 함수 사용법 & 예제

프로그래밍을 하다보면 특정 문자열에서 찾고자 하는 문자가 몇번 포함되어있는지 체크하고 싶을때가 있습니다. 대상 문자를 검색하고 싶다면 문자를 끝까지 반복문을 돌려 문자가 있는지 일일이 비교하여 확인하는 방법도 있겠지만 그 방법보다는 strchr()함수를 사용하면 편리하게 찾을 수 있습니다. 문자열에서 특정 문자 검색 strchr 함수 사용법 #include //C언어 #include //C++ char* strchr(const char*, int character); //C언어 const char* strchr(const char* str, int character); //C++ char* strchr (char* str, int character); //C++ strctr 함수를 사용하기 위해서는 해당..

Tistory

[C언어/C++] 특정 문자열 찾기/검색 &치환 strstr 함수 사용법 & 예제

개발을 하다보면 특정 문자열에서 원하는 문자열이 포함되어 있는지 확인해야하는 경우가 있습니다. 이 경우 strstr()함수를 사용하면 간편하게 체크할 수 있습니다. 문자열에서 특정 문자열 검색 strstr 함수 사용법 #include //C언어 #include //C++ char* strstr(char* str1, const char* str2); strstr 함수를 사용하기 위해서는 해당 함수가 포함되어있는 헤더를 포함해야 합니다. C++의 경우 헤더를 포함하시면 됩니다. strstr함수는 찾고자하는 문자열이 있다면 해당 문자열로 시작하는 문자열 포인터를 반환하고 찾고자 하는 문자열이 없다면 NULL값을 반환합니다. 인자값 str1 : search 대상 문자열 str2 : 찾고자 하는 문자열 리턴값 해..

Tistory

[C언어/C++] 문자열 대소문자 판별 (isupper, islower) 함수 사용법 & 예제

모든 문자들은 아스키코드값으로 이루어져 있습니다. 숫자는 48 ~ 57까지 대문자는 65 ~ 90까지 소문자는 97 ~ 122번까지로 구성되어 있죠. 이러한 특성을 활용한다면 문자열을 판별하여 해당 문자가 대문자인지 소문자인지 숫자인지 특수 기호인지를 구분할 수 있는 프로그램을 만들 수 있습니다. #include void main() { char input[1000]; int temp1 = 0, temp2 = 0, temp3 = 0, temp4 = 0; int count = 0; printf("문자열을 입력하세요 \n"); gets_s(input); while (input[count]) { if (input[count] >= 65 && input[count] = 97 && input[count] = 48..

Tistory

[C언어/C++] 문자열 대소문자 변환 (toupper, tolower) 함수 사용법 & 예제

대문자와 소문자의 아스키코드값은 32만큼의 차이가 납니다. 아스키 코드값이 다르기 때문에 컴퓨터에서는 'A'와 'a'를 같은 값으로 인식하지 않습니다. 대문자와 소문자를 같은값으로 인식시켜주기 위해서는 대문자이든 소문자이든 하나로 통일을 시켜주어야 합니다. 이러한 특징을 활용하여 대문자는 32를 더해서 소문자로 치환할 수 있고 반대로 소문자는 32를 빼주어 대문자로 치환할 수 있습니다. #include void main() { char input[1000]; int count = 0; printf("문자열을 입력하세요 \n"); gets_s(input); while (input[count]) { if (input[count] >= 65 && input[count] = 97 && input[count] 대..

Tistory

[C언어/C++] 메모리 초기화 memset 함수 사용법 & 예제

메모리를 할당받은 변수의 공간은 쓰레기 값들이 남아있습니다. 이러한 쓰레기값들을 없애기 위해서 사용할 수 있는 방법중 하나가 memset함수를 사용하는 것입니다. memset 함수를 사용하면 메모리의 내용을 원하는 크기만큼 특정값으로 설정할 수 있습니다. 특히 동적이나 정적으로 생성한 배열을 초기화할 때 자주 사용합니다. memset 함수 사용법 #include //C언어 #include //C++ void* memset(void* ptr, int value, size_t num); memset함수를 사용하기 위해서는 먼저 memset함수가 포함되어 있는 헤더를 포함시켜야 합니다. 헤더는 string.h에도 있고, memory.h에도 memset함수가 있습니다. 둘중 아무거나 포함해 주세요. 인자 값 p..

Tistory

[C언어/C++] 메모리 복사 memcpy 함수 사용법 & 예제

이미 생성한 객체들을 여러개 만들어야 할때 물론 여러번 만들어줄수도 있지만 번거로울 수 있습니다. 이런 경우에는 이미 만들어 놓은 객체들을 복사해서 사용하면 편리한데요. memcpy함수를 사용하여 메모리를 다른곳으로 복사할 수 있습니다. 이번 포스팅에서는 memcpy함수의 사용법에 대해 알아보도록 하겠습니다. memcpy 함수 사용법 #include //C언어 #include //C++ void* memcpy (void* dest, const void* source, size_t num) memcpy함수를 사용하기 위해서는 먼저 memcpy함수가 포함되어 있는 헤더를 포함시켜야 합니다. 헤더는 string.h에도 있고, memory.h에도 memcpy함수가 있습니다. 둘중 아무거나 포함해 주세요. 인자값..

Tistory

[C언어/C++] 메모리 이동 memmove 함수 사용법 & 예제

memmove의 함수는 memory + move의 합성어로 메모리를 이동시키는 목적으로 만들어진 함수입니다. 하지만 실질적인 수행동작은 메모리의 이동이 아닌 메모리의 복사입니다. 실질적인 동작은 앞서 포스팅 했었던 memcpy와 같이 메모리의 값을 복사하는 동작을 똑같이 수행하는데요. 다만 memcpy와는 달리 memmove 함수는 복사할 대상을 버퍼에 복사하고 해당 위치에 가서 버퍼에 복사된 것을 붙여 넣는 식으로 동작이 구현되어있기에 성능은 살짝 떨어지지만 memmove 함수가 더 안정성이 좋습니다. 두 함수의 다른 점은 포스팅의 가장 마지막 부분을 참고해주세요. memmove 함수 사용법 #include //C언어 #include //C++ void* memmove (void* dest, const..

Tistory

[C언어/C++] 구조체, 클래스의 패딩 바이트에 대하여

구조체, 클래스의 크기와 패딩바이트 구조체나 클래스의 크기는 어떻게 결정될까요? 구조체나 클래스 내부에 선언된 변수들의 크기로 결정된다고 생각하실 수 있는데 실제로 크기를 확인해보면 대부분 내부의 선언된 변수의 크기들보다 더 큰 크기의 공간이 할당되어 있습니다. 바로 패딩 바이트 때문에 그렇습니다. 패딩 바이트란 클래스나 구조체에 패딩 바이트를 추가하여 CPU 접근을 더 용이하게 해 주는 것을 말합니다. 자칫 공간 낭비일 수도 있는 불필요한 패딩 공간을 확보하면서 메모리의 크기를 맞추는 이유는 캐시 hit율을 높이고 CPU의 연산 횟수를 줄이기 위해서입니다. 패딩바이트 생성 예제 #include struct temp { int a; // 4byte int b; // 4byte char c; // 1byt..

Tistory

[C언어] 메모리 동적할당 (malloc, free) 함수 사용법 & 예제

메모리의 동적 할당이란? "메모리를 동적 할당한다"라는 뜻은 컴퓨터 프로그램이 실행되는 도중인 런타임 도중에 사용할 메모리 공간을 할당하는 것을 말합니다. 동적 할당되는 메모리는 힙 영역에 생성되게 되며 컴파일 타임에 메모리의 크기가 결정되는 데이터 영역이나 스택 영역의 정적 메모리 할당과는 대조적인 개념입니다. malloc 함수 사용법 #include //malloc 함수가 포함된 헤더 파일 void* malloc(size_t size) malloc 함수를 사용하기 위해서는 malloc 함수가 포함되어 있는 헤더나 헤더를 포함시켜야 합니다. 인자 값 size_t : 동적으로 할당할 메모리의 크기 반환 값 성공시 할당한 메모리의 첫번째 주소 리턴, 실패시 NULL리턴 malloc 함수 사용 예제 #inc..

Tistory

[C언어] 동적 배열 생성하기 (1차원, 2차원)

동적 배열이란? 동적 배열은 heap을 이용하여 배열의 크기를 컴파일 단계가 아닌 실행시간에 가변적으로 바꿀 수 있는 배열을 말합니다 위 코드는 자바에서 동적배열을 생성하는 코드입니다. 하지만 이 코드를 그대로 C언어에서 생성해본다면 "식에 상수값이 있어야 합니다."라는 문구와 함께 에러가 나게 되는데요. 이렇듯 C언어에서는 Java와는 달리 변수를 배열의 길이에 오지 못하게 제한되어 있습니다. 그렇기 때문에 C언어에서는 동적 배열을 생성할때는 malloc함수를 활용하여 동적 메모리를 할당하는 방법을 써야 합니다. malloc함수에 대해 알고싶다면 아래 링크를 클릭해주세요. [C언어] 메모리 동적할당 (malloc, free) 함수 사용법 & 예제 1차원 동적 배열 생성하기 #include #includ..

Tistory

[C언어/C++] 현재 날짜/시간 원하는 형태로 출력하기 (time, localtime)

개발을 하다 보면 현재 날짜나 현재시간이 필요할 경우가 생깁니다. 이번 포스팅에서는 C언어나 C++에서 현재 날짜, 현재시간을 어떻게 구할 수 있는지에 대해 포스팅하도록 하겠습니다. 1. time 헤더 파일 포함 #include //C언어 #include //C++ 현재시간을 구하는 time 함수는 C언어는 , C++ 일 경우에는 헤더 파일 안에 내장되어 있습니다. 2. time() 함수를 호출하여 현재의 날짜, 시간을 얻어 time_t 변수에 저장 time_t timer = time(NULL); time 함수는 time_t 결과값으로 타입을 리턴합니다. 결과값은 Unix 운영체제가 공식 출시한 1970년 1월 1일 0시 0분 0초를 기점으로 현재까지 흐른 시간을 초단위로 나타냅니다. 3. localti..

Tistory

[C언어/C++] 두개의 날짜/시간 간격 차이 계산하기 (difftime)

프로그래밍을 하다 보면 두개의 날짜나 시간의 간격을 계산해야할 경우가 생깁니다. C언어나 C++에서는 두개의 날짜나 시간의 간격은 difftime 함수를 사용하여 구할 수 있습니다. time 헤더 파일 포함 #include //C언어 #include //C++ 두 날짜나 시간의 간격을 구하는 difftime 함수는 C언어에서는 , C++에서는 경우에는 헤더 파일 안에 내장되어 있습니다. difftime 함수 사용법 double difftime(time_t time1, time_t time2); difftime 함수의 리턴값은 double형입니다. time1 : 이후 시간 time2 : 이전 시간 difftime 함수 사용 예제 시간 차이 구하기 #include #include #include void m..

Tistory

[C언어/C++] 키보드 입력 받기 (getch, kbhit) 함수 사용법 & 예제

C/C++를 통해서 개발할 때 키보드 입력을 받아야 할 경우가 있습니다. 주로 키보드로 입력을 받을 때는 C언어에서는 scanf, C++에서는 cin을 사용했지만, 입력된 키의 정보를 얻어 올 경우에는 getch()와 kbhit() 함수를 사용합니다. 그 이유는 scanf나 cin은 입력 시 버퍼를 사용하기 때문에 키 입력 후에 엔터키를 눌러야 입력이 마무리되지만 getch는 입력 버퍼를 사용하지 않기 때문에 키를 누름과 동시에 값이 입력된다는 점과 SPACE나 ENTER와 같은 특수 키도 입력이 가능하다는 점 때문입니다. 키보드의 입력을 받으면 데이터가 ASCII코드로 들어옵니다. 주요 아스키(ASCII) 코드 값 주요 아스키 코드값은 위와 같으니 개발 시 활용하시면 되겠습니다. 아스키코드로 표현할 수..

Tistory

[C언어/C++] 랜덤함수(rand, srand, time) 사용법 & 예제 (난수 생성)

C/C++로 개발을 하다 보면 종종 난수가 필요할 경우가 많습니다. C/C++에서는 이처럼 난수를 생성하는 rand() 함수와 srand() 함수가 있습니다. rand()함수는 난수의 생성 패턴을 한개로 설정하는 것이고 srand()함수는 난수의 생성 패턴을 여러개로 설정하는 차이가 있습니다. 이 함수들이 들어있는 헤더파일을 확인해보면 #define RAND_MAX 0x7fff라는 매크로 상수가 선언되어 있습니다. 즉 RAND_MAX는 0x7fff인데 이는 10진수로 32767입니다. 따라서 난수 의 범위는 0~32767가 되게 됩니다. 랜덤함수를 사용하여 난수 생성하기 헤더 파일 //C언어 #include //rand(), srand() #include //time() //C++ #include //r..

Tistory

[C언어/C++] 랜덤(rand)함수 활용 아이템 가챠 프로그램 (난수 생성)

확률 게임 아이템 가챠 프로그램 #include #include #include #include #include struct Item { int num; char name[100]; }; int main(void) { struct Item item[100]; //아이템 배열 //배열 정보 입력 for (int i = 0; i < 60; i++) { item[i].num = i; strcpy_s(item[i].name, "일반등급 아이템"); } for (int i = 60; i < 90; i++) { item[i].num = i; strcpy_s(item[i].name, "레어등급 아이템"); } for (int i = 90; i < 99; i++) { item[i].num = i; strcpy_s(it..

Tistory

[C언어/C++] Sleep(딜레이) 함수 사용법 (잠시 멈춤)

컴퓨터의 연산속도는 너무나도 빨라서 아무리 많은 연산을 하더라도 실제 사용자가 보기에는 찰나의 순간에 지나가버립니다. 이런 CPU의 연산을 잠시 지연시키고 싶다면 windows의 Sleep함수를 사용하면 됩니다. 이렇게 Sleep 함수를 활용하여 CPU의 연산을 잠시 지연시키게 되면 마치 프로그램이 천천히 실행되는 효과를 줄 수 있게됩니다. Sleep함수는 밀리초 단위의 간격으로 설정이 가능하며 여기서 밀리초는 1/1000초입니다. 딜레이(Sleep) 함수 사용법 (잠시 멈춤) #include // Sleep함수가 포함된 헤더 Sleep(밀리초); // Sleep함수 호출 헤더파일의 Sleep() 함수를 사용하면 명령어의 실행시간을 지연시킬 수 있습니다. 1초를 지연시키고 싶다면 인자값으로 1000을 넣..

Tistory

[C언어/C++] 콘솔 창 색상, 크기, 제목, 폰트 색상 변경하기

콘솔 환경설정 C언어나 C++을 사용하여 콘솔 개발을 할 때가 많은데 콘솔도 환경설정값이 있어 개발자가 원하는 세팅을 해줄 수 있습니다. 다만 소스코드를 삽입한게 아니라 단순 환경설정이므로 내 PC한정입니다. 1. 콘솔창에 우클릭을 하게 되면 위와 같이 기본값이라는 항목이 있는데 클릭해서 콘솔 창 속성에 들어갑니다. 2. 콘솔 창 속성에서 콘솔의 글꼴과 크기, 창 크기와 색상변경 등 다양한 옵션값을 줄 수 있습니다. 자신만의 스타일로 콘솔창을 꾸며보세요. 명령어 사용 하나의 소스코드로 모든 디바이스의 콘솔 형태를 맞춰주고 싶다면 windows 헤더파일에 있는 함수들을 활용하여야 합니다. #include 콘솔창 크기 변경 //col = 가로, lines = 세로 system("mode con:cols=10..

Tistory

[C언어/C++] 콘솔 화면 지우기(초기화)

C언어를 사용하다보면 주로 콘솔로 데이터를 출력하고 입력받는 작업들을 수행하게 될것입니다. 이렇게 계속해서 프로그램이 진행되다보면 자연스럽게 콘솔창에 텍스트들이 누적될것이고 누적된 텍스트들로 인하여 가독성이 떨어집니다. 따라서 경우에 따라서는 콘솔창을 한번씩 초기화 시켜 줄 필요성이 있습니다. 콘솔 화면지우기 #include //windows 헤더파일 include system("cls"); //콘솔창 clear 헤더파일의 system()함수를 이용하면 cmd 명령어를 사용 할 수 있습니다. 여기서 위와 같이 system함수안에 "cls"를 입력하면 콘솔 창을 clear할 수 있습니다. 사용 예제 #include #include void main() { printf("출력되지 않음\n"); system(..

Tistory

[C언어/C++] 이중 포인터 사용법 & 예제

다중 포인터란 2차원 이상의 포인터 변수를 의미합니다. 포인터 변수도 메모리위에 올라가야하기에 주소값이 있습니다. 이러한 포인터의 메모리 주소값을 참조하는 포인터의 포인터를 이중 포인터라고 하며 이런 원리로 무한대의 다차원 포인터를 만들 수 있습니다. 다만 이중포인터까지만 종종 사용되고 실질적으로 2차원을 넘어서는 고차원 포인터는 잘 사용되지 않습니다. 이중포인터 사용법 int **ptr = NULL; 포인터를 선언할 때 ** 이런식으로 자료형 뒤에 *을 두 번 사용하면 포인터의 포인터(이중 포인터)를 선언할 수 있습니다. 이중 포인터 사용 예제 #include void main() { char ch = 'A'; char* ptr = NULL; char** ptr2 = NULL; ptr = &ch; //..

Tistory

[C언어/C++] const 포인터와 키워드 위치에 따른 차이점

const 포인터란? const라는 키워드는 변수를 상수화 시킬때 사용하는 키워드입니다. 이렇게 상수화 된 변수는 이후 변경이 불가능하며 포인터 변수에 const 키워드를 붙여도 같은 동작을 합니다. 다만 const의 위치가 어디로 가느냐에 따라 의미가 다릅니다. int a = 100; //1) const 자료형 변수명 = 초기값 const int *ptr = &a; //2) 자료형 const 변수명 = 초기값 int const *ptr2 = &a; //3) const 자료형 const 변수명 = 초기값 const int const *ptr3 = &a; const 포인터에서 const 키워드는 위와 같이 3가지 형태로 붙일 수 있습니다. const 키워드의 위치별 의미 상수 포인터(const pointe..

Tistory

[C언어/C++] 상수 선언하기 const, define의 차이점

상수란? 상수는 변하지 않는 값을 뜻합니다. 값을 계속 바꿀 수 있는 변수와는 달리 상수는 처음 선언할 때 값을 할당받게 되면서 그 다음부터는 값을 바꿀 수가 없습니다. 그렇기에 상수를 선언하실때는 꼭 선언과 동시에 초기화를 같이 해야만 합니다. 상수는 값을 변경시키지 못하도록 제한하고 싶을때 사용합니다. 코딩을 하다보면 고정되어 있어야 할 값을 실수로 값을 바꿀 가능성이 있습니다. 그렇기에 변하지 않을 값이라면 상수로 만들어줌으로써 값을 바꾸는 것을 방지하고 코드의 의도를 명확하게 만들 수 있습니다. 상수 사용법 #include // define은 전처리기이므로 main밖에 써야함 (매크로 상수) #define PI 3.141592 #define COL 100 #define ROW 200 void ma..

Tistory

[C언어/C++] 비트 플래그 (Bit Flag) 사용법 & 예제 (비트연산 활용)

2진수는 숫자를 표현할때 0과 1 두 가지 값으로만 표현합니다. 여기서 0과 1을 On / Off로 사용하는 개념을 비트 플래그라고 합니다. 이것을 어디에다 사용하냐?라고 반문하실 수도 있는데 전혀 사용성이 없는 것은 아니고 한 번에 여러 가지 속성을 동시에 지정할 때, 편리하게 사용할 수 있는 방법 중에 하나가 비트 플래그입니다. 비트 플래그를 사용하면 좀 더 공간을 효율적으로 사용할 수 있습니다. 단순 비교를 해보아도 8개의 상태를 저장하려면 bool 타입 변수 8개를 선언해야 할텐데 8비트의 char을 비트단위로 쪼개서 저장한다면 1개의 char 변수(1byte = 8bit)만으로도 8개의 상태를 저장할 수가 있죠. 비트 플래그 (Bit Flag) 사용 간단한 예제 #include int main(..

Tistory

[C언어/C++] 비트 쪼개기 (Bit Split) 사용법 & 예제 (비트연산 활용)

int형의 값의 범위는 –2,147,483,648 ~ 2,147,483,647입니다. 이렇게 큰 숫자를 저장할 수 있는 공간이죠. 하지만 우리는 int타입에 이렇게 큰 값을 잘 넣어서 사용하지는 않습니다. 그렇다면 그만큼의 공간이 낭비되는 셈입니다. 그렇다면 int형을 반으로 나눠서 사용할 수는 없을까요? 가능합니다. 비트 연산자의 간단한 기법을 통해서 말이죠. 이렇게 된다면 하나의 int값 안에 2개의 값을 넣을수가 있게 되겠죠. 참고로 이러한 방법들은 실제 코딩에서는 잘 사용되지 않습니다. 메모리를 타이트하게 잡고싶다면 __int8, __int16과 같은 변수타입을 선언해서 사용하면 됩니다. 비트 쪼개기 (Bit Split) 사용법 & 예제 (비트연산 활용) #include int main() { u..

Tistory

[C언어/C++] 포인터 배열, 배열 포인터의 사용법과 차이점

포인터 배열이란? 포인터 배열이란 말 그대로 포인터를 배열로 나열해놓은 것을 말합니다. 즉 포인터 변수의 배열이죠. 각각의 index에 여러 개의 포인터를 넣을 수 있습니다. char* arr[5]; int* arr[5]; void* arr[5]; 위와 같이 선언하여 사용합니다. char* arr[5]는 5개의 char형 포인터를, int* arr[5]는 int형 포인터 5개를 저장하고 있는 배열이 됩니다. 그냥 단순 주소값만 저장하고 싶을 때는 주로 void로 선언하며 이렇게 선언할 경우 이후 어떤 타입이든지 변환이 가능합니다. 포인터 배열 활용 예제 #include int main() { int num1 = 100; int num2 = 200; int num3 = 300; int* arr[3] = {..

1 2 3 4 5 6 7 8 9 10