개인 자료란 (JE)

  서버 커뮤니티

Profile 스크립터브혼 스크립트 전문가

Vhone dc73ee51d49946dabf4f634c6e3ce5c6

Profile

강좌 자바 에디션(JE) 플러그인 개발

Item 타입과 ItemType 타입의 차이

2021.06.01 조회 수 2058 추천 수 0
분야 스크립트 
게임버전 모든버전 
API 스피곳, 페이퍼 
자료글 https://github.com/SkriptLang/Skript 

Item과 ItemType의 차이

스크립트를 처음 배우거나 어느정도 다를 줄 아는 분들도 Item과 ItemType의 차이를 잘 모르시는 분들이 많을겁니다.

이 개념은 플러그인(자바)에는 없는 스크립트만의 고유한 개념인데요.


스크립트에서는 두 타입을 이렇게 설명합니다

Item은 결정된 하나의 데이터 타입으로 한개의 데이터를 의미한다.

ItemType은 결정되지 않은 데이터 타입으로 넓은 범위의 데이터를 의미한다.


설명만 보면 잘 이해가 되지 않는데 몇가지 예문들 통해 그 차이를 알아보도록 하겠습니다.



비교 순서만 바꾸었을 뿐인데


# 세팅
set {_i.1} to red wool block named "빨간색 양모"
set {_i.2} to red wool block

# 1
{_i.1} is red wool block

# 2
{_i.1} is {_i.2}

# 3
{_i.2} is {_i.1}

1~3번의 조건문에서 각각 어떤 결과가 나올까요?


{_i.1} 변수에는 이름을 지정한 빨간색 양모 블록을 저장했고

{_i.2} 변수에는 그냥 빨간색 양모 블록만 저장했습니다.


1번은 '같다'가 나옵니다.

빨간색 양모 블록에 이름만 지정했기 때문에 빨간색 양모 블록과 같은 걸까요?

이름을 지정한 빨간색 양모 블록은 Item 입니다.

스크립트에 정의된 aliases를 그대로 쓴 red wool block은 ItemType 입니다.


위에서 정의했듯이 ItemType은 넓은 범위의 데이터를 의미한다고 했습니다.

red wool block은 모든 종류의 빨간색 양털 블록을 의미합니다.

그렇기 때문에 이름이 정해진 블록이라할 지라도 같다고 나오죠.


2번도 '같다'가 나옵니다.

1번과 마찬가지로 ItemType을 변수에 저장한 것이기 때문에 같다고 나옵니다.


 3번은 '다르다'가 나옵니다.

그런데 3번은 다르다고 나옵니다. 그냥 비교 순서만 바꿨을 뿐인데 말이죠.

앞서 말했듯이 ItemType은 범위의 데이터를 의미하기 때문에

한개의 데이터를 의미하는 Item은 ItemType과 같을 수 없습니다.

좀 더 명확하게는 Item은 ItemType을 포함할 수 없다는 거죠.




어떤것이 Item이고 어떤것이 ItemType일까?

스크립트에서 'red wool block'이라고 aliases를 적으면 그것은 ItemType입니다. 모든 aliases는 ItemType입니다.

그러나 [Named Item], [Enchant Item]와 같이 메타를 추가하는 모든 익스프레션은 Item을 반환합니다.

그렇기 때문에 이름을 가진 빨간 양모 블록은 Item이 된 것입니다.


스크립트가 어렵다고 느껴지는 이유는 명확한 타입 비교를 하지 않기 때문입니다.

스크립트는 같은 일을 하는 코드도 여러개의 패턴을 가지고 있고, 패턴에 사용되는 타입 역시 여러 타입이 혼용될 수 있습니다.

까다로운 타입 비교를 하는 자바에 비해서 느슨한 타입 비교를 한다는 것이죠.


예를 들어 아래와 같은 코드입니다.

바로 위에 링크한 Named Item이나 Enchant Item의 패턴을 보면 ItemType이 필요하다고 명시되어있습니다.

그리고 익스프레션을 사용한 {_i.1} 변수는 명확히 Item이라는 것을 알고 있죠.

{_i.1} 변수를 ItemType으로 사용하면 어떻게 될까요.

set {_i.3} to {_i.1} named "양모로 양모를"

{_i.3} 변수도 {_i.1} 변수와 마찬가지로 "양모로 양모를"이라는 이름을 가진 빨간색 양모 블럭이 됩니다.


ItemType이 필요한 패턴에서 Item을 사용했는데도 불구하고 정상적으로 동작을 하죠.

스크립트는 데이터의 타입을 패턴에 맞게끔 변경하여 동작하게 되어있습니다.

Item이라 할지라도 패턴에서 ItemType이 필요하다면 변경하여 동작하죠.

이러한 느슨한 타입 비교 방식을 사용하기 때문에 이것을 이해하지 못한 유저들은 복잡하고 어렵게 느끼게 됩니다.




그래서 ItemType이 정확히 뭔데?

단 하나의 값을 의미하는 Item은 앞서 말했듯이 익스프레션을 사용한 값입니다.

특정 슬롯에 있는 아이템이라던지, 플레이어의 손에 있는 아이템, 인벤토리에 있는 아이템, 땅에 떨어진 아이템 등등

익스프레션을 통해 얻을 수 있는 모든 아이템 데이터는 Item입니다.


반대로 스크립트에서 정의한 Aliases의 값은 모두 ItemType입니다.

스크립트의 aliases 옵션으로 정의한 것도 모두 ItemType이죠.


aliases 옵션의 예제를 하나 보시죠.

aliases:
    wood_sign = minecraft:acacia_sign, minecraft:birch_sign, minecraft:dark_oak_sign, minecraft:jungle_sign, minecraft:oak_sign, minecraft:spruce_sign
    wood_door = minecraft:acacia_door, minecraft:birch_door, minecraft:dark_oak_door, minecraft:jungle_door, minecraft:oak_door, minecraft:spruce_door
    wood_tool = minecraft:wooden_sword, minecraft:wooden_shovel, minecraft:wooden_pickaxe, minecraft:wooden_axe, minecraft:wooden_hoe

    fuel_1 = wood_sign, wood_door, wood_tool

wood_sign, wood_door, wood_tool 이 세가지 모두 여러개의 아이템을 포함합니다. 범위를 가지는 ItemType이라는 의미죠.

wood_sign는 모든 표지판을, wood_door는 모든 나무문을, wood_tool는 모든 나무도구를 의미합니다.

그리고 나서 fuel_1이 그 모든 것들을 포함합니다.


wood_sign을 메세지로 출력하면 아래처럼 나옵니다.

acacia wood slab, birch wood slab, dark oak wood slab, jungle wood slab, oak wood slab or spruce wood slab

이것을 보니 ItemType이 무엇인지 아시겠나요?

ItemType은 다른 ItemType들과 or로 묶일 수 있습니다.

이것과 마찬가지로 하나의 ItemType은 여러개의 Item을 의미합니다.




요약

1. Item은 명확한 한개의 데이터를 의미한다.

2. ItemType은 넓은 범위의 데이터를 의미한다.

3. 넓은 범위란 OR 연산을 이용한 비교로써 일부만 같아도 '같다'를 반환한다.

4. ItemType이 Item을 포괄한다고 볼 수 있다.


* 예를들어 ItemType으로 인벤토리의 아이템 개수를 세면 메타데이터와 상관없이 모든 종류가 찾아진다.

* 완전히 일치하는 아이템을 찾기위해선 Item으로 비교하여 개수를 세야 한다.




2개의 댓글

A_bins
2021.06.08

자바나 코틀린으로 따지자면 ItemType은 Material의 enum Class를 말하는거고 Item은 ItemStack을 의미 하는거 같네요! ItemStack은 하나하나가 객체값을 가지고 있어서 이런식으로 비교할 순 없고 ItemStack.getType(), ItemStack.type 으로 비교 가능한데 이러한 점에서는 스크립트가 조금 모호한 점이 있는거 같네욘

스크립터브혼
2021.06.10
@A_bins

Type of 익스프레션으로 Item을 ItemType으로 변환 할 수 있는데, 이 변환으로 탈락하는 메타데이터는 이름과 로어 뿐입니다.

커스텀 모델데이터, 어트리뷰트, 플래그 같은값은 ItemType도 가질 수 있다는 의미인데요. 이 부분이 좀 애매하죠.

 

또, aliases를 정의할때 NBT 태그를 사용할 수 있어서 ItemType의 메타데이터에 기본값을 넣을 수 있습니다.

이런 ItemType은 Item과 비교할 때 자신이 가지고 있는 메타데이터까지 일치하는지 확인합니다.

 

이런점에서 스크립트의 ItemType은 Material과는 조금 다르다고 할 수 있죠.

스크립트의 소스를 직접 확인해본 것은 아니라서 어떻게 구현되어 있는지는 잘 모르겠습니다.

어찌보면 장점이기도하고, 배우는 사람입장에서는 참 난해한 개념인것 같아요.

뉴스 및 창작물
/files/thumbnails/766/636/003/262x150.crop.jpg?20231123013340

레드스톤

장충동 왕족발 보쌈을 노트블럭으로 (저퀄주의) 2

겜웅이

2023-11-23

3

/files/thumbnails/934/632/003/262x150.crop.jpg?20231121193420

업데이트

마인크래프트 자바 에디션 스냅샷 23w46a

학교가기싫다

2023-11-21

0

/files/thumbnails/911/626/003/262x150.crop.jpg?20231109201118

업데이트

마인크래프트 자바 에디션 스냅샷 23w45a

학교가기싫다

2023-11-09

0

/files/thumbnails/324/622/003/262x150.crop.jpg?20231102211248

스킨

[Sem;colon] 게임 캐릭터 스킨 합작 (스킨배포링크O)

RePl

2023-11-02

1

/files/thumbnails/176/622/003/262x150.crop.jpg?20231102204644

업데이트

마인크래프트 자바 에디션 스냅샷 23w44a

학교가기싫다

2023-11-02

2

/files/thumbnails/897/620/003/262x150.crop.jpg?20231031013405

레드스톤

마인크래프트 노트블럭으로 만든 『 사랑은 혼돈의 노예 』 2

Sonttukk

2023-10-31

4

/files/thumbnails/858/619/003/262x150.crop.jpg?20231029192328

독도 1

GlassesFilm

2023-10-29

3