-
C# 객체지향, 구조체, 배열(교육8일차)C# 2020. 5. 27. 18:16
객체지향 언어
우리가 프로그래밍을 배우는 이유는 컴퓨터에게 일을 시키고 싶어서이다, 하지만 컴퓨터는 기계어 즉 0과 1밖에 이해하지 못한다. 지금 사용하고 있는 프로그래밍 언어를 기계어로 번역을 컴파일러가 하는 것이다. 그렇다면 실행 속도는 기계어와 프로그래밍 언어 중에 어느 것이 더 빠를까. 답은 기계어이다. 우리가 이해하기 쉬운 언어는 프로그래밍 언어이고 기계가 이해하기 쉬운 언어는 기계어이다. 이때 기계어와 프로그래밍 언어 사이에 CPU를 직접 제어하는 어셈블리 언어가 있다. 기계가 이해하기 쉬울수록 저급 언어 우리가 이해하기 쉬 올수록 고급언어이다.
프로그래밍 언어 중 C언어는 어셈블리 문자를 획기적으로 단축시킨 지 50년이 되었다. HW는 눈부신 발전을 이루었지만 C언어는 그대로이다. 그래서 나온 개념이 객체지향이다. 그전까지는 흐름 지향이었다. 지금까지 했던 건 기본형(Basic Type, Built in)에서 객체형으로 발전했다. 여기서 C#은 2000년 마이크로소프트가 발표한 플랫폼 독립적인 실행환경이다. 여기서 플랫폼 독립적의 뜻은 하나의 소프트웨어만 만들고 어느 플랫폼에서나 실행하는 것이 목표로 설계되었다. C와 C++은 소스 차원의 이식성만 지원한다. 이진 호환성까지 확보한 진정한 플랫폼 독립 실행 환경은 1995년에 발표된 자바이다. C#과 java는 서로 경쟁 발전하는 관계이다. 특이사항으로는 최신 버전을 쓰기보다 검증된 안정된 버전을 쓰는 것이 좋다.
닷넷 코어
C#컴파일러
----> 윈도용 JIT ----> 윈도 기계어 코드
C# -------------> IL(중간 코드) ----> 리눅스용 JIT ----> 리눅스 기계어 코드
----> 맥용 JIT -----> 맥 기계어 코드
한 번만 만들어 놓으면 아무 CPU에서나 쓸 수 있지만, CPU에게 직접 명령을 내리는 C언어보다 속도가 느리다. 프레임 워크나 가상 머신을 설치하여 실행 환경을 맞춰야 하며, 성능보다 신속한 개발과 편리한 유지 보수, 안정성이 더 중요하다. 잘못 만들면 가상 기계(플랫폼)만 죽고 CPU에는 지장이 없다.
자바 가상 머신 : JVM, DALVIC(안드로이드)
C# 가상 머신 : CLR(Common Language Runtime) 플랫폼 닷넷 응용프로그램이 닷넷을 통해서 실행된다.
닷넷 언어가 공통으로 사용하는 타입 체계 CTS(Common Type System)
C언어에서 int 값을 넘기면 VB에서 Integer타입으로 받는다.
. NET의 장점은 네임벨류이다. 마이크로소프트에서 개발했으므로 윈도를 사용하는 모든 플랫폼에서 동작이 가능하다. 단점으로는 초기 제작 목표였던 대통합은 실패했고, 수많은 개발 방법 중의 하나로 성공적으로 자리매김했다.
프로젝트 분석
using 시스템 라이브러리를 사용
네임스페이스 - 추후 교육
Main 엔트리 포인트 (저번 글 참조)
C#은 자바와 C++을 결합하여 만들어낸 프로그래밍 언어인데, C++의 강력함과 Visual Basic의 편리함과 생산성 그리고 자바의 깔끔한 문법을 결합한 언어이다.
구조체
구조체는 사용자가 정의한 자료형이다. 사용자가 학생 50명의 인적사항을 기록한다고 했을 때, 학생 하나하나의 이름 나이 학번 등을 저장하기 위해 변수를 선언하기 너무 불편하다. 따라서 하나의 자료형을 만든다는 생각으로 구조체를 정의하여 이 구조체를 활용하면 훨씬 편리하다.
구조체(상태 정보)->클래스(상태 정보, 행위정보)위의 그림에서 빨간색 부분은 구조체를 정의하는 부분이다. 이름은 문자열, 생년월일이나 학번은 int형으로 선언했다. 원하는 자료형으로 선언해서 사용하면 될 것이다. 파란색 부분은 구조체를 선언하고 초기화하는 부분이다. 이 구조체를 사용하는 변수의 이름은 st1, st2 그리고 대입 연산자의 오른쪽 부분은 생성자로 새로운 객체를 생성하는 부분이다. 초록색 부분은 이 정보에서 정보를 추출해서 출력하는 부분이다.
배열배열은 동일 타입 변수를 하나의 이름으로 묶어 놓은 것이다. 변수의 이름을 여러 가지 선언할 필요 없이 데이터 타입이 똑같다면 인덱스로 구분하는 여러 개의 공간을 만든다.
int a=500
int [] iMoney=new int [20]
두 가지 변수가 있을 때 a는 평범하게 a라는 스택 공간에 500을 넣는다. 하지만 iMoney라는 배열을 선언하면 iMoney라는 스택 영역에 공간을 만들고 힙 영역에 4byte * 20개의 공간이 생기는데 iMoney의 스택 공간에는 20개의 공간 중 첫 번째 공간을 가리키는 주소를 들고 있다. 즉 첫 번째 숫자 즉 0번 공간의 힙 영역 주소를 iMoney의 스택 공간에 저장한다.
힙 영역을 사용하고 싶으면 new(생성자)
객체지향 언어에서 가지고 있는 반복문
foreach( int 변수 이름 in 배열 이름)
{Console.WriteLine(변수 이름);
}배열에서 변수 이름의 인덱스의 값을 출력하는 반복문, 배열의 끝까지.
2차원 배열
[0 , 0] [0 , 1] [0 , 2] [0 , 3] [1 , 0] [1 , 1] [1 , 2] [1 , 3] 2차원 배열의 인덱스는 다음과 같이 표현된다. 0번이 첫 번째이고 그다음은 숫자대로 간다.
배열의 길이 알아보기
배열이름.GetLength( a ) a에 0이 들어가면 행의 개수, 1이 들어가면 열의 개수
2중 배열의 출력
i에는 행의 인덱스, j에는 열의 인덱스
foreach( int 변수 이름 in 배열 이름) 다음 구문을 쓰면 배열의 끝까지 긁고 지나간다.
배열의 초기화
배열의 초기화 방법은 변수를 선언할 때, 초기화를 하는 방법과, 따로 배열의 인덱스 별로 초기화를 시켜주는 방법이 있다. 후자의 경우 반복문으로 초기화도 가능하다.
총 세 가지 방법으로 이차원 배열을 선언했는데, 첫 번째 방법은 배열의 크기와 타입을 모두 적어주고 반복문을 돌린 거고, 두 번째 방법은 배열의 크기를 명시하지 않고 초기화를 진행해서, 배열의 크기를 데이터의 크기에 맞춘다. 세 번째 방법은 배열의 크기와 타입 모두 생략하고 초기화를 했다. 세 가지 예제 모두 이름만 다를 뿐 크기와 안에 들어있는 값까지 모두 일치한다.
배열은 System.Array 클래스로 구현되며 이 클래스에는 배열을 관리하는 멤버가 포함되어 있다.
위 그림은 위 표에 있는 기능들을 전부 사용해본 결과이다.
GetLength(n) n차원 요소 개수를 조사하므로 2행 3 열이므로 첫 줄엔 2 그리고 두 번째 줄엔 3이 출력된다.
GetUpperBound(n) 은 n차원 요소의 마지막 인덱스를 찾는다.
Length는 배열 요소의 총 개수로 6개이다.
Rank 다음 줄은 배열의 차수를 출력해주는데 iArray는 2차원 배열이므로 2가 출력된다.
Sort는 무작위로 적어놓은 숫자를 오름 차순으로 정리해 준다. 따라서 {2,7,4,3,1,6,8} 이 {1,2,3,4,6,7,8} 이 출력된다.
Reverse는 배열의 순서를 거꾸로 뒤집는다. {1,2,3,4,6,7,8}이 뒤집혀서 {8,7,6,4,3,2,1}이 된다.
BinarySearch는 배열 상에서 값을 찾아서 인덱스를 반환해준다. 위의 코드 상에서 4는 0번부터 시작할 때 3에 위치해 있다.
Clear(배열, 시작 위치, 삭제할 개수) 배열의 인덱스에서 시작 위치부터 삭제할 개수까지 배열의 값을 삭제한다. 위 예제에서는 0번부터 4개를 삭제한다.
여담 : Ctrl+k+d 비주얼 스튜디오 줄 자동 정렬
'C#' 카테고리의 다른 글
C# 종료자, 정적 멤버, 인스턴스 멤버, 정적 필드,정적 생성자, 네임스페이스(교육10일차) (0) 2020.05.29 C# 명령행 컴파일러, *클래스* (교육9일차) (0) 2020.05.28 C# 반복문 (교육 7일차) (0) 2020.05.26 C# 자료형, 조건문, 연산자 (교육 6일차) (0) 2020.05.25 C# 자료형, 16진수, 용어(교육 5일차) (0) 2020.05.23