본문으로 바로가기
반응형

지금까지 했던 것들 용어 정리

 

public : 액세스 수정자 중의 하나로 외부에서 Main()메소드를 접근하는 것을 허용한다.

 

static :  스태틱 메소드를 만들때 사용하는 키워드.  일반 메소드는 객체가 만든 후에 그 객체를 통하여 메서드를 호출할 수 있지만 스태틱 메서드는 객체를 선언하지 않는 상태에서 클래스로 접근하여 호출할 수 있다.

 

void : 메소드의 되돌려줄 결과값이 없을때 메소드의 자료형을 void로 지정한다.

 

메서드

Main은 소괄호를 동반하기 때문에 메서드라고 할 수 있다. 메서드는 특정한 기능을 수행하도록 작성된 독립적인 단위이다. 객체가 선언되기에 앞서서 클래스가 정의되어야하는데 클래스는 멤버를 갖는다. 그 중에서 ()를 동반하는 멤버가 메서드이다. C#에서 진입점에 해당되는 메서드가 Main()메서드이다.

 

Main()함수가 결과값으로 정수형을 되돌려준다면 Void 대신 int를 적어주어야한다

결과값은 return 다음에 적어준다. 밑의 코드는 return다음 1을 기술했기때문에 Main()메서드앞에 int를 적어준 것이다. 

public statie int Main(){

return 1;

}

 

 

 

 

종료자

클래스에 생성자가 있다면 객체가 제거되는 시점에 종료자(finalizer)가 있다.

기본 생성자 앞에 ~(틸드)를 접두사로 쓰는 클래스명과 동일하며 인자나 반환값도 갖지 않는다.

 

 

저번 강의 예제에 이어서 종료자를 사용해보는 예제

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
class Program
    {
        class Car
        {
            public int _iSpeed;
            public Car()    // 디폴트 생성자
            {
                _iSpeed = 0;
                Console.WriteLine("Car() 생성자 호출");
            }
            ~Car()
            {
                Console.WriteLine("Car() 생성자 호출 : {0}  (종료자) ", _iSpeed);
            }
 
            public Car(int iSpeed)
            {
                _iSpeed = iSpeed;
                Console.WriteLine("Car(int) 생성자 호출");
            }
         
            public void Acc()
            {
                _iSpeed = _iSpeed + 10;
            }
 
            public void DeAcc()
            {
                _iSpeed = _iSpeed - 10;
            }
 
            public void Status()
            {
                Console.WriteLine("현재 속도는 {0}Km입니다.", _iSpeed);
            }
        }
        static void Main(string[] args)
        {
            Console.WriteLine("1=================");
            Car MyCar = new Car();
            MyCar.Status();
            Console.WriteLine("2=================");
            Car MyCar1 = new Car(100);
            MyCar1.Status();
            Console.WriteLine("3=================");
        }
cs

종료자가 두번 호출된다

 

 

메모리 관리는 GC가 한다. 이걸 안하면 프로그래머가 소스를 직접 관리해야함 -> 깜빡하고 지우는 코드 안넣으면 메모리 누수가 생김 -> 안쓰는데도 메모리가 꽉차게되서 프로그램을 먹는 경우가 생김

 

이런 사치를 막기위해 GC가 나옴

 

우리가 방학때 일기 쓰듯이 한꺼번에 몰아서 지움, 개발자가 호출하고 싶을때 못함 -> 불확실한 타이밍에 가동함 이게 너무 치명적임 (사람이 몰려서 갑자기 메모리가 폭주하듯이 많이 쓰는데 이걸 GC가 감지해서 지워버리기때문에 더 폭주해버림), 수동이든 자동이든 장단점이 발생하는데 C#은 자동을 채택했다.

 

 

인스턴스

어떤 타입을 실체화한 것을 객체 또는 인스턴스라고한다. new 연산자를 거쳐서 메모리에 할당된 객체라고 할 수 있다. 그 객체와 관련된 멤버를 인스턴스 멤버라고한다. 필드, 메서드, 생성자(특별한 메서드)는 모두 여기에 속한다.

 

인스턴스 필드 

이름 그대로 클래스의 인스턴스를 생성해야만 접근할 수 있는 필드를 말한다.

 

인스턴스 메서드

이름 그대로 클래스의 인스턴스를 생성해야만 호출할 수 있는 메서드를 말한다. this 키워드를 사용해서 해당 클래스의 필드에 접근이 가능하다.

단, static으로 선언된 정적 필드는 this 키워드로 접근이 불가능하다. 인스턴스 메서드에서 정적 필드에 접근이 불가능한 것은 아니다.

 

정적 필드

정적 필드는 자료형 앞에 static 키워드를 이용해서 선언한 필드이다. 클래스의 인스턴스를 만들지 않고도 클래스로부터 접근이 가능하다.

 

정적 메서드

메서드 맨 앞에 static 를 사용해서 선언할 수 있다. 클래스의 인스턴스를 만들지 않고도 클래스로부터 바로 호출이 가능하고, 인스턴스 필드의 접근이 불가능하다. static으로 선언된 정적 필드만 접근이 가능하다.

 

 

 

참조변수

 

스택          │                    힙

person                

ㅁ         ㅡㅡ>>   ㅁ Person(참조변수)    

             new      ㅁ  _name               ㅡㅡ>>   ㅁ 홍길동

                           (참조변수)

 

person._name

person은 스택

.을찍으면 건너가라(닷연산자)

_name을 찾아라(힙에있는)

대신 new를 넣어야함

동적할당을 사용하지않으면 갈곳이없어서 에러가 난다. 그래서 동적할당을 해줘야한다

 

 

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
 
namespace _20200529_002
{
    class Person
    {
        public string _name; //인스턴스 필드
                public Person(string name) // 인스턴스 생성자
        {
            _name = name;
        }
        public void OutputYourName() // 인스턴스 메서드
        {
            Console.WriteLine(_name);
        }
    }
    
    class Program
    {
       
        static void Main(string[] args)
        {
            Person person = new Person("홍길동");
            person.OutputYourName();
            Console.WriteLine(person._name);
        }
    }
}
cs

객체를 만들어야 접근이 가능하기 때문에 new가 필요하다
인스턴스 참조 변수 person를 쓸 수 없다

변수 이름을 접근할때 클래스로 정의해야한다

스태틱을 적으면 컴파일시점에 생성되서 집어 넣는다. (컴파일과 런타임 둘다 생성)

new를 적으면 실행시점에 생성되서 집어 넣는다

 

Person이라는 클래스에  string _name을 만들어 놓는다.  

 

new는 실행될때 올라가는 프로그램. 객체는 실행될때 만들어진다.(실행되는 시점=런타임(Run-Time))

 

new는 메모리(RAM)에만 존재, 스태틱은 파일에 존재

프로그램은 파일에 있는거를 메모리로 옮긴 다음에 실행한다(폰노이만의 프로그램 적재방식)

폰노이만은 인간은 기억과 연산을 구분하는데 연산을 모방해서 CPU, 기억을 모방해서 RAM을 만들었다

 

번역하는건 실행하는 시점은 아니다(예를들어 ;을 빼먹어서 컴파일이 안된다(문법오류) -> 컴파일타임에러)

(오락하다가 꺼졌다, 프로그램이 스톱했다 -> 런타임에러)

만든 소스를 번역하는시점, 실행하는 단계는 아님(Complie-Time)

 

static이 광범위하게 쓸 수 있어서 좋지만 만들지 않아도 존재하는 메커니즘때문에 용량을 많이 차지하기때문에 거의 쓰지 않는 것이 좋다

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

int A;

static int B;  

 

컴파일 번역하면

 

실행파일 안에서는 'A를 만들어라' 라는 명령어와 이미 생성된 파일 B가 있다

 

실행하면 로딩중에는 A를 만들어라'라는 명령이 메모리에 저장되서 CPU가 그걸 가져와서 stack영역에 A를 만든다

B는 이미 만들어져있기때문에 그대로 있다.

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

 

 

 

 

 

왼쪽코드에서

Person person1 = new Person(홍길동)으로 '새로운 객체'를 하나 만들어서 0으로 시작되어서 ++하면 1이 되고

Person person2 = new Person(홍길순)으로 '새로운 객체'를 하나 만들어서 0으로 시작되어서 ++하면 1이된다

 

 

객체와 상관없이 실행되기전에 만들어져있다, 객체가 100개 만들어져도 하나밖에 안만들어진다

 

 

우리 교실은 전용자리가 있는 변수(_name)

한명이 나가면 책상치우고 한명이 들어오면 책상이 들어오듯이 만들어졌다 지웠다해지지만, 화장실은 계속있다.

화장실은 다같이 1개만쓴다(공용개념)

 

 

공통된 변수를 쓸 수 있기때문에 객체가 몇개인지 세고싶으면 스태틱을 이용해서 카운트하면된다.

 

 

 

정적 메서드

객체 생성없이 메서드를 호출할 수 있다

메인이 메서드이고 void와 static이 붙어있다.(자바는 퍼블릭까지 붙어있다)

 

 

 

명령 실행시 매개 변수 개수를 인지하여 출력하는 반복문 작성

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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace _20200529_004
{
    class Program
    {
 
        static void Main(string[] args)
        { // string[] args 사용방법
       
            /*int iCount;
           for(iCount = 0; iCount < args.Length; ++iCount)
           {
               Console.WriteLine("[{0}] : {1}", iCount, args[iCount]);
           }
          */
            foreach (string command in args)
            {
                Console.WriteLine(command);
            }
        }
    }
}
cs

주석 처리된 for으로 돌려도 똑같이 출력됩니다.

실행창에서 숫자를 입력했을때 그대로 출력되는 모습

 

 

 

 

정적메서드랑 동적메서드 개수비교

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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
class Person
{
    public string _name;
    public Person(string name)
    {
        _name = name;
        Console.WriteLine("ctor 실행");
    }
    static Person()
    {
        Console.WriteLine("cctor 실행");
    }
}
namespace _20200529_005
{
    class Program
    {
        static void Main(string[] args)
        {
            Person person1 = new Person("");
            Console.WriteLine("--------");
            Person person2 = new Person("");
        }
    }
}
    /* 출력결과
      cctor 실행
      cotr 실행
      --------
      cotr 실행
     */
 
 
cs

 

 

네임스페이스

이름 중복 변수 이름이나 클래스 이름이나 메서드 이름이 우연히 겹쳐서 동작을 안한다... 이때 클래스(나 메서드나 변수)를 분류하는 방법으로 네임스페이스를 쓴다

 

 

private는 중요한거 보호하려고 쓴다.

네임스페이스를 자판기에 비유

돈과 상품을 보호(철판에다 구멍을 내놨다)

버튼구멍, 돈구멍(반환, 입금, 잔돈),상품구멍등을 사용하기위해 다 막아놓고 필요한거만 구멍을 낸다.

프로그램작성할때도 싹다 막고 필요한것만 퍼블릭선언을해야한다.

 

반응형