1) 객체지향 프로그래밍(Object-Oriented Programming)
1.1) 객체(Object)
물리적으로 존재하거나 추상적으로 생각할 수 있는 것 중에서 자신의 속성을 가지고 있고 다른 것과 식별이 가능한 것
ex) 자동차, 자전거, 학과, 강의, ...
클래스에 정의된 내용이 메모리에 생성된 것
클래스로부터 객체를 만드는 과정을 클래스의 인스턴스화(instantiate)
어떤 클래스로부터 만들어진 객체를 그 클래스의 인스턴스(instance)
1.2) 객체지향 프로그래밍(Object Oriented Programming)
동일한 목적이나 기능을 하는 변수와 함수들을 각각 하나로 묶어서 객체로 만들고 그 객체들끼리 상호 작용하면서 프로그램 전체가 돌아가도록 코드를 구성
실제 세계에서 존재하는 객체를 컴퓨터 속에 옮겨 놓은 것과 같이 코드로 작성하는 프로그래밍 방식
ex) 객체 : 집 / 붕어빵 ; 클래스 : 설계도 / 틀
cf. C와 Java의 컴파일 과정
cf. 저급언어, 고급언어
- 저급언어 : 컴퓨터 내부에서 바로 처리 가능한 프로그래밍 언어 ex) 기계어
- 고급언어 : 사람이 알기 쉽도록 써진 프로그래밍 언어 ex) c언어, Java
2) 구조체(struct)
- 클래스는 참조 형식이지만 구조체는 값(value) 형식(메모리 stack 영역)이다.
- 클래스와 달리 구조체는 new 연산자를 사용하지 않고 인스턴스화 할 수 있다.
- 구조체는 생성자를 선언할 수 있으나 반드시 파라미터가 있어야 한다.
- 구조체 내부의 변수에 대해서 초기값을 설정할 수 없다.
- 구조체는 상속할 수 없다. 모든 구조체는 System.Object를 상속하는 System.ValueType에서 직접 상속한다.
[접근제한자] struct [구조체명]
{
// 생성자
// 멤버 변수
// 멤버 메서드
}
ex)
struct Student
{
public string name;
public int birth;
public int num;
}
static void Main(string[] args)
{
Student st1;
st1.name = "홍길동";
st1.birth = 19940728;
st1.num = 1334112;
//Console.WriteLine("이름 : {0}\n생년월일 : {1}\n학번 : {2}", st1.name, st1.birth, st1.num);
Console.WriteLine("이름 : " + st1.name);
Console.WriteLine("생년월일 : " + st1.birth);
Console.WriteLine("학번 : " + st1.num);
}
cf. 접근 제한자
외부로부터 타입(클래스, 구조체, 인터페이스, 델리게이트 등) 혹은 그 타입 멤버들(메서드, 속성, 이벤트, 필드 등)로의 접근을 제한할 때 사용하는 것
접근 제한자 | 설명 |
private | 클래스 내부에서만 접근이 가능하다. |
public | 모든 곳에서 해당 멤버로 접근이 가능하다. |
internal | 같은 어셈블리에서만 public으로 접근이 가능하다. |
protected | 클래스 외부에서만 접근할 수 없으나 파생 클래스(상속)에서는 접근이 가능하다. |
protected internal | 같은 어셈블리에서만 protected으로 접근이 가능하다. |
명시되지 않은 경우에 기본적으로 갖게 되는 제한자가 정의돼 있다. class 정의에서 접근 제한자를 생략한 경우 기본적으로 internal로 설정되며, class 내부의 멤버에 대해서는 private으로 설정된다. 접근 제한자는 정보 은닉에 중요한 역할을 한다.
cf) 형식 지정자(Numberic Formatting)
숫자형식 포맷팅을 이용하면 숫자로 이루어진 문자열을 다양한 형태로 출력할 수 있다.
이 포맷팅은 System.String.Format 메서드에 기반하여 적용된다.
형식지정자 | 종류 | 예제 코드 | 출력 결과 |
C / c | 통화(Currency) | Console.WriteLine("{0:C}", 2.5); Console.WriteLine("{0:C}", -2.5); |
$2.50 ($2.50) |
D / d | 10진법(Decimal) | Console.WriteLine("{0:D5}", 25}; | 00025 |
E / e | 과학적 지수(Scientific) | Console.WriteLine("{0:E}", 250000}; | 2.500000E+005 |
F / x | 고정 소수점(Fixed point) | Console.WriteLine("{0:F2}", 25); Console.WriteLine("{0:F0}", 25); |
25.00 25 |
G / g | 일반(General) | Console.WriteLine("{0:G}", 2.5}; | 2.5 |
N / n | 숫자(Number) | Console.WriteLine("{0:N}", 2500000}; | 2,500,000.00 |
P / p | 백분율(Percentage) | Console.WriteLine("{0:P}", 2468013}; Console.WriteLine("{0:P1}", 2468013}; |
24.68% 24.7% |
X / x | 16진법(Hexadecimal) | Console.WriteLine("{0:X}", 250); Console.WriteLine("{0:X}", 0xffff); |
FA FFFF |
3) foreach 문
foreach(표현식요소의_자료형 변수명 in 표현식)
구문;
//또는
foreach(표현식요소의_자료형 변수명 in 표현식) 구문;
표현식에 올 수 있는 대표적인 자료형은 배열이다. foreach 문은 in 다음에 오는 배열을 처음부터 끝까지 순회하면서 개별 요소를 선언된 변수에 넣어 반복문 구문 내에서 해당 변수를 사용할 수 있게 해 준다.
4) 배열(array)
같은 데이터 유형의 변수명을 여러 개 사용해야 할 때 사용한다. C#에서 new 키워드는 참조 형식과 함께 사용되는 경우 그에 필요한 메모리 힙(Heap)에 할당하는 역할을 한다. 메모리가 허락하는 한까지 다차원 배열을 선언할 수 있다.
4.1)
4.2) 배열의 초기값
int[] arScore = new int[5];
int[] products_1 = new int[5] {1,2,3,4,5};
int[] products_2 = new int[] {1,2,3,4,5};
string[,] arCity = {{"서울", "용인", "수원", "의정부"},
{"춘천", "홍천", "평창", "양구"},
{"대전", "합덕", "논산", "당진"}};
int[,] i2array = { { 1000, 1004, 1008 },
{ 1012, 1016, 1020 } };
4.3) 배열 요소의 참조
- 배열 요소를 참조할 때는 [ ] 괄호 안에 요소의 첨자(index)를 적는다.
- 첨자는 항상 0부터 시작하며 최대 첨자는 배열 크기보다 1 더 작다.
- 배열의 첨자가 범위를 벗어나면 IndexOutOfRangeException 예외가 발생한다.
ex)
int[] i_money = new int[20];
for(int i_count = 0; i_count < 20; i_count++)
{
i_money[i_count] = 1000 + 4 * i_count;
Console.WriteLine("i_money[{0}] : {1}", i_count, i_money[i_count]);
}
4.4) 배열의 메서드
멤버 | 설명 |
GetLength(n) | n차원의 요소 개수를 조사한다. |
GetUpperBound(n) | n차원의 마지막 요소 첨자(index)를 조사한다. 개수보다 항상 1 적다. |
Length | 배열 요소의 총 개수를 조사한다. 모든 차수의 곱과 같다. |
Rank | 배열의 차수를 조사한다. |
Sort | 배열 요소를 크기순으로 정렬한다. 일정 범위의 요소만 정렬할 수도 있다. |
Reverse | 배열 요소의 순서를 반대로 뒤집는다. 일정 범위의 요소만 뒤집을 수도 있다. |
BinarySearch | 이분 검색으로 요소를 찾는다. 검색된 경우 그 첨자가 리턴된다. 이 메서드를 호출하려면 배열이 정렬되어 있어야 한다. |
Clear | 지정한 범위의 요소를 삭제하여 기본값으로 만든다. |
- 배열은 System.Array 클래스로 구현되며 이 클래스에는 배열을 관리하는 멤버가 포함되어 있다.
- 배열을 순회할 때 상수 대신 Length를 사용해야 한다.
ex)
int[] i_money = new int[20];
Console.WriteLine(i_money.GetLength(0));
int[,] i2array = new int[2, 3];
Console.WriteLine(i2array.GetLength(0));
Console.WriteLine(i2array.GetLength(1));
int[,] i2array = new int[2, 3];
i2array[0, 0] = 1000;
i2array[0, 1] = 1004;
i2array[0, 2] = 1008;
i2array[1, 0] = 1012;
i2array[1, 1] = 1016;
i2array[1, 2] = 1020;
/*int count = 0;
for(int i = 0; i < 2 ; i++)
{
for(int j =0; j<3;j++)
{
i2array[i, j] = 1000 + 4 *count;
count++;
}
}*/
for(int i = 0 ; i < 2 ; i++)
{
for(int j = 0 ; j < 3 ; j++)
{
Console.Write("{0} ", i2array[i, j]);
}
Console.WriteLine();
}
int count = 0;
foreach(int num in i2array)
{
if(count%i2array.GetLength(1) == 0)
{
Console.WriteLine();
}
Console.Write("{0} ", num);
count++;
}
int[,] arr = new int[2, 3] { { 1, 2, 3 }, { 4, 5, 6 } };
for(int i = 0;i<arr.GetLength(0);i++)
{
for(int j =0;j<arr.GetLength(1);j++)
{
Console.Write("[{0}, {1}] : {2} ", i, j, arr[i, j]);
}
Console.WriteLine();
}
Console.WriteLine();
int[,] arr2 = new int[,] { { 1, 2, 3 }, { 4, 5, 6 } };
for (int i = 0; i < arr2.GetLength(0); i++)
{
for (int j = 0; j < arr2.GetLength(1); j++)
{
Console.Write("[{0}, {1}] : {2} ", i, j, arr2[i, j]);
}
Console.WriteLine();
}
Console.WriteLine();
int[,] arr3 = { { 1, 2, 3 }, { 4, 5, 6 } };
for (int i = 0; i < arr3.GetLength(0); i++)
{
for (int j = 0; j < arr3.GetLength(1); j++)
{
Console.Write("[{0}, {1}] : {2} ", i, j, arr3[i, j]);
}
Console.WriteLine();
}
Console.WriteLine();
foreach(int a in arr3)
{
Console.WriteLine("{0}", a);
}
int[,] iarray = { { 1, 3, 2 }, { 5, 4, 6 } };
Console.WriteLine(iarray.GetLength(0));
Console.WriteLine(iarray.GetUpperBound(0));
Console.WriteLine(iarray.Length);
Console.WriteLine(iarray.Rank);
int[] iarray2 = { 1,48,4,21,3,6};
Array.Sort(iarray2);
foreach(int i in iarray2)
{
Console.Write(i+" ");
}
Console.WriteLine();
Console.WriteLine(Array.BinarySearch(iarray2, 3));
Array.Reverse(iarray2);
foreach (int i in iarray2)
{
Console.Write(i + " ");
}
Console.WriteLine();
Array.Clear(iarray, 2, 4);
foreach (int i in iarray)
{
Console.Write(i + " ");
}
Console.WriteLine();
cf. 스택, 큐
① 스택(stack)
스택이란 쌓아 올린다는 의미이다. 스택 자료구조라는 것은 접시를 쌓듯이 자료를 차곡차곡 쌓아 올린 형태의 구조를 말한다. 같은 구조와 크기의 자료를 정해진 방향으로만 쌓을 수 있고, top이라고 정한 한 곳으로만 접근하도록 제한되어 있다. 스택에서의 top은 현재 스택의 가장 위에 있는 마지막 자료를 가리키며 삽입되는 새 자료는 top이 가리키는 자료의 위에 쌓이게 된다. 자료를 삭제할 때에도 역시 top을 통해서만 가능하다. 이를 LIFO(Last In First Out) / 후입 선출이라고 한다. top을 통한 삽입 연산을 push, top을 통한 삭제 연산을 pop이라고 한다.
② 큐(Queue)
삽입과 삭제의 위치와 방법이 제한된 유한 순서 리스트지만(Finite Ordered List)지만, 스택과 달리 리스트의 한쪽 끝에서는 삽입 작업만 이루어지고 반대쪽 끝에서는 삭제 작업이 이루어진다. 삽입된 순서대로 먼저 삽입된 자료가 먼저 삭제되는 FIFO(First In First Out) / 선입선출의 구조이다. 큐의 리어(rear)에서 이루어지는 삽입 연산을 인큐(enQueue)라고 하고, 프런트(front)에서 이루어지는 삭제 연산을 디큐(deQueue)라고 한다.
'스마트팩토리 > C#' 카테고리의 다른 글
8. 종료자, static, 네임스페이스 (0) | 2020.05.29 |
---|---|
7. 클래스 (0) | 2020.05.28 |
5. 복합 대입 연산자, 반복문, 점프문, 메서드 (0) | 2020.05.26 |
4. if문, 연산자, switch문 (0) | 2020.05.25 |
3. 진법, 불린형 기본타입, 형변환, 기본 문법 요소 (0) | 2020.05.23 |