[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

+ Recent posts