본문 바로가기

C#

20240508 C#공부

오버로딩
객체지향 프로그래밍에서 클래스가 가지는 특징
클래스 내부에 이름이 같은 메서드를 여러 개 선언하여 필요에 맞게 사용
햄버거 만들 때 햄버거라는 큰 틀은 그대로 두고 어떤 식재료 넣는지에 따라 다른 햄버거가 되는 원리와 같음
 
클래스의 상속 개념
부모 클래스의 내용을 자식 클래스에서 그대로 사용할 수 있게 하는 것
 
상속을 사용하면 반복 내용은 부모 클래스에 준비해 두고 변경 내용만 자식 클래스에 반영하는 식으로 관리할 수 있어 요구사항 바뀔 때 대응하기 쉬움
 
객체지향 프로그래밍 언어에서
상속을 주는 클래스 앞에 부모 기반 슈퍼 등을 붙여 부름
상속을 받는 클래스 : 자식 파생 서브
 
자식 클래스가 많아질수록 코드 수정할 때 생산성이 향상됨
 
오버라이딩
부모 클래스에 있는 메서드를 자식 클래스에서 재정의하는 기능
오버라이딩 사용시 기존 클래스의 틀은 재사용하되 현재 클래스만의 고유한 기능을 주입할 수 있음
오버라디이한 메서드를 호출하면 부모 클래스의 메서드가 아닌 상속받아 재정의한 메서드가 호출됨
 
<클래스의 데이터 전달>
정보 은닉이란 정해진 경로로만 데이터에 접근할 수 있도록 제한하는 것
 
멤버 변수에 직접 전달하기
멤버 변수 : 클래스 내부에 선언된 변수를 부르는 다른 이름
 
[접근 제한자와 this 키워드]
정보 은닉성을 고려해 멤버 변수에 접근할 수 있는 수준을 정하려면 접근 제한자를 사용함
접근 제한자 : 외부에서 클래스, 속성, 메서드 등에 접근할 때 어느 범위까지 접근을 허용하고 거부할지를 겨렂ㅇ하는 형식
 
대표적인 접근 제한자 : public과 private, 기본값은 private
-> 접근제한자 표기하지 않으면 외부접근x, public 표기시 외부접근허용
 
 
C#의 지식 창조 MSDN 활용하기
 
MSDN은 개발 문서나 환경 등을 안내하는 지식 창고
MS에서 자체 제작한 콘텐츠 외에도 개발자 포럼, 블로그, 소셜 북마킹 등으로 개발자와 테스터 사이의 소통 채널이 될 수 있도록 한 통합 도구로 확장하고 있음
 
[샘플 코드 실행하기]
객체지향 프로그래밍 언어의 장점 중 하나 : 코드의 재사용성 -> 극대화하려면 프로그램 만들 때마다 모든 클래스 직접 설계하는 것보다 자주 사용하는 클래스를 미리 만들어 두고 가져와 쓰는 것
 
[묶음 데이터 다루기]
달걀 30개 묶어 유통하고 판매하듯 여러 값을 담고 사용하는 방법 살펴보기
 
-배열 데이터 다루기
”정수형 변수를 선언하고 값을 넣는 실습“
첫번째 방법
‘array1이라는 변수에 new 연산자로 정수형 배열 변수의 크기를 3으로 설정하고 배열의 인덱스값을 이용해 값을 넣는 방식’
인덱스 : 배열에 담긴 값에 접근할 때 사용하는 위치 정보
배열의 인덱스는 0부터 시작
-> 정수를 3개 저장할 수 있는 정수형 배열 array1의 인덱스는 0,1,2
 
두번째 방법
‘배열 변수를 선언하면서 동시에 초깃값을 명시하는 방식’
*배열의 크기를 설정하지 않는다는 점이 중요!
배열의 크기는 입력할 값의 개수에 맞게 자동으로 설정되기 때문
 
세번째 방법
int[] array3 = {4,5,6};
 
범위 0~2인데 잘못 코딩하는 실수 할 수 있음
이러한 오류 예방하는 목적으로 C#에서는 foreach문 제공함
 
//배열을 초기화하는 세 번째 방법
int[] array3 = {4,5,6}
 
//foreach 문으로 배열에 담긴 값 출력
foreach(int item in array3){
Console.WriteLine(item);
}
 
foreach 문 내에 선언한 item 변수는 array3 배열 변수에 담긴 값을 차례로 저장하는 역할을 수행함
따라서 인덱스를 명시하지 않아도 item값을 출력하면 반복할 때마다 다른 값이 담기고 그 값을 출력함
 
배열을 초기화할 때 new 연산자를 사용한다는 의미 : 클래스를 인스턴스로 만든다는 의미
즉, 인스턴스 변수에 접근하는 연산자로 속성과 메서드를 호출할 수 있다는 의미기도 함
 
array.Length 출력시 배열에 저장된 값이 결과로 나옴
 
[컬렉션 데이터 다루기]
묶음 데이터를 다루는 또 다른 방법, 컬렉션
단일 자료구조가 아닌 입출력 처리를 포함해 연산을 수행하는 다양한 자료구조 모음
 
System.Collection 네임스페이스에 포함된 컬렉션 클래스에는 ArrayList, Queue, Stack, Hashtable 등이 있음
 
배열은 인덱스로 직접 접근해 데이터를 삽입하거나 다른 값으로 대체할 수 있지만 컬렉션 클래스는 메서드를 호출해 데이터를 다룸
컬렉션 클래스의 구조와 메서드 이름만 알면 복잡한 처리도 쉽게 해결할 수 있음
 
ArrayList 클래스 살펴보기
배열과 유사한 데이터 묶음을 관리하는 클래스
차이점 : 클래스의 생성자가 호출될 때 크기를 미리 설정할 필요가 없으며, 한 가지 자료형이 아닌 다양한 자료형의 값을 담을 수 있음
 
Add() 메서드로 값을 추가할 수 있으며, Remove() 메서드로 특정 값을 제거할 수 있음
정수, 문자열, 실수, 불리언형의 데이터를 모두 ArrayList에 넣어도 문제가 없음
 
하지만 foreach 문으로 ArrayList에 담긴 값을 출력할 때 어떤 자료형으로 특정할 수 없어 var형을 사용해 암시적으로 형 변환할 수 있도록 함
var형으로 선언해 두면 컴파일러가 자동으로 값에 따른 알맞은 자료형으로 변환함
 
ArrayList al = new ArrayList();
 
// Add() 메서드로 ArrayList에 아이템 추가
al.Add(1);
al.Add(“Hello”);
al.Add(3.3);
al.Add(true);
 
foreach(var item in al){
Console.WriteLine(item);
}
Console.WriteLine();
 
// Remove() 메서드로 ArrayList에서 아이템 삭제
al.Remove(“Hello”);
 
foreach(var item in al) {
Console.WriteLine(item);
}

 

[Queue 클래스 살펴보기]
입력한 값이 먼저 출력되는 자료구조
물건 사려고 줄 서면 먼저 기다린 사람에게 파는 원리로 데이터를 입력하고 출력하는 방식
선착순으로 실행되는 상황에 사용할 수 있음
 
Queue qu = new Queue();
 
qu.Enqueue(1);
qu.Enqueue(2);
qu.Enqueue(3);
 
while(qu.Count>0){
Console.WriteLine(qu.Dequeue());
}
 
[Stack 클래스 살펴보기]
Queue 클래스와 대조되는 자료구조
먼저 입력한 데이터가 맨 나중에 출력됨
 
스택에 데이터를 넣을 때는 Push() 메서드를 사용하고, 추출할 때는 Pop() 메서드를 사용
입력된 데이터의 순서와 출력된 데이터의 순서가 반대인 것이 중요함
 
알아두면 좋은 자료
FIFO와 LIFO의 의미
Queue는 먼저 들어온 데이터가 먼저 나간다는 의미에서 ‘선입선출’, ‘FIFO(First In First Out)’라는 용어를 사용하며, Stack은 먼저 들어온 데이터가 나중에 나간다는 의미에서 ’후입선출‘, ’LIFO(Last In First Out)’라는 용어를 사용함
 
[Hashtable 클래스 살펴보기]
데이터를 키key와 값value으로 저장하는 자료구조
대표적인 예는 사전 - 원문key과 번역문value의 쌍으로 저장됨
장점 : 데이터의 크기가 커질수록 상대적으로 처리하는 속도가 빠르다
 
ArrayList, Queue, Stack - 데이터가 저장된 순서를 중시해서 찾고자 하는 데이터가 마지막에 있을 때 모든 데이터를 살펴본 뒤 찾게 됨
Hashtable - 키로 값을 한 번에 찾을 수 있으므로 데이터가 클수록 유리함
 
배열 - 인덱스 사용
Hashtable - 인덱스 대신 문자열 사용
 
[예외 처리하기]
프로그램을 만들다 보면 오류가 발생하기 마련인데 예외처리를 하면 오류가 발생해도 프로그램 자체가 비성장으로 종료되는 일이 드물게 됨
보험과 같이 사고가 나기 전 가입해 두면 사고났을 때 보상받을 수 있음
 
-예외 상황이란?
프로그램을 만드는 과정에서 발생할 수 있는 의도치 않은 모든 상황을 의미함
 
-try~catch 문으로 예외 처리하기
if~else문과 유사하게 사용함
 
Console.Write(“나눌 숫자를 입력하세요 : “);
int divider = int.Parse(Console.ReadLine());
 
try{
Console.WriteLine(10/divider);
}catch{
Console.WriteLine(“0으로 나눌 수 없습니다.”);
}
}
 
-System.Exception 클래스로 예외 메시지 출력하기
Exception 클래스는 모든 예외의 기본 클래스
 
회문palindrome이란 바로 읽으나 거꾸로 읽으나 똑같은 문장을 말함
 
<윈도우 프로그램 만들기>
 
[윈폼 만들기]
윈폼WinForms은 윈도우 기반 사용자 인터페이스 애플리케이션을 만드는 환경을 의미함
 
윈도우 운영체제에서 동작하는 계산기, 그림판, 메모장, 엑셀, 파워포인트 등의 애플리케이션을 윈폼으로 만들 수 있음
 
새 프로젝트 만들기(비주얼 스튜디오)
새 프로젝트 만들기 - Windows Forms앱(.NET Framework)]을 선택 - 프로젝트 이름과 위치, 프레임워크 버전을 선택하고 만들기 클릭 - 솔루션 및 프로젝트를 같은 디렉터리에 배치]
 
-컨트롤 배치하고 속성 바꾸기
도구상자->모든 Windows Forms 항목을 차례로 클릭하면 폼에 배치할 수 있는 컨트롤 목록을 볼 수 있음
 
컨트롤 목록에서 버튼과 레이블을 마우스로 끌어다 디자이너에 보이는 윈도우 폼 안에 배치함
각 컨트롤을 마우스 왼쪽 버튼으로 클릭할 때 속성 창에 보이는 내용이 달라지는 것을 확인함
컨트롤레 따라 변경할 수 있는 속성값이 다르다는 것을 알 수 있음
 
버튼 컨트롤 선택시 외곽에 흰색 점을 마우스로 끌어 크기조절 가능
속성 창에서 Font 항목 변경하면 글꼴과 글자의 크기도 바꿀 수 있음
 
-버튼에 이벤트 추가하기
속성 창 위에 있는 번개 아이콘을 클릭해 추가할 수 있음
 
번개아이콘 클릭 - 이벤트 항목 중 Click 더블클릭 - 편집창에 Form1.cs 파일 열림 - 코드 수정하고 저장
 
-애플리케이션 실행하기
F5나 Ctrl+F5
 
C# 코드에서 레이블Label 컨트롤의 문자를 변경할 때 사용하는 속성 이름은? Text
 
[로그인 창 만들기]
-폼 디자인하기
WindowsSignIn이라는 이름으로 새로운 윈폼 프로젝트 만들기 - 레이블1개, 텍스트박스2개, 버튼1개 배치
 
텍스트박스 : 사용자에게 값을 입력받을 수 있는 컨트롤
속성 창에서 컨트롤의 값은 코드에서 변수명으로 사용됨
같은 컨트롤을 하나 더 추가할 때는 해당 컨트롤을 선택한 상태에서 컨트롤CV
 
[로그인 버튼에 이벤트 추가하기]
namespace WindowsSignIn{
public partial class Form1 : Form{
public Form1(){
InitializeComponent();
}
 
private void SignInButton_Click(object sender, EventArgs e){
string userId = id.Text;
string userPassword = password.Text;
 
if(userId.Equals(“MyId”)&&userPassword.Equals(“MyPassword”)){
MessageBox.Show(“로그인에 성공했습니다.“,”로그인“);
}else{
MessageBox.Show(“로그인에 실패했습니다.”,“로그인”);
}
 
-애플리케이션 실행하기
로그인 창에 아이디와 비밀번호를 작성 후 클릭
사용자가 입력한 아이디와 비밀번호가 일치하면 성공문구, 일치하지 않으면 실패문구 출력
 
-비밀번호 가리기
텍스트박스의 속성을 바꿔 쉽게 적용할 수 있음
PasswordChar 속성값에 특정한 문자를 설정하면 해당 문자로 대체됨
 
시스템마다 비밀번호 일겨 창을 일관된 형태로 보여주고 싶을 때는 텍스트박스의 UseSystemPasswordChar 속성값을 True로 바꾸기
 
<숫자 맞히기 게임 만들기>
시스템이 임의로 생성한 숫자를 정해진 횟수 내에 맞히는 게임
 
-폼 디자인하기
FindNumber라는 이름으로 새로운 윈폼 프로젝트를 만듦
버튼과 레이블, 텍스트박스 배치해 폼 디자인함
 
프로그램 창의 크기는 폼을 선책할 때 주위에 나타나는 크기 조절 점을 끌어서 알맞게 조정함
컨트롤에 출력되는 문구를 가운데 정렬하려면 속성 창에서 AutoSize값을 false로, TextAlign값을 MiddleCenter로 설정함 TestAlign 속성에서 오른쪽 끝에 있는 펼침 메뉴를 클릭해 가운데 항목을 클릭하면 MiddleCenter로 바뀜
컨트롤의 Dock 속성값을 Top으로 설정하면 창 위쪽에 Bottom으로 설정하면 아래쪽에 고정됨
컨트롤에 표시되는 글자를 키울 때 짤려 보인다면 크기 조절 점을 끌어서 조정
 
-게임 시작 버튼에 이벤트 추가하기
 
-입력 버튼에 이벤트 추가하기
 
namespace FindNumber{
public partial class Form1: Form{
private int findNumber = 0;
private int chance = 0;
 
public Form1(){
InitializeComponent();
}
 
private void ButtonStart_Click(object sender, EventArgs e){
var rand = new Random();
findNumber = rand.Next(1,21);
chance = 10;
display.Text = “맞힐 숫자를 입력하세요.“;
}
 
private void ButtonStart_Click(object sender, EvenArgs e){
var rand = new Random();
findNumber = rand.Next(1,21);
chance = 10;
display.Text = “맞힐 숫자를 입력하세요.“;
}
 
private void ButtonInput_Click(object sender, EvenArgs e){
int inputNumber = Int32.Parse(textBox.Text);
if(inputNumber == findNumber){
display.Text = “승리했습니다!!!“;
}else{
chance—;
display.Text = “기회는 ” + chance + “번 남았습니다.“;
}
 
if(chance <=0){
display.Text = “실패했습니다!!!”;
}
 
Int32.Parse() 메서드는 다른 형식을 32비트 부호가 있는 정수형으로 바꿔줌. 문자를 숫자로 바꿔줌
inputNumber 변수에는 사용자가 입력한 문자열을 숫자로 변환한 값이 저장됨
inputNumber에 저장된 값이 임의로 생성한 findNumber와 같으면 게임에 승리하는 코드 작성, 같이 않으면 기회 1 차감 및 남은기회 출력
마지막 기회 비교해 0보다 작으면 실패메시지 출력
 
-애플리케이션 실행하기