class Program{
    static void Main(string [] args){
    }
}

c# 프로그램 실행시 가장 먼저 실행되는 메소드

메소드의 이름은 반드시 Main이어야 한다

정적메소드여야 한다.

매개변수 : string 배열 or 없음

반환값 : void or int

class Program{
    static int Main(){
    	Console.WriteLine("실행");
        return 0;
    }
}

 

'프로그래밍 > C#' 카테고리의 다른 글

as, is 연산자  (0) 2020.03.20
객체지향 - 3  (0) 2020.03.20
객체지향 -2  (0) 2020.03.20
객체지향-1  (0) 2020.03.19
break, continue, goto  (0) 2020.03.19

WRITTEN BY
beautifulhill

,

객체지향-1

프로그래밍/C# 2020. 3. 19. 18:00

객체지향프로그래밍이란?

   상태와 행위로 이루어진 객체라는 단위로 파악하고자 하는 프로그래밍 패러다임이다. 

 

객체의 구성요소

   속성(멤버변수) + 기능/행위(메소드)

 

클래스

   속성과 행위를 변수와 메소드로 정의한 것을 클래스라고 한다.

 

인스턴스(객체)

   클래스로 정의된 타입을 new 연산자로 메모리에 할당한 것을 인스턴스라고 한다.

 

추상화

   데이터를 속성으로, 코드를 메소드로 정의한 것을 추상화라고 한다.

 

생성자

   객체가 생성될때 자동으로 호출되는 메소드

 

종료자

   객체가 제거되는 시점에 실행되는 메소드

class Album
{
    public album(){/*생성자*/
    	Console.WriteLine("생성자");
    }
    ~album(){
    	Console.WriteLine("종료자");
    }
}

 

인스턴스 멤버 

   new연산자를 거쳐 메모리에 할당된 객체에 속한 멤버

   개별 인스턴스 내에서만 유효

   스택에는 인스턴스 필드, 힙에는 값이 할당

 

정적 멤버

   모든 객체가 공유하는 멤버, 전역적으로 적용될 필드, 메소드, 생성자

   static으로 선언

   인스턴스를 만들지 않고(new연산자 사용안하고도) 바로 접근 가능

 

인스턴스 필드 예시

class Test{
    static void Main(string[] args){
    	Album a1 = new Album();
    	Album a2 = new Album();
    	Album a3 = new Album();  
    }
}
class Album{
    public int numb;
    public string singer;
    public string album_name;
    
    public Album(){
    	numb++;
       	Console.WriteLine(numb);
    }
}

 

정적필드 예시

class Test{
    static void Main(string[] args){
    	Album a1 = new Album();
    	Album a2 = new Album();
    	Album a3 = new Album();  
    }
}
class Album{
    static public int numb; //정적필드
    public string singer;
    public string album_name;
    
    public Album(){
    	numb++;
       	Console.WriteLine(numb);
    }
}

 

정적필드는 인스턴스를 만들지 않고도 접근 가능 ([클래스명].[정적필드])

class Test{
    static void Main(string[] args){
    	Album a1 = new Album();
    	Album a2 = new Album();
    	Album a3 = new Album();  
        Console.WriteLine(Album.numb);
    }
}
class Album{
    static public int numb; //정적필드
    public string singer;
    public string album_name;
    
    public Album(){
    	numb++;
    }
}

 

싱글톤 패턴

   인스턴스가 최초 한번만 메모리에 할당되어 전역적으로 접근 가능하도록 하는 디자인패턴

   메모리 낭비 방지

 

 

싱글톤 클래스 예제 (생성자가 단 한번만 실행되기 때문에 numb의 값이 한번만 증가함)

class Test{
    static void Main(string[] args){
    	Album.album.Count();
    }
}
class Album{
    static public Album album = new Album();
    private int numb;
    private string singer;
    private string album_name;
    private Album(){
    	numb++;
    }
    public void Count(){
    	Console.WriteLine(numb);
    }
}

 

정적메소드

   static 예약어가 붙은 메소드

   정적메소드 안에서는 인스턴스 멤버에 접근이 불가능하다.(new로 할당된 객체가 없기 때문)

class Album{
    private int numb;
    private string singer;
    private string album_name;
    private Album(){
    	numb++;
    }
    static public void Count(){
    	Console.WriteLine(numb);
        //에러 : 정적메소드에서 인스턴스 멤버에 접근 불가
    }
}
class Album{
    static private int numb;
    private string singer;
    private string album_name;
    private Album(){
    	numb++;
    }
    static public void Count(){
    	Console.WriteLine(numb);
        //정적메소드에서 정적필드 접근 가능
    }
}

 

Console.WriteLine

   Console 클래스에 정의된 WriteLine 정적 메소드

 

 

정적 생성자 type initializer

   static 예약어를 붙임

   클래스에 단 한개만 존재할 수 있음

   정적 데이터를 초기화하거나 한 번만 수행하는 작업 시 사용

   처음 인스턴스가 생성될 때 OR 정적 멤버가 참조되기 전에 자동으로 호출

 

정적필드를 참조할 때 정적 생성자 호출

class Test{
    static void Main(string[] args){
    	int numb = Album.numb;
    }
}
class Album{
    static public int numb;
    private string singer;
    private string album_name;
    public Album(){
    	numb++;
    	Console.WriteLine("생성자");
    }
    static Album(){
    	Console.WriteLine("정적생성자");
    }
}

 

 

인스턴스가 생성될 때 정적생성자 호출 

    정적생성자는 처음 한번만 호출된다.

class Test{
    static void Main(string[] args){
    	Album album1 = new Album();
    	Album album2 = new Album();
    	Album album3 = new Album();
    	int numb = Album.numb;
    }
}
class Album{
    static public int numb;
    private string singer;
    private string album_name;
    public Album(){
    	numb++;
    	Console.WriteLine("생성자");
    }
    static Album(){
    	Console.WriteLine("정적생성자");
    }
}

 

 

네임스페이스

   이름이 똑같은 클래스를 사용할 때 사용

   클래스의 소속을 구분할 때 사용

   using 예약어를 사용하여 네임스페이스를 생략할 수 있음

 

   단 using 예약어는 파일 첫 부분에 있어야함

 

using 사용 안할때

using System;
namespace Example
{
    class Program
    {
        static void Main(string [] args)
        {
            Product.Album album1 = new Product.Album();         
        }
    }   
}
namespace Product{
    class Album
    {        
    }
}

 

using 사용할 때

using System;
using Product;
namespace Example
{
    class Program
    {
        static void Main(string [] args)
        {
            Album album1 = new Album();            
        }
    }   
}
namespace Product{
    class Album
    {        
    }
}

 

using System

   Console 클래스가 System이라는 namespace 내부에 정의됨

   Consel.WriteLine = System.Console.WriteLine

   네임스페이스 : System

   클래스         : Console

   정적메소드   : WriteLine

'프로그래밍 > C#' 카테고리의 다른 글

as, is 연산자  (0) 2020.03.20
객체지향 - 3  (0) 2020.03.20
객체지향 -2  (0) 2020.03.20
Main 함수를 알아보자  (0) 2020.03.20
break, continue, goto  (0) 2020.03.19

WRITTEN BY
beautifulhill

,

break

반복문 내에서 반복문을 빠져나올 때 사용

단, switch와 같이 사용될 경우 해당 case문을 빠져나옴

int i = 10;
while( i > 0){
	if(i < 8){
		Console.WriteLine(i + "가 되면 반복문을 빠져나온다.");
        break;
    }
    i--;
}

출력 : " 7가 되면 반복문을 빠져나온다."

 

continue

밑의 구문을 건너뛰고 반복문으로 돌아감

int i = 10;
while( i > 0){
	if(i < 8){
		Console.WriteLine(i + "미만이면 i--를 실행하지 않고 반복문 처음으로 돌아간다.");
        continue;
    }
    i--;
}

 

출력 ; '7 미만이면 i--를 실행하지 않고 반복문 처음으로 돌아간다.'가 무한 출력된다.

 

goto

어디서든 사용가능한 반복문

가독성때문에 중첩 루프 탈출에만 사용

 

일반 중첩 루프 탈출

bool isstop = false;
for(int i = 0; i < 10; i++)
{
	for (int j = 0; j < 10; j++)
	{
    	if (i > 5 && j > 7) {
    	isstop = true;
    	break;
    }
	if (i > j)
		Console.Write(' ');
	else
		Console.Write('*');
	}
	if (isstop)
		break;
	Console.Write('\n');
}
Console.WriteLine("끝");

goto 중첩 루프 탈출

for (int i = 0; i < 10; i++)
{
	for (int j = 0; j < 10; j++)
	{
    	if (i > 5 && j > 7)
        	goto LOOP_EXIT;
        if (i > j)
        	Console.Write(' ');
    	else
        	Console.Write('*');
	}
	Console.Write('\n');
}
LOOP_EXIT: ;

Console.WriteLine("끝");

결과는 다음과 같이 나온다

'프로그래밍 > C#' 카테고리의 다른 글

as, is 연산자  (0) 2020.03.20
객체지향 - 3  (0) 2020.03.20
객체지향 -2  (0) 2020.03.20
Main 함수를 알아보자  (0) 2020.03.20
객체지향-1  (0) 2020.03.19

WRITTEN BY
beautifulhill

,

wkhtmltopdf는 html 페이지를 pdf로 다운받을 수 있는 프로그램이다.

 

 

1. OS에 맞게 다운로드한다.

https://wkhtmltopdf.org/downloads.html

 

wkhtmltopdf

All downloads are currently hosted via Github releases, so you can browse for a specific download or use the links below. Stable The current stable series is 0.12.5, which was released on June 11, 2018 – see changes since 0.12.4. OS Flavor Downloads Commen

wkhtmltopdf.org

 

2. 다운로드 후 적당한 위치에 압축을 푼다.

 

3. 윈도우의 경우 cmd 창에서

 

cd wkhtmltopdf위치\bin

wkhtmltopdf "다운로드 받고자 하는 페이지" "pdf 다운받을 위치"

 

 

 

4. 다운로드 됨

 

*참고

wkhtmltopdf -h 

를 작성하면 여러 옵션들이 나온다.


WRITTEN BY
beautifulhill

,

php, html 코드로 되어있는 페이지를 pdf로 변환하고자 한다.

이미 html코드로 페이지가 되어있는 상태라 최대한 적게 수정하는 방향으로 알아봤다.

 

1. fpdf

http://www.fpdf.org/

 

FPDF

 

www.fpdf.org

<?php
require('fpdf.php');

$pdf = new FPDF();
$pdf->AddPage();
$pdf->SetFont('Arial','B',16);
$pdf->Cell(40,10,'Hello World!');
$pdf->Output();
?>

사이트에 가면 여러 예제가 나와있으나, 코드를 대폭 수정해야한다.

 

2. tcpdf

https://tcpdf.org/

-tcpdf의 경우 fpdf보다 기존의 코드를 살릴 수 있었다.

-예제도 더 자세하고 많이 나온다.

-float padding 이 안먹힌다.

-기존의 페이지와 다르게 나오는 부분이 많아 결국 전체 수정을 해야할 판..

 

 

 

3. html2pdf

https://github.com/spipu/html2pdf

 

-이런 라이브러리를 간절히 찾고있었다!

-한글이 안된다

 

 

 


4. html2canvas, jspdf

 

-html2canvas로 html객체를 이미지로 변환 jspdf로 pdf를 생성하는 방식

-원하는 곳에서 페이지를 나눌 수 있고

-기존의 페이지와 가장 유사하게 나온다.

-화질의 문제가 발생한다.

-마치 그림판으로 늘려놓은 느낌의 글자와 이미지 화질....

-화면 크기에 따라 다른 결과가 나옴

-pdf 변환이 다 되기 전에 스크롤로 아래페이지로 가버리면 윗 페이지들이 안나오거나 오류가 발생함

-좀 더 고민해서 사용하면 유용할 것 같다.

 

 

5. wkhtmltopdf

https://wkhtmltopdf.org/

-html2canvas, jspdf를 사용하는 것과 같은 결과가 나온다.

-해당 페이지를 캡처하여 pdf로 변환하는 것과 같은 효과

-화질이 깨지지 않음

-5개 중 가장 간단하고 빠름

-php의 경우 exec로 바로 실행된다.

- https://beautifulhill.tistory.com/3

 


WRITTEN BY
beautifulhill

,

스킬서버를 구축하여 카카오톡 챗봇을 사용하면 더 자유롭게 사용할 수 있다.

php로 아주 간단히 simpletext로 응답을 보내는 방법을 설명하겠다.

 

1. 블록 수정

 

2. 응답 예시

- 응답은 다음과 같은 json 형태로 올 것이다.

3. 코드

~~/kakaochat/index.php

<?
$json_data = file_get_contents("php://input"); 
$obj_json = json_decode($json_data);
$singer = $obj_json->action->detailParams->singer->value;
$num_album = $obj_json->action->detailParams->num_album->origin;


$text = '주문확인 : '.$singer.'의 '.$num_album.'을 주문하셨습니다.';
$jayParsedAry = [
	"version" => "2.0", 
	"template" => [
		"outputs" => [
			[
				"simpleText" => [
					"text" => $text
				]
			]
		]
	]
];

echo json_encode($jayParsedAry,JSON_UNESCAPED_UNICODE);
?>

 

 

4. 카카오톡 챗봇 > 스킬 > 스킬 명 및 스킬서버 URL 입력 

 

 

5. 예시

 


WRITTEN BY
beautifulhill

,

스킬서버 없이 간단한 카카오톡 챗봇을 만들 수 있다.

다른 것들은 매뉴얼에 잘 나와 있어 쉽게 따라했지만 되묻기, 컨텍스트의 경우 헷갈렸다.

그래서 그에 대해 정리하고자한다.

 

1. 되묻기

 

 

 

 

 

 

2. 컨텍스트

 

 

주는 블록

 

 

받는 블록

 

 

테스트

 


WRITTEN BY
beautifulhill

,

1. 엔티티

  • 봇이 이해할 수 있는 단어 사전, 데이터 사전
  • 동의어 설정 가능 => 오타가 있거나 띄어쓰기가 달라도 제대로 답변을 보여줄 수 있다.
  • 구조 : [엔티티명], [대표 엔트리], [동의어]
    • ex) [대학교], [서울대학교], [서울 대학교, 서울대, 관악대]
  • 종류 : 나의 엔티티, 시스템 엔티티
  • 나의 엔티티 : 사용자 정의 엔티티

2. 시나리오

  • 서비스 단위, 블록의 그룹
  • 시나리오 단위로 다수의 블록들을 원하는 서비스 별로 그룹핑하여 체계적으로 관리
  • 기본 시나리오 : 웰컴블록, 폴백블록(사용자의 의도를 파악 못 했을 때), 탈출블록
  • 커스텀시나리오 : 사용자 정의 시나리오
    • ex) 회사소개, 자주하는 질문이 각각의 시나리오
    • 회사소개 : 위치 소개, 회사 제품 소개가 각각의 블록 
  • 시나리오설정
    • 되묻기 질문 설정 가능
    • 봇 제네릭 메뉴 : 하단의 슬라이드 메뉴 형태로 존재하는 사용자 인터페이스
    • 스마트 채팅과 유사

3. 블록

  • 사용자 의도의 기본단위, 인덴트
  • 웰컴블록 : 사용자가 봇을 처음 사용할 때 받게되는 웰컴메시지를 설정하는 블록
  • 폴백 블록 : 사용자의 발화 의도가 어떠한 블록과도 매칭이 되지 않을 때 (=봇이 사용자의 발화 의도를 이해하지 못할 때)
  • 탈출 블록: 봇의 되묻기 상황에서 사용자가 대화를 초기화하거나 탈출하고 싶을때 쓰는 사용자 명령어를 정의하는 블록
  • 블록안에는 사용자 예상 발화, 그리고 봇이 수행할 액션과 응답할 내용이 설계

4. 컨텍스트

  • 컨텍스트는 서로 다른 블록 간 ‘연결고리’를 만들고 싶을 때 사용
  • 컨텍스트에 필요한 구성값 : 인풋, 아웃풋, 컨택스트 수명(lifespan), 유효기간(TTL)
  • Input context : 다른 블록에서 내보낸 컨텍스트 받을 때
  • Output context : 다른 블록으로 컨텍스트 내보낼때

5. 스킬

    • 스킬은 임의의 API를 연결하여 봇이 이를 이용할 수 있게 함

4. 컨텍스트

    • 플러그인에 스킬 적용할 수 있음
    • 스킬서버를 구축해야 사용 가능
    • 바코드(QR코드)를 보낼 수 있는 바코드플러그인
    • 날짜/시간 플러그인
    • 프로필, 회원가입, 이미지보안전송, 현위치 전송 플러그인 등

WRITTEN BY
beautifulhill

,