본문으로 바로가기
반응형

 새 책이 나왔는데 수준이 높아서 교육기간 동안 쓸일이 없답니다... 칼라가 많으면 책이 비싸지니 차라리 모니터 좋은걸 사라는 꿀팁을 받았습니다. 또, 어떤 사람이봐도 이해하기 쉬운 언어일수록 고급언어, 이해하기 어려울수록 저급언어라고 하셨습니다.

 

 

 지금까지 배웠던 C#기초는 기본형 프로그래밍언어이고 이제부터 객체형프로그래밍언어에 공부해볼예정입니다.

 

 제목에 썼던 구조체, 클래스, 배열이 바로 객체지향 프로그래밍인데요,

 

 그럼 객체가 무엇이냐?

 프로그래밍에서 객체는 자료와 그 자료에 대한 연산(방법)을 함께 묶어 둔 것이라고 합니다.

이름을 붙일 수 있는 것 -> 자기 자신을 포함하여 서로 연관된 변수와 데이터묶음이라고 볼 수 있죠.

 

 그럼 객체지향 프로그래밍은 무엇일까요?

 같은 목적이나 연산을하는 것들을 묶어서 객체를 만든 다음에 그 객체를 사용하여 프로그래밍을하는 것을 의미합니다.

 

 

 그리고 C#을 쓰다보면 위에 걸려있는 글들이 많은데요

 using은 시스템 라이브러리를 사용하겠다는 표현이고, using System 선언에 의해 system 네임스페이스의 모든 클래스를 자유롭게 사용할 수 있습니다. 이때 네임스페이스는 명칭을 저장하는 영역이며 주로 클래스를 담게됩니다.

 Main은 닷넷 프로그램의 시작점이며 이 메서드에서부터 실행을 시작한다. 프로그래밍을 중에 에러 발생시 코드를 수정한 후 다시 컴파일하면됩니다.

 출력을쓸때 Console.WriteLine도 Console 안에 들어있는 WriteLine을 사용하는 것으로 알 수 있습니다.

 

구조체(struct)

 구조체는 사용자가 직접 만드는 데이터 유형으로 int, float, char같은 C#에서 기본적으로 제공되는 변수가아니라 우리가 새로운 유형을 만들어서 사용할 수 있습니다. C#에서 구조체는 일반 변수와 같이 값 형식의 데이터 형식입니다.

 

 구조체를 써먹으려면 struct문을 사용합니다.

 

 struct문은 두개 이상의 변수가 있는 새로운 데이터 형식을 정의합니다. 예시로 test의 구조체를 만든다고하면 int iNum;이 아닌 test stNum; 같은 새로운 타입을 만들 수 있는 것이죠. 참고로 객체를 분석했을때 상태정보, 행위정보가 있는데 이것을 한 곳에 모아두는 게 있고 구조체는 상태만 저장되고, 행위정보는 메서드에 넣을 수 있습니다. 상태, 행위정보까지 넣어서 만드는 자료타입을 클래스라고합니다.

구조체의 예시를 들어보겠습니다.

 

struct 이름{

새로운 변수 선언

}

 

 사용법은 이렇게하면되고, 우리나라에 있는 학생들의 이름과 생년월일, 학번을 저장하는 변수를 만든다고 가정해보겠습니다.

학생1

이름       -> string Name1;

생년월일  -> int Birth1;

학번        -> int Num1;

 

학생2

이름       -> string Name2;

생년월일  -> int Birth2;

학번        -> int Num2;

 

 이렇게 학생수가 더 많아지면 코드는 단순하겠지만 너무 많아서 힘들어지기때문에 한꺼번에 묶는 방법을 생각해낸 것이 바로 구조체입니다.

맨위 struct Student로 구조체를 만들어서 void Main에 Student st1으로 변수의 개수를 줄일 수 있다 
4번째에 16진수는 지나가던 팁으로 한번 해봤습니다 

 

 

 

배열 

 배열은 동일한 타입의 변수를 하나의 이름으로 묶어 놓은 것입니다.

(같은 자료형을 여러개 모아둔 것, 구조체는 여러가지 자료형을 한번에 묶는 것입니다)

 배열의 선언은 

타입[] 변수명;    으로 할 수 있고, 차수를 [ ] 괄호 안의 콤마(,)의 수+1로 정의할 수 있습니다.

int [] arScore;       // 1차원 정수 배열

double[] arRate;    // 1차원 실수 배열

int[,] arSung;        // 2차원 정수 배열

string[,,] arName;  // 3차원 문자열 배열

 

 배열은 메모리가 허락하는 한까지 다차원 배열을 선언할 수 있다고 합니다.

 

 예시를 들어보겠습니다.

 한 교실의 20명의 학생들에게 지금 주머니에 있는 돈을 걷는다고 할때, 한 사람당 금액이 얼마나 있는지 기록하려고합니다. 그러면 변수선언을 해야겠죠.

int iMoney1;

int iMoney2;

int iMoney3;

.

.

.

int iMoney20;

 이렇게 되면 만들어야할 변수만 20줄이나 됩니다. 만약 3000명의 돈을 걷어간다고하면 너무 많아져서 관리가 힘들어지겠죠. 그래서 하나의 이름으로 관리하고 나머지는 번호로 관리하는 방법인 배열을 사용할 수 있습니다.

 

int[ ] iMoney; 로 배열을 선언하고 iMoney = new int[20];으로 20개쓴 효과를 낼 수 있다

iMoney = int[20];   이 한줄로 배열을 선언하게되면 int형에 학생1부터 20명까지의 변수가 선언됩니다.

예제에서 학생들의 돈은 1000원부터 4원씩 증가하기에 for문으로 더 간단하게 만들 수 있습니다.

 

다음은 2차원 배열을 알아야하는데요, 그 전에 스택(Stack), 힙(Heap), 데이터(Data)영역을 알아야합니다.

 

컴퓨터의 RAM(메모리)는 5가지 영역으로 나눠져있습니다.

Code
Data
BSS
Heap
Stack

대략 이렇게 나뉘어져있는데 지금은 Heap과 Stack만 알아보고 나머진 다음에 알아보도록 하겠습니다.

스택

스택이란? 쌓아 올린다는 뜻으로, 각 기능에의해 생성된 임시 변수를 저장하는 컴퓨터 메모리의 일종의 영역입니다.

 

만약 그릇에 A, B, C라는 물건을 차례대로 담으면 아래의 표처럼 쌓여있습니다.

 
 
C
B
A

이때 처음 들어간 A를 First in이라고합니다.

 지금 그릇에서 하나씩 차례대로 꺼내면 C->B->A순으로 나오게되겠죠? 이때 A가 마지막에 나왔다고해서 Last out이라고 합니다.

 대략 이런 알고리즘을 Stack이라고하고 이 스택의 특징은 방금 접근했던것에 자주 접근할 확률이 높다는 특징이 있습니다.

 

 참고로 데이터를 양옆이 뚫려있는 일종의 파이프같은 곳에 C,B,A가 저장되어있다고 가정합니다.

ㅡ> 왼쪽에서 밀면

  C B A

 오른쪽으로 A->B->C 순으로 떨어진다고할때 이런 구조를 파이프 구조라하고 큐(Queue)라고 부릅니다.

(키보드에 ABC를 입력했을때 ABC순으로 출력되는 구조를 보고 큐구조라고 부릅니다.)

 

 

힙은 자세히... 알아봐야겠지만 원래 데이터의 변수선언하면 메모리의 스택 영역에 저장됩니다.

이때 변수 선언을 new int A; 이런식으로하게되면 스택이 아니라 Heap영역에 저장됩니다. 큐구조에서 삽입 연산, 삭제 연산 등이있지만 일단은 여기까지..로 하겠습니다.

 

 

2차원 배열

 위의 학생의 예제는 1차원 배열이고, 이번엔 2차원 배열을 알아보겠습니다.

 배열 선언을할때 new int[행, 렬]을 뜻하고,

 임의로 int[,] i2Array = new int[2,3]을 선언하게되면

[0,0] [0,1] [0,2]
[1,0] [1,1] [1,2]

 스택에 2행, 3열의 6개의 방이 만들어집니다.

또, 임의로 i2Array[0,0] = 1000;   선언하면 [0,0] 자리에 1000이 들어가게됩니다.

 

나머지 값들도 표에 넣어주면

i2Array[0, 1] = 1004;

i2Array[0, 2] = 1008;

i2Array[1, 0] = 1012;

i2Array[1, 1] = 1016;

i2Array[1, 2] = 1020;

1000 1004 1008
1012 1016 1020

표에 이렇게 들어가게 되는 것이죠.

이 표의 숫자들의 배치처럼 출력도 해보겠습니다.

 

강사님께서 foreach문으로 써준 코드

(i2Array.GetLengTh(1)은 i2Array 배열의 열의 개수 = 3 입니다)

 

 밑에 foreach문은 위의 빨간색 네모로 그려진 for문을 지우고 삽입하면 출력이 그대로 되는 것을 확인할 수 있습니다.

 

이때 사용된 foreach문은

foreach(변수타입 변수명 in 배열)

{

반복할 구문

}

으로 쓰입니다.

 위에서 쓰인 foreach문은 int iNum을 선언한 다음, i2Array의 배열값들을 하나씩 가져온다고 생각하면됩니다. 변수선언하고 그 후에 배열을 놔두면 배열에 있는 데이터를 하나씩 순서대로 들고 와주는 것이죠.

 배열의 출력을 해야할때 for문과 비교했을때 더 간단하게 짤 수 있는 걸로 이해했습니다.. 다음에 예제를 더 작성해보도록 하겠습니다.

 

 

 이때 배열 i2Array 값들을 일일이 다 넣어줬는데, 한꺼번에 { }로 원하는 초기값을 콤마(,)로 구분하여 나열하는 방식으로 더 간단하게 선언할 수 있습니다.

또 예를들어, 크기와 타입은 생략 가능합니다.

int[] arScore = new int[5] { 1, 2, 3, 4, 5 };

int[] arScore = { 1, 2, 3, 4, 5 };  

 

 

마지막으로 배열의 기본 용어들에 대해 알아보겠습니다.

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
 
Console.WriteLine("=============================");
int[,] iArray = { { 123 }, { 456 } };
Console.WriteLine("GetLength(0) " + iArray.GetLength(0));
Console.WriteLine("GetLength(1) " + iArray.GetLength(1));
Console.WriteLine("GetUpperBound(0) " + iArray.GetUpperBound(0));
Console.WriteLine("GetUpperBound(1) " + iArray.GetUpperBound(1));
Console.WriteLine("Length " + iArray.Length);
Console.WriteLine("=============================");
Console.WriteLine("Reverse Test : 1, 2, 3, 4, 5, 6 뒤집기");
int[] i1Array = { 123456 };
Array.Reverse(i1Array);
foreach (int iTemp in i1Array)
{
Console.Write(iTemp + " ");
}
Console.WriteLine("\n=============================");
Console.WriteLine("Sort Test : 7, 200, 2, 65, 84, 11 정열");
int[] i2Array = { 72002658411 };
Array.Sort(i2Array);
foreach (int iTemp in i2Array)
{
Console.Write(iTemp + " ");
}
Console.WriteLine("\n=============================");
Console.WriteLine("BinarySearch Test : 11의 위치(인덱스 번호) 검색");
int iResult = Array.BinarySearch(i2Array, 11); // 정렬된 11의 위치를 검색
Console.WriteLine("BinarySearch " + iResult); // 11의 위치의 index(번호)를 반환해준다
Console.WriteLine("=============================");
Console.WriteLine("Clear Test : 6, 5, 4, 3, 2, 1에서 [3]부터 2개 삭제");
Array.Clear(i1Array, 32);
foreach (int iTemp in i1Array)
{
Console.Write(iTemp + " ");
}
Console.WriteLine("\n=============================");
cs

 

각 배열에 사용되는 기능 용어들인데, 코드는 강사님께서 주셨습니다(다음에 제가 쓰던거있는데 그걸로 수정할께요)

기능의 뜻들은 표에 나와있고 밑에 코드는 사용법을 익히기위해 짜본 예제입니다.

 

 

 오늘은 C#의 객체지향프로그래밍에 맛보는 시간을 가졌습니다. 구조체, 배열의 예제를 작성해봤는데 클래스는 아직 예제를 작성해보지못했네요.. 다음엔 많은 예제를 작성해보겠습니다. 오늘 포스팅은 여기까지입니다.

 

감사합니다.

 

 

반응형