# 다형성


나는 게임을 못한다.

가끔씩 LOL을 하는데

너무나 쉽게 내 행동을 간파당해서

라인전이 망하고 한타에서도 진다.

그렇다고 오버워치를 하면 

딜러가 힐러보다 딜을 못하는 상황을 만들어낸다.

네 그렇습니다.

LOL, 오버워치 모두 실버유저입니다.

ㅠㅠ

그래서 가끔 게임이 하기 싫어질 때가 있는데

그럴때마다 하는 게임이 있다.

바로!!!!

추억의 게임인 포켓몬스터 골드버전!!!!



이 게임의 두가지 특징이 얘기해보려 한다.


첫번째

포켓몬은 몬스터볼로 잡을 수 있어서

컴퓨터와 싸움을 하면

포켓몬들은 모두 몬스터볼에서 나온다.


두번째

골드버전은 이전버전과 다르게

포켓몬에게 아이템을 소지할 수 있다.

아이템에 따라 포켓몬에게 적용되는 효과가 달라진다.



이 두가지 특징이 다형성과 연결된다.

다형성다양한 형태를 가질 수 있는 특징을 말한다.


어디서 많이 들어봤던

오버라이딩과 오버로딩이 바로 다형성의 예이다.


<오버라이딩>


먼저, 오버라이딩은 상위 클래스가 가지고 있는 메소드를

하위 클래스가 재정의 해서 사용한다는 것이다.


몬스터볼이라는 상위 클래스를 상속받아

모든 포켓몬스터를 몬스터볼로 꺼내고 돌아오게 할 수 있다.

 예를 들어 다음의 코드와 같다.


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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
public class PocketMonster {
 
    public static void main(String[] args){
 
        //포켓몬 만들기?!
        MonsterBall pikachu = new Pikachu();
        MonsterBall yadon = new Yadon();
 
        //피카츄 꺼내기
        pikachu.getout();
        //피카츄 불러들이기
        pikachu.comeback();
 
        //야돈 꺼내기
        yadon.getout();
        //야돈 불러들이기
        yadon.comeback();
 
    }
 
    static class MonsterBall{
 
        public void getout(){
            System.out.println("포켓몬 꺼내기");
        }
 
        public void comeback(){
            System.out.println("포켓몬 불러들이기");
        }
 
    }
 
    static class Pikachu extends MonsterBall {
 
        @Override
        public void getout() {
            System.out.println("피카츄 꺼내기");
        }
 
        @Override
        public void comeback() {
            System.out.println("피카츄 불러들이기");
        }
    }
 
    static class Yadon extends MonsterBall{
 
        @Override
        public void getout() {
            System.out.println("야돈 꺼내기");
        }
 
        @Override
        public void comeback() {
            System.out.println("야돈 불러들이기");
        }
    }
 
}
 
cs


피카츄와 야돈은 모두 몬스터볼(부모 클래스)를 상속받는다.

둘 모두 몬스터볼의 메소드를 사용할 수 있고

각자에 맞게 바꿀 수도 있다.


몬스터볼을 가지고

피카츄를 내보낼 수 있고

야돈을 내보낼 수 있다.


겉모습은 몬스터볼인데

피카츄, 야돈을 모두 생성(?!)할 수 있는

다형성의 예이다.


<오버로딩>


오버로딩은 하나의 클래스에서 같은 이름의 메소드가 있지만

파라미터에 따라 다르게 동작한다.


포켓몬에게 아이템을 소지할 수 있는데

아이템에 따라 다른 효과를 적용할 수 있다.

 예를 들어 다음의 코드와 같다.


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
26
27
28
29
public class PocketMonster {
 
    public static void main(String[] args) {
        
        //꼬부기 생성?!
        Kkobugi kkobugi = new Kkobugi();
 
        kkobugi.item(new HappyEgg());
        kkobugi.item(new LearningDevice());
    }
 
    public static class Kkobugi{
 
        public void item(HappyEgg happyEgg){
            System.out.println("지닌 포켓몬이 받는 경험치의 양을 1.5배로 상승시킵니다.");
        }
 
        public void item(LearningDevice learningDevice){
            System.out.println("배틀에 나간 포켓몬과 경험치를 나눠 받을 수 있습니다.");
        }
    }
 
    //행복의알
    public static class HappyEgg{ }
    //학습장치
    public static class LearningDevice{ }
 
}
 
cs


아이템이라는 메소드 이름은 동일하지만

꼬부기에게 어떤 아이템을 주느냐에 따라

효과가 달라지는 것을 볼 수 있다.


같은 이름의 메소드에서

어떤 파라미터를 주느냐에 따라

다른 결과를 나타낼 수 있는 다형성의 예이다.



다형성이 있다면 코드를 편하게 짤 수 있다.

새로운 포켓몬을 등록할 때

몬스터볼의 기능인 넣었다 뺐다하는 기능을

포켓몬에게 일일히 다 써줄 필요가 없고

그냥 몬스터볼을 상속만 시켜주면

몬스터볼의 기능을 사용할 수 있다.


이처럼 다형성을 이용한다면 개발의 효율성을 높일 수 있다.


To be continued.........




Made by 꿩

'IT > Java' 카테고리의 다른 글

Spring Boot와 JSP  (0) 2019.08.02
추상클래스와 인터페이스  (0) 2018.11.11
object vs instance vs class  (3) 2018.10.24

# MIME 타입



내 PC에는 무수히 많은 종류의 파일들이 있다.

이 파일을 구분하는 것은 바로 확장자이다.

.jpg .txt .pdf .mp4 .avi 등의 확장자로 파일이 구분되어 있고

 해당 확장자에 맞는 프로그램으로 파일을 열 수 있다.


그렇다면 웹에서는 어떨까?

웹에서는 확장자로 파일을 구분하지는 못한다.

그 대신 MIME 타입을 알려주면 어떤 종류의 파일인지 인식할 수 있다.

그래서 웹에서 데이터를 전송하는 경우

꼭 MIME 타입을 명시해야 한다.


MIME은 Multipurpose Internet Mail Extension으로

다목적 전자우편 확장이라 한다.

전자우편으로 다양한 파일을 보낸다고 생각할 수 있다.


기존의 인코딩 방식으로는 파일의 종류를 알 수 없었지만

문서, 이미지, 동영상 등의 파일도 전송하기 위해

새로운 인코딩 방식인 MIME이 생겼다.

(전자우편에 사용하기 위해 등장했지만 HTTP 통신간 전송 데이터 종류를 알리는 용도로도 쓰인다)


MIME 타입은 여러가지 형태가 있다.

MIME 타입의 형식은 가운데 슬래시(/)가 있고

슬래시 앞에는 파일 종류가 뒤에는 파일 포맷으로 되어있다.



MIME 타입의 종류는 다음과 같다.


파일종류

설명 

MIME 타입

text

텍스트

 text/plain, text/html, text/css, text/javascript

image

이미지

 image/gif, image/png, image/jpeg, image/bmp

video

동영상

video/mp4, video/ogg, video/webm

 audio

오디오

 audio/midi, audio/mpeg, audio/webm, audio/ogg, audio/wav

 application

이진 데이터

 application/octet-stream, application/vnd.mspowerpoint, application/xml,  application/pdf, application/json

multi-data

동시전송

multipart/form-data, multipart/byteranges 



(참고)

https://ko.wikipedia.org/wiki/MIME

https://dololak.tistory.com/130 

https://www.iana.org/assignments/media-types/media-types.xhtml

http://www.emh.co.kr/content.pl?mime

      


To be continued.........




Made by 꿩

'IT > ' 카테고리의 다른 글

URI? URL? URN?  (0) 2018.10.27

URI? URL? URN?


보통 인터넷 주소라 하면 URL이라고 많이 알고 있다.

나또한 다른 사람들과와 다르지 않았으나

URI, URL, URN

이 세 종류가 있다는 것을 알게 되었다.

wiki를 참고하자면

URL : Uniform Resource Locator

URN : Uniform Resource Name

URI : Uniform Resource Identifier


우선 공통적인 단어인 Uniform Resource는 정형화 된 자원이라고 해석하고

나머지 단어들이 각각 다르다.


Identifier, Locator, Name

식별자  / 장소  /  이름


URI는 식별자이다.

식별자는 글자로 인터넷 상의 자원을 식별해주는 것으로 생각하면 된다.


URI는 URL과 URN의 상위 개념인데

URI = URL + URN

이라고 생각하면 된다.


URI를 설명하기 전에

URL과 URN의 차이점을 설명해보는 게 나을 것 같다.


URL은 장소, 위치를 나타낸다.

내가 어느 장소로 가면 원하는 자원이 있다는 말이다.


반면에, URN은 이름을 나타낸다.

자원의 고유한 이름(ex) 주민번호 등...)을 나타내는 것이다.


자원을 식별할 때는

장소로 식별할 수도 있고

이름으로 식별할 수도 있다.


즉, URI(식별자)는 URL(장소)와 URN(이름)을 포함한다.


예를 들어 내가 말하는 포켓몬 냐옹이를 찾고 있다고 가정하자

여러 포켓몬 중 말하는 냐옹이는 한 마리이다.

냐옹이가 태초마을에 살고 있다면

태초마을이라는 위치에서 찾을 수 있고

말하는 냐옹이의 등록번호(말하는 냐옹이의 고유한 등록번호)를 가지고 찾을 수 있다.


여기서 태초마을은 URL이라 할 수 있고

등록번호가 URN이라 할 수 있다.

그리고 말하는 냐옹이라는 포켓몬을 식별해주는 태초마을, 등록번호를 모두 URI라고도 말할 수 있다.



To be continued.........




Made by 꿩

'IT > ' 카테고리의 다른 글

MIME 타입  (0) 2018.10.28

# XSS

XSS는 Cross-site Scripting의 약자인데 웹사이트 공격방법 중 기초적인 것에 해당된다.

XSS공격은 웹사이트에 스크립트 코드를 주입시키는 방법인데

html코드를 해석하지 않게 만들면 간단히 방어할 수 있다.


높은 이해를 위해 예시를 들어보자.

XSS 보안에 취약한 게시판이 있다고 보자.


게시판에 글을 등록을 할 때 다음과 같이 스크립트 코드를 집어 넣어 보았다.



이제 게시판에 다시 들어가 보면



자바스크립트 코드가 실행된 것을 볼 수 있다.

이러한 자바스크립트 코드를 실행을 막으려면

EL 밖에 <c:out value=' '/>태그를 씌워서

 자바스크립트 태그가 실행되지 않게 만들고

 글자 그대로 출력되게 하면 된다.



<c:out value='${값}'/>에는 디폴트로 escapeXml옵션이 true로 되어있어

출력 문자열에 HTML 특수문자(예: <, >, &, ' 또는 ") 포함되어 있을 경우

HTML을 해석하지 않고 그대로 출력되도록 해준다.

혹시나 <c:out value=' ${값}' escapeXml = false />로 입력하면

HTML 코드를 그대로 해석해서 내보내주기 때문에 주의할 필요가 있다.


XSS보안을 방어한 게시판은 다음과 같이

자바스크립트 코드가 그대로 출력되어 나온다.



예시를 위해 단순한 alert창을 띄었지만

쿠키에 들어있는 개인정보를 전송하거나

엉뚱한 곳으로 접속하게 만드는 등

악성코드가 심어져 있다면

문제를 일으킬 수 있다.

그러나 이 방법은 워낙 기초적인 거라 대부분 웹사이트들이 막았기에 걱정하지 않아도 된다.



To be continued.........




Made by 꿩

'IT > 보안' 카테고리의 다른 글

[방화벽] 인바운드 & 아웃바운드  (0) 2022.01.31
[Spring] Google reCAPTCHA v3  (6) 2019.07.07
OAuth  (0) 2019.06.17
SSL인증서  (0) 2019.03.21
CSRF  (0) 2018.12.25

# Object  vs Instance vs Class

Java를 처음 공부하면서 객체지향의 원리가 이해가 가지 않았다.

특히, 객체와 인스턴스의 차이는 도저히....

알고보니

클래스는 붕어빵 틀

인스턴스는 붕어빵

객체는 붕어빵이라는 음식이었다.


<클래스>

내가 붕어빵을 만든다고 가정하자.

붕어빵을 만들려면 역시나 붕어빵 틀은 필수템이다.

이것만 있으면 붕어빵을 쉽게 여러개 만들 수 있다.

클래스도 마찬가지이다.

클래스는 붕어빵 틀처럼 설계도라고 생각하면 된다.

설계도 하나로 대량생산을 하는 것처럼

클래스 안에 만들고자 하는 것에 대한 정보를 넣고 객체를 대량생산 하는 것이다.


<인스턴스 & 객체>

클래스는 쉽게 이해가 갔지만 문제는 인스턴스와 객체의 차이가 너무 모호했다.


보통 붕어빵 틀로 붕어빵을 만든다.

붕어빵 틀로 만들어낸 붕어빵을 인스턴스라 하고

객체는 그저 붕어빵을 가리키는 것일 뿐이다.


이 설명만 들어서는 조금 헷갈릴 수 있다.

" 아 붕어빵 먹고싶다."라고 말할 때

붕어빵은 붕어빵을 가리킨다.

이것을 객체라 한다.


인스턴스는 단순히 붕어빵 틀로 붕어빵을 만들어 냈을 때

이 붕어빵을 인스턴스라 한다.

즉, 메모리에 적재된 것을 인스턴스라 하고

객체는 그냥 그것을 가리키는 것이라 생각하면 된다.




To be continued.........




Made by 꿩


'IT > Java' 카테고리의 다른 글

Spring Boot와 JSP  (0) 2019.08.02
추상클래스와 인터페이스  (0) 2018.11.11
다형성  (0) 2018.11.03

+ Recent posts