라즈베리파이가 오지않았으므로 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);
}
}
}
이를 통해 메인메서드의 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]);
}
}
}
객체지향 프로그래밍
데이터의 추상화, 캡슐화, 모듈화, 계층성
객체지향프로그래밍(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() 디폴트 생성자가 호출된다.
'개발자과정준비 > C#' 카테고리의 다른 글
[C#] 제네릭 프로그래밍(메서드, 클래스) (2) | 2020.08.19 |
---|---|
C# 복습 (4) (0) | 2020.07.20 |
C# 복습 (2) (0) | 2020.07.14 |
C# 복습 (1) (0) | 2020.07.14 |
[C#] 11. C# 초급(5) 클래스 형변환, 중첩클래스, 추상클래스, 델리게이트 (0) | 2020.06.07 |