본 아티클은 UI 및 간단한 VFX 제작에 도움이 될만한 Graphics 에 대한 이해를 돕기 위해 작성했습니다.


아직 한참 공부가 필요한 입장에서 이런 글을 쓰는 것이 혹여나 잘못된 정보를 퍼뜨리지 않을까 불안합니다만.

많은 분들이 게임 그래픽을 쉽게 이해하는데 도움이 되길 바라는 마음으로 작성해봅니다.

혹시 잘못된 부분 지적해주시면 고치도록 하겠습니다.


추후에 실제 Shader Code 작성 및 VFX 제작을 위한 튜토리얼도

시간님이 허락하신다면... 제작해보도록 하겠습니다.


매끄러운 전달을 위해 반말로 작성된 점 양해부탁드립니다.

문의 사항은 포스팅에 댓글로 적어주시면 최대한 답변 드리겠습니다.


감사합니다. :D





3편 - UV 응용 및 결론



똑똑한 독자들의 목소리가 들리는듯 하다.


"이 UV 이미지를 왜곡 시키면 신박한 결과가 나오지 않을까?"


그러하다.

아래의 예시들을 살펴보도록 하자.




[ 둥근 띠 모양으로 수정된 UV map 에 Texture 를 흘렸을 때 ]




[ Stripe 같은 형태로 수정된 UV Map 에 Texture 를 흘렸을 때 ]




[ 포토샵에서 Smudge Tool로 문지른 UV Map 에 Texture 를 흘렸을 때 ]



각 예시들을 살펴보면, 형태와 무관하게 UV의 좌표값 (색상) 에 따라 텍스쳐가 움직이는 것을 확인할 수 있다.


Graphics 에 대해 잘 모를 경우, "이미지가 움직인다" 고 착각하기 쉽다. (내가 그랬었다)

하지만 이것보다는 "각각의 픽셀이 다른 이미지를 표현한다" 고 하는 것이 더 정확하다고 할 수 있겠다.




["픽셀화" 를 몸소 보여주는 북녘의 마스 게임] 



위 이미지에서도 판넬을 든 사람들이 뛰어가는 것이 아니라,

한 위치에 고정된 사람들이 순차적으로 다른 판넬을 들어 이미지가 움직이는 것처럼 보이는 것을 알 수 있다.


자 이제 결론이 코 앞이다. 조금만 힘내자.



《!》 어떻게 하면 폴리곤 하나로 구체를 만들 수 있을까? 《!》



여기까지 성실하게 읽었다면, 이 뒤는 알아서 잘 할 수 있을 것이다.

그럼 이만..




[ 이제 굳이 더 설명안해도 다 알지 않으세요? 쉽죠? 쉽잖아. 네? 그죠? ]

.

.

.


사실 똑똑한 독자들은 이미 다 이해하고 지루해하고 있겠지만,

혹시라도 아직 이해를 못하고 있을 고냥이들을 위해 설명을 덧붙여본다.


셰이더로 특정한 효과를 구현하고자 할 때는,

만들고자 하는 결과물을 논리적으로 정의하는 과정이 중요하다.


( ※ 느낌적인 느낌을 좋아하는 아티스트들이 가장 힘들어하는 부분이다 )


그렇다면, 아래의 이미지를 통해 《구체로 보여지기 위한》 특성을 정의해보자.



1. 구체의 형태에 따라 수평으로 왜곡된다.

2. 구체의 형태에 따라 수직으로 왜곡된다.

3. 원형으로 된 영역 내부에만 이미지가 표시된다.



정리하자면, 수평으로 왜곡되는 좌표 값을 X 값에, 수직으로 왜곡되는 좌표 값을 Y 값에 넣어주면 된다.

UV 이미지로 표현하면 아래와 같다.


[ R + G = UV ] 


자, 이제 위의 이미지를 UV 좌표 값으로 사용했을 때의 모습을 살펴보자!



[ 쨘! ]


이 아름다운 구체의 모습이 보이는가.

하지만 뭔가 이상하다.. 구체를 제외한 바깥 부분이 이상하게 반짝거린다.


왜 구체 바깥 부분에도 색상이 찍히는 걸까?



[ 혹시 '이 부분은 검은색이니 색상이 없는게 아닌가?!' 라고 생각했나? ]




[ 닝겐이여... ]



앞서 살펴봤듯이, 검은색 부분도 (0, 0) 의 좌표값에 있는 텍스쳐를 읽어들인다.

그래서 검은색 부분이 전체적으로 같은 색상으로 변화하는 것이다.


그렇다면 구체 영역 내부만 마스킹을 해야할텐데,

이미지는 R, G, B 세 개의 채널로 이루어져있다는 것을 알고있는가?


그렇다. 우리에겐 아직 B 채널이 남아있다...


B 채널을 소중히 꺼내서 흰 원을 그려넣어주자.

그러면 UV 이미지는 아래와 같이 한층 더 영롱해진다.

[ X (R) + Y (G) + Z (B) ]



위에서 얻었던 결과물의 알파채널에 B 채널을 입력해주면,

아래와 같이 구체를 제외한 부분은 깔끔하게 사라진다.




[ 야호! 깔끔하다! ]


( ※ 알파 채널에서 불투명한 부분은 1 의 값을, 투명한 부분은 0 의 값을 가진다. 

그러므로 알파 채널에 B 채널을 입력하면 흰색 부분은 불투명하게 보이고, 검은색 부분은 투명하게 되는 것이다 )



Quad 하나로 수백개의 폴리곤을 절약했다!!

물론, Vertex Shader 에서 추가적인 연산을 할 경우 자원이 더 들어가지만 상황에 따라 때 충분히 사용해봄직한 기술이다.


한가지 주의할 점은, UV 좌표 를 연산할 때와 비교하면

Image 는 정확도가 떨어지기 때문에 충분히 큰 이미지를 사용하지 않으면 노이즈가 발생한다. 


( ※ 하지만 멀리서 빨리 돌리면 안보이지롱 )


평면인 관계로 UI VFX 에 활용해도 좋고,

Billboard로 사용시에는 World map 에도 충분히 사용할 수 있다.



[ 파티클 시스템에 적용해서 Billboard 로 보여지는 이미지 ]




여기까지다.

여기서 이해한 내용을 잘 응용해서 좋은 작품을 만들어내길 기원한다.


언젠가 개발자에게 당당하게 



"되던뒈여?!!?!?" 



라고 외칠 수 있는 그 날이 오기를..





너무 기초적인 내용이라 좀 지루했을 수도 있을텐데, 끝까지 읽어줘서 넘나 감사합니다.

이런 글을 써보는건 처음이라 좀 매끄럽지 못한 부분도 있을텐데 양해 부탁드려요. ㅎㅎ


글에서 다뤘던 결과를 제대로 만들기 위해서는 Graphics 에 대한 이해와 더불어

3d Tool, Game engine, Script, Shader Language 와 같은 여러가지 툴에 대한 숙련도가 필요합니다.


실무적 내용을 포함한 모든 것을 몇 개의 글로 완벽히 설명하기는 한계가 있기에, (읽다 지쳐 포기하실 수도 있으니)

주로 이론과 이해를 도우며 흥미를 돋우는데 주안점을 두고 작성했습니다.


궁금하신 내용 댓글로 달아주시면 확인하는데로 답변 드리겠습니다. :)

질문 사항이 다른 분들에게도 공유될 수 있게 가급적 공개 댓글로 적어주세요.


감사합니다.

  1. 빈센 2018.07.12 17:03

    캬 님 짱입니다요

  2. 2018.07.13 03:39

    비밀댓글입니다

    • 2018.07.13 05:47

      비밀댓글입니다

    • 쿠오 2018.07.13 06:05

      앗 비밀글로 남겼다가 답글 주신게 볼 수가 없네요ㅠㅜ 에고 괜히 비밀글로 남겨서 죄송합니다.

    • Woodorl 2018.07.13 07:24 신고

      헐 안보이는군요 누구한테 보이는 비밀댓글이지ㅋㅋ "안녕하세요! 네 몬트리올에 있습니다! 와우 몬트리올에서 일하시는군요 완전 반가워요ㅎㅎ 영화나 애니쪽 CG 하는 한국분은 많은데, UI 일 하시는 분은 못봐서 더 반갑네요!! 저는 온지 이제 막 6개월차 접어드는데, 오신지 오래 되셨나요?" 라는 내용이었어요 ㅋㅋ wizardkwh@gmail.com 으로 답신 주실 수 있으신가요? 동네 주민인데 친하게 지내요!

  3. 와우쭈 2018.07.13 10:11

    심박한 내용 입니다
    또 없죠?

  4. 어쎄씬 2018.07.13 11:20

    멋져요~ ^_^=b

  5. 코코a 2018.07.13 14:27

    고양이를 입양할까하다가 ...두번 세번 보니 조금씩 알것 같아요. 완전 굿

    • Woodorl 2018.07.13 21:45 신고

      후후후 이제 고양이랑 동등한 수준이 되어가고 있군요

  6. 룡딘 2018.07.14 02:40

    와 개꿀잼이네요.
    계속 연재해주시면 좋겟네요.
    감사합니다.

    • Woodorl 2018.07.18 08:03 신고

      재밌게 읽어주셔서 감사합니다. :D
      다음편도 틈틈히 준비해볼게요!

  7. 궁금궁금 2018.07.30 18:53

    보고 따라했는데 저는 이미지가 시작하는 부분은 확대되고, 끝나는 부분은 축소되더군요..
    알려주실 수 있을까요 ㅠㅠ
    전 아래처럼 만들었거든요..

    fixed4 d = tex2D (_UVTex, IN.uv_UVTex );
    fixed4 c = tex2D (_MainTex, float2(d.r - _Time.x * 0.1 , d.g));

    • Woodorl 2018.08.02 08:31 신고

      음.. 어떻게 되는지 이미지를 봐야 뭐가 문젠지 알거 같아요. 최적화를 위해서는 버텍스 셰이더에서 계산을 해주는게 좋긴 하지만, 적어주신 스크립트에는 문제가 없습니다~!

    • 궁금궁금 2018.08.02 11:07

      도무지 해결을 못 하고 있다가,
      사용하신 노멀맵 캡쳐해서 쓰니 되더군요..;; 그런데 다른 문제로, 지구 이미지의 텍스쳐를 아무리 고해상도를 써도 이미지가 자글자글해서 난감하네요. ㅠㅠ

    • Woodorl 2018.08.02 21:05 신고

      아 저 구형태의 UV맵 말씀하시는거죠? 저 맵을 잘 만들어야 정상적으로 작동해요 ㅎㅎ

      그리고 자글자글해지는건 지구 이미지의 텍스쳐 해상도 문제라기보다는 UV맵 이미지의 문제일 가능성이 커요.

      일반적으로 UV를 계산할 때 사용하는 float 함수형이 표현가능한 수는 "1.2E-38~3.4E38" 인데 E38이라고 하면 0이 38개가 붙는 만큼의 숫자 크기에요. (1억이 0이 8개)

      그에 비해 이미지를 사용할 경우에는 끽해야 512일텐데, 비교할수없을만큼 정확도가 낮죠. ㅎㅎ (1024 이상은 비용이 너무 커지는듯)

      정밀한 표현이 가능한 요소보다는 어느 정도 해상도를 희생해도 되는 (혹은 노이즈를 인지하기 어려울 정도의 연출을 동반한) 것들에 사용하시는 것이 좋을거에요!

    • 궁금궁금 2018.08.03 11:34

      자세한 설명 감사합니다. 다만 작성자님 튜토리얼에 있는것처럼 깔끔하게 한번 만들어 보고 싶어서 그랬어요..ㅋㅋ 다시한번 감사드려요!

  8. 지누쓰 2018.07.31 15:45

    항상 우돌님 작업물 감탄하면서 보고있습니다 ㅠㅠ
    제가 VFX를 생각하고 이것저것 공부해야겠다 라고 계기를 가진 원동력입니다..
    언젠가는 저도 우돌님처럼 되고싶네요!
    회사에서는 UI업무랑 이번주 토요일부터 이펙트 과외랑 C#을 공부하고있는데
    우돌님의 C# 강의도 도움이 되네요! 감사합니다 ㅎㅎ

    • Woodorl 2018.08.02 08:33 신고

      하핫 감사합니다! 저도 아직 많이 부족해서 공부할게 산더미 같은데.. 좋게 봐주셔서 감사합니다!

      후후 UI에 이펙트, C# 까지 하시면 곧 엄청난 괴수가 되시겠군여! 기대하겠습니다! ㅎㅎ 나중에 재밌는 작업 하시면 공유해주세요~!



본 아티클은 UI 및 간단한 VFX 제작에 도움이 될만한 Graphics 에 대한 이해를 돕기 위해 작성했습니다.


아직 한참 공부가 필요한 입장에서 이런 글을 쓰는 것이 혹여나 잘못된 정보를 퍼뜨리지 않을까 불안합니다만.

많은 분들이 게임 그래픽을 쉽게 이해하는데 도움이 되길 바라는 마음으로 작성해봅니다.

혹시 잘못된 부분 지적해주시면 고치도록 하겠습니다.


추후에 실제 Shader Code 작성 및 VFX 제작을 위한 튜토리얼도

시간님이 허락하신다면... 제작해보도록 하겠습니다.


매끄러운 전달을 위해 반말로 작성된 점 양해부탁드립니다.

문의 사항은 포스팅에 댓글로 적어주시면 최대한 답변 드리겠습니다.


감사합니다. :D




2편 - UVW란?




XYZ - 1 = UVW

(충격적인 네이밍 센스.. 역시 개발자들이란..)



UV Coordinate (UV 좌표) 라고 하는 값은 RGB, XYZ 와 같이 UVW 라는 세 개의 값을 갖는다.

하지만 3차원 좌표값을 필요로 하지 않는 특성상 W 값은 제외하고 주로 UV 두 개의 값만을 사용한다.


이것은 텍스쳐가 어떤 좌표에 그려질지에 대한 정보를 갖고 있고,

이미지로 표현하면 아래와 같은 영롱한 색상이 된다.


[ 지긋지긋한 놈.. ]



이러한 색상을 갖게 되는 이유는 각각의 픽셀들이

x 좌표 값을 0~1 까지, y 좌표 값을 0~1 까지 갖고 있는 두 값을 묶어서 (RGB로 표현하면 (x값, y값, 0) 이 된다) 저장하기 때문이다.


( ※ 일반적으로 UV 좌표 값은 2개의 값만 가지는 데이터 타입 (float2, fixed2, half2 등) 을 프로그램 내에서 연산하여 사용한다 )

 float, half , fixed 는 순서대로 값의 정확도에서 차이를 보이는데, UV coordinate 는 정확도를 요하는 값이기에 float 을 주로 사용한다 )

 각 데이터 타입에 대한 설명은 본 아티클의 난이도를 넘어가므로, 이 글에서 다루지 않는다 )


다양한 해상도의 텍스쳐를 모두 문제없이 불러들여야하므로 좌표값의 정확도가 중요하기에,  

저장할 수 있는 정보양에 비해 덩치가 큰 이미지를 사용하기보다는 프로그램 내에서 연산하여 사용하는 것이다.


아래의 그림을 보면 결과적으로 색을 가진 것 같이 보이지만, 

사실 각각의 픽셀들이 (0,0), (0, 0.01), (0, 0.02) .... ~ (1, 1) 등의 값을 표현하고 있다.




[ 각 값 사이에도 무수히 많은 좌표 값들이 존재한다 ]



Pixel shader 단계에서 이 좌표값 (Coordinate) 에 따라 텍스쳐의 이미지를 불러들인다.

간단한 UV scrolling 같은 경우, 각각의 좌표 값에 특정한 속도로 값을 더해주는 개념이라고 생각하면 된다.


이렇게 값을 더해주면 일정 시간이 흐른 후 좌표값이 1을 초과하게 되는데 

이 때 초과한 값을 어떻게 처리하느냐에 따라 아래의 예시와 같이 다르게 보인다.


먼저, 1을 초과한 좌표 값을 다시 0부터 반복되게 하면 해당 픽셀에서 불러들이는 이미지의 좌표값이


0.1 0.2 0.3 0.4 .... 0.8 0.9 1.0 0.0 0.1 0.2 .... 0.8 0.9 1.0 0.0 0.1 0.2 0.3 ....


이런 식으로 반복되게 되고, [스크롤 예시1] 과 같이 보인다.

( ※ Unity Image Setting 에서 Repeated 와 같다고 생각하면 된다 )




[ 스크롤 예시1 - X 값에만 특정한 값을 더해주어 수평으로 움직임 ]



위와 다르게 1을 초과하더라도 좌표값을 초기화하지 않을 때는, 

말하자면 좌표 범위를 초과한 상태가 되고 [스크롤 예시2] 와 같이 마지막 픽셀이 반복적으로 보이게 된다. 

( ※ Unity Image Setting 에서 Clamp 와 같다고 생각하면 된다 )



[ 스크롤 예시2 ]



자, 그럼 UV 좌표에 값이 다른 방식으로 작용했을 때 어떻게 되는지 살펴보자. 



[ UV 좌표 X 1 ~ 5 ]


UV의 Tiling 을 조절할 때에는 UV 좌표 값에 특정 값을 곱해주면 된다.

1보다 작은 수를 곱해주면 확대, 1보다 큰 수를 곱해주면 축소된다고 볼 수 있다.

( ※ 최적화를 위해 나누기는 가급적 사용하지 않는다 예를 들어, a / 10 보다는 a x 0.1 을 사용하는 것이 좋다 )





[ 삼각 함수를 적용한 이미지 ]




이러한 UV 값은 활용하기에 따라 무한한 활용성을 가지는데,

약간의 이해있으면 아래와 같이 이미지 없이 그림을 그리는 것도 충분히 가능하다.



[ Sprite 없이 Shader Language 로만 만든 이미지 in Unity (영상 링크) ]



이제 이 UV 좌표 라는 데이터가

얼마나 많은 활용성을 가진 개념인지 대충 감이 오는가?


이 외에도 Shader 는 수 없이 많은 정보를 이용해서 시각효과를 만들어낸다.

World 에서의 좌표, 카메라로부터의 거리, Vertex가 받는 빛을 활용하기도 한다.


Shader 의 가능성에 설레는 독자의 심장 소리가 여기까지 들리는듯하다


피의 복수의 두번째 장이 끝이났다.

그럼 이제 막장으로 넘어가보록 하자..




궁금하신 내용 댓글로 달아주시면 확인하는데로 답변 드리겠습니다. :)

질문 사항이 다른 분들에게도 공유될 수 있게 가급적 공개 댓글로 적어주세요.


감사합니다.

  1. 와우쭈 2018.07.13 10:06

    복수는 누구에게 하는건지 궁금합니다



본 아티클은 UI 및 간단한 VFX 제작에 도움이 될만한 Graphics 에 대한 이해를 돕기 위해 작성했습니다.


아직 한참 공부가 필요한 입장에서 이런 글을 쓰는 것이 혹여나 잘못된 정보를 퍼뜨리지 않을까 불안합니다만.

많은 분들이 게임 그래픽을 쉽게 이해하는데 도움이 되길 바라는 마음으로 작성해봅니다.

혹시 잘못된 부분 지적해주시면 고치도록 하겠습니다.


추후에 실제 Shader Code 작성 및 VFX 제작을 위한 튜토리얼도

시간님이 허락하신다면... 제작해보도록 하겠습니다.


매끄러운 전달을 위해 반말로 작성된 점 양해부탁드립니다.

문의 사항은 포스팅에 댓글로 적어주시면 최대한 답변 드리겠습니다.


감사합니다. :D





1편 - Vertex Shader & Pixel Shader



스크린 안의 세상이 어떻게 그려지는지 생각해본적 있니




밑도 끝도 없이 UI 부터 까고보는 사람들..



뭐가 잘못된건지 설명도 안해주는 개발자들..




이제 그 설움의 시간에 마침표를 찍고...


피의 복수를 시작해보자..


(미안하지만, 이거 다 읽어도 피의 복수까진 못한다)


.

.

.



총 3개로 이루어진 본 아티클의 목적은 아래의 Custom Shader 에 대한 이해를 돕는 것이다.




[ Custom Shader in Unity ( 영상링크 ) ]




자 그럼 이제 신나고 설레는 Graphics 의 세계로 들어가보자!


여기 이미지가 있다.



[ 유아이 이미지가 이상하다!! ]


이것을 보고 어떤 생각이 드는가?





초보라도 좌절하지 말자. 당연한거다.

중수는 복습하는 의미에서 읽어줬으면한다.

고수님들은.. 여기서 나가주세요.. 초보랑만 있고싶습니다.


이 글의 대상 독자는 초보 - 중수이다. 자신감을 가지자.



[ 출처 좌 : Pinterest, 우 : Alberto Rodriguez ]


Game graphic 에서 화면에 출력되는 이미지들은 Mesh 위에 그려진다. (UI도 예외는 아니다)


Mesh 의 최소 단위는 삼각 폴리 (Triangle Polygon) 인데, 면을 구성하는 점의 최소 개수는 3개이기 때문이다.

( ※ 놀랍게도 점이 2개 이하면 면이 존재할 수 없다! )


우리가 만든 UI도 결국 삼각 폴리의 덩어리 위에 그려지는 것이다.


그렇다면 폴리곤과 픽셀들은 어떠한 과정으로 그려질까?




[ Shader 의 전체 과정. 저 두 놈에만 집중하자 ]



화면에 Graphic 을 출력하는 Shader 에서 우리가 주로 다루는 두 가지 프로세스가 있는데,

첫번째는 Vertex Shader 이고, 두번째는 Pixel Shader 이다.


Vertex Shader 란 Vertex (3d 프로그램에서의 정점) 를 화면에 그리는 과정으로,

3개의 점을 가져와 삼각형 한 판씩을 그린다고 생각하면 된다.


[ Vertex 를 기준으로 렌더되는 폴리곤 ]



Pixel Shader 는 Vertex Shader 단계 이후에 Pixel 을 입히는 과정인데,

이미지를 각각의 픽셀에 그리는 것이다.



[ 해상도를 기준으로 한 픽셀씩 렌더된다 ]



Vertex Shader 같은 경우 Vertex의 개수만큼 연산을 하고,

Pixel Shader 같은 경우 Pixel의 개수만큼 연산을 한다. (256 해상도의 픽셀은 256 X 256 = 65,536 번만큼 계산)






[ Pixel Shader 내에서의 연산은 훨씬 무겁다 ]


이러한 이유때문에 최적화를 위해서 가능한한 Vertex Shader 내에서 연산을 하는 것이 좋다.

Vertex Shader 로 화면에 Vertex 들을 배치하고 난 뒤에, 이미지를 그리는 과정에서 필요한 것이 텍스쳐와 UV 맵이다.


( ※ 둘 사이에 Geometry 를 생성하는 프로세스도 있으나, 본 아티클에서는 다루지 않는다 )

( ※ 당연히 픽셀들이 저렇게 개기는 일은 없다; ]

( ※ 편의상 좌우상하로 표현했지만, 모든 값은 X, Y (3d 좌표의 경우 Z) 를 기준으로 입력되어야한다 )



과연 UV맵은 무엇일까!!

2편이 너무 궁금해지는걸!





궁금하신 내용 댓글로 달아주시면 확인하는데로 답변 드리겠습니다. :)

질문 사항이 다른 분들에게도 공유될 수 있게 가급적 공개 댓글로 적어주세요.


감사합니다.

  1. 와우쭈 2018.07.13 10:04

    재미있어요

https://realtimevfx.com/t/an-example-of-sending-custom-data-from-shuriken-to-a-vertex-shader-in-unity-5-5/1515




[Day 43]


object 는 Object 와 동일한 것으로 모든 클래스의 부모이다. 한 개체를 생성하면 그 개체의 부모인 Object 의 개체도 함께 생성된다.

모든 클래스는 직 간접적으로 object를 상속하게 된다.


중요 Method

GetHashCode()     개체 고유 번호

GetType()            개체 형태

Equals()              같은 개체인가 비교

ToString()            개체에 대한 정보



형변환 에는 캐스팅, 프로모션, 박싱, 언박싱 등이 포함된다.



대체 프로모션 캐스팅 박싱 언박싱이 뭐지.. 한줄씩만이라도 설명을 달아줬으면 이해하기 좋았을텐데 ㅡㅡ

다시금 이 책의 불친절함을 느끼며 구글링한 결과를 첨부.


Promotion, Casting (from : http://movefast.tistory.com/7)


Promotion 자동타입변환

- 프로그램 실행 중에 자동으로 타입 변환이 일어나는 것을 의미.


큰 크기의 타입 ← 작은 크기의 타입    (여기서 크기는 사용하는 메모리 크기를 말함)


byte > short > int > long > float > double 순서 또는 char> int 순서로 자동 타입 변환이 일어난다.



Casting 강제 타입변환

- 큰 데이터 타입을 작은 데이터 타입으로 쪼개어 강제로 저장하는 것을 의미.


큰 크기의 타입 → 작은 크기의 타입


위와 반대의 순서로 강제 타입 변환이 일어난다.


예를 들어,


int i = 271445124;

byte b = (byte) i;


위의 경우 끝의 1 byte만 byte 타입 변수에 담게 된다. 

즉, 변환되어질 데이터보다 큰 것을 강제 타입 변환을 할 때 기존의 값을 보존되지 않는다.


※ 주의 사항


int > float 로 강제 타입 변환을 할 때,


float : 부호(1비트) + 지수(8비트) + 가수(23비트)


로 구성되어 있기 때문에 int 값이 123456780 처럼 가수 23비트로 표현불가능한 숫자일 경우 근사값으로 변환된다.

이 점은 정밀도 손실을 발생시키기 때문에 모든 int 값을 안전하게 실수 타입으로 변환시키려면 double 타입을 사용하는 것이 현명하다.


double : 부호(1비트) + 지수(11비트) + 가수(52비트)


그 이유는 int 값은 4바이트 = 32비트 이므로 double 의 가수 52비트보다 항상 작기 때문에 정밀도 손실없이 변환이 가능하다.


지수, 가수란? (http://thrillfighter.tistory.com/349)



음.. 역시 프로그래밍은 뭔가 철저하구먼



박싱과 언박싱 (from : http://www.mkexdev.net/Article/Content.aspx?parentCategoryID=1&categoryID=5&ID=671)


"박싱 / 언박싱은 성능에 좋지 않습니다"


Boxing 값 형식을 참조 형식으로 변환하는 것


스택에 있는 데이터가 힙으로 복사됨. 박싱은 묵시적으로 일어나며 명시적으로 해도 무방.

값 형식인 정수형 자료 int 를 참조형식인 object 객체로 할당하게 되면 자동으로 박싱이 일어남.


int i = 123;

object o = i;    // Boxing (묵시적 변환)


UnBoxing    참조 형식을 값 형식으로 변환하는 것.


힙에 있는 데이터가 스택으로 복사 됨. 언박싱은 명시적으로 변환해줘야 함.

박싱된 객체를 다시 값 형식으로 변환하면 언박싱이 일어남.


int i = 123;

object o = i


int j = (int) o;    // Unboxing (명시적 변환)


※ Unboxing 은 Boxing 한 객체에 대해서만 가능

※ Unboxing 은 Boxing 하기 전 형식을 준수해야 함.


MSDN 에서는 이 과정에 대한 비용을 다음과 같이 설명하고 있습니다

boxing  unboxing 과정에는 많은 처리 작업이 필요합니다값 형식을 boxing할 때는 완전히 새로운 개체가 
만들어져야 하며이러한 작업에는 할당 작업보다 최대 20배의 시간이 걸립니다. unboxing을 할 때는 캐스팅 
과정에 할당 작업보다 4배의 시간이 걸릴 수 있습니다


언제 왜 사용하는지는 너무 복잡하니 링크 참고.

여기 C# 기초강좌들이 있으니 방문해볼 것. (내 눈엔 기초같이 안보이지만..)

http://www.mkexdev.net/Article/ArticleList.aspx?parentCategoryID=1&categoryID=5



위 사이트에 발췌한 Overloading 과 Overriding 에 대한 글. (책보다 훨씬 이해가 잘되네.. 하하 ^^)


오버로딩, 오버라이딩 그리고 new ( from : http://www.mkexdev.net/Article/Content.aspx?parentCategoryID=1&categoryID=5&ID=190)


Overloading 

C# 오버로딩  기법을 사용하면 동일한 이름의 메서드를 여러개 사용할 수 있다.

C# 컴파일러는 동일한 이름을 가진 두개 이상의 메서드가 있을 경우 이 메서드들의 파라메타들의 정보를 기준으로 메서드를 식별한다.


메서드 시그너처 - 메서드 이름, 파라메타 정보(타입, 개수) 를 말한다. 메서드 시그너처는 클래스 내에서 유일해야 한다.


C# 컴파일러 입장에서는 각기 다른 메서드로 식별되지만, 사용자 입장에서는 동일한 이름으로 접근할 수 있도록해서 편의성을 제공


Overriding

클래스의 상속과 연관이 있다. 부모로부터 상속되어진 메서드를 재정의 할 때 사용하는 기법이다.

부모 클래스에서는 자식 클래스에서 재정의 할 수 있도록 virtual (또는 abstract) 메서드로 정의하고,

자식클래스에서는 이렇게 정의된 가상 메서드를 override (재정의) 하면 된다.


이런 메서드 재정의 기법은 객체지향의 다형성을 가능하게 한다.

동일한 타입의 객체로 서로 다른 일을 할 수 있도록 하는 다형성은 아주 유용한 개념.


New

오버라이딩 처럼 클래스의 상속과 관련이 있고, 부모 클래스에 정의된 메서드를 숨기는 역할을 한다.

new 를 통해서 부모 클래스의 메서드를 새로 정의할 때는 부모 메서드가 virtual 이거나 아니거나 상관이 없다.

부모 클래스의 메소드를 자식 클래스에서 그대로 상속받도록 하지 않고 새로이 정의해서 사용한다고 해석될수 있다.


오버라이딩과 new의 차이점

언뜻 봐서는 별반 달라보이지 않지만, 이 들은 아주 큰 차이점이 있다.

new 는 객체를 생성할 때 자식타입으로 생성해도 부모타입으로 접근하게 되면 여전히 부모 클래스에 정의된 메서드가 호출된다.


하지만 오버라이딩은 부모타입으로 메서드에 접근하더라도 인스턴스가 생성된 자식타입의 메서드가 호출되도록 하여

객체의 다형적인 동작이 가능토록 한다.




[Day 44]


is 키워드를 이용하면 구체적인 타입을 알 수 있다.


example )

if (obj is string) { string tt = (string) obj; }



[Day 45]


as 키워드는 참조 타입에만 사용할 수 있으며, is 와 캐스팅을 합한 키워드이다.

Unboxing 할때는 as 사용 불가.



[Day 46]


ArrayList 는 Array + List로 배열과 비슷하면서 순서대로 저장하고 사용할 수 있는 클래스이다.

네임스페이스는 System.Collections 이다.

Array 는 크기가 고정되어 있지만, ArrayList 는 크기가 유동적이다.

Array 는 Index 를 사용한다. Array m 의 3번째 element는 m[3] 으로 표시한다.

ArrayList 는 3번째 element 를 list[3] 으로 사용하여 Array의 Index를 흉내낸 듯한 Indexer 를 사용한다.


중요 Method

Array list = new ArrayList(10)        기본으로 10개를 저장할수 있도록 선언. Capacity 라고 함.

list.Clear();                                   초기화

list.Add(object o);                         순서대로 저장함

list[i] as XXX;                                list에 저장된 i 번째 element 를 return 한다. indexer라고 하며 array 처럼 사용할수 있다. 저장할 떄 object로 promotion 됨.

list.Reverse();

list.ToArray();

list.Count;

list.IndexOf(object o)

list.Sort();

list.Insert (int index, object o);

list.RemoveRange(int index, int count);



[Day 047]


ArrayList 와 IEnumerator


ArrayList 와 배열은 IEnumerator 인터페이스를 사용하여 크기를 몰라도 사용할 수 있다. System.Collections 네임스페이스에 있다.

IEnumerator 는 iterator pattern 을 적용한 것으로 크기를 몰라도 사용할 수 있다.


예를 들어, 구슬 주머니에 구슬이 몇개 있는지 몰라도 손을 넣어서 잡히는 것이 있으면 꺼내고, 없으면 끝낸다.

'구슬 주머니에 손을 넣고 구슬을 잡는다' 는 MoveNext() 메서드 역할을 하고, '잡힌 구슬을 주머니에서 꺼낸다' 는 Current 프로퍼티 역할을 한다.


중요 Method

ArrayList list = new ArrayList(10);                            ArrayList 나 배열에서 IEnumerator 를 얻는다.

string[] list = {"A", "B", "C", "D"};

IEnumerator iters = list.GetEnumerator();


iters.MoveNext()            남은 것이 있는가?

iters.Current as XXX       남은 것 중 하나를 꺼내의 원래의 참조 타입 모습 (XXX) 으로 as 캐스팅한다.

'Study > Programming' 카테고리의 다른 글

[C# 200제] Day - 5  (0) 2018.01.04
[C# 200제] Day - 4  (0) 2018.01.03
[C# 200제] Day - 3  (2) 2018.01.02
[C# 200제] Day - 2  (0) 2018.01.01
[C# 200제] Day - 1  (0) 2017.12.31

[Day 37]


StringBuilder 는 string 과 거의 비슷한 메서드를 갖는다.

특징      - System.Text Namespace 에 있는 Class 로 System.Text 를 using 한다.

- mutable : 문자열 string 과는 다르게 다시 대입하지 않아도 원래 값이 변경되는 것을 말한다. mutable 이기 때문에 주소에 의한 전달이 된다.

- mutable string concatenation : s.Append() 를 이용한다. 다시 대입하지 않아도 된다.


중요 Method

sb.Append( string )

sb.Insert( location, string )

sb.Remove( start location, delete area)

sb.Replace( target string, replacing string )



[Day 38]


char " " 으로 감싼 것은 문자열 (string) 이고, ' ' 로 한 글자를 감싼 것은 문자(char)다. char는 기본 타입이다.

문자열은 1개 이상의 문자로 구성된다.


중요 Method

char.IsPunctuation(index)        문장부호인가?

char.IsUpper(index)                대문자인가?

char.IsLower(index)                소문자인가?

char.IsLetter(index)                문자인가?

char.IsNumber(index)             숫자인가?

char.IsDigit(index)                  10진수 숫자인가?

char.IsLetterOrDigit(index)        문자나 숫자인가?

char.IsWhiteSpace(index)        공백문자('\t', '\n', '\r') 인가?


입력받은 문자열에서 숫자만 골라내기



어제 "아 이런걸 다 해야해?!" 하고 후루룩 넘겼다가,

오늘 다시 보니 하나도 기억이 안나는 참사가 벌어져서 다시 하나하나 해보는중.


이건 입력받은 10진수를 2진수로 변환시키기



인내해야 하느니라..


입력한 문자열 숫자로 바꾼 뒤 각 자리 다 더하기




[Day 040]


Array 

중요 Method

Array.Copy (a, b, count)        배열 a를 배열 b에 count 개수 만큼 일대일 복사 (Deep Copy)

Array.Clear(a, 0, count)          0번째에서 count 개수 만큼 배열 kk를 0으로 채움

int num1 = Array.IndexOf(a, 6)        a에서 첫번째 6의 위치

int num2 = Array.LastIndexOf(a, 6)   a에서 마지막 6의 위치

Array.Reverse(a)            a의 순서를 반대로 바꾼다.

Array.Sort(a)            증가순으로 정렬한다.



[Day 041]


enum 은 상수의 나열이다. enum 은 클래스를 선언하는 방법과 같이 'public enum enum이름 {A, B} 로 한다.

switch(A) 의 A에는 int, char, enum, string 이 올 수 있다.

public enum ClearType{ZERO, THEOTHER} 에서 값을 명시하지 않은 ZERO는 0이 대입되고, 다음은 1씩 자동으로 증가하여 THEOTHER = 1 이 된다.



[Day 042]


Overloading 메서드 이름은 갖지만 아규먼크의 개수나 타입 또는 ref, out, params 와 같은 키워드의 유무에 따라 다른 메서드가 되는데, 이것을 overloading 이라고 한다.

Return type 은 Overloading 과 관계 없고, 주로 한 메서드를 잘 만들어놓고, 다른 메서드가 이 메서드를 사용하는 형식을 취한다.

'Study > Programming' 카테고리의 다른 글

[C# 200제] Day - 5  (0) 2018.01.04
[C# 200제] Day - 4  (0) 2018.01.03
[C# 200제] Day - 3  (2) 2018.01.02
[C# 200제] Day - 2  (0) 2018.01.01
[C# 200제] Day - 1  (0) 2017.12.31

[초보자를 위한 C# 200제]


[Day 24]


비트 연산자...

음..... 이 책의 예시들은 참 재미없고 와닿지 않는 느낌이다.


내가 아트 베이스에 수학을 싫어해서 그런지는 모르겠지만,

만드는 것들이 하나 같이 딱딱한 수학공식들임..

수학의 정석에 나오는 문제들을 코딩으로 구현하는 것 같음.


먼저 흥미를 북돋울수 있는 예제들을 경험하게 하고,

그 후에 실제 쓰일만한 상황에 수학 공식을 끼얹는게 좋은 접근 방식이 아닐까 생각해봄.


참 끈기와 의지가 필요한 책이구만.


보수란? (출처 : http://sessionk.tistory.com/126)


1의 보수는 0은 1로 1은 0으로 바꾸는 방식입니다. 

1의 보수 
0000 0100 -> 1111 1011 
이렇게 바꾸는 것이 1의 보수입니다. 

2의 보수는 1의 보수에 1을 더하는 것입니다. 
0000 0100 -> 1111 1011 +1 -> 1111 1100
위에 예제에서 2의 보수는 음수값을 가지고 있습니다.


1의 보수를 사용하다 보면 문제가 있습니다. 그 문제는 0이 2개가 생긴다는 것입니다.

+0 : 0000 0000
-0 : 1111 1111

0은 매우 중요한 숫자이므로 이러한 문제가 발생이 되면 안됩니다. 그래서 2의 보수를 만들게 되었습니다.

2의 보수는 1의 보수의 +1 입니다.

그래서 1111 1111은 0이 아니고 -1 입니다. 



일단 따라하긴 했지만, 그대로 베껴 치는게 뭔 의미가 있나 싶다 ㅡㅡ

아.. 짜증


알고 있는 내용이라도 연습삼아 차근차근 해보려했건만,

슬슬 짜증나서 스킵해야되나 고민중


[Day 25 - 30]

이미 알고 있는 switch, while 문으로 또 몇진법이 어쩌고 해서 Skip.


[Day 31]


ref 는 값에 의한 전달을 주소에 의한 전달이 되게 한다. ref 가 붙은 변수는 메서드 안에서 값을 변경하면 메서드 밖에 있는 원래의 값들도 변경된다.

메서드를 선언할 때와 호출할 때 모드 ref 키워드를 붙여야 한다.

ex ) Swap (ref m[j], ref m[j+1]);                    //호출

public static void Swap(ref int a, ref int b) {    //선언



get property - 저장된 값 보여주기  - a=m[i];

set property - 새로운 값 대입        - m[i] = 20;


foreach 출력이나 외부로 값을 보여주기(get property) 위해 for 대신 인덱스를 사용하지 않는 foreach 를 사용할 수 있다.

foreach(타입 변수 in 배열명) 의 형태를 사용한다. 줄을 맞추어 서있는 학생들을 부를 떄처럼 다음 학생이라는 말을 사용하는 것과 마찬가지로 배열 m에 있는 다음 int, 다음 int 로 배열 m 에 있는 모든 것을 출력할 수 있다. num 은 set property로 사용할 수 없다. 반복 변수에 대입하는 것은 불가능하다. 출력이나 저장된 값 보여주기용으로만 사용할 수 있다.


params 키워드는 변수의 개수에 관계 없이 사용할 수 있게 한다. DescSort(a,b), DescSort(a,b,c), DescSort(a,b,c,d) 와 같이 DescSort() 메서드의 아규먼트 개수가 2개, 3개, 4개가 필요할 때 오버로딩된 메서드가 3개가 필요하지만 params 를 사용하면 아규먼트의 개수에 관계 없이 사용할 수 있다.


out 키워드는 Argument 와 반대로 method 안에서 구한 값을 method 외부로 보낸다. return 을 사용할 수 없는 void 메서드를 이용하려면 out 키워드를 사용한다.

ex) private void countOfEnemy(int n, out int nums) {


string (문자열) 은 참조 타입이지만 기본 타입과 같은 특징을 갖는다. 참조 타입의 메서드를 가지면서 기본 타입처럼 값에 의한 전달을 한다.

특징1 - Immutable. s1 = "Good Morning." 일 때, s2 = s1.ToUpper(); 를 하면 s2는 "GOOD MORNING." 으로 변경된다. 그러나 s1은 그대로 "Good Morning." 이다 .s1을 s2에 대입하면 s2는 변경되지만 s1은 변경되지 않는다. 이를 이뮤터블이라고 하며, 기본 타입의 특징이기도 하다.

특징2 - 기본 타입과 문자열이 만나면 문자열이 된다.


Member method

string.ToUpper()            대문자로 바꾸기

string.ToLower()            소문자로 바꾸기

string.PadLeft(20, '-')      -을 왼쪽에 넣어서 20자 채우기

string.PadRight(20, '-')    -을 오른쪽에 넣어서 20자 채우기

string.Remove(5)           5번째부터 제거

string.Remove(5, 8)        5번째부터 8자 제거

string.Trim()                 양쪽 공백 제거

string.TrimeEnd()           오른쪽 공백 제거

string.TrimStart()           왼쪽 공백 제거

string.Replace('G', 'S')     'G' 를 'S' 로 바꾸기

string.Substring(5)        5번째 이후를 남기기

string.Substring(5, 8)      5번째부터 8자 남기기

string.Insert(2, "uu")        2번째에 "uu" 삽입하기

bool s1 = string.Contains("o")        "o"를 포함하고 있나?

int s1 = string.IndexOf("o")    왼쪽부터 첫번쨰 "o"의 위치 (없다면 -1)

int s1 = string.LastIndexOf("r") 마지막 "r" 이 존재하는 위치

int s1 = string.Length            문자열의 길이


char[] cc == {''}

string[] s1 = string.Trim().Split(cc);    공백 (" ") 을 기준으로 string을 분리 (먼저 Trim() 으로 공백을 제거한다)


chat[] c = string.Trim().ToCharArray();  문자열을 문자 타입의 배열로 만든다 (먼저 공백을 제거한다)


string ss = new string(c)        문자타입의 배열을 문자열로 바꾼다.


string.Concat(params object[] obj)     여러개의 파라미터를 붙임


string cc = "&";

string.Join(cc, keyval);            문자열 배열을 서로 붙일 때 분리자를 이용하여 붙임

'Study > Programming' 카테고리의 다른 글

[C# 200제] Day - 5  (0) 2018.01.04
[C# 200제] Day - 4  (0) 2018.01.03
[C# 200제] Day - 3  (2) 2018.01.02
[C# 200제] Day - 2  (0) 2018.01.01
[C# 200제] Day - 1  (0) 2017.12.31
  1. digitz 2018.01.02 15:52

    어차피 캐나다 오실꺼니까 기왕이면 영문서로 공부하시는 게 적응하시기 편하시긴 할 거에요. ㅎㅎ.
    보수가 필요한 개념이긴 합니다만 입문자용에 꼭 필요한지는 의문이긴 하네요. C#을 배우기로 하신데는 아마 Unity와의 접점때문이겠지만 개념 파악하는데에는 조금 어렵긴 할 거에요.
    C#은 객체지향프로그래밍 언어라 그 개념을 파악하는데 꽤 오랜 시간이 걸리는 편인데요 (저의 경우에도 학부 1년을 거의 이 개념을 이해하는데만..) 특히 class가 뭔지 왜 class가 필요한지를 깨닫기 위해서는 이론과 실전 공부를 열심히 병행해야 합니다. 이 객체지향형 언어는 지하철 빠른길 찾는 프로그램을 만들면서 어느정도 숙련자의 길로 접어들 수 있어요.
    그래서 언어에 익숙치 않으시다면 Flash의 Actionscript나 Web의 Javascript부터 시작하는 쪽을 추천드리긴 합니다만, 정공으로 처음부터 C# 배우는 것도 끈기만 있다면 괜찮은 선택일 겁니다. 화이팅입니다!

    • Woodorl 2018.01.03 09:16 신고

      조언 감사합니다. 아무래도 아직 영어가 많이 취약하다보니 영문 자료를 보니 완전히 이해하기가 쉽지 않더라구요. ㅠㅠ
      그래서 국문으로 구입했는데, 이게 또 같은 개념도 어떨때는 한글로, 어떨때는 영어로 말해놔서 더 헷갈리네요ㅋㅋ 아이고

      당장의 목표는 Unity + C# 으로 간단한 게임을 만드는건데, 나중에는 Shader language나 OpenGL도 공부해보려구요. 아마 일이년으론 어림도 없겠죠. ㅎㅎ

      일단 한동안은 Artist로서의 아트감도 발전시켜야하니 그냥 도닦는 수험생 심정으로 살려구요. ㅋㅋ


[초보자를 위한 C# 200제]


[Day 13 - 21]


계단 만들기 오르락 내리락



피라미드 만들기




범위 내에 완전수 구하기




범위 내에 소수 구하기




범위 내에 짝수, 홀수 합 구하기




[Day 22]

아.. 근데 뭔 책 1/10부터 테일러급수니 뭐니 이상한게 나왔다 ㅡㅡ

수포자한테는 너무 어려운 것


멘붕. 일단 유투브 영상을 찾아봐도 이해가 안되니

완전히 이해하는건 나중에 하도록하고 따라만 해봄.


[Day 23]

친화수 구하기


아.. 친화수가 뭔지도 모르는 사람한테 친화수를 구하라니 ㅡㅡ
C# 입문이라고 했지 수학 입문이라고는 안했다 이건가.
어쨋든 열심히 구글링해서 찾아보고 짜보긴함.


'Study > Programming' 카테고리의 다른 글

[C# 200제] Day - 5  (0) 2018.01.04
[C# 200제] Day - 4  (0) 2018.01.03
[C# 200제] Day - 3  (2) 2018.01.02
[C# 200제] Day - 2  (0) 2018.01.01
[C# 200제] Day - 1  (0) 2017.12.31

[초보자를 위한 C# 200제]


[Day 001]


Console.ReadLine()         키보드로 문자열을 입력받는다.

int.Parse()                     숫자타입 문자열을 int 타입 문자열로 변환한다.


Console.WriteLine("{0} + {1} = {2}", num1, num2, num1 + num2)


- 결과




- 메소드란?

필드가 물체의 상태라면, 물체의 행동에 해당하는게 메소드다.

      • 메소드는 입력값이 있고, 그 입력값을 받아서 무언가 한 다음 결과를 도출해 내는 수학의 함수와 비슷한 개념이다.

      • 이때 입력값을 매개변수라고 하고,결과값을 리턴값이라고 합니다.

        • 인자( Argument ) 는 어떤 함수를 호출시에 전달되는 값을 의미한다.

        • 매개 변수( Parameter ) 는 그 전달된 인자를 받아들이는 변수를 의미한다.

      • 메소드란 클래스가 가지고 있는 기능이다. 클래스 안에 선언됩니다.



- 메소드와 평션은 어떻게 다른가? (출처 : https://blog.naver.com/cdincdin/30129625682)




- public static void main(String[] args) 란? (출처 : https://blog.naver.com/yub91/140131895088)


static

" 프로그램이 시작하면서 따로 인스턴스 하지 않아도 프로그램의 시작과 동시에 static으로 선언된 것들은 메모리에 호출이 되어 지는데, 이렇게 호출된 것들은 다른 녀석들과는 다르게 프로그램이 종료되는 시점까지 계속 유지가 된다는 점이다.

다른 클래스, 메소드, 변수 등의 경우 Java Virtual Machine의 Garbage Collector에 의해 인스턴스화 되어 사용이 되어진다 하더라도, 일정 용도를 끝 마친 후에는 다시 메모리에서 삭제가 되거나, 다른 부분에서 참조가 되지 않는 부분 등이 있는데, static으로 선언된 것은 끝까지 살아남아 계속 참조를 할 수 있다 "


void

" 메소드에 return 값이 없다는 뜻이다. main에서 void를 사용 하는 것은 main 자체가 하나의 프로그램의 시작과 끝인데, 프로그램 자체가 종료가 되는 시점에서 어떤 특정 값이 반환된다 한들 그 값이 의미를 가질리도 없고, 의미를 가져서도 안 된다.

어떤 계산에 의한 값의 반환이 있다면 그건 어디까지나 프로그램이 종료 되기 전에 이루어져야 하고 그 반환된 값 역시 프로그램이 종료되기 전 사용이 되어야 정상적인 것이므로 프로그램의 시작과 끝이 함께하는 main 메소드에는 반환값이 없는 void가 필요하다. "


String[] args

" String은 우리가 흔히 사용하는 그 String과 같은 녀석으로 []를 통해 배열로 생성이 된다는 의미이다. args의 경우 일반적으로 이렇게 사용할 뿐 원한다면 그 이름은 얼마든지 다른 것들로 대체할 수 있다. String[] aabb 역시 성립한다는 의미이다. 또한 배열의 특징상 String args[] 역시 사용 가능하다.

이 명령어는 맨 처음 프로그램을 실행하는 데 있어 외부에서 값을 받아오기 위해서 사용하는 것인데,

예를 들어 Example01.class라는 이름으로 클래스를 생성하고 실행한다면, java Example01.class 라는 명령어를 통해 실행이 되는데, java Example01.class 100 200 이런 식으로 맨 처음 프로그램을 실행하는 순간 특정한 값을 입력하고자 할 경우 그렇게 입력한 100 200이 String 타입의 배열 args[0], args[1]에 저장이 되어 프로그램 안에서 사용할 수 있다는 것이다.

이렇게 사용하는 것을 매개변수라고 하는데, main에서 String[] args라고 선언을 하는 이유는 프로그램의 실행 순간 외부값을 가져와서 프로그램 안에 사용하고자 할 때 메모리에 저장할 공간을 미리 선언해 두는 것이라고 할 수 있다. "


public protected private (default)

" public은 어디서나 상속 및 참조가 가능하다는 의미이다.

protected는 같은 패키지의 내부 혹은 이 클래스를 상속한 클래스에서만 접근을 허용한다는 의미이다..

private는 오직 이 클래스를 포함하고 있는 클래스 내부에서만 상속 및 참조를 허용한다는 의미이다.

(default)는 같은 패키지 내에서만 상속 및 참조가 가능하다는 의미이다. "




- 클래스 메소드 필드 에 대한 접근 제어자에 대한 이해 (출처 : https://blog.naver.com/yub91/140131895088)

 

[ 클래스 ]


□ abstract : 클래스의 정의된 메소드 중에서 구현을 생략하고 이름만 정의된 것이 존재할 수 있는데(이러한 메소드를 정의할 때에는 앞에 abstract라는 접근제어자를 붙여야 한다. ) 이런 abstract 메소드를 하나라도 가지고 있는 클래스를 정의할 때에는 반드시 abstract 클래스로 하여야 한다. abstract 클래스는 아직 구현되지 않은 메소드를 포함하고 있기 때문에 객체를 생성시킬 수 없으며 상속만 가능하다.

 

□ final : 더 이상 상속이 불가능하도록 만든다. 따라서 abstract와 같이 사용될 수 없다.


[ 메서드 ]


□ abstract : 몸체의 구현 없이 선언된 메소드에 붙는다. , 접근 제어자, 반환형 및 명칭부만 명시한 메소드이다. 메소드의 명치부란 메소드의 이름과 매개변수 리스트를 말한다. 내부 메소드 중 하나가 abstract 메소드이면 그 메소드를 포함하는 클래스는 abstract 클래스 이어야 한다. abstract 메소드는 서브 클래스에 상속될 때 반드시 구현되어야 한다.

 

□ final : 한 번 구현되면 상속은 가능하지만 서브 클래스에서 오버라이딩이 불가능한 메소드가 된다. 따라서 abstract와 함께 사용될 수 없다.

 

□ synchronized : 멀티 스레딩에서 동기화해야 할 메소드를 표시한다. 한 프로그램에서  동시에 실행될 수 있는 메소드가 서로 동기화되어 있으면 하나의 메소드가 실행되고 있는 동안에는 다른 메소드는 실행 될 수 없다.

 

[ 필드 ]

 

□ protected : 선언된 클래스 내부, 같은 패키지 내부, 같은 소스 파일 내부, 선언된 클래스를 상속하는 서브 클래스에서 참조가 가능하다.

 

□ static : static으로 선언된 필드는 해당 클래스로부터 여러 개의 객체가 생성되더라도 오직 하나만 존재하며 여러 객체가 공유하여 사용한다. 클래스 A로부터 A1,A2,A3를 생성하더라도 모두 static으로 선언된 변수a는 모두 하나의 값을 나타낸다. static 필드는 서브 클래스로 상속된다.

 

□ final : 초기화가 끝나면 더 이상 값을 변경할 수 없도록 한다. 일반적으로 상수로 사용하고 싶은 필드에 적용시킨다.

 

 생략 : 접근 제어자를 생략하면 선언된 클래스 내부 또는 같은 패키지 내부에서 참조 가능하다.

 

[ 생성자 ]

 

□ public : 어느 곳에서든지 호출이 가능하다.

 

□ private : 클래스 내부에서만 호출이 가능하고 다른 곳에서는 호출이 불가능 하다. private 생성자의 경우 외부에서 호출이 불가능하기 때문에 특별한 경우에만 사용한다.

 

□ protected : 같은 패키지 내부, 선언된 클래스 내부, 서브 클래스에서만 호출이 가능하다.


- 자바 VS C# : 강력함과 다재다능함의 대결 (출처 http://corealight.tistory.com/63)


요약

두 언어가 공통점이 많고 서로 장단점을 가지고 있다.


결론

둘 다 공부하자.




[Day 002]



[Day 003]

Clear 및 Calculate 함수 작성.


[Day 004]

공백 입력 및 String 입력시 예외 처리


[Day 005]

사칙연산 계산기 만들기



[Day 006] 

변수의 값이 바뀌지 않게 하려면 Const 키워드를 붙여 상수로 만들면 된다.


[Day 007]

Console.WriteLine() 과 Console.ReadLine()


[Day 008 - Day 012]

딱히 별 것 없음.




오늘은 C# 프로그래밍 체험하기 파트를 다 해봄.


아직 극초반이긴 하지만,

간단한 소감을 말하자면 이 책은


"개 불친절하다"

C# 프로그래밍 시작을 위한 입문서!! 라고 표지에 적혀있지만,

IDE 에 대한 기본 지식이 없거나 경험이 없으면 꽤나 헤맬법함.

Unity 에서만 해봤지 Visual Studio 에서 직접 코딩을 하는 경험이 전무한 나로서는 굉장히 많이 헤매게 됨..


각 섹션에 대한 진행 역시

목표를 설정하고, 차근차근 해설하며, 한줄씩 설명하는게 아니라

방법이 죽 나오고, 코드가 주루룩 적혀있고, 주석은 따로 주루룩 적혀있는 형식이다.


일일이 찾아가며 맞춰보기도 힘들고, 논리를 전개해나가는 방식 또한 알기 힘듦.


너무 개초보의 무지함을 얕잡아본게 아닌가 싶으다.

나의 무지함은 바다보다 깊거늘..


일단 끝까지 한번 해보는걸로..

'Study > Programming' 카테고리의 다른 글

[C# 200제] Day - 5  (0) 2018.01.04
[C# 200제] Day - 4  (0) 2018.01.03
[C# 200제] Day - 3  (2) 2018.01.02
[C# 200제] Day - 2  (0) 2018.01.01
[C# 200제] Day - 1  (0) 2017.12.31

[Unity] Wave Distortion Shader Code 

https://pastebin.com/WC5giTZC

+ Recent posts