본문으로 바로가기

C# 복습 (3)

category 개발자과정준비/C# 2020. 7. 14. 23:42
반응형

라즈베리파이가 오지않았으므로 C# 복습을 해보자.

프로그램은 무엇인가?

일을 순서대로 처리하는 것.

큰거일수도있고, 작은거일수도있는데, 프로그램안의 프로그램을 메서드, 기능이라고한다.

메서드의 정의

접근속성  반환타입 이름 (매개변수)    // 매개변수는 인자, 인수로도 불린다

{

본문

 

메서드의 이름이 같더라도 매개변수가 다르면 사용할 수 있다.

이것을 메서드 오버로딩이라 부른다. 이름이 같아야하고, 인자가 달라야한다.
            
 int Add (int N1, int N2)
  {
  }
double Add(double N1, double N2){
  {
     return D1 + D2;
  }
             
  이때 Add를 호출해도 오류가 뜨지 않으면 객체 지향이다.

  // 메서드 오버로드
        static int Add(int N1, int N2)
        {
            Console.WriteLine("저는 int형입니다");
            return N1 + N2;
        }
        
        static double Add(double N1, double N2)
        {
            Console.WriteLine("저는 double형입니다");
            return N1 + N2;
        }

        static float Add(float N1, float N2)
        {
            Console.WriteLine("저는 float형입니다");
            return N1 + N2;
        }
        static void Main(string[] args)
        {
            Add(1, 2);
            Add(1.0, 2.0);
            Add(1.0f, 2.0f);
        }

 

 

 

배열의 숫자를 찾아보는 코드

// 324가 배열의 [3]번째인데 그걸 알아보는 코드를 짜보자

int[] Array = { 144, 123, 232, 324, 789 };
int index = System.Array.IndexOf(Array, 324);
//index를 int형으로 몇번째인지 확인하는 코드
//배열의 검색기능이있다.라는 것을 알 수 있다.

Console.WriteLine(index);

 

 

C#에는 자체적으로 찾아주는 기능이있지만 C에는 그렇지않다. C에서하는 것처럼 반복문을 통해서 직접 찾아보자.

      for (int Count = 0; Count < Array.Length;)
            {
                //324의 위치를 찾아라
                if (Array[Count] == 324)
                {
                    Console.WriteLine("찾았습니다. : " + Array[Count]);
                    Console.WriteLine("지금 배열의 횟수 : " + Count);
                    break;
                }
                else
                {
                    Console.WriteLine("찾는 중입니다.... 지금 숫자 : " + Array[Count]);
                    Console.WriteLine("지금 배열의 횟수 : " + Count);
                    Console.WriteLine();
                    ++Count;
                }
            }

 

 

 

 

메서드의 반환타입이 배열일때

 class Program
    {
        static int[] Test()   // 반환형도 배열로 해줘야한다.
        {
            int[] Array = new int[5]; // 배열 5개 생성

            return Array;
        }
        static void Main(string[] args)
        {
            int[] Ret = Test();  // Ret가 Test를 받음

            Console.WriteLine(Ret.Length);  // Ret가 5개를 받았는지 확인하는 코드
        }
    }

 

 

 

메인메서드에서 배열을 받았을때

 class Program
    {
        static int[] test(int[] Var)  // 매개변수(인자,인수)가 배열인 것을 기억하자
        {
            Console.WriteLine(Var.Length);  // 배열의 길이를 출력
            return Var;
        }
        static void Main(string[] args)
        {
            int[] Array = new int[5];
            test(Array);
        }
    }

 

 

 

 

 

배열을 반환받고 리턴도 배열로 반환하는거(위에꺼 두개를 섞은거)

class Program
    {
        static int[] test(int[] Var)
        {
            Var[0] = 99;
            return Var;
        }
        static void Main(string[] args)
        {
            int[] Array1 = new int[100];
            int[] Array2 = test(Array1);
            Console.WriteLine(Array1[0]);
            Console.WriteLine(Array2[0]);
        }
    }

 

 

 

 

 

 

 

밑의 코드를 작성해놓고 이 실행파일이 저장된 폴더로 가보자.

namespace _20200713_001
{
    class Program
    {
        static void Main(string[] args)  // 인자를 영어로 arguments라고해서 args로 보통 많이 쓴다.
            // Main의 인자는 윈도우가 만들어준다.
        {
            Console.WriteLine(args.Length);
        }
    }
}

해당 파일이 저장되있는 곳에서 명령창을 띄워보자
명령창을 띄운 모습
Cmd창에  DIR을 쳐서 파일이름을 확인한다음에 파일명을 쳐서 엔터를누르면 ' 0 ' 이 뜬다.
파일명을 치고 띄어쓰기해서 아무문자나 치고, 또 띄워쓰기한 후에 문자를눌러서 엔터를치면 숫자가 점점 올라간다.

 

이를 통해 메인메서드의 args는 윈도우가 자동으로 배열공간을 생성해주는 것을 알 수 있다.

 

 

 

 

이 과정을 VS에서도 할 수 있다!

 class Program
    {
        static void Main(string[] TTT)  // 인자를 영어로 arguments라고해서 args로 보통 많이 쓴다.
            // Main의 인자는 윈도우가 만들어준다.
        {
            Console.WriteLine(TTT.Length);
            if (0 == TTT.Length)
            {
                Console.WriteLine("그냥 열기");
            }
            else if (1 == TTT.Length)
            {
                Console.WriteLine("{0} 파일 이름으로 열기", TTT[0]);
            }
        }
    }

프로젝트 -> 맨밑의 속성에서 창을 띄운다음 디버그에서 명령줄 인수에 값을 입력해보자.(띄워쓰기로 개수를 늘린다)
위에는 a.txt가 입력되어있을때, 밑에는 아무것도 없을때

 

 

 

 

객체지향 프로그래밍

데이터의 추상화, 캡슐화, 모듈화, 계층성

객체지향프로그래밍(Object Oriented Programing -> OOP) (참고로 객체, 클래스중에 객체가 먼저 개념이 정립)

 

 

클래스의 속성, 행위

속성 : 변수

행위 : 메서드

변수와 메서드를 모아놓은 것을 클래스

다른데서 Car ㅁ = new ㅁ로 만든 것을 객체

실제 객체를 컴퓨터로 옮기는게 객체지향프로그래밍

실제를 모델링을통해 속성과 행위로 분리해서 나열한 다음, 객체를 생성해서 만든 프로그램은 객체지향프로그램

 

왜 객체 지향을 사용하는가?

만약 10만줄의 코드를 기반으로 프로그램을 만들었다고 가정해보자.

C언어로 보다가 오류가 발생했을때 처음부터 끝까지 보면서 오류를 관리해야한다.

만약 C#이면 오류가 뜬 클래스에만 오류관리를해주면 된다.

이러한 이유로 객체지향프로그래밍이 유지,보수 관리에 조금 더 효율적이기때문에 사용한다.

상속

단일상속 : 하나만 상속 받아서 하나를 만든다.

다중상속 : 아빠가 3명(?) 여러개에서 상속받을 수 있다.

 

 

 

메인메서드는 항상 클래스에 존재해야한다.

메인이 속한 클래스는 프로젝트 전체에 해당되는 이름으로 해주는게 좋다.

 

 

 

메모리는 5가지로 나눠서 쓰고있다.

Code
Data
Bss
Heap
Stack

메모리의 5가지 영역

Code/Text영역에는 주로 메서드(메서드도 주소를 가지고있는데, C#은 주소를 숨겨놨음..), 상수가 들어간다. 이 영역에는 쓰기(W)가아니라 읽기(R)만 가능하다.

Data, Bss영역에는 static 변수가 들어가있다.

Heap영역에는 객체(클래스 내부의 변수)로 주로 쓴다.

Stack영역에는 지역변수(메서드 내부 변수)를 주로 쓴다.

 

이 5가지 영역은 용도에따라서 위치가 변할 수도 있다.

 

 

클래스

Car 클래스 예제를 만들어보자

Auto클래스안에 Car클래스를쓰면 Car클래스는 Auto안에서만 쓸 수 있다.
다른 프로젝트에서도 쓰려면 Car클래스를 Auto클래스 밖에 만들어줘야한다.
(PS4 게임기를샀는데 거실에두냐, 내 방에 두냐랑 비슷한 개념이다.)

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

class Car
{
    //속성(Attribute) : 변수 
    //속도(숫자:int)
    
    private int Speed;  // 변수에도 접근권한을 설정해줄 수 있다
    // Speed를 private하면 클래스 내부에서만 사용할 수 있으므로 직접적인 사용은 불가능하고
    // 간접적으로 Accel과 braek로 사용할 수 있다.
    private const int SpeedValue = 10;
    private const int SpeedLimit = 200;


    //행위(Behavior) : 메서드
    public void Run()
    {
        Console.WriteLine("달립니다.");
    }

    public void Accel()
    {
        Speed = Speed + SpeedValue;  // 위의 상수값을 바꾸면 저절로 바뀌도록 묶어준다
        if(Speed > SpeedLimit)
        {
            Speed = SpeedLimit;
        }
        Console.WriteLine("현재 속도는 {0}입니다.", Speed);
    }

    public void Break()
    {
        Speed = Speed - SpeedValue;
        if(Speed < 0)
        {
            Speed = 0;
        }
        Console.WriteLine("현재 속도는 {0}입니다.", Speed);
    }

}
    

public class Auto
 {
    static void Main(string[] args)
    {
        Car aCar = new Car();
        aCar.Accel();
        aCar.Accel();
        aCar.Accel();
        aCar.Accel();
        aCar.Break();
        aCar.Break();
        aCar.Break();
        aCar.Break();
        aCar.Run();
    }

    /*
    static void Main1(string[] args)
     {
        Car aCar;  // 객체를 가리키는 애를 선언
        aCar = new Car();
        // Heap메모리에 Car스타일의 object가 생성된 후, 대입연산자(=)로인해 Heap영역의 주소가 aCar로 전달
      
        aCar.Run();  // .을 찍어서 소속된 객체참조변수를 호출
        aCar.Speed = 0;  // 오류가뜨지만 public을 붙여주면 없어진다.

        Console.WriteLine($"aCar의 속도는 {aCar.Speed}입니다. ");  // C#에서만 있는 출력코드
        Console.WriteLine("aCar의 속도는 {0}입니다. ", aCar.Speed);  // 변수를 한번에 볼 수 있다
        Console.WriteLine("aCar의 속도는 " + aCar.Speed + "입니다. "); // 자바는 이거밖에 못쓴대
    }
    */
}

 

 

 

생성자 예제

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _20200714_002
{
    // 생성자 예제
    // 생성자 만드는법 : 메서드, 클래스이름과 같아야함(ex)메서드 이름이 Car)
    class Program
    {
        class Car
        {
            string color;
            string vender;  // 제조사
            string name;
            
            /*
            생성자
            1. 메서드이다.
            2. 클래스와 이름이 동일하다.
            3. 반환 타입이 존재하지 않는다.(void형이다)
            */
           
            public Car()   // 디폴트(기본) 생성자(인자가 없는 생성자)
            {
                Console.WriteLine("Car 디폴트 생성자 호출");
            }

            public Car(string name)   // 생성자 오버로딩(이름은 같은데 인자가 다름)
            {
                Console.WriteLine("Car 생성자 호출");
            }

            ~Car()
            {
                Console.WriteLine("Car 소멸자 호출");
            }
        }

        static void Main(string[] args)
        {
            Console.WriteLine("1===========================");
            Car aCar = new Car("비엠따블유"); // new다음은 해당 객체의 생성자가 생성된다.
            // 인자 "비엠따블유"때문에 Car(string name) 호출
            new Car();  // 인자 없으니까 디폴트생성자 호출
            Console.WriteLine("2===========================");
            // 객체를 생성할때 1번만 호출된다.
        }
    }
}

 

 Main메서드에서

- new Car("비엠따블유")에서는 

"비엠따블유"라는 인자가있으므로 Car(string name) 인자가 호출

 

- new Car()에서는 인자가 없으므로 Car() 디폴트 생성자가 호출된다.

 

 

 

반응형