파이썬 챌린지 2번째 문제화면이다.


(2번째 문제)




글자를 맞춰보세요...
책에 있을 수도 있고, 페이지소스에 있을 수도 있고~

음... 저 책 이미지를 데이터처리해서 알아내라는건지 싶었지만 모르기도하고.. 어려우니까
다음..!

페이지소스에 있을 수도 있다라.!




(페이지소스)




페이지 소스에 들어가봤다.





(페이지 소스)


역시나!!
예상은 했지만! 주석처리로 문제가 나와있다.

위에 이렇게 써있다.
아래 데이터중에 가장 드문(rare) 문자들을 확인해보세요.
아.! 그러면 이 문자열들을 하나씩 검사해서
횟수를 카운트하면 되겠군!

두 개의 리스트를 써서 문자가 들어오면 한 리스트에 추가 할 것이다.
추가할 때 카운트 리스트에도 값을 1이라고 해서 추가할 것이다.

그 다음에 중복되는 문자가 오면 그 리스트에서 그 문자가 들어있는 인덱스를 찾아서
카운트 인덱스에 있는 숫자를 수정해줄것이다.
-> data 전체에서 그 문자를 카운트할 수 있는 메서드로
(사실 이 메서드는 인덱스를 찾는 메서드를 찾기위해 API를 보다가 얻어 걸린거다.)
(원래 하나씩 증가시켜주려고 했다.)





(코드)



실행 시켜서 위 소스코드에 있는 마구잡이 데이터를 복사해서 입력해주면 끝이다!





(입력하는 모습)




?? 불길한 빨간글자는.. 

일단 입력해보자.




(입력 결과)



아....
빨간색 글씨는 주석처리 된거구나... (이때까지 몰랐다.)
왠지
저 카운트된 숫자들도 보니 말도 안되는 숫자고..(너무작다.)

입력이 주석처리되다니..ㅜ
(보안책에서 SQL 인젝션이라고 개념을 본적있는데, 그게 떠올랐다.)

여기서 한참 방황했다. 저 #들을 어떻게 처리해 주어야할까...
그 때 든 생각이 파일로 통째로 해서 입력하는게 어떨까 싶었다.

메모장을 키고 데이터들을 복사해서 붙여넣었다.





(메모장 파일 새성)


이 파일을 받아서 문자열로 옮긴 후 내가 생각했던대로
코드를 돌려볼 생각이다.




(코드 수정)




(결과)


오.....!!!!!!

( 공백도 문자다.)

적은 문자들을 보니 1이다. 이건 분명 적다고 할 수 있는 값이다.
equality 
가 정답이다.! :)

문제 1에서 했던것 처럼 url의 값을 변경해주었다.




(통과된 모습)




문제 2도.! 해결하였다.

: ) (뿌듯)

'WarGame > Python Challenge' 카테고리의 다른 글

Python Challenge - 5  (0) 2017.01.18
Python Challenge - 4번  (0) 2017.01.09
Python Challenge - 3번  (0) 2017.01.02
Python Challenge - 1  (0) 2017.01.01

재밌는 퀴즈(?) 같은 사이트다.
Python Challenge

0번 문제는 너무 쉬워서 패스하겠다.

1번부터 보면 아래 화면이 나온다.




K -> M
O -> Q
E -> G

알파벳을 쭉 써보고 위 세개의 규칙을 넣어보면
두칸씩 땡긴것을 확인 할 수 있다.

즉, 나머지 알파벳도 두칸씩 땡겨서 아래 분홍색 글씨를 해석하면 되는 것이다.

우선 이름이 Python Challenge인것 만큼 파이썬으로 코드를 작성해 보았다.

먼저 위 분홍색 글들은 소문자로 a 부터 z까지 범위를 보니 97부터 122였다.
유니코드 기준으로 (파이써는 유니코드이기 때문에)

2칸씩 땡겨서 변환해야하므로 유니코드 숫자에 2를 더했다.
2씩 더한 값이 122보다 크다면 26을 빼준 값, 즉 다시 a로 돌아가는 값이다.




(암호문 해석 코드)




(실행 결과)



실행 결과를 보면 url에 대하여 이 암호코드를 적용해봐라 라는 뜻이다.




(url)



url의 모습이다 여기서 map 밖에 건드릴것이 없어서

map을 코드에 대입시켜보니 ocr이라는 값이 나왔고





(답 입력)




map을 ocr로 바꾸어 주었다.





(다음 문제로 넘어가는 화면)



정답이다~ :)

'WarGame > Python Challenge' 카테고리의 다른 글

Python Challenge - 5  (0) 2017.01.18
Python Challenge - 4번  (0) 2017.01.09
Python Challenge - 3번  (0) 2017.01.02
Python Challenge - 2  (0) 2017.01.01

어제까지 ARP Spoofing공격을 공부했다.

이 ARP Spoofing 공격이 가능한 이유는
인증과정에 대한 부재가 원인이다.

 인증과정을 거치면 속도가 느려진다. 그렇기 때문에 추가하지 못하고있다.
 (V3도 ARP Spoofing을 막아준다.)

막으려면
 arp -a 를 들어가서 ARP 테이블을 들어가보면 유형에 동적이라고 나와있다.
동적 -> 직접입력 안해도 되고 바로바로 인터넷을 쓸수 있다.
정적 -> 안전하다. 하지만 계속 업데이트를 직접 해줘야한다.
명령어
arp -s (옵션)
arp -s  (정적으로 바꿔줄 수 있다.)



(정적으로 바꾼 화면)



탐지 하는 법
1.서로다른 IP에 대해 중복되는 맥주소가 있을 때
2. 대량의 ARP 패킷이 탐지 될 때

Layer 3에 대한 이해
 - 어떻게 IP헤더만을 가지고 다른 네트워크와 통신이 가능한가?
 - 이더넷헤더 + IP 헤더
 
 - ICMP (Internet Control Message Protocol)
 - 네트워크상에 오류를 제어하기 위한 목적
 - 요즘엔 효율성은 별로 없는데 취약점들이 너무많아서
   ping정도만 사용된다.

ICMP - 오류상황 전달, 서버와의 시간 동기화 등
       많은 타입의 ICMP가 있다.


ICMP 공통헤더
 - type(1) : ICMP 패킷의 타입
 - code(1) : ICMP 패킷타입의 세부 정보
 - checksum(2)

ICMP 타입에 따른 헤더

- ping : Echo Request(8번) (ICMP의 한 종류다.)
서버입장에서 ping을 차단시키는 경우도 있다.
(공격으로 이용할 수 있기 때문이다.)

원래 용도는 상대와 통신이 잘되는지 테스트하는 용도다.

우리는 ping 패킷을 만들어볼 것이다.



(ICMP 패킷을 생성한 코드)




(출력해보면 헤더가 잘 만들어졌음을 확인 할 수 있다.)



type : 8번
 identifier(2)
 sequence number(2)    
 payload(?) - 정하기 나름이다. 여기 들어있는 데이터 그대로 응답이 온다.
      - 별 의미는 없다. ping의 크기를 조절하기 위한 것이다.



(ping 메세지 테스트를 위해 수정한 코드)





(ping을 보내고 응답을 받은 것을 확인할 수 있다.)




(cmd 창에서 ping 메세지를 사용해서 확인한 결과)



- 응답이 오는것을 확인 할 수 있다.

* IP Spoofing (L3에서 할 수 있는 공격)
 - IP값을 변조
 - 0ffset, IP 주소 등등

다음 주 부터는 IP에 관한 내용을 살펴보고
L4부터 취약점을 파악해보겠다.




어제 만들던 코드는 완성됬다.
(내가 만든건아니지만 결국)

어제 만들던 원리 그대로 이어 붙였다.



(패킷 필터 결과화면)




위 화면은 python sniffer.py -p arp -s 192.168.3.18 -d 192.168.167 로 실행시킨 것이다.

옵션에 맞게 정상적으로 출력되는 것을 확인 할 수 있다.

이제 스니퍼 프로그램을 만드는데 있어서
패킷덤프 프로그램도 우리가 보기 편하게 만들었고,
ARP spoofing 할 수 있는 프로그램도 만들었다.

상대방의 패킷을 보려면, 스니핑을 하려면 지금까지 만든거로는 조금 부족하다.
왜냐하면
상대가 스니핑 당하는 것을 알아차리기 때문이다.

우리가 포워딩을 안해주기 때문에 상대 호스트는 나에게 패킷을 전송하고 있다.
그리고 그 결과를 못받고 있는 상황이다.
그러기 때문에 통신이 끊기게 되고 피해자는 알아차리게 된다.
더군다나 통신이 안되기 때문에 스니핑 할 수 있는 자료도 RST 패킷 , SYN 패킷등 이런거 밖에 볼수 없다.



(SYN, RST 패킷밖에 안보인다.)



 위 결과 화면은 상대 호스트 ARP 테이블에서 게이트웨이를 스푸핑한 상태이다.
상대 호스트는 게이트웨이가 내 컴퓨터의 주소인 줄 알고 나에게 보내는 상황이다.

하지만 그에 대한 응답이 안오고 있다. ( 이유는 내가 지금 포워딩을 안해주고 있기 때문에 )


이렇듯, 포워딩을 해줘야 완벽한 스니핑을 할 수 있게 된다.

포워딩이란 상대 호스트의 패킷이 원래 가던 길로 내가 다시 보내줘야된다는 뜻이다.
정확한 뜻은 패킷이 목적지 까지 도착하도록 올바른 길로 보내는 것을 포워딩이라고 한다.

그렇기 때문에 들어온 패킷을 원래 보내려던 목적지 호스트의 맥주소를 참조해서 패킷을 새로 만들고 보내 줘야한다.
목적지 호스트의 맥주소를 알기 위해서 우리는 ARP 테이블을 사용할 것이다.
(우리의 ARP 테이블에 목적지가 있다고 가정했다.)

우리는 이 기능들을 subprocess 모듈을 이용해서 구현할 수 있다.



(subprocess)



subprocess에서 arp -a 명령어로 ARP 테이블을 확인 할 수 있는 화면이다.



(맥 주소를 구해내는 코드)



우리는 위의 방법으로 arp 테이블에서 목적지 호스트의 맥주소를 참조할 것이다.



(포워딩 부분 코드)



위의 코드로 생성을 했다.

하지만 여기서 문제가 있었다.
상대호스트에게 ARP 스푸핑을 하는데
내 컴퓨터의 ARP 테이블에도 영향이 간다는 것이다..

그래서 완벽하게 스니핑 프로그램을 완성하지 못했다.

지금 마주한 문제를 곰곰히 생각해봐야겠다.




파일을 입력, 출력을 다루는 클래스가 JAVA에 존재한다.

InputStream으로 파일 스트림을 받을 수 있는데

이를 이용해서
먼저
간단한 파일 복사 프로그램을 작성해본다.



(파일 복사 코드)




(복사된 화면)



위 코드는 파일을 복사하는 프로그램이다.

InputStream과 OutputStream을 이용해 작성해보았다.

InputStream 과 OutputStream는 한바이트씩 읽고 쓴다.
그렇기 때문이 이 코드를 직접 사용하기에는 성능면에서 문제가 있다.

만약 버퍼를 이용하면 성능을 높일 수 있게 된다.


(버퍼를 이용한 코드)



위처럼 1KB 버퍼를 이용해 옮기는 코드 모습이다.

그러면
InputStream을 이용해 정수형 int 자료형에 데이터를  담을 수 있을까?

스트림 데이터를 int 자료형으로 옮겨야하는데
그러기 위해서는
필터 스트림이 필요하다.

필터 스트림이란 스트림을 받아오는 과정에서 원하는 형태로 가공하기 위한 것이다.
말그대로 필터이다.

필터 스트림에는 InputStream이나 OutputStream의 기능은 없다.
필터이기 때문에 같이 사용하여야 한다.



(필터 스트림 적용)




(출력 화면)



위 코드는 필터 스트림을 적용한 코드이다.

그렇다면 이 코드 역시 버퍼를 적용 시킬 수 있지 않을까?



(버퍼를 적용한 코드)



위는 BufferedOutputStream 클래스를 이용해 버퍼를 이용한 코드이다.

OutputStream을 생성하고 그 참조변수를 BufferedOutputStream인자로 넘겨주고
그 인자를 DataOutputStream으로 연결해준다.

이 순서는 중요하다.

그러면 파일에 직접 입력을 해볼 것이다.

파일에 직접 입력하기 위해서는 문자스트림이 필요하다.
문자스트림은 다양한 운영체제에서도 똑같이 적용시키기 위해서
필요하다. 문자데이터를 입력받아 각 운영체제에 맞게 인코딩이 필요하기 때문이다.

- FileReader, FileWriter

클래스만 달라졌지 역할은 위에서 본것과 같다.

메모장에 입력하는 코드를 만들어보겠다.




(파일 입력 코드)






(출력 화면)



메모장에 문자가 입력된 것을 확인할 수 있다.

객체 또한 파일처럼 입력할 수 있다.

클래스 이름은
ObjectOutputStream , ObjectInputStream이다.
파일입력처럼 객체를 저장해 파일의 데이터처럼 꺼내서 사용할 수 있다.



(객체 입력)




(*참조 - 난 정말 JAVA를 공부한 적이 없다구요, 윤성우)




스니프( Sniff )
Packet sniffing
 - 남의 패킷을 가로채는 공격기법들
 - ARP Spoofing (ARP를 속여서 가로채는 것)
 = ARP Cache Poisoning 공격 기법

 - MITM ( Man In The Middle ) 중간자 공격

우리가 쓰고 있던 덤프 프로그램을 스니퍼 프로그램으로 만들어 보겠다.

우선 필요한건
1. 장치명을 매번 입력받는것
2. 원하는 패킷만을 보길 원한다.
  -> 소스코드를 수정하면서 확인했었다.
이다.

먼저, 실행인자를 이용해볼 것이다.
예를 들어



(ipconfig /all 옵션)



ipconfig 뒤에 붙는 옵션처럼
원하는 필터링의 옵션을 추가할 것이다.

스니핑 프로그램을 제대로 만들기 위해
먼저 패킷덤프 프로그램을 쓸모있게 만드는게 필요하다.

필요한 인자를 받아서 옵션을 만들것이다.
-> sys, optionparse  모듈이 파이썬에 이미 있다.
우리는 이것을 이용할 것이다.




(파이썬3의 optparse 모듈)



파이썬3의 optparse 모듈

인자를 받는 모듈을 이용해서
옵션을 5개 추가해 보았다.

옵션처리 방식(닉스계열 (유닉스, 리눅스))
#> python sniffer.py -t 192.168.3.88
       -p ARP    
       -s  (출발지 IP)
       -d (도착지 IP)

#> python sniffer.py --protocol ARP
       --target          (긴옵션)

* 필터링 룰을 넣어줄 것이다.
option
 -s : 출발지 ip 주소
 -d : 도착지 ip 주소
 -a : 출발지와 도착지 상관없이 필터링
 -p : 확인하고자 하는 프로토콜 타입
 -m : 동작모드(덤프/스니프)



(옵션 설정 코드)



(옵션이 입력된 것을 확인했다.)



-h 의 도움말 옵션까지 추가해 그럴싸한
프로그램으로 만들생각이다.



(usage를 추가하고 -h 인자를 추가한 코드)



(python test.py -h 를 입력하면 옵션이 나온다.)



우선
ARP 만 출력하는 모습을 보이겠다.

옵션 -p ARP 를 입력하면
ARP 만 나오게 하는 코드이다.



(옵션을 추가해서 조건을 걸은 코드)




(실행화면)



실행화면을 보면
ARP 패킷만 덤프되는  것을 확인 할 수 있었다.







어제 해본 공격으로 ARP Cache Poisoning이 있다.

오늘은 이 공격을 확장해 보겠다.


(확장된 공격)



이 코드는
보내는 사람의 소스 IP주소까지 변조하는 코드이다.
for문을 사용해서 192.168.3.0 부터 192.168.3.49 까지 한번에 쓰레기 값을 입력하는 것이다.


(공격받은 모습)




(공격받은 모습)


ARP 패킷을 하나씩만 보냈기 때문에 이 증상은 조금후 조금씩 회복된다.
하지만 while 문으로 꾸준하게 보내주게 되면
이 컴퓨터는 통신을 할 수 없는 상태에 빠지게 된다.

또 이것저것 바꿔보면서 실험해보았는데
이더넷 헤더의 맥주소는 바꿀 수 없었다.



(표시된 부분)


이더넷 헤더의 출발지 주소까지 변조하여 완전범죄를 꿈꾸었으나
이 헤더의 정보를 건드리면
컴퓨터에서 패킷이 전송되지 않는다.
우리는 ARP 데이터는 변조할 수 있다.

여기서 한가지 호기심이 더했다.

만약, 게이트웨이 ARP 테이블을 지금 위에서 한 확장된 ARP 캐쉬 Poisoning을 한다면
어떻게 될까??


(타겟의 IP주소를 게이트웨이 주소로 한 코드)


IP 주소 범우는 199까지 했다. 같은 네트워크에 200번 뒤도 있었지만
내 IP주소가 165번이었기 때문에 내 번호까지만 커버하는 IP 범위로 설정했다.



(공격 받은 후 상황)



게이트웨이로의 ping이 잘되다가 응답이 몇번 안된다.
하지만 이 현상은 오래 가지 않는다. (내가 while문으로 계속해서 돌리지 않았기 때문에)
내 컴퓨터는 게이트웨이의 주소를 ARP 과정을 거쳐 올바른 주소를 얻고
ping 메세지 아래 두개는 응답을 받은 것을 확인 할 수 있다.



(인터넷 멈춤 현상)



그리고 게이트웨이를 공격한 후에 인터넷 접속을 했더니 오래걸렸다.
이는 아까 위에서 본거 같이 ping메세지도 처음 두 메세지는 응답하지 못했지만
나중에 다시 ARP과정을 거쳐 메세지를 받았듯이
인터넷도 원래는 바로 켜졌는데, 시간이 조금 지난 후에 접속이 가능하였다.

여기서 만약 내가 while 문으로 계속 돌렸다면
네트워크는 동작하지 않았을 것이다.

또 위에서 확인해 보았듯이 이더넷 헤더는 변조가 안된다...
패킷을 덤프해서 확인해보니
내 맥주소가 나온다



(내 맥주소가 노출되는 상황)


만약 ARP 변조 공격을 당했다면, 혹은 탐지를 위해서는
패킷을 덤프해보면 확인 할 수 있다.
이더넷 헤더는 변조가 불가능하기 때문이다.


쓰레드란 프로그램의 흐름을 형성하는 것이다.

지금까지 우리는 main 메소드를 이용해 main 쓰레드 하나가지고 이요했다.

그 말은 하나의 프로세스만 돌렸다는 뜻이다.
쓰레드를 이용하면 여러개의 처리를 동시에 할 수 있다.

?
CPU가 하나인데 여러개의 프로세스를?
우리 운영체제는 보통 시분할 즉 시간을 나누어 프로세스에 분배한다.
우리 눈에는 동시에 일이 처리되는 듯 보이는 것이다.

쓰레드 생성 모습


(Thread를 상속받아 클래스를 만들었다.)




(쓰레드를 생성하고 시작.)




위 코드에서 보는 것과 같이 쓰레드를 이용하려면
Thread 라는 클래스를 상속받아야 한다.
또 Thread를 상속받은 클래스 내에서 run이라는 메소드를 오버라이드 해야한다.

이렇게 만든 클래스를 생성하여 .start()코드로
run() 메소드를 동작시킨다.

위 코드는 st1 클래스의 run과 st2클래스의 run이 동시에 돌아가는 것이다.

만약,
다른 클래스를 상속받는 클래스를 쓰레드로 이용하려면 어떻게해야할까?
위에서 봤듯이 쓰레드를 이용하려면 Thread를 상속받아야한다.
자바에서는 다중상속이 안되기 때문에 다른 방법이 필요하다.
바로 인터페이스로 구현하는 것이다.


(Runnable 인터페이스를 상속받는 코드)



위에서 보듯 Runnable 인터페이스를 상속 받으면 된다. 그리고 run() 을 꼭 채워줘야한다. start()함수로 run()이 실행되기 때문이다.





(생성한 클래스를 Thread 클래스의 인자로 넘긴다.)





위에서 보듯 Runnable 인터페이스를 상속받은 클래스는
실행하려면 결국 Thread 클래스로 돌아가야한다.
다중상속의 기능을 위해 우리는 Runnable 인터페이스를 상속시켜서
그 클래스 인자를 Thread 클래스의 인자로 넘겨서 사용했다.

쓰레드는 우선순위를 가지고 있다.
아래 코드를 실행시켜보면 우선순위에 대한 이해가 될 것이다.




(우선순위 확인 코드)



* 동기화
- 위에서 말했듯이 쓰레드는 각자 독립적으로 실행이된다.
그렇기 때문에 다른 애들이 어떻게 일하는지 신경안쓰고 혼자 신나게 동작한다.

하지만 코드를 작성하는 우리 입장에서는
쓰레드끼리 서로 합이 맞길 바란다.
아래 처럼


(비동기화된 코드)




(실행결과)



결과를 보면 실행 메인코드는 첨부하지 않았지만 300,000,000이 출력되야한다. 하지만 실행한 쓰레드들이 각자 동작하다보니 요상한 값이 출력된 것이다.

동기화 시키는 방법은 간단히 synchronized 메서드를 이용하면 된다.



(동기화 된 코드)





(실행 결과)





이렇게 동기화를 시켜주면
내가 원하는대로 쓰레드들이 합을 맞추어 올바른 결과를 내었다.

synchronized 함수는 여러가지 key를 가지고 돌아갈 수 있다.
다른 식으로 설명하자면 토큰식이라고 생각할 수 있다.
토큰이 돌고 돈다. 이 토큰을 가진 놈들만 일을 할 수 있는 것이다.
그렇기 때문에 synchronized로 동기화를 시켜줄 수 있는 것이다.

이 토큰을 늘릴 수 있는데 Object를 하나 더 이용하는 것이다.



(두개의 키를 이용한 코드)



혹은 쓰레드들을 서로 기다리고 이제 왔으니 일어나라는 등의 명령을 내려줄 수 있다.



(notifyAll 코드)




notifyAll 구문으로 기다리고 있던 다른 쓰레드들을 부를 수 있다.
혹은
wait() 구문으로 다른 애들이 부르기 전까지 기다리는 구문도 있다.

이런 식으로 쓰레드들을 정교하게 동기화 시킬 수도 있다.

(*참조 - 난  정말 JAVA를 공부한 적이 없다구요, 윤성우)





오늘은 지금까지 분석해왔던 패킷을 직접 만들어볼 것이다.

오늘은 L2 계층의 패킷을 만들어볼 것이다.

대표적인 ARP 패킷을 만들것이다.

ARP패킷에 들어가는 내용은
이더넷 헤더(14바이트), ARP 헤더(28바이트) -> 총 42바이트가 들어간다.

먼저
패킷을 만드는 코드를 짜야된다.


(패킷 생성 코드)



가운데 주석 표시해 둔 곳에
내용에 맞는 패킷을 작성하면 된다.


(패킷 내용을 작성한 코드)



(실행해서 덤프받은 화면)



위 화면은 ARP 패킷을 전송한 것을 덤프받아서 확인한 결과이다.

아래 바로 ARP 응답 패킷또한 확인 할 수 있다.
ARP 응답은 Operation이 2이다.


ARP 패킷을 만들어서 전송하면서 발견한 취약점.

* ARP 패킷을 받으면 그 받은 host는 그 내용을 무조건 신뢰하며
그 데이터에 따라 자기 캐쉬 테이블을 업데이트한다.

우리가 패킷 내용을 작성해서 보냈지만,
솔직하게 데이터를 쓰지 않을 수도 있는것 아닐까?
그렇게 되면 상대 host의 ARP 테이블은 어떻게 될까?



(나의 맥주소를 77:77:77:77:77:77 이라고 속인 코드)



이렇게 ARP 패킷을 스푸핑했다.
스푸핑 -> 속이다.

옆 사람이 내 컴퓨터로 ARP 패킷을 조작해서 보낸 결과는 다음과 같다.



(아래에 192.168.3.239 주소 맥주소)



192.168.3.239의 맥주소를 보면 이상하다.
aa-bb-cc-dd-ee-ff 라니?...

게다가 하면서 더 요상한걸 발견했다.

ARP 패킷을 보내는데
IP주소도 변조해서 보낸다면?...



(엉망이된 나의 ARP 테이블)



위 화면을 보면 요상한 맥주소들이 등록되어있다.
이 경우 아주 착하게도 맥주소가 잘못된것을 바로 알기 쉽지만
보통 일반적인쓰레기맥주소를 입력한다면 구별하기 힘들것이다.

또 이로 인해 네트워크 통신에 문제가 생길 수 있다.

바로 이렇게 ARP 테이블을 망쳐놓는다 해서
이 공격이름은 ARP Cache Poisoning 이라고 한다.





자바에서 컬렉션 프레임워크란
프로그래밍시 유용한 자료구조나 알고리즘을 클래스와 메서드로 정리해 둔것이다.

자료구조로는 대표적으로
배열, 리스트, 스택, 큐, 트리, 해시

알고리즘 몇가지로는
정렬, 탐색, 최대 최소검색이 있다.

리스트표현과 유용한 메서드들을 정리해둔 예를 보자.

(리스트 표현)


< > 표시는 어제 확인한 제네릭이다.
또 리스트는 배열로 만들 수 있고, 연결리스트(LinkedList)로 만들 수 있다.

위 코드는 배열을 이용한 리스트이다.
자세한 자료구조 내용은 언급하지 않겠다.
(필요시 검색해보면 많이 나온다.)




(리스트에 정수를 추가하는 코드)


보면 Integer Wrapper 클래스를 이용한다.


(get() 메서드)



리스트에서 제공하는 get 메서드는 () 괄호 안의 인덱스에 있는 데이터를 얻을 수 있다.




(결과 모습)


배열을 이용하지 않는
연결리스트 표현도 가능하다.

아래는 LinkedList 의 표현코드이다.



(연결리스트 코드)


위 코드를 보면
Iterator 라는 놈이 나왔다.
이 Iterator 라는 놈은 Interface이다.
반복하는 경우에 생성해서 이용하면 좋은 메서드들이 많다.

위 코드에서 보는 것처럼 .hasNext() 함수는 다음에 값이 있는지 확인하는 boolean 반환 메서드이고
next() 는 다음 값으로 넘어가는 함수이다.

*Hash Set
해쉬 알고리즘을 이용하는 집합단위이다.
먼저
코드를 보면




(HashSet 사용 코드)



(실행화면)



실행 화면에 보듯이 해쉬집합은
순서대로 입력되지 않는다.
순서는 신경쓰지않고 저장한다. 또 동일한 값은 저장하지 않는다.

해쉬에 관한 자세한 내용은 언급하지 않겠다.
(자료구조에 관한 내용은 알고있으리라 가정하고 넘어가겠습니다.)



(해쉬 집합)




(실행화면)



화면을 보면 중복된 데이터들은 빠져있는 것을 확인 할 수 있다.


자료구조 트리를 이용한 집합이 있다.
TreeSet이다.



(TreeSet 사용 코드)



(실행화면)



실행화면을 보면 값이 정렬되어 저장되어있음을 확인 할 수 있다.

오름차순인지 내림차순인지 기준은 각자 다르지만
확실한건 숫자의 크기로 순서가 정해져 있다는 것은 분명하다.

그러면 이 순서를 역순으로 하는 방법이 있을까?
-> 반복자 Iterator를 바꿔준다. ( descendingIterator() 함수로 )


(역순, 실행화면)



* TreeMap
Map이란 key-value 방식의 저장방법이다.
트리라는 자료구조로 저장한다. 즉, 크기비교하여 순서있게 저장한다.

아래는 사용 예시이다. 입력을 보면 key와 value가 들어가는 것을 확인할 수 있다.



(TreeMap 사용 코드)



(실행 화면)



실행 화면을 보면 트리의 특성처럼
순서가 있게 저장된것을 확인 할 수 있다.

* 전화번호관리 프로그램 07 단계

-> Ver 07에서는
이러한 프레임워크를 이용한다.
자료구조를 이용해 자료를 관리한다.
해쉬를 이용해 검색기능을 향상 시켰고, 중복된 값은 저장받지 않도록 향상했다.

캡쳐 화면은 다음 08단계에서 한번에 보이겠다.

(*참조 - 난 정말 JAVA를 공부한 적이 없다구요, 윤성우)



+ Recent posts