안녕하세요 활짝웃자입니다.

Java / HTML5 / CSS / JSP / Spring / DataBase : Postgresql / Apache Tomcat을 모두 사용하게 되어서

기본 문법만 하고 프로그래밍 했었는데 필요하게 된 부분들이 많아져서 글을 작성하게 되었습니다.

 

이것이 자바다 교재를 사용하여 진행하였습니다.

총 2권으로 나누어져 있는데, 1권은 기본 문법 + Java에서 자주 사용되는 API등을 다루는 내용입니다.

2권은 멀티스레드, 제네릭, 람다식, 컬렉션 프레임워크, 스트림과 병렬 처리, 네티워킹 등 기본 문법을 숙지 후, 개발 업무 시 자주 사용되는 부분을 설명하는 내용입니다.

 

Java 게시글은 다음과 같은 방식으로 진행 됩니다.

1. 이것이 자바다 교재가 아니어도 Java 기본 문법을 알고 계신다고 생각하며 진행합니다.

2. 모든 내용을 다루지는 않을 것이며 참고한 부분은 분명하게 출처를 밝히면서 진행합니다.

 

 

 

멀티태스킹두 가지 이상의 작업을 동시에 처리하는 것입니다.

이때 사용되는 방법 중 하나인 멀티 스레드가 있습니다.

멀티스레드에서 동기화, 비동기화의 개념이 존재 하는데 해당 개념은 다음의 출처를 통해 확인해 주시기 바랍니다.

 

Synchronous(동기) vs Asynchronous(비동기)

 

Synchronous(동기) Vs Asynchronous(비동기)

 

nesoy.github.io

동기화를 실험해 보기 위해 비동기를 먼저 확인해 보도록 합시다.

 

 

Calculator.java - 공유객체

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package thread_synchronized;
 
public class Calculator {
 
    private int memory;
    
    public int getMemory() {
        return memory;
    }
    
    public  void setMemory(int memory) {
        this.memory = memory;
        try {
            Thread.sleep(2000);
            System.out.println(Thread.currentThread().getName() + ": " + this.memory);
        } catch(InterruptedException e) {
            /* 이것이 자바다 교재에서는 이 부분(catch)으로 실행이 되는 것 같지만
             * 제가 실행할 때는 정상적으로 출력이 되지 않아서
             * try 부분에 확인을 위한 코드를 삽입 하였습니다.
             */
            System.out.println(Thread.currentThread().getName() + ": " + this.memory);
        }
    }
}
 

 

 

User1.java - User1 스레드

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package thread_synchronized;
 
public class User1 extends Thread {
 
    private Calculator calculator;
    
    public void setCalculator(Calculator calculator) {
        this.setName("User1");
        this.calculator = calculator;
    }
    
    public void run() {
        calculator.setMemory(100);
    }
}
 

 

 

User2.java - User2 스레드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package thread_synchronized;
 
public class User2 extends Thread {
 
    private Calculator calculator;
    
    public void setCalculator(Calculator calculator) {
        this.setName("User2");
        this.calculator = calculator;
    }
    
    public void run() {
        calculator.setMemory(50);
    }
}
 

 

 

MainThreadExample.java - 메인 스레드가 실행하는 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package thread_synchronized;
 
public class MainThreadExample {
 
    public static void main(String[] args) {
        Calculator calculator = new Calculator();
        
        User1 user1 = new User1();
        user1.setCalculator(calculator);
        user1.start();
        
        User2 user2 = new User2();
        user2.setCalculator(calculator);
        user2.start();
    }
}

 

MainThreadExample.java를 실행하면 다음과 같은 결과를 확인 하실 수 있습니다.

 

User1: 50

User2: 50

 

위와 같이 동시에 실행하는 것만 생각하고, 공유가 되면 안 되는 부분을 해결하기 위해 synchronized를 사용합니다.

 

MainThreadExample, User1, User2는 동일하므로 Calculator만 수정합니다.

 

 

수정된 Calculator.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package thread_synchronized;
 
public class Calculator {
 
    private int memory;
    
    public int getMemory() {
        return memory;
    }
    
    public synchronized void setMemory(int memory) {
        this.memory = memory;
        try {
            Thread.sleep(2000);
            System.out.println(Thread.currentThread().getName() + ": " + this.memory);
        } catch(InterruptedException e) {
            /* 이것이 자바다 교재에서는 이 부분(catch)으로 실행이 되는 것 같지만
             * 제가 실행할 때는 정상적으로 출력이 되지 않아서
             * try 부분에 확인을 위한 코드를 삽입 하였습니다.
             */
            System.out.println(Thread.currentThread().getName() + ": " + this.memory);
        }
    }
}
 

 

Calculator.java를 위와 같이 수정해 주시고, 실행하시면 다음과 같이

 

User1: 100

User2: 50

 

동시에 실행을 하지만 공유가 되지 않은 결과가 출력되는 것을 확인하실 수 있습니다.

 

 

소개해드린 예제는 이것이 자바다에 있습니다!

동시에 실행은 해야 하지만 공유가 되면 안 되는 동기화 프로그래밍을 해야 되는 경우가 의외로 많습니다.

 

제가 진행했던 개인 프로젝트 중 Java를 사용한 간단한 Hash비교 기능과 랜섬웨어에 의하여 암호화된 파일들을 복호화 해주는 백신 아닌 백신을 제작하였었는데, 당시 빠른검사, 정밀검사 기능을 제작하던 중, GUI에서 Progress Bar를 사용하여 검사 중인 파일의 경로 + 파일명, 진행상태 표시를 위한 Progress Bar 를 실행하니 실시간으로 진행되는 파일명 출력과 게이지가 차지를 않고, 검사 종료 후, 맨 마지막에 검사한 파일의 파일명만 출력되고, 게이지 또한 공백 상태에서 꽉찬 게이지 형식으로 변경이 되었었습니다.

 

당시 pannel thread와 검사 thread 간의 임계영역 간섭 문제였던걸로 생각이 들어서 검사 thread에 synchronized를 적용하니 정상적으로 일반 백신처럼 진행되는 것을 확인 할 수 있었습니다.

 

모든 상황이 저와 같지는 않으시겠지만 굉장히 다양한 경우가 많으니 검색등을 통하여 알아보시기 바랍니다!

 

 

안녕하세요.

블로그 주인 활짝웃자 입니다.

꽤 오래전이지만 이전 글들에서 종종 찾아 뵙겠다고 하면서

공부하던 것은 올리지 않고,

뜬금없이 Python 프로그래밍을 올린다던지 했었습니다.

 

취직 준비한다는 이유로 프로젝트 형식으로 온전한 소스는 가지고 있고,

Python 게시글들은 보여주기 식으로 진행했었습니다.

 

이제 정말 시간이 없어서 자주 올릴 수 있을지 모르겠지만

초심으로 돌아가서 시간 될 때마다 조금씩 올리려고 합니다.

 

솔직하게 더 말씀 드리자면 취직이 되었기에 습관을 길들이기 위하여 올린다는 것도

부정하지는 않겠습니다.

 

모든 점에 대해서 사과의 말씀드리고 향후 계획에 대해 말씀드리도록 하겠습니다.

 

앞으로 크게 2가지 형식으로 나눠지게 될 것 같습니다.

 

1. 프로그래밍 처음 시작 하는 느낌으로 기본부터 진행하는 게시글을 올리는 경우

2. 프로그래밍 언어의 경우 제 기준으로 난이도를 조금씩 높혀가며 개념 정리 + 응용 게시글을 올리는 경우

 

이처럼 2가지 맥락으로 작성을 하게 될 것 같습니다.

 

적어도 8월 말 까지는 시간 되는 대로 종종 게시글을 올리게 될 것 같습니다.

 

감사합니다.

'공지사항' 카테고리의 다른 글

오랫만 입니다!  (0) 2019.11.15
포스팅 관련  (0) 2017.01.01

지난번 포스트에서 Keylogger 에 대해서 간단하게 알아 보았습니다.


이제 기능들은 구현이 되었는데 이걸 프로그램 배포자가

원하는 기능을 입력 했을 때 정보를 GitHub로 보내도록 하고 싶지 않나요?


그러기 위해서는 Network 통신이 필요합니다.


그 중에서도 단방향 통신인 UDP가 아닌

양방향 통신

3Way-HandShaking인 TCP를 사용하는 방법을 알아 보겠습니다.

(바로 전 포스트에서 말씀드린 것처럼 악용하시는 분이 계실 수도 있기에 완성된 코드는 설명하지 않습니다. 물론 응용해서 하실 분들도 계시겠지만 이 포스트의 목적은 어디까지나 필자 본인의 개인 공부 및 교육용이기 때문입니다. 제가 올리는 내용들을 악용하셔서 문제가 발생 할 경우 즉시 삭제 조치 하겠습니다. 또한 악용시 책임은 본인에게 있습니다.)





우선 TCP통신을 위해서는 Server와 Client가 있어야 합니다.(Server역할을 하는 PC입니다)



위 사진에서 보면 알 수 있듯이 Server 역할을 하는 PC에서는 host IP와 port 번호를 지정해줍니다.

이때 port 번호는 int type 이어야 합니다.


s 라는 객체를 선언 해줍니다.

socket.SOCK_STREAM 옵션이 TCP 통신을 하겠다는 옵션입니다.


다음으로 s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)은

한 번 사용한 포트를 다시 사용 하겠다는 설정입니다.


s.bind를 사용하여 host와 port를 묶어서 사용할 준비를 합니다.


s.listen(연결 허용 수)를 사용하여 연결을 할 수 있도록 소켓을 활성화 합니다.


conn, addr = s.accept()는 연결이 되었을 경우 addr에 연결 된 PC의 IP정보,

conn에 연결 된 PC의 정보를 각각 저장합니다.


conn.recv(읽어들일 Bytes 수)를 통해 conn 객체에서 보내온 정보를 읽습니다.


conn.send(보낼 내용)를 이용하여 연결된 PC에 내용을 전달합니다.


conn.close()를 이용하여 연결되어 있는 connection 객체를 연결을 해제 합니다.


Server 역할을 하는 PC의 소켓을 닫습니다.







다음은 Client 역할을 하는 PC의 코드 입니다.



위 사진에서 알 수 있듯이 TCP Server 역할을 하는 코드에 비해 훨씬 간결하고 짧습니다.


마찬가지로 SOCK_STREAM 옵션을 사용하여 TCP 통신을 하겠다는 선언을 해줍니다.


connect기능을 통해 TCP Server 역할을 하는 PC의 IP와 Port 번호를 입력해서 연결합니다.


send 기능을 이용해 내용을 전달합니다.


마찬가지로 TCP Client 또한 csock.recv() 가 있습니다. (저는 일부러 생략 했습니다)


마지막으로 연결 되어있던 csock 객체를 close()를 통해 닫아 줍니다.




이렇게 해서 Python GitHub 연동 프로그램에 네트워크 기능 까지 알아 보았습니다.


Python GitHub 연동 프로그램과 네트워크 기능을 합쳐서 정말 Virus 처럼 만들 수도 있습니다.

하지만 이에 대한 주의사항과 이 포스트의 목적은 여러번에 걸쳐서 말씀 드렸습니다.


그 부분 유의 해 주시고 GitHub에 올라가 있는 내용은 base64로 암호화 되어 저장이 되어 있습니다.

이 부분 확인 후 (디코딩은 여러분이 직접 해보세요 ! 디코딩도 필자는 직접 해봤습니다!)


Python GitHub 연동프로그램은 마치도록 하겠습니다.


다음은 GitHub에 보내진 정보들이 base64로 암호화된 모습입니다.







※ 다시 한 번 사용하실 때 악용 하지 마세요 ! 당신의 양심입니다. :)

그리고 시간 되는 대로 공부했던 거나 공부 하는 것들 중간 중간 올리도록 하겠습니다.


* [출처] Black Hat Python

* [출처] Everything 블로그 본인






지난번 포스트에서는 ScreenShot 모듈을 알아보았습니다.


이번에는 Target PC에서 어떤 프로세스에서 어떤 내용을

키보드로 입력하고 있는지 파일로 저장하고

저장된 내용의 파일을 읽어서 GitHub로 보낼수 있게 하는

모듈을 알아 보겠습니다.

(물론 마우스 입력도 활용할 수 있지만 Python GitHub 연동 프로그램 포스트를 작성하는 동안은 다루지 않도록 하겠습니다. 본인이 GitHub 연동 프로그램에 추가할 수도 있으니 그 점 참고해 주시기 바랍니다.)





우선 Keylogger 모듈을 만들기 위해 필요한 모듈을 알아 보겠습니다.

필요한 모듈들은 다음과 같습니다.





다음으로 필요한 변수에 대해 알아 보겠습니다.

변수는 다음과 같습니다.






다음으로 Keylogger 실행시 해당 내용을 저장할 파일을 만들어서 저장하는 함수에 대해 알아보겠습니다.







다음으로 Target PC의 사용자가 현재 사용하고 있는 프로세스에 대한 정보를 알아내는 함수에 대해 알아보겠습니다.






다음으로 키보드 입력에 대한 이벤트 발생시 후킹하는 기능을 가진 함수를 알아 보겠습니다.





이렇게 해서 Keylogger 모듈에 대해서 알아 보았습니다.


다음 포스트에서는 Python Network TCP 통신에 대해서 알아 보겠습니다.

(간단하고 Google에 검색 해 보시면 훨씬 자세하게 설명을 해 놓은 글을 보실 수 있습니다. 응용해서 하는 부분은 혹시 악용 하시는 분이 있을 까 해서 완성된 코드를 보여드리지 않기 위함입니다. Network TCP 통신 포스트 이후 Python GitHub 연동 프로그램의 결과에 대해서 간단하게 포스트 하도록 하겠습니다.)




* [출처] Black Hat Python

* [출처] Everything 블로그 본인





이번 포스트에서는 ScreenShot 기능에 대해 알아 보겠습니다.


우선 화면을 캡쳐하기 위해 필요한 모듈을 알아 보겠습니다.





다음으로 화면 캡쳐후 저장할 파일이름이 지정될 변수를 선언 합니다.

(필자는 지정해서 했습니다. 얼마든지 변형해서 사용할 수 있습니다.)





다음은 실제 화면을 캡쳐하는 기능을 구현한 함수입니다.



화면을 캡쳐하는 기능을 구현 했습니다.

이제 캡쳐한 이미지를 GitHub에 보내기 위해

바이너리 형식으로 읽어 들여서 string 형식으로 변환 후

return 하는 함수를 알아 보겠습니다.





다음과 같습니다.




이렇게 해서 화면 캡쳐 후 GitHub로 보내는 코드를 알아 보았습니다.



다음 포스트에서는 Keylogger와 KeyDump에 대해서 알아보겠습니다.






* [출처] Black Hat Python

* [출처] Everything 블로그 본인






지난번 설정 파일에 이어서 

사용할 모듈들에 대해서 알아 보겠습니다.

지난번 포스트를 확인하지 못 하신 분은

다음의 링크를 통해 확인 해 주세요!


http://widevery.tistory.com/19?category=818811



mainInformation, environment, dirlister 모듈에 대해서

알아보도록 하겠습니다.


우선 mainInformation입니다.





다음은 environment입니다.






다음은 dirlister입니다.




이렇게 해서 총 3개의 모듈에 대해서 알아 보았습니다.


이번 포스트는 짧았는데 아마 다음 포스트들도 마찬가지 일 것 같습니다.


다음 포스트에서는 ScreenShot 모듈에 대해서 알아 보겠습니다.




* [출처] Black Hat Python

* [출처] Everything 블로그 본인




네 여러분 반갑습니다.


오늘 포스트는 짧을 것 같은데요.

그래도 시작해 봅시다!



Python에서는 JSON 형식의 파일을

지원해주는 모듈을 자체적으로

내장하고 있습니다.


바로 요녀석 입니다.


import 해주고, 「help(json)」 이라고 입력 해주시면

다음과 같이 json 모듈에 대한 

자세한 설명을 확인 할 수 있습니다.


json을 사용하기 위해서는

Python에서 「List」 「Dictionary」 를 알고 계셔야 합니다.

이유는 바로 json 형식의 파일이 다음과 같은 구조로 되어 있기 때문입니다.


보기 어려우시다구요!?

다음과 같이 바꿔보면 어떨까요


[{"module":"IpInformation"}]


json 파일의 경우 위와 같은 형식으로

저장이 되기 때문에 List와 Dictionary를 알고 계셔야 합니다.


이제 우리가 저번 포스트에서 했던 GitHub 연동 프로그램에 사용할

JSON 형식의 설정 파일을 만들어 보겠습니다.

※ 지난번 포스트가 궁금하시거나 알고 싶으신 분들은 다음의 링크에서 포스트 확인 후 와주세요!


http://widevery.tistory.com/16?category=818811

http://widevery.tistory.com/17?category=818811


여기서 부터는 각자가 추가하고 싶고 실행할 모듈들에 대한

설정 파일을 만들어 주시면 되는데요.

저 같은 경우는

1) 프로그램 배포

2) Target PC에서 실행

3) Target PC의 Platform정보 확인 후 IP 정보 GitHub로 업로드

4) 업로드 후 IP "0.0.0.0" Port 지정 해서 Python TCP Server 실행

5) 프로그램 배포자가 자신의 GitHub 확인

6) 확인 후 IP와 Port 번호를 통해 Python TCP Client로 Target PC 연결

7) 배포자 PC에서 입력한 메뉴(혹은 명령어)에 따라 해당 모듈들 실행

* 필자가 사용한 기능을 가진 모듈들 - 「IpInformation」「Keylogger」「KeyDump」「ScreenShot」「ScreenShot」「dirlister」「environment」

* 시간상 급하게 올리다 보니 더 추가하지를 못 했는데요 여기에 「랜섬웨어」「윈도우권한상승」「백도어」등의 기능들도 추가 할 수 있습니다.

http://widevery.tistory.com/16?category=818811

위 링크의 포스트 시작 시 말씀드렸듯이 어디까지나 이 글의 목적은

개인 공부 및 교육용 입니다.

언제든지 문제가 생길 경우 바로 삭제 조치 하겠습니다.

또한 악용하시는 경우 책임은 본인에게 있습니다.


사설이 길었군요

본격적으로 필자가 사용하기 위해 모듈들을 불러올 수 있도록 한

JSON 형식의 설정 파일들에 대해 알아 보겠습니다.


우선 이번 포스트의 위쪽에 JSON에 대해서 설명하면서

"module":"IpInformation"

이라고 되어 있는 사진을 하나 보셨을겁니다.

해당 파일은 IpInformation.py 파일을 불러오는 역할을 합니다.


나머지도 위 사진과 형식은 같습니다.

이름만 틀려질 뿐이지요.



위 두가지 이외에도 다음과 같이


[{"module":"ScreenShot"}]

[{"module":"KeyDump"}]

[{"module":"Keylogger"}]

까지 해서

총 6가지의 설정 파일을 만들어 주었습니다.

당연히 파일 확장자 형식은 <ConfigureFileName>.json 형식입니다.

<ConfigureFileName>은 설정 파일 이름이면서 첫 번째 포스트에서

trojan_id 라고 했던 부분에서 지정해주고

trojan_config = trojan_id.json 이 되는데

그게 여기서 사용됩니다.

그 부분을 고려해서 json 형식의 설정 파일의 이름을 지정 해주세요.




이렇게 해서 GitHub 연동 프로그램의 설정파일에 대해서 까지 알아 보았습니다.


다음 포스트에서는 mainInformation, environment, dirlister 모듈에 대해서 알아 보겠습니다.


※ [출처] Black Hat Python

※ [출처] Everything 블로그 본인






지난번 GitHub 연동 프로그램의 2번 째 글입니다!

지난 번 글을 못 보신 분은 다음의 링크를 통해 확인 해 주세요!

http://widevery.tistory.com/16?category=818811


GitHub 연동 프로그램에서 사용할 모듈과 변수 설정을 마쳤으므로

프로그램의 기능을 함수와 클래스들에 대해서!

(소스코드)사진으로 알아 보겠습니다.

귀찮아ㅅㅓ... 사진에 설명을 첨부하였으니 그 점 참고해 주세요!










이렇게 GitHub 연동 프로그램에 대해서 2부에 걸쳐 알아 보았습니다.


다음 글에서는 GitHub 연동 프로그램에 사용되는 설정 파일에 대해서

알아보도록 하겠습니다.


※ [출처] Black Hack Python

[출처] Everything 블로그 본인






여러분 안녕하세요

활짝웃자입니다.

너무 오래간만이어서 죄송하기도하고 필요에 의해서 하.ㄴ.. 해서

다시 오게 되었습니다.


잡담은 여기까지 하도록 할게요!


GitHub 연동 프로그램은 맞는데

GitHub 연동해서 상대 PC의 정보를 파싱해서

GitHub로 보내고

프로그램을 심은 쪽에서는

GitHub만 확인하고 정보를 탈취하는 프로그램입니다.

해당 게시글은 몇 개의 글로 나누어질 예정입니다.

만약 이 글이 문제가 될 경우 바로 삭제 조치 하도록 하겠습니다.


※ 이 게시글은 어디까지나 교육 및 공부를 목적으로 만들어졌으며

악용하시라는 의도로 만들어진 것이 아닙니다.

만약 악용하시더라도 그 책임은 본인에게 있음을 알려 드립니다.





깃허브란?

깃허브는 분산 버전 관리 툴인 깃을 사용하는 프로젝트를 지원하는 웹호스팅 서비스이다. 루비 온 레일스로 작성되었다. GitHub는 영리적인 서비스와 오픈소스를 위한 무상 서비스를 모두 제공한다.

...라고

우리의 'Google'!에 검색 해보니 나오더라구요 :)........

자세히 알고 싶으신 분은 GitHub를 따로 검색해주세요!


Python 에는 GitHub를 사용할 수 있도록 모듈이 존재합니다.

다음과 같습니다. :)


(모듈 설치는 검색 해보면 많이 나와있고, 잘 나와 있으니 찾아보세요 :) !)


위 사진과 같이 github3 모듈을 import 하면 GitHub와 연동할 준비를 하게 됩니다.


이제 GitHub와 어떻게 연동을 하고, 무엇을 하는지 생각해봅시다.

연동을 위해서는 (자신의) GitHub ID와 PW가 필요합니다.

다음으로 Repository가 필요하고 정보를 저장할 Repository가 필요합니다.

정보 저장을 위한 Repository는 기본 베이스 Repository의 하위 디렉터리 형식으로 생성해 줍니다.

(자세한 것은 검색 해보시면 나와 있어요!)


그 외에 또 필요한 것을 생각해 봅시다.

우리가 원하는 기능을 하는 모듈이 Python에 없는 경우가 있습니다.

그런 경우 해당 모듈을 설치를 하거나 만들어야 되는데

모듈을 설치 하는 것도 편하지만 이번에는 만들어서 GitHub에 저장 후,

Target PC에서 GitHub 연동 프로그램을 실행하여

필요한 모듈을 GitHub에서 불러오기도 하고, Target PC의 정보를

GitHub에 업로드 시키는 기능도 필요하다고 생각합니다.

그리고 무작정 GitHub에 업로드 하는 것이 아닌 base64 암호화 기법을 사용해

암호화 된 상태로 보내도록 합니다.


또한 GitHub에 저장 되어 있는 필요한 모듈을 불러올 때는

Python에서 지원 해주는 json 모듈을 활용하여

json 형식의 파일로 불러올 모듈을 지정하고,

json 형식의 설정 파일을 읽어 들여서 해당 설정 파일의 모듈을

GitHub에서 불러들여서 실행하는 형태가 되면 좋다고 생각합니다.


그러기 위해서 필요한 모듈들은 다음과 같습니다.



위 사진의 「from github3 import login」 부분은

github3 모듈의 login 기능만을 사용하겠다는 선언입니다.


이제 모듈들은 준비가 되었으니

프로그램에서 사용할 「변수」를 선언합니다.


다음은 변수들 선언과 사용 용도입니다.








여기까지가 GitHub 연동, Target PC의 정보 수집을 위해

필요한 모듈들과 프로그램에 필요한 변수 선언이었습니다.


다음 글에서는 GitHub 연동 프로그램(기존의 Trojan 수정)의

기능들에 대해서 알아 보겠습니다.



※ [출처] Black Hat Python

※ [출처] Everything 블로그 본인



오랫만에 글을 올리네요.


개인적인 사정으로 바빠서 올리지 못 한 점 양해 부탁드립니다.




이번 글에서는 if ~ else 문과 if ~ else if ~ else 문을 다루도록 하겠습니다.



1. if ~ else 문


if 문하고 if ~ else 문의 차이점은 처음 보자마자 알 수 있듯이 else 가 추가 된 것입니다.


if 문은 조건을 검사 후 조건 성립하면 실행하고, 조건 성립하지 않으면 실행을 하지 않고 다음 문장으로 넘어갑니다.


if ~ else 문 if 부분에서 조건이 성립하지 않을 경우 else 문의 내용을 실행합니다.


반대로 if 부분에서 조건이 성립하면 else 문의 내용을 실행하지 않습니다.


예제를 통해 알아보도록 하겠습니다.



[ if 문의 조건이 성립할 경우 ]



[ if 문의 조건이 성립하지 않을 경우 ]


위의 예제에서처럼 if 문의 조건이 성립하지 않았을 경우 실행할 것을 else 문을 통해서 실행할 수 있습니다.






2. if ~ else if ~ else 문


if ~ else if ~ else 문은 조건검사 효율 문제 때문에 사용한다고 보시면 됩니다.


바로 예제를 통해 알아보도록 하겠습니다.



[ if 문의 비효율성 ]


위의 예제를 사람이 보면 단순히 '조건이 맞는 것만 실행하고 나머지는 실행하지 않는다' 라고 생각을 하기 쉽습니다.


하지만 C언어에서는 4가지의 if 문에 있는 조건문을 전부 검사합니다.


그렇게 되면 필요하지 않은 것들까지 조건을 검사하게 되서 그만큼 효율이 떨어지게 됩니다.


그렇다면 if ~ else if ~ else 문을 예제를 통해 알아보도록 하겠습니다.



[ if 문의 비효율성 해결을 위한 if ~ else if ~ else 문 ]


위 예제에서는 if 문의 비효율성을 해결하기 위해 if if if 대신 if ~ else 문 중간에 else if 를 추가 한 것입니다.


위 예제와 같이 코드를 작성하게 될 경우, if 문의 조건이 성립하지 않고, 두 번째 if 문 대신 들어간 else if (opt == 2) 문장이 참일 경우 해당 문장을 실행하고, 나머지 else if (opt == 3) 부터 else 문 까지는 실행을 하지 않고 바로 24번 째 줄의 printf("결과: %f \n", result); 문으로 넘어가게 됩니다.


이렇듯 if 를 연속적으로 사용하여 조건 검사를 매 회 계속 하는 것보다 else if 를 사용하여 조건이 성립 할 경우 남은 조건 문을 실행하지 않도록 하여 효율성을 높이는 방법이 훨씬 보기에도 편하고, 사용에 익숙해지면 편하게 사용 가능합니다.






3. if ~ else 문과 if ~ else if ~ else 문의 구조


if ~ else 문과 if ~ else if ~ else 문의 구조는 다음 예제를 통해 알아보도록 하겠습니다.



[ if ~ else 문, if ~ else if ~ else 문의 구조 ]


위 예제에서 확인 가능 하듯 if ~ else 문은 if 문의 조건식이 성립하지 않을 경우 else 문을 실행하는 구조입니다.


if ~ else if ~ else 문의 경우


if 문의 조건식이 성립하지 않아도 else if 문 조건 성립 또는 모든 조건이 성립하지 않아 else 문을 실행하는 구조로 되어 있습니다.


또한 if ~ else if ~ else 문에서 else if 부분은 추가로 else if 를 삽입 가능합니다.






이것으로 if ~ else 문, if ~ else if ~ else 문에 대하여 알아 보았습니다.



다음에는 반복문의 생략과 탈출에 사용되는 continue 와 break 에 대하여 글을 올리도록 하겠습니다.









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

C언어 공부 관련!  (0) 2019.08.16
C언어 조건문 - if 문 (1)  (0) 2017.01.26
C 언어 반복문의 중첩  (0) 2017.01.15
C언어 반복문 - for문 (2)  (0) 2017.01.15
C언어 반복문 - for문 (1)  (0) 2017.01.12

+ Recent posts