728x90
728x90

01 C++의 역사


C는 데니스 리치가 70년대 초 유닉스 시스템을 개발하기 위해 제작

C++은 미 벨연구소 비얀 스트루스트럽이 80년대 C에 객체 지향 등의 특징을 추가하여 제작
당시 C with class로 발표. 83년 C++로 이름 변경
98년 첫 발표된 ANSI 표준안에 이어 여러 C++ 표준이 있다. ISO, NCITS, ANSI/ISO, X3 등...

 

02 C++의 특징


C는 절차프로그래밍 = 데이터와 명령(함수)을 분리
C++은 객체지향프로그래밍 = 확장성과 재사용성을 고려

C언어를 기본으로 확장한 언어
데이터 추상화를 제공 
객체지향프로그래밍(OOP)를 제공
일반화 프로그램을 지원 : 템플릿 등

 

추상화

더보기

추상화는 객체들의 공통된 특성을 파악하고 불필요한 특성을 제거해서 모델링하는 것으로
유사한 객체들의 덩어리로 공통적 특성을 표현하는 것 
객체지향프로그래밍에서 데이터를 추상화하는 단위는 클래스

 

추상화를 적절히 시키면 코드의 재사용성과 가독성을 높이고 결국 생산성, 에러의 감소와 같은 요소에 영향을 미치게 된다.
 
코딩을 하면서 빈번하게 쓰던 반복문을 살펴보자.
가와 나가 별을 100개 찍는다.
가:
printf("******....100개가 될 때까지 반복");
 
나:
for( i = 0; i < 100; i++ ) { printf("*");}
 
나에서는 *을 찍는 행동을 추상화 시켰다고 볼 수 있다.나에서는 *을 한 번 찍는 다는 것 밖에 행동이 없었지만, 반복문을 사용함으로서 추상화 시켰고 반복문이 실행되며 행동이 실체화 되었다.우리가 자주 쓰던 반복문도 일종의 추상화이다. 이러하듯, 추상화가 마냥 어려운 개념만은 아니다.
https://developers-dev.tistory.com/3

 

 

일반화 프로그램 지원

더보기

일반화 프로그래밍은 데이터를 중시하는 객체 지향 프로그래밍과는 달리 프로그램의 알고리즘에 그 중점을 둔다.

대표적인 C++의 일반화 프로그래밍관련 기능이 템플릿이고

템플릿은 매개변수의 타입에 따라 함수나 클래스를 생성하는 매커니즘이다.
타입이 매개변수에 의해 표현되서 매개변수화 타입이라고도 한다.

데이터타입을 템플릿으로 만드는 것이 대표적
함수 템플릿/클래스 템플릿 등이 있다.

 

절차적 프로그래밍 procedural programming

단계별로 구현한 프로그램
프로시저를 중심으로 설계
함수를 처리하는데 필요한 데이터 (인자)를 전달하고, 함수실행 후 결과값을 반환해서 처리한다
데이터의 배려가 어렵고?
사용된 프로그램을 확장, 재사용하기 어렵다

프로시저 중심에서 데이터 구성중심으로 이동 : 모듈화 프로그램

모듈화 프로그램은 캡슐화가 원칙

 

C++은 모듈성과 엄격한 타입제약을 받는 인터페이스로 유연하다

OOP는 객체의 구성과 객체 간 통신을 정의하는게 중요하다

객체 : 존재하는 것, 생각, 아이디어
클래스 : 객체를 프로그램으로 표현
인스턴스 : 프로그램에서 클래스를 사용해 만든 실제로 실행할 객체

 

객체지향 프로그램 : 객체 단위로 프로그램을 구현

객체지향 프로그램 3대 특성 : 캡슐화, 상속성, 다형성

 

캡슐화  : 객체와 관련된 데이터와 활용하는 함수를 하나로 묶어 놓은 것. 정보 은닉성

클래스 내부 데이터와 함수들을 묶은 것으로 외부에서 접근 불가하다.
객체를 단순화하면서 안전하게 작성할 수 있다.

 

상속성 : 작성된 클래스에 기능을 추가하거나 특정 멤버함수를 수정 등 클래스를 재정의해서 사용하는 것.

기본 클래스(base class)를 상속받는 파생 클래스(derive class)는 기본클래스의 멤버변수와 멤버함수를 모두 상속받고 데이터와 기능을 추가하거나, 특정 멤버 함수를 수정하여 만들어진 새로운 클래스다.

파생클래스를 통해 기본클래스에서 정의한 데이터나 멤버함수에 접근할 수 있다.
기본클래스에서 정의한 멤버함수는 오버라이딩해 수정하거나 새롭게 재정의할 수 있다.
한개의 클래스를 여러개의 클래스에서 기본클래스로 중복 사용할 수 있다.
두 개 이상 기본클래스를 반복하여 상속 받은 것이 다중상속이다.

 

오버라이딩 : 클래스들의 상속 상태에서 기본클래스에 정의된 함수를 파생클래스에서 재정의하는 것

부모의 멤버함수와 원형이 동일해야한다. 부모클래스의 함수는 모두 가려진다. (출처)

 

#include <iostream>

using namespace std;

class A {
	public:
	void over() { cout << "A 클래스의 over 함수 호출!" << endl; }
};

class B : public A {
	public:
	void over() { cout << "B 클래스의 over 함수 호출!" << endl; }
};

int main()
{
	B b;
	b.over();
	return 0;
}

//출처: https://blog.hexabrain.net/175 [끝나지 않는 프로그래밍 일기]

 

다형성 : 상속받을 기본클래스 내부에서 해당함수 이름 앞에 키워드 virtual를 붙여 가상함수로 선언한다.

같은 이름의 함수를 클래스에 따라 객체에 알맞은 행동을 하도록 하는 것.
컴파일러에서 처리, 상속받은 파생클래스 내부에서 해당 클래스가 요구하는 기능을 재정의 후 사용해야 동작된다.

한 클래스 내부에 같은 이름을 가진 멤버함수들을 포함하는 오버로드와
기본클래스와 파생클래스가 같은 이름을 갖는 멤버함수들을 포함하는 오버라이드 방법이 있다.

가상 함수 : 파생클래스에서 재정의할 것을 기대하는 멤버함수로 호출하는 객체의 동적 타입에 따라 실제 호출할 함수가 결정

virtual 멤버함수의 원형;

 

 

 

03 컴퓨터의 데이터 표현과 코드 체계


정보 단위 : 정보를 저장하는 최소단위. 1비트

문자 표현의 기본 단위
1Byte는 8bits. 1바이트는 8비트.

워드(word) :  CPU가 한 번에 처리할 수 있는 데이터의 크기입니다.
하프워드(2바이트) / 풀워드(4바이트) / 더블워드 (8바이트)

CPU에 따라 크기가 결정된다. 

32비트 시스템에서는 32비트 / 8비트 = 4, 즉 4바이트가 1워드(word)로 처리
64비트 시스템에서는 64비트 / 8비트 = 8, 즉 8바이트가 1워드(word)로 처리

필드(field) : data process 자료 처리의 최소 단위
특정 의미를 전달할 수 있는 단위

레코드(record) : 하나 이상의 필드로 구성되는 프로그램 처리의 기본 단위
논리레코드(프로그램 처리 단위)
물리레코드(논리레코드로 구성된 프로그램 입출력의 단위)로 나뉜다.

파일 : 연관성있는 레코드의 집합. 프로그램 구성의 기본 단위

데이터베이스 :  서로 관련된 파일들의 집합

 

수의 표현과 진수

0은 양수를 표현, 1은 음수를 표현한다.
음의 정수 표현은 부호 비트를 사용한 부호화크기 (signed magnitude) 방식|
양의 정수 표현은 unsigned magnitude(부호크기를 표시할 필요가 없다)

최상위 1비트 (MSB: Most Significant Bit)를 부호 표시에 사용, 나머지는 수의 크기를 표시
* LSB: Least Significant Bit 최하위비트

n비트를 사용한 정수는 음/양수 전부 표현 시 -(2의 n-1승)~(2의 n-1승-1) 까지 정수 표현 범위를 갖는다.
범위 초과 시 정상값으로 표현이 안되며 오버플로overflow 라고 한다.

 

1의 보수 complement :  1의 보수는 대부분 산술연산에서 원래 숫자 음수처럼 취급된다
보수 : 보충을 해주는 수. 현재 숫자에서 자릿수가 1단계 올라갈 수 있는 수를 구한다.

00000101 //5
11111010 //-5

2의 보수 : 1의 보수 결과에 1을 더한 것

 

 

04 C++ 프로그램의 개발 단계


C++로 작성한 프로그래믕ㄹ 소스코드(원시코드)라고 하며 파일명.확장자로 저장한다.

test.cpp  //C++프로그램
test.obj  //목적파일
test.exe  //실행파일

 

C++프로그램의 개발 단계 흐름도 

출처 : TCPSCHOOL.com

 

소스 코드 (source code, 원시 코드) : 프로그램을 작성한 코드

소스 파일에 저장되며 텍스트 형식으로 저장한다.

 

컴파일 : 소스코드를 컴퓨터에서 실행할 수 있도록 컴파일러를 사용하여 기계어로 번역

번역된 기계어로 작성된 코드는 목적 코드(object 코드)이며, 목적 파일에 저장된다.
기계어는 연산코드(operation code)피연산자(operand)로 구성된다.

컴파일러는 정확한 C++규칙을 지켜 구문 오류(syntax error)가 없는지 체크한다.
개발자가 실수한 의미상의 오류(semantic error)는 찾지 못한다.

컴파일 시 오류가 발생하면 목적파일이 안만들어진다.

 

링크 : 같은 이름의 여러 식별자가 같은 식별자를 참조하는지를 결정한다.

링커(linker)는 컴파일러가 생성한 목적코드에서 사용하는 표준라이브러리 함수들을 컴파일러 회사가 제공하는 표준라이브러리에서 필요한 코드 모듈을 가져와 목적 코드에 삽입하며 모든 모듈을 조합하며 연결(링크)하여 실행 가능한 실행파일을 생성한다. (윈도우는 exe)

* 요약하면, 여러 분리된 파일들을 컴파일한 각각의 결과물에서 최종적인 실행 파일을 만드는데 필요한 부분들을 찾아 연결하는 작업이다. (https://kldp.org/node/71570

정적 링크 : 필요한 모든 목적코드를 연결해서 완성된 실행파일을 만들어 실행
동적 링크 : 프로그램 실행 중에 프로그램 외부에 존재하는 목적코드를 찾아서 연결 (JAVA는 JVM이 알아서 처리)

프로그램에서 사용한 함수가 없거나 표준라이브러리에 없으면 오류메세지를 띄우고 링크를 중단한다.
오류 발생 시 소스코드에서 수정한다.

링키지 : 링크를 위한 규칙
로더(loader) : 메모리에 할당할 주소를 계산하여 절대 주소 프로그램을 생성한다.

 

 

 

실행 : 컴파일 후 링크까지 성공적이면 컴퓨터에서 실행할 수 있는 파일이 생성된다.

소스코드 작성 시 프로그램 논리가 잘못되면 실행 결과는 목적과 다를 수 있다.
컴퓨터가 다른 원인에 의해 충돌할 수도 있는데 이 경우에도 소스코드를 재검토한다.

 

디버깅 : 오류 발생 시 소스 코드를 단계별로 실행하면서 프로그램에서 사용한 변수들을 조사하는 작업

디버거 : 버그를 잡는다는 뜻

 

 

05 간단한 C++ 프로그램


전처리기 (preprocessor) : #으로 시작하는 문장

 

 

 

06 DEV-C++ 주의사항 (생략 가능)


화면에 결과를 출력하는 창이 순식간에 사라지는 문제 해결
임의의 키를 누를 때까지 창이 계속 열려있는 코드

#include <iostream>

using namespace std;

int main()
{
    cout<<"Hello World";
    cin.get(); // 컴파일, 링크 후 실행키를 누를 때까지 기다림

    return 0;
}

 

 

명령행에서 프로그램 실행하기

모든 C++ 프로그램에는 main함수가 있어야하며 메인함수가 없으면 main 컴파일러에서 오류가 생긴다
소스코드 실행을 시작하는 위치로 특별한 방법으로 정의해서 프로그램을 실행시킬 때 command 라인에서 문자열을 전달해줄 수 있다. 그러면 명령행 인자에 저장되어 프로그램 내에서 사용이 가능하게 된다.

명령행에서 main함수의 원형은 다음과 같다. 

 

main(int argc, char *argv[])
main(int argc, char **argv)

 

argc : 명령행 인자의 개수를 전달받는 정수 타입 매개변수
프로그램 이름을 첫 번째 인자로 사용하기 때문에 하나 이상이어야 한다.

argv : 명령행 인자의 문자열을 저장할 배열 포인터를 매개변수로 전달받아 실행한다.
argv[]의 대괄호 안이 비었으면 배열의 길이가 결정되지 않아 입력한 인자의 개수만큼 처리한다.
argv[0]은 c++ 프로그램명이다.

https://kldp.org/node/48280

artv[argc] 배열은 argc 개수만큼 생성되면서 해당하는 문자열이 저장된다.

 

#include <iostream>

using namespace std;

int main(int argc, char **argv)
{
    for(int i=0; i<argc; i++)
        cout<<"argument " << i << ": " << argv[i] <<endl;   

    return 0;
}

 

웹 컴파일러말고 프로그램에서 돌리면 c: .... .exe 가 나온다.
cmd 창에서 cd 저장한 폴더경로를 입력해 이동한 뒤 프로그램을 실행해본다.

프로그램파일명 + 단어 + 단어등으로 입력한 뒤 실행시키면 빈 칸에 의해 명령과 인자들이 구분되어 출력된다.
프로그램에서 도스 운영체제의 명령은 system() 함수를 사용하여 실행한다.

 

int system(const char *command);
// command : 도스 명령어를 사용하겠음
// 실행 파일의 이름이나 배치 파일 이름을 전달하여 해당 파일 실행

 

아래는 프로그램 내부에서 운영체제의 명령을 직접 실행하는 예제이다.

#include <iostream>

using namespace std;

int main(int argc, char **argv)
{
   system("cls"); //도스 화면 깨끗이 지우기
   system("dir"); // 디렉토리에 있는 파일이나 경로 표시
   system("type c:\\work\\cpp\\hello.cpp"); //파일 내용 표시
   system("pause"); // 임의의 키를 누를 때까지 정지
   // md : 디렉토리(폴더) 생성
   // cd : 디렉토리 변경
   // rd : 디렉토리(폴더) 삭제

    return 0;
}
728x90
728x90
블로그 이미지

coding-restaurant

코딩 맛집에 방문해주셔서 감사합니다.

,
728x90
728x90

윤성우 열혈 c++ 프로그래밍 동영상 강의 : http://www.orentec.co.kr/teachlist/CPP_BASIC_1/teach_sub1.php

사용할 컴파일러 : 비쥬얼스튜디오 or 온라인컴파일러 GDB (https://www.onlinegdb.com/online_c++_compiler) GDB는 컴파일 뿐만 아니라 리눅스 방식?으로 디버깅도 되는 온라인컴파일러

 

Online C++ Compiler - online editor

OnlineGDB is online IDE with C++ compiler. Quick and easy way to compiler c++ program online. It supports g++ compiler for c++.

www.onlinegdb.com

 


 

파일 확장자는 .cpp

c++ 컴파일러로 컴파일된다.

 

입출력을 하기 위한 헤더파일 선언문 #include <iostream> 추가

헤더에 추가 이후 std, cout, endl 등을 사용할 수 있다.
헤더파일 확장자는 .h이지만 새로운 표준 라이브러리, 표준 헤더파일 선언에서는 <iostream>으로 생략 가능하다.
과거 표준 라이브러리는 <iosteram.h>로 사용한다. 점차 지원하지 않는 추세.

 

std::cout<< '출력대상' 로 출력

출력대상 위치에는 정수, 실수, 문자열, 변수 모두 사용 가능하다.
C의 printf처럼 %d 같은 서식문자를 써서 별도의 출력포맷을 지정안해도 된다. (입출력 모두)
<< 연산자를 사용하면 둘 이상의 출력대상을 연이어 출력할 수 있다.

 

<<std::endl 로 개행

개행 및 \n과 다르게 출력버퍼를 비운다. (https://yechoi.tistory.com/48)

 

std::cin >> 데이터 입력 (scanf를 대신하는 데이터 입력)

역시 #include <iostream> 헤더파일 선언문이 필요하다.
변수의 선언은 어디서든 가능하다.

// SimpleAdder.cpp

#include <iostream>

int main()
{
    int val1;
    std::cout<<"첫 번째 숫자입력: ";
    std::cin>>val1;
    
    int val2;
    std::cout<<"두 번째 숫자입력: ";
    std::cin>>val2;
    
    int result = val1 + val2;
    std::cout<<"덧셈결과: " <<result<<std::endl;

    return 0;
}

 

C++에서는 데이터의 출력처럼 데이터의 입력도 별도의 포맷 지정이 필요 없다. 

char str[100];
scanf("%s", str);
char str[100];
std::cin>>str;

 

 

C++의 지역변수 선언

함수 정의 시 C에서 지역변수 선언은 가장 먼저 등장해야 했으나,
C++의 변수의 선언은 위치에 제한을 두지 않는다.

#include <iostream>

int main(void)
{
    int val1, val2;
    int result=0;
    std::cout<<"두 개의 숫자입력: ";
    std::cin>>val1>>val2;
    
    if(val1<val2) 
    {
        for(int i=val1+1; i<val2; i++) { // C도 새 표준에서는 이런 식으로 변수선언 가능
            result+=i;
        }
    } 
    else
    {
        for(int i=val2+1; i<val1; i++) {
            result+=i;
        }
    }

    std::cout<<"두 수 사이의 정수 합: " <<result<<std::endl;
    return 0;
}

 

 

std::cin>>'변수1'>>'변수2'로 연속적인 데이터의 입력

데이터 입력 시 데이터 간 경계는 탭, 스페이스바, 엔터키의 입력과 같은 공백에 의해 나눠진다.

 

배열 기반의 문자열 입출력
#include <iostream>

int main()
{
    char name[100];
    char lang[200];
    
    std::cout<<"이름은 무엇임?";
    std::cin>>name;
    
    std::cout<<"좋아하는 언어는?";
    std::cin>>lang;
    
    std::cout<<"내 이름은 "<<name<<"입니다.\n";
    std::cout<<"제일 좋아하는 언어는 "<<lang<<"입니다."<<std::endl;
    
    return 0;
}

 


 

문제 1 : 사용자로부터 5개의 정수를 각각 받아 합을 출력하는 프로그램

 

#include <iostream>

int main(void)
{
    int result=0;
   
    for(int val=1; val<6; val++) {
        std::cout<<val<<"번째 정수 입력: ";
        std::cin>>val;
        result+=val;
    }

    std::cout<<"합계: " <<result<<std::endl;
    return 0;
}

 

 

문제 2 : 프로그램 사용자로부터 이름, 전화번호를 문자열 형태로 입력받고, 입력받은 데이터를 출력하는 프로그램

 

#include <iostream>

int main(void)
{
    int result=0;
    char name[100]; //이름
    char phoneNum[200]; //전화번호
    
    std::cout<<"이름을 입력하세요: ";
    std::cin>>name;
    std::cout<<"번호를 입력하세요: ";
    std::cin>>phoneNum;

    std::cout<<name<<phoneNum<<std::endl;
    
    return 0;
}

 

 

문제 3 : 숫자를 하나 입력받아서 그 숫자에 해당하는 구구단을 출력하는 프로그램

 

#include <iostream>

int main(void)
{
    int result=0;
    int number;
   
  
    std::cout<<"구구단 몇단을 출력할까요? (숫자를 입력)";
    std::cin>>number;
    
    for(int multiplicationTables=1; multiplicationTables<10; multiplicationTables++) {
        std::cout<<number<<"x"<<multiplicationTables<<"="<<number*multiplicationTables<<std::endl;    
    }
    
    return 0;
}

 

 

문제 4 : 판매원들의 급여 계산 프로그램. 매달 급여는 50만원에 판매 물품의 가격에 판매원의 판매금액에서 12%를 추가 지급한다. 급여의 계산은 -1이 입력될 때까지 계속되어야 한다.

 

#include <iostream>

int main(void)
{
    int sellMoney, pay;
    
    while(sellMoney != -1) {
        std::cout<<"판매 금액을 만원 단위로 입력(-1 to end): ";
        std::cin>>sellMoney;
        
        if(sellMoney == -1) {
            std::cout<<"프로그램을 종료합니다"<<std::endl;
            //continue;
        } else {
            pay = 50 + (sellMoney*0.12);
            std::cout<<"이번 달 급여: "<<pay<<"만원"<<std::endl;      
        }
        
    }
    return 0;
}

 


 

개발하는데 키보드는 무접점 키보드를 추천한다
728x90
728x90

'C, C++ > 열혈 C++ 프로그래밍' 카테고리의 다른 글

02-1 챕터 02의 시작에 앞서  (0) 2021.08.19
01-5 이름공간  (0) 2021.08.19
01-4 인라인 함수  (0) 2021.08.18
01-3 매개변수의 디폴트 값  (0) 2021.08.18
01-2 함수 오버로딩  (0) 2021.08.18
블로그 이미지

coding-restaurant

코딩 맛집에 방문해주셔서 감사합니다.

,

[JS] map es5

Javascript 2021. 7. 20. 17:27
728x90
728x90

map은 콜백함수로 새 배열을 만들 때 사용

 

arr.map(callback(currentValue[, index[, array]])[, thisArg])

callback : 새로운 배열 요소를 생성 

인수
currentValue : 처리할 현재 요소

옵션
index : 처리할 현재 요소의 인덱스
array : map()을 호출한 배열


thisArg : callback을 실행할 때 this로 사용되는 값

 

문법은
arary.map(현재값, 인덱스, 배열, 디스배열?)

기능은
filter, forEach와 같다

 

예시는

<button type="button" id="click" onclick="render()">데이터 얻기</button>
<table id="tbl">
    <thead>
        <th>이름</th>
        <th>전화번호</th>
    </thead>
    <tbody></tbody>
</table>
// ajax를 통해 가져온 데이터라고 가정
var data = [
    {
        name: 'a',
        phone: '010-1000-2000'
    },
    {
        name: 'b',
        phone: '010-3000-4000'
    },
    {
        name: 'c',
        phone: '010-5000-6000'
    }
];

// Array.map 메서드를 사용하여 배열 요소의 데이터를 html로 변경
function makeDom() {
    var dom = data.map(function (item, index) {
        return '<tr><td>' + item.name + '</td><td>' + item.phone + '</td></tr>';
    });
    return dom;
}

// 배열을 하나의 값으로 만든 후 테이블에 html 추가
function addTbl(dom) {
    var tblList = dom.join('');
    document.getElementById('tbl').getElementsByTagName('tbody')[0].innerHTML = tblList;
}

// 위 로직을 실행
function render() {
    var list = makeDom();
    addTbl(list);
}

 

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/map

728x90
728x90
블로그 이미지

coding-restaurant

코딩 맛집에 방문해주셔서 감사합니다.

,
728x90
728x90

활용할 html 문서

<div class='source'>
  <div class='system' number='1'>
    1번
    <div class='system' number='2'>
      2번
      <div class='system' number='3'>
        3번
      </div>
      <div number='3-1'>
        3-1번
      </div>
    </div>
  </div>
  <div class='test'>
  test
  </div>
</div>

<div class='result'>
</div>

 

 

 

1 그냥 자식이 있으면 출력하는 코드

var data = $('.source');

findSystemLevel(data);

function findSystemLevel(data) {

  if (data.children.length) { // 자식태그가 있다면
    for (var i = 0; i < data.length.length; i++) {         
      findSystemLevel(data.length[i]);
    } 
  }
  
}

 

 

2 특정 클래스의 자식만 출력하는 코드

: 배열에 담아 출력

var test = findSystemLevel('system');

 function findSystemLevel(className) {
  let result = []; // 결과 요소를 담을 배열

  let body = document.body; // 최상위 element

  //리커젼 함수
  let recursion = function(element) {
    
    if (element.classList.contains(className)) { // element가 주어진 className을 담고 있는지 확인 후, true이면 result배열에 추가
    /* 	result.push("<div>" + element.textContent + "</div>"); */
       result.push(element); 
      //console.log(element.textContent);
    }

    if (element.children.length > 0) { // 자식 element가 있으면
      for (let i = 0; i < element.children.length; i++) { //for 문을 돌면서 리커젼을 통해 className 포함 여부를 확인
      console.log("들어감");
       if (element.classList.contains(className)) {
        recursion(element.children[i]);
        }
        
        
      }
    }

  }

  recursion(body);
  
  return result;

}
  
 $('.result').html(test);

 

728x90
728x90
블로그 이미지

coding-restaurant

코딩 맛집에 방문해주셔서 감사합니다.

,
728x90
728x90
* {
	padding: 0;
	margin: 0;
	max-width: 100%;
	overflow-x: hidden;
	position: relative;
	display: block;	
}
728x90
728x90
블로그 이미지

coding-restaurant

코딩 맛집에 방문해주셔서 감사합니다.

,
728x90
728x90

- 구상 : 문서 영역의 특정 텍스트를 드래그하여 선택한 뒤 '메모' 버튼을 눌러 '메모' 창을 실행 -> '메모'창 내부 form 영역에 선택된 텍스트 표시, 추가 데이터를 입력 후 저장하는 기능.
- '메모' 창이 실행되기 전 말고 후에도 텍스트를 드래그하면 위와 같이 진행되어야 함

 

마우스로 드래그한 텍스트 가져오기

function selectText() {
   var selectionText = ""; //마우스로 드래그한 글
                
   if (document.getSelection) {
       selectionText = document.getSelection();
   } else if (document.selection) {
       selectionText = document.selection.createRange().text;
   }
  return selectionText;
  }
Document.getSelection()
Window.getSelection()과 같으며 Selection 형의 객체를 반환

 

가져온 텍스트를 form 텍스트 란에 표시하기

document.onmouseup = function() {
                document.getElementById("console").innerHTML = selectText();
}

 

(드래그한 텍스트 내용을 저장)

// 각자 상황에 맞는 방법

 

드래그한 텍스트 내용을 하이라이트 하기

$(document).ready(function(){
	var strKey = '스트링'; // 하이라이트를 적용할 스트링
	if(strKey != ''){
		$('.line').highlight(strKey); //하이라이트 처리
	}
}); 

 

 

출처

https://gopae02.tistory.com/101

https://blog.taeseong.me/249

728x90
728x90
블로그 이미지

coding-restaurant

코딩 맛집에 방문해주셔서 감사합니다.

,
728x90
728x90

공통 규칙

  • 코드가 나오기 바로 전에 나와야 한다.
  • 코드 작성 전에 주석을 작성한다. (미루면 80% 이상은 안하게 되니까)
  • 기능 설명은 /** */, 임시는 /* ... */ , 코드 내의 짧은 주석은 //로 작성한다.

 

 

1. 함수

- 들어갈 내용 : 설명, 업데이트 날짜, 리턴값에 대한 설명, 함수 인자에 대한 설명

/** @brief 함수의 설명

*  @date 함수 업데이트 날짜

*  @return 리턴값에 대한설명

*  @param 함수의 인자 설명

*/

 

2. 메인페이지

- 들어갈 내용 : 메인페이지 제목, 간략한/상세한 설명

/**

*@mainpage 메인페이지 제목

*@brief 요약설명

*@details 자세한 설명

*/

 

3. 파일

- 들어갈 내용 : 파일명, 간략한/상세한 설명

/**

*@file NewClass.cpp

*@brief 간략

*@details 상세

*/

 

4. 패키지

- 들어갈 내용 : 네임스페이스, 간략한/상세한 설명

/**

*@namespace org.nhnnext

*@brief 간략

*@details 상세

*/

 

5. 클래스

- 들어갈 내용 : 간략한/상세한 설명, 만든 사람 정보와 날짜, 버전명, 하는 일

/**

*@brief 간략

*@details 상세

*@author Name, Name@tistory.com

*@date 2019-06-09

*@version 0.0.1

*/

class ClassName

{

   /* do nothing */

}

 

각각에 대한 예제

https://hubbleconstant.tistory.com/7

 

참고하면 좋을 링크

https://danpatpang.github.io/tip/2018/04/12/Tip_java_comment/

https://wgkang80.tistory.com/267

 

728x90
728x90
블로그 이미지

coding-restaurant

코딩 맛집에 방문해주셔서 감사합니다.

,
728x90
728x90

자바 jre 버전 확인 

1) cmd.exe에서 아래와 같이 입력

java -version

2) 자바 jre 버전 확인 결과

java version "1.8.0_291"
Java(TM) SE Runtime Environment (build 1.8.0_291-b10)
Java HotSpot(TM) 64-Bit Server VM (build 25.291-b10, mixed mode)

 

자바 jre 버전 변경

1) 다운그레이드 할 버전 exe 클릭하여 설치 진행

2) 시스템속성> 고급 > 환경변수 클릭하여 JAVA_HOME 변경

변수 이름 : JAVA_HOME
변수 값 : C:\Program Files\Java\jre1.8.0_161 (각자 경로)

C:\Program Files\Java\jre1.8.0_161

필요하다면 Path도 변경 

3) 제어판 > 프로그램 제거 또는 변경 에서 구 버전을 삭제

4) 자바 jre 버전 재확인

java -version
java version "1.8.0_161"
Java(TM) SE Runtime Environment (build 1.8.0_161-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.161-b12, mixed mode)
728x90
728x90
블로그 이미지

coding-restaurant

코딩 맛집에 방문해주셔서 감사합니다.

,
728x90
728x90
var testValue = 22;
var vWindow = window.open(vUrl);
vWindow.addEventListener("load", openNewTab(testValue, vWindow));

// 새창열기 - 팝업창 로드가 완료되면 실행
function openNewTab(testValue, vWindow) {
	var test = vWindow.document.body; // 팝업창의 html 전체

	if (test == null) {
		//alert("아직안됨");
	} else {
		//alert("로드됨");

		if (vWindow.cvCJSDocHandler) {
			vWindow.childFunction.testFunction(testValue); 
			vWindow.focus();
		} else setTimeout(function () {
			openNewTab(vRefID, vWindow);
		}, 500);
	}
}
<html>
<head>
	<script>
    	var childFunction = new CV_childFunction();
        
        function CJ_CJSDocHandler() {
		}		
		CJ_CJSDocHandler.prototype = {
        	testFunction: function(){
            	alert();
			}
        }
	</script>
</head>

<body>
test
</body>

</html>

 

728x90
728x90
블로그 이미지

coding-restaurant

코딩 맛집에 방문해주셔서 감사합니다.

,

c++ define 함수

2021. 5. 26. 08:26

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

728x90
728x90

Dark Glassmorphism UI


 

Concept Design by Mikołaj Gałęziowski
anton_olashyn
Hesam Mousavi for Flexi

 


Glassmorphism Generator


쉽게 글래스모피즘 CSS를 만들어주는 제너레이터. 아래 이미지를 클릭하면 이동.

https://glassmorphism.com/


etc. 


https://www.collectiveray.com/dark-websites


50 Beautifully Designed Black Websites


 

https://www.awwwards.com/50-beautifully-designed-black-websites.html

 

 

728x90
728x90
블로그 이미지

coding-restaurant

코딩 맛집에 방문해주셔서 감사합니다.

,
728x90
728x90

td에 text-align:center 로는 div 안의 내용물이 중앙정렬이 되지 않을 때 요거 추가...

 

<td><div style="margin:0 auto;">내용</div></td>

 

안될 때는 div를 inline-block으로 속성 추가..

 

※ 참고한 곳 : https://xetown.com/questions/1225991

728x90
728x90
블로그 이미지

coding-restaurant

코딩 맛집에 방문해주셔서 감사합니다.

,

v