반응형

오랜만의 포스팅을 싱글톤으로 하게 되었네요.

 

 

일단 제 기준으로 유니티에서 사용하기 편하고 관리하기 쉬운 방법의 싱글톤 예제를 가지고 왔습니다.

 

싱글톤의 역할

싱글톤은 프로그래밍 디자인 패턴 중 추상 객체 인스턴스 생성 패턴 중의 하나로

유니티에서 싱글톤의 역할은

 

1. 게임 시스템에서 전체를 관장하는 스크립트(단일 시스템 자원 관리 차원)

2. 게임 시스템상 전역 변수의 역할을 하는 스크립트

3. 씬 로드시 데이터가 파괴되지 않고 유지

4. 여러 오브젝트가 접근을 해야 하는 스크립트의 역할

5. 단 한개의 객체만 존재(게임 전체를 관장하는 스크립트가 둘 이상 있으면 꼬이겠죠?)

 

등등 많겠지만 결론은 다 같은 말이죠? 네 이 모든 역할을 할 수 있는게 Singleton Pattern입니다.

 

 

아마 새로운 씬을 로드를 하게 되면 앞에 있던 변수들은 전부 파괴되고 새로운 씬이 로드가 될 거예요.

하지만 싱글톤은 씬 이동시 자신을 파괴하지 않으면서 자신이 가진 데이터들 또한 함께 유지한답니다.

 

실습 예제 및 스크립트

씬이 이동되면서 내 골드의 정보가 초기화 되는 것을 알 수 있습니다.

 

위 그림과 같은 경우로

유니티 내에서 씬과 씬 사이를 넘어갈 때 앞의 씬에서 데이터를 받아와서 다음 씬에서 받고 싶을 때 사용할 수 있어요.

 

그럼 MyGold 가 씬이 이동이 되어도 계속해서 유지할 수 있는 방법을 알아볼게요

 

저는 우선 "GameManager"라는 이름의 스크립트를 만들었습니다.

많은 사람들이 GameManager라는 이름으로 스크립트를 사용 하다보니 유니티에서 아이콘을 바꿔주네요.

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GameManager : MonoBehaviour
{
    /* // 싱글톤 //
     * instance라는 변수를 static으로 선언을 하여 다른 오브젝트 안의 스크립트에서도 instance를 불러올 수 있게 합니다 
     */
    public static GameManager instance = null; 

    private void Awake()
    {
        if (instance == null) //instance가 null. 즉, 시스템상에 존재하고 있지 않을때
        {
            instance = this; //내자신을 instance로 넣어줍니다.
            DontDestroyOnLoad(gameObject); //OnLoad(씬이 로드 되었을때) 자신을 파괴하지 않고 유지
        }
        else
        {
            if (instance != this) //instance가 내가 아니라면 이미 instance가 하나 존재하고 있다는 의미
                Destroy(this.gameObject); //둘 이상 존재하면 안되는 객체이니 방금 AWake된 자신을 삭제
        }
    }

    //게임 내에서 씬이동시 유지하고 픈 골드 값(변수)
    public int myGold = 0;
}

 위와 같이 스크립트를 짜주시고, 각 씬의 하이라키창에 빈 오브젝트(Empty Object)를 생성해줍니다.

 

이러면 준비 끝!

이제 어디서든

GameManager.instance.(변수 혹은 함수명)

으로 불러 줄 수 가 있게 되었습니다!

 

지금 의 예제로는

GameManager.instance.myGold 라고 불러 줄 수 가 있겠네요.

 

그럼 Main 씬에서 '돈 벌기' 버튼을 눌렀을때 아래가 작동이 되는 스크립트를 만들어주고,

GameManager.instance.myGold += 2;

씬을 이동(상점) 후, 아이템 구매마다 해당하는 가격만큼 myGold가 줄어들게 설정을 하고 테스트를 해보면..

GameManager.instance.myGold -= (아이템가격);

 

씬 이동을 했음에도 'GameManager'가 파괴되지 않아, 'MyGold' 변수 값이 유지가 되는 모습 
플레이 중에 하이라키에서도 씬 이동이 계속 되어짐에도 GameObject(GameManager Componenet가 들어있는)가 지워지지 않고 유지되고 있다.

주의할 점

쉽게 사용이 가능하다보니 되나 가나 모든 데이터,

객체 등을 이곳에 마구잡이로 때려 넣으면 안 된다는 것!!

 

접근이 쉽다보니 막 갖다쓰다보면 비대칭적인 크기로 게임이 만들어지게되고,

나중에 다시 재정리 하려면 이미 꼬일대로 꼬인 상황이 올거에요.

장담합니다 막 갖다쓰다보면 봅니다.

반응형
반응형

안녕하세요 무꼬입니다~


프로그래밍에서 제일 중요한 구문 대표적인걸 꼽으라고 한다면


바로 딱 떠오르는게 조건문반복문입니다. (사실 전부다 중요하죠 ㄲㄲ)


어떤 언어(C,JAVA등)에서든 쓰이고,


조건문의 경우는 이전 강의에서 예제를 보면서 진행을 했고,


이번 강의에서는 반복문의 기본에 대해서 알려드리고자합니다.


조건문은 대표적인게 IF문이 있죠. (그 외 응용을 해서 사용가능한 조건문도 있습니다.)

짚고 넘어가자면 조건문은 '만약에' 라는 조건에 충족되면 IF~end IF 사이에 있는 명령을 수행합니다.

Else문이 추가가 된다면 '만약에'라는 조건이 충족되지 않았을때 Else~end IF 사이에 있는 명령을 수행하죠.


그럼 반복문이라 하면,

말 그대로 반복을 하는 것입니다.


반복문은 대표적이라 할 것 없이 

Do...Loop

For

While 문 등이 있습니다.


반복문은 좀 많네요?


그 이유는 적재적소에 따라 다른 반복문을 사용해야 할 필요가 있단 뜻이지요.

하지만 모든 반복문은 메커니즘은 같다는 것.!


For 문은 조건식이 도달할때까지 반복을 하는 반복문입니다.


기본 식을 한번 보실까요


For i=1 to 10

(반복될 내용)

Next i


자, 기본 For문입니다.

하나씩 스토리텔링 형식으로 얘기해볼게요


'i'라는 아주 성실한 정수형 변수가 있었습니다.

그런데 이 i 라는 녀석이 야망이 커서

자기가 가지고 있는 1원이 10원이 되길 원해요. (초기값 i=1 to 10)

그 i라는 녀석이 1원을 가지고 일을하기 시작했어요. (반복될 내용)

그는 일을 한번 하고 1원을 벌었어요.

그리고 또 다시 반복해서 (반복될 내용 두번째)

2원을 벌었고,

또 일을해서 3원을 벌었어요 (반복될 내용 세번째)

그렇게 10원까지 10번의 반복을 거쳐

10원을 벌었습니다!


변수 'i'의 입장에서 본 For 반복문 스토리텔링입니다^^


하지만 사실상 프로그래머 입장에서는 i 입장보다는 반복될 내용이 중요하죠.

이해하기 쉬우시라고 이렇게 써봤습니다.


자, 아무튼 그렇게 10번 반복을 했습니다!

이해하기 쉽게써서 간단 하죠?


자, 그러면 반복문을 배울때 항상 하는 구구단 만들기를 해볼게요!


기본 폼입니다.


그리고 sub Form_Load. 폼이 로드되었을때 실행될 명령어를 입력해볼게요.



레이블1의 캡션에  "2 곱하기 " & i & "는" & (2 * i)

이걸 감으로 이해 하셨을 수도 있고,

모르실 분도 계셔서 잠깐 설명드릴게요.


"2 곱하기" 이부분은 그냥 문자열 그대로 표현을 해준거죠! 다들 아시리라 믿고,

뒷 부분

& i & "는" & (2 * i)

이건 뭐라고 해석을 해야 되냐하면


'&' 연산자의 경우 변수와 변수사이(문자열과 문자열사이 혹은 변수와 문자열사이)를

이어주는 역할을 합니다.


그리고 괄호 부분의 (2 * i) 내용은

2 × i값을 하라는 뜻입니다.

수식 내용 그대로를 계산을 하는 것이죠.


그럼 i값이 1일 경우 (2 * i)의 값은? 2가 되겠죠?

그럼 i값이 9일 경우 (2 * i)의 값은? 18이 되겠죠?

괄호안의 변수의 내용에 따라 출력되는 값이 달라진다는 말씀!

그럼 만약 i 값이 3일 경우 전체적으로 출력될 문자열은?

2 곱하기 3는 6

이라는 문자열이 출력되겠죠.

결국 Label1.Caption = "2 곱하기 3는 6"

이렇게 나온다는 것입니다~!


그럼 실행을 해볼까요?

아마 실행 되자마자 Form_Load서브가 실행되어서 값이 출력 될거에요.


어라? 근데 뭔가 이상하죠?


왜 2곱하기 9만 나왔을까요?



그 이유는 For문이 10번 돌면서

Label1.Caption 값을 계속 10번 바꿨을 테죠.

그리고 마지막 9번째에는

Label1.Caption = "2 곱하기 9는18"

이라는 것을 출력했을테고...


그럼 Label1.caption에

2 곱하기 1는 2

2 곱하기 2는 4

2 곱하기 3는 6

2 곱하기 4는 8

.....

...

2 곱하기 9는 18


이렇게 나오게 할 수는 없을까요?



물론 있습니다!

아래 와 같이 코딩을 하면 되지요~!


Label1.caption = Label1.caption & "2 곱하기 " & i & "는" & (2 * i)

뭐가 좀더 추가 되었죠?

Label1.caption 값 안에 Label1.caption 자기자신이 가지는 값 그리고 "2 곱하기 " & i & "는" & (2 * i) 를 출력하라

라고 코딩을 했습니다.


그럼 이대로 실행해볼까요?

아마

2 곱하기 1는 22 곱하기 2는 42 곱하기 3는 6....

이렇게 한줄로 죽~~~~ 나올거에요...ㄷㄷㄷ

이게 뭐야..알아보기 힘들잖아..




그럼 뭔가 엔터를 칠 수 있는 인자가 있다면 좋겠죠.


이걸 개행문자라고 합니다.

키보드의 엔터키가 있죠

이 엔터키가 줄바꿈을 하는게 아니라

사실 어떤 문자를 입력합니다.

그게 바로 개행문자 이지요!


나중에 배울텐데 Ascii(아스키코드)로는 13번에 해당합니다.

그걸 컴퓨터가 알아먹게 바꿔주면

chr(13)

chr 이라는 함수(기능)인데요.

이건 컴퓨터 내에 등록되어서 숫자로 순번이 매겨져 있는 문자를 표시하게 하는 함수입니다.

13번째에 등록된 문자는 바로 엔터키를 쳤을때 입력되는 개행문자입니다!

그럼 chr(13) 이 코드를 Label1.Caption이 출력될 값이 끼워 넣어주면 되겠지요?



이렇게요.


Chr() 함수는 타 언어도 모두 통용되니까 이렇게 알려드렸구요

사실 비주얼 베이직에서는 개행문자를 출력하는 함수가 많아요.





 Chr(13) 과 같은 기능을 하는 함수

 vbNewLine

 vbCrlf

그럼 이렇게도 바꿀수 있다는 얘기겠죠



vbcrlf 를 사용해서 개행하기


vbNewLine 을 사용해서 개행하기



자 그럼 실행 해볼게요~


짜잔~ 제대로 나온게 보입니다~


이제 For문에 대해서 아셨으니까

나머지 반복문들도 쉽게 하실 수 있으세요.


마지막으로 Do..Loop문을 한번 볼까요?

For문은 해당 조건식에 맞으면 밖으로 빠져나오게 되어 있는 구조이죠.

하지만 Do Loop 문은 빠져 나갈 수가 없어요.


예를 들어


Do

msgbox "안녕?"

Loop

이라는 코딩을 했다면

메세지 박스로



이 메세지가 무한으로 루프되겠죠...



그래서 보통 Do Loop 문은 IF문을 함께 씁니다.

Do

   i=i+1


      If i >= 10 then 'i 값이 10 이상일때

         exit do 'Do 구문을 빠져나와라

      end if

Loop

이렇게 사용할 수가 있습니다.

해당 조건이 되면 DO 구문을 빠져나와라.



이해하셨죠?

그럼 오늘도 어김없이 퀴즈 나갑니다~

해답이 궁금하신분들은 댓글 달아주세요


오늘은 Do Loop문을 이용해서

구구단을 만들어 봅시다.

단 폼형식은



텍스트박스 하나, 커맨드버튼 하나, 레이블하나

이렇게 해서 텍스트박스에 숫자를 입력하고 커맨드버튼을 클릭하면,




이렇게 결과물이 나오게 해봅시다!

단 Do..Loop문으로 해결해야 합니다.






그리고 참고적으로

연산자라고 하는게 있는데 알아두세요


연산자

 설명

예제 

 +, -

더하기, 빼기 

 3+ 5

 *, /

곱하기, 나누기 

 3* 6

 mod

나머지

 3mod2  → 1

 &

변수와 변수 사이 연결

 3 & 32

 And

조건 A 와 B가 둘다 참일 경우 

 a=1 And b=2    a가 1이고 b가 2가 맞다면 True 아니면 False

 OR

조건 A 와 B가 둘 중 하나만 참일 경우 

 a=1 OR b=2   → a가 1이거나 b가 2 둘중 하나가 맞다면 True 아니면 False

 >, <

비교구문 

 비교 할때 보다 값이 미만일때 초과일때  A < 13  'A가 13미만일때

 >=, <=

비교구문 

이상일때 이하일때  A <= 13 'A가 13보다 이하일때

 <>

비교구문 

C 언어에서는 != 라고 표현하죠.

양쪽의 값이 일치하지 않을때   A <> 13 'A가 13이 아닐때


반응형
반응형

오늘은 변수의 심층 이해를 돕는 강좌를 시작하겠습니다.


변수에는 전역변수(Global)와 지역변수(Local)가 있습니다.


사전적의미로 단어로만 보시면


Global 글로벌~ 세계적인; 지구의, 전반적인

Local 로컬~ 지역의


자, 그럼 지역안에서만 쓰는 변수가 지역변수고,

지역과 지역간에도 모두 소통되는 변수가 전역변수라는걸 대강 감이 오시죠?


그렇다면, 지역 변수와

전역변수는 어떻게 규정 되느냐.


비주얼 베이직내에서는

각각의 서브가 있죠?


이 서브들을 하나의 마을이라고 생각해보세요.

그럼 각각

Command1_Click 이란 마을

Command2_Click 이라는 마을

form_Load 라는 마을

Label1_Click 이라는 마을


하지만 이 비주얼베이직 세상에서는 사람이 아니라 '변수'라는 동물이 살고 있어요.

그 마을들 중에

Command1_Click 이라는 마을에

각각 이름 아래와 같은 이름을 가진 변수가 태어났어요 (변수 선언)

Dim Temp_Str As String

Dim Temp_Int As Integer



각각 변수 이름과 각각 개개인이 해야될 역할을 전부 입력해주었죠?


그럼 이 변수라는 동물들이 활동을 하기 시작합니다~!

그런데 변수라는 녀석들은 멍청해서 마을 밖으로 절대 나가려고 하질 않아요.

그러다보니

다른 마을에서는 Temp_Str이라는 녀석과 Temp_Int라는 녀석의 존재를 절대 모르죠.

오로지 Command1_Click 이라는 마을에서만 이 두녀석의 존재를 안다는 것이죠.


이게 바로 지역 변수입니다.


다른 마을에서 관여를 할 수도 없고, 다른 마을로 이전 할 수도 없는 녀석이 지역변수!

오로지 그 마을(Sub)에서만 쓰이고,

그 마을(Sub)가 종료 되면 같이 산화 되어버리죠(값 초기화).


그러면 코딩으로 설명 하면 어떻게 될지 볼까요?



그럼 해당 폼을 실행을 해보면?


우선 Command1 (A확인)을 누르면



Dim Temp_Str As String

Dim Temp_Int As Integer

Temp_Str = "안녕하세요 저는 지역변수입니다."

Temp_Int = "1234"

이녀석들이 실행 되겠죠?

그럼 변수도 선언되었고, 각 변수에 값도 들어가있는 상황입니다.


그다음에 Command2 (B확인)을 누르면


 Label1.Caption = Temp_Str

이 명령이 실행 되겠죠?


그러면, 예상되는 값은

label1의 Caption 값이 "안녕하세요 저는 지역변수입니다." 가 나와야 겠죠?


하지만 결과는 아무것도 없는 ""가 뜹니다. 비어있는게 뜨죠.



이유는 아까 말씀드렸다 시피,


서브안에서 선언이 된 변수는 서브가 종료되면('End Sub') 산화되어 없어집니다.

다른 서브에서 관여 할 수가 없는거죠.




한번더 보강해서 설명을 하자면

상위 계층에서 선언된 변수는 그 하위 계층에서도 사용이 가능합니다.(물론 서브가 종료되기 전까지.)

Form1에서 선언된 지역변수는 Form2에서는 사용이 불가능합니다.

즉, 같은 계층을 포함한 하위 계층에서 선언된 변수는 다른데에서 사용을 할 수 없습니다.


어렵나요?


그럼 마을을 예로 설명드리면


나라에서 만든 법은 각각 도, 시, 마을들에게 전파되어 법으로 인정받고 사용이 가능하지요?

그럼 '도'안에서 만들어진 법은 '시', '동', 마을에 전파되어 사용을 할 수 있습니다.

그럼 마을에서 만들어진 법은 나라 전체에 통용이 될까요?

안되죠.

우물 안에서만 쓰는 법(변수)라는 말입니다.


전체적으로 통용이 되려면 전역변수로 선언을 하든지,

아니면 최상위 계층에서 선언을 하게되면 모든 서브에서 사용이 가능하게 됩니다!


이해 하셨나요?


자, 그럼 한번에 전역 변수와 지역변수에 대해 설명을 드렸죠?


그럼 위 코딩에서 제대로된 코딩을 하려면 폼자체가 Command1과 Command2보다 높은 상위계층이니까

아래 처럼 코딩을 하면 제대로 되겠죠



한번 테스트 해보세요~!


그리고 이번 강의에서는 문제를 하나 내겠습니다.


아, 그전에

'Msgbox' 라는 함수가 있는데,

간단하게 이번강의에서 사용방법만 설명하자면


Msgbox ("메세지내용입력")

이렇게 입력하시고 실행해보시면


폼이 로드될때 메세지창이 이렇게 뜹니다.


물론 Command1_Click 서브에 넣게 되면

커맨드버튼1을 클릭했을때 위 메세지가 뜨겠지요?


그럼 문제입니다.



텍스트 박스를 하나와

커맨드 버튼 하나를 만드세요


그 다음에 텍스트 박스에 숫자를 입력하고 커맨드 버튼을 누르면

메세지박스에 해당 텍스트 박스에 입력되었던 문자열이 출력되게 해보세요!

반응형
반응형

참고용입니다~


문제 내기 프로그램입니다!


IF문과 변수를 어떻게 쉽게 이해하고, 응용 할지에 대해 생각하다가 글을 싸지르네요 ㅋㅋ


우선 폼 형태 입니다.

이렇게 바꿔 주시고...

코딩창!




솔직히 어느정도 숙련이 되셨거나 프로그래밍으로 밥벌이하시는 분들입장에서는

정말 비효율적인 코딩이죠 ㅎㅎ

하지만 초심자들을 위해 무식한 방법으로 코딩 해봤어요



최소한으로 줄인다면 커맨드버튼을 배열로 설정하고, 코딩을 하면 아래와 같겠죠.


하지만 저렇게 하면 아직 모르시는 분들이 더많으니..차차 알려드릴게요.

두개를 비교하면서 깨우치면 당신은 천재.





반응형
반응형

2강으로 돌아왔습니다~


1강에서 계속 사용하셨던 비주얼 베이직 파일을 가지고 계시죠?




이거요 ㅋㅋ

지우세요 이제 필요없어요 ㅋㅋ



오늘 할 것은


텍스트 박스에 있는 글을 변수에 집어 넣고,

그 변수의 값이 컴퓨터가 원하는 값과 일치하면

라벨에 정답! 이라는 메세지가 뜨게 해보겠습니다.


자, 새롭게 프로젝트를 만드셔서, 아래와 같이 폼을 만들어보세요.





 개체 이름

속성

속성값 

 Label1

 Caption 

"문제출제란"

 text1

 text 

"정답입력"

 Command1

 Caption

"정답확인"

자, 그 후에 폼의 빈공간(점이 그려져있는 빈 공간) 있죠?

빈공간부분을 더블클릭해보세요.



그럼 Form_Load라는 서브가 생성됩니다!


이건 폼이 로드되었을때. 즉, 실행되었을때 라는 말입니다.


그럼 폼이 실행되었을때 라벨에 문제 출제가 되도록 해볼게요.


label1.caption = "5+7+8+13=?"

이라고 입력해줍니다.


그리고 나서 실행해보면

Label1의 값이 변경되어서 실행 되는게 보이시죠?


자, 그리고 다시 돌아와서 커맨드 박스(버튼)을 더블클릭해보도록 하죠.


그럼 Command1을 클릭했을때에 대한 서브가 생성됩니다.

(사실 직접 입력해도 되는 거지만 저렇게 각 개체를 더블클릭해서 하는게 빠르고 편해서..ㅋㅋ)


아래와 같이 Command1_Click 서브에 입력..

if text1.text = "33" then

Label1.Caption = "정답입니다!"

else
Label1.Caption = "틀렸습니다 다시 입력해주세요. 5+7+8+13=?"

end if




자 이제 간단히 해석 해볼게요.


자 처음보는 IF문이 나왔어요.


프로그래밍 중의 가장 기본이 되는

비교문입니다.

IF문은 말그대로 '만약에'라는 뜻입니다.


즉,

If text1.text = "33" then

만약에 text1개체의 속성중 text 속성이 33과 같다면, (참이라면)


Label1.Caption = "정답입니다!"

Label1의 개체의 캡션을 "정답입니다!" 라고 보여주고,


Else 그렇지 않다면(거짓이라면)


Label1.Caption = "틀렸습니다 다시 입력해주세요. 5+7+8+13=?"

Label1의 개체의 캡션을 "틀렸습니다 다시 입력해주세요. 5+7+8+13=?" 라고 보여줘라.

end if 조건문IF를 종료합니다.

이해 하셨나요?

그럼 실행을 한번 해보겠습니다.


아무거나 입력해볼게요. 그리고 정답확인 클릭!

If 구문중에 Else구문 안에 있던 명령이 실행되었죠?


반대로 제대로된 "33"이란 값을 입력해볼게요.

정답입니다~!



자, 이걸 여러가지로 실험해보시고, 깨우쳐 보셔요


아, 그리고 Else 구문을 사용할 필요가 없을때도 있는데

그때는 생략 가능합니다.

(참일 경우만 IF문을 쓰고 싶을때.)


자, 그럼 변수와 함께 사용해볼게요.




서브가 실행되기 전에

변수를 미리 선언해줍니다. (선 선언)


해당 코딩을 한번 이해 해보시고, 아래 해석을 확인하세요.




허허 실험을 해보세요~!


궁금한점은 댓글 달아주세요!




반응형
반응형

 

안녕하세요~ 알기쉽게 설명하는 초보자를 위한 무꼬입니다.

오늘은 Visual Basic으로 암호화 및 복호화 코딩에 대해 강좌를 하도록 하겠습니다 ㅎㅎ


우선 암호화복호화에 대해 알아보죠~!


[암호화]

데이터 전송 시 타인의 불법적인 방법에 의해 데이터가 손실되거나 변경되는 것을 방지하기 위해 데이터를 변환하여 전송하는 방법.

의미를 알 수 없는 형식(암호문)으로 정보를 변환하는 것.


[복호화]

암호화의 반대 과정.



우선 암호화에는 대칭형(DES)과 비대칭형(RSA)이 있어요.

설명하기가 어려운 부분이 있어서 네이버 지식백과를 참고해서 설명해드릴게요~


대칭형 암호화 방식의 비밀키 암호화기법(DES)비대칭형 암호화 방식의 공개키 암호화 기법(RSA)이 있다. 비밀키 암호화 기법은 동일한 키로 암호화와 복호화를 수행하는 방법으로 보안 유지와 키 관리에 어려움이 있으나 알고리즘이 간단해 암호화 속도가 빠르고 용량이 작아 경제적이다. 공개키 암호화 기법은 공개되는 공개키(public key)와 본인만 사용하는 비밀키(private key)로 구성되는 것으로 공개키와 비밀키를 별도로 관리하기 때문에 키 관리가 용이하며 암호화와 사용자 인증이 동시에 이뤄진다는 특징이 있다. 이는 전자 문서의 디지털서명, 부인봉쇄에 사용된다. 그러나 알고리즘이 복잡해 속도가 느리다는 단점을 가지고 있다.

[네이버 지식백과] 암호화 [暗號化, encryption] (시사상식사전, 박문각)



DES기법 기초 및 중급 암호화 강좌에서 아주 적절한 예라고 생각해서ASCII 코드를 이용한 대칭기법 암호화를 강좌 하겠습니다 ㅎㅎㅎ


혹시라도 아스키코드(ASCIIcode)에 대해서도 모르시는 분들을 위해 조그만 설명을 드리자면,
 American Standard Code for Information Interchange 의 약자로서정보 교환용으로 미국에서 만든 표준 코드입니다.ASCII 코드 표

대문자, 소문자, 숫자, 특수기호, 제어정보등을 포함하는 8개의 비트 코드로 구성이 되며그 중 일곱개의 비트는 코드화되어 있는 문자세트,한 개는 패리티비트(에러 검사용)로 사용 됩니다~ 
뭔소린지 모르겠고, 그냥 암호화 하는 방법이나 가르쳐 달라구요? 그럼 본론으로 들어가볼까요?

[원리 알고리즘]

"Hello~? 무꼬의 블로그입니다!!!" 라는 문자열을 암호화 할 때.
1. 우선 해당 문자열의 길이를 구합니다.(Hello~? 무꼬의 블로그입니다!!! 는 길이가 20)
2. 문자열에서 n번째 글자를 따옴(첫번째부터 문자열길이 까지.)(첫번째 글자인 'H'를 따옴)
3. n번째 글자를 ASCII코드화(숫자화) 시킵니다.('H'를 ASCII코드화 시키면 '72'가 됨.)
4. 암호화 할 대칭 키(Key)만큼 해당숫자에서 뺌.(무꼬는 1을 뺄것임! 72 - 1   1의 데미지를 입었다!!!  71이 됨.더해도 상관은 없음 하지만 복호화 할때는 반대 작업이 필요하니 복호화 할땐거꾸로 빼줘야 겠죠?)
5.이제 이 숫자를 다시 문자화 시켜줌.('H'는 'G'라는 숫자가 되었다!!)
6. 이제 다시 2번으로 돌아가서 두번째, 세번째 문자를 차례로 위의 방법대로 진행합니다.그럼 해보진 않았지만 앞의 'Hello~?'만 보면 'Gdkkp}>' 라는 알수 없는 문자열로 변형 되어 있겠죠?(※한글은 더 복잡하게 알수없게 바뀝니다.)



이제 코딩을 보시죠.


[VB 코딩] 

 EnCoding(문자열)

'출처를 밝히지 않고 퍼갈수 없습니다. 출처를 밝히세요.'출처 무꼬's Art-Life  http://art-life.tistory.comFunction EnCoding(ByVal Input_Str AString'Input_Str:문자열을 받을 변수 Dim Len_Str As Double '문자열의 길이값을 저장할 변수Dim Result As String '결과값을 받을 변수
Dim
Temp_Str As String '임시로 문자를 받을 변수Len_Str = Len(Input_Str) '1. 해당문자열의 길이를 구합니다.
for As Double = 0 to Len_Str - 1 Temp_Str =  Mid(Input_Str,n,1)   '2. 문자열에서 n번째 글자를 따옵니다.'3. n번째 글자를 ASCII코드화(숫자화) 시키고(Asc) 4. 대칭 키 만큼 뺌!(-1) 5. 그리고 다시 문자화 시켜줌 (Chr) Temp_Str = Chr(Asc(Temp_Str) - 1Result &= Temp_Str '5.Next nMsgBox Result '메세지창으로 띄워줌. 혹은 EnCoding = Result 를 써저 재귀함수로 만들어주어도! ㅎㅎ



처음 하시더라도 위에 원리를 보시고 코딩을 분석하시면 되게 쉬울거에요.


자 그럼 복호화는 어떻게 하냐구요?

똑같아요.

다만 아까 대칭 키를 입력할때 빼거나, 더했을 텐데 (저는 -1 을 했죠 ㅎㅎ)

그 반대로 해주는 거죠.

암호화할 때 - 1 을 했다면 복호화 때는 + 1

- 2 를 했다면 복호화 할때는 + 2 를 해주면 된다는 거죠.


그럼 뭐 볼것도 없지만 복호화 코딩도 한번 보실까요?

 DeCoding(문자열)

'출처를 밝히지 않고 퍼갈수 없습니다. 출처를 밝히세요.'출처 무꼬's Art-Life  http://art-life.tistory.comFunction DeCoding(ByVal Input_Str AString'Input_Str:문자열을 받을 변수Dim Len_Str As Double '문자열의 길이값을 저장할 변수Dim Result As String '결과값을 받을 변수 
Dim 
Temp_Str As String '임시로 문자를 받을 변수Len_Str = Len(Input_Str) '1. 해당문자열의 길이를 구합니다.
for As Double = 0 to Len_Str - 1 Temp_Str =  Mid(Input_Str,n,1)   '2. 문자열에서 n번째 글자를 따옵니다.Temp_Str = Chr(Asc(Temp_Str) + 1)  '이 부분만 다르죠 ㅎㅎResult &= Temp_Str '5.Next nMsgBox Result '메세지창으로 띄워줌. 혹은 DeCoding = Result



이해 하셨으리라 믿겠습니다 ㅎㅎ
아 혹시나 궁금한점이 있으시거나,모르겠다 하시면 댓글을 달아주시면 최대한 빠른 시일 내에 답해드리도록 하겠습니다 ㅎㅎ



그럼 즐프로그래밍 하세요~ 이상 무꼬였습니다. ( p.s - 하트 한번 눌러주세요 ㅎㅎ)

반응형

+ Recent posts