👾 내일배움캠프/🎮 TIL & WIL
내일배움캠프 7일차 TIL - C# 기초 문법 (2)
리리핸
2023. 8. 16. 21:31
[공부 내용]
* 일단 대충 쓰고 주말에 다시 공부하기
[클래스와 객체]
1. 객체지향프로그래밍의 특징
- 캡슐화
- 한 코드에서 여러가지 일을 하는 게 아니라 각각의 필요한 기능을 구현한 후 이것을 뭉쳐서 새로운 구현을 함
- 관련된 데이터와 기능을 하나의 단위로 묶음
- 이를 통해 정보에 대한 직접적인 접근을 제한할 수 있음 --> 안전성과 유지보수성
- 상속
- 클래스의 확장. 계층 구조를 구성하여 코드의 구조화와 유지보수를 용이하게 함
- 다형성 Ex. 오버로딩 / 동일한 코드에서 다양한 처리가 일어날 수 있도록 하는 것
- 추상화
- 객체
2. 클래스의 구성요소
- 필드: 멤버 변수
- 메서드: 멤버 함수
- 생성자: 생성될 때 호출되는 메서드
- 디폴트 생성자: 클래스와 동일한 이름, 매개변수 없음
- 디폴드 생성자 없이 다른 생성자를 추가할 경우 디폴트 생성자를 쓸 수 없게 됨 (정의된 생성자가 디폴트생성자가 아니므로)
- 꼭 초기화 해줘야 하는 변수가 있다면 그것도 생성자를 통해 할 수 있음
- 소멸자: 해제될 때 호출되는 메서드
- 클래스와 동일한 이름에, 앞에 ~가 붙음
- 소멸자는 우리가 컨트롤하는 것이 아니기 때문에 오버로딩 불가능
- cf) 생성자는 우리가 호출하기 때문에 확인하고 변경할 수 있음
- 생성자와 소멸자도 메서드의 일종이므로 필드와 메서드가 주요한 요소임
3. 클래스
- 객체를 만들기 위한 설명서, 설계도
- 붕어빵 틀 비유
- 객체를 생성하기 위해서는 클래스를 사용해서 인스턴스를 만들어야 함
- 틀이나 설계도 자체를 쓰는 것이 아니라 쓸 물건들을 만들어내는 역할을 하듯이 클래스 자체의 의미보다는 객체를 만들기 위한 기초 도구라는 사실이 중요한 듯
4. 객체
- 클래스를 통해 실체화된 형태의 인스턴스
- 각 객체는 독립적인 형태. (붕어빵 틀을 통해 만들어진 각각의 붕어빵은 서로 다른 내용물을 가질 수 있음)
5. 클래스 선언과 인스턴스
- 데이터와 메서드를 하나로 묶은 “사용자 정의 타입”
- 사용자정의타입 예시 : 구조체 (선언과 동시에 변수가 됨 / 값형식) / 사용자 정의 함수도
- 기본자료형 외에 프로그래머가 서로 관련된 변수들을 묶어서 하나의 타입으로 새로 추가, 값들을 묶어서 꺼내쓸 수 있도록
- 레퍼런스 타입(참조형식): Person p = new Person();
- 여기서 왼쪽 의 Person p는 Person의 주소를 저장할 수 있는 p라는 공간. new는 새로운 Person을 실제로 생성(객체화)한 후 "="를 통해 p 공간에 연결한 것
- 동적 할당: 프로그램이 실행되고 있을 때 값을 할당 받음
- Class 내에서 선언된 변수 및 메서드들은 객체에 .을 붙여 사용할 수 있다.
class Person
{
public string Name;
public int Age;
public void PrintInfo()
{
Console.WriteLine("Name: " + Name);
Console.WriteLine("Age: " + Age);
}
}
Person p = new Person(); // 새로 생성된 Person() 인스턴스가 p라는 주소에 저장됨.
p.Name = "John"; // 객체 p에 .을 붙여 Name이라는 변수 사용
p.Age = 30;
p.PrintInfo(); // 출력: Name: John, Age: 30
6. 프로퍼티
- 객체의 필드값들은 외부에서 접근 불가. 이들을 외부에서 간접 접근할 수 있도록 하는 매개체가 get과 set이다.
- 프로퍼티는 get과 set 접근자를 사용하여 값을 읽고 설정하는 동작을 정의 . (필요에 따라 get 또는 set 접근자 중 하나를 생략하여 읽기 전용 또는 쓰기 전용 프로퍼티를 정의할 수 있음)
class Person
{
private string name;
private int age;
public string Name
{
get { return name; }
private set { name = value; }
}
public int Age
{
get { return age; }
set
{
if (value >= 0)
age = value;
}
}
}
Person person = new Person();
person.Name = "John"; // 컴파일 오류: Name 프로퍼티의 set 접근자는 private입니다.
person.Age = -10; // 유효성 검사에 의해 나이 값이 설정되지 않습니다.
Console.WriteLine($"Name: {person.Name}, Age: {person.Age}"); // Name과 Age 프로퍼티에 접근하여 값을 출력합니다.
[상속과 다형성]
1. 상속
- 상속: 기존의 클래스를 확장하거나 재사용하여 새로운 클래스를 생성하는 것
- 콜론(:)을 통해 상속
- 기존 클래스의 코드를 재사용하여 반복적인 코드 작성을 피할 수 있고, 계층 구조를 표현해서 코드의 구조를 명확하게 할 수 있음
- C#은 단일 상속(자식 클래스의 부모클래스는 하나만) & 인터페이스 상속(여러 개의 인터페이스를 동시에 상속받을 수 있음)
2. 다형성
// #1 참조형태와 실형태가 같을때
Marine marine = new Marine();
marine.Move();
marine.Attack();
Zergling zergling = new Zergling();
zergling.Move();
zergling.Attack();
// #2 참조형태와 실형태가 다를때
List<Unit> list = new List<Unit>();
list.Add(new Marine());
list.Add(new Zergling());
foreach (Unit unit in list)
{
unit.Move();
}
- 참조형태와 실형태가 다를 때 : Unit은 참조의 형태이고, Marine과 Zergling은 실형태임. 부모클래스에 있는 메서드가 우선순위가 됨.
- 가상메서드 : 부모 클래스에서 메서드를 virtual로 선언하면 '자식이 재구현했을 수 있다', '재정의로 인해 실형태가 다를 수 있으니 실형태를 체크하라'는 표현이 됨. 자식 클래스에서 해당 메서드를 override로 재정의하면 참조 형태가 부모 클래스이더라도 자식 클래스에서 재정의된 메서드를 활용함.
- 추상클래스 : 직접적으로 인스턴스를 생성할 수 없는 클래스
- 상속받은 친구들만 구현함. 본체는 안 하묘
- 상속받은 자식 클래스(실형태)는 무조건 부모(추상)클래스에서 추상으로 정의된 메서드를 재정의해야 함 (강제성)
[고급문법 및 기능]
1. 제너릭
- 제너릭: 클래스나 메서드를 일반화 시켜서 다양한 자료형에 대응
- <T> 형태의 키워드로 선언, 사용 시에는 <구체적인 자료형>
- 선언 시점이 아닌 사용 시점에 결정됨 따라서 사용되는 자료형의 수 만큼 만들어짐
2. out과 ref
- 매개변수로 전달되는 친구들
- 보통은 반환값으로 받던 값들을 매개변수를 통해 직접적으로 받을 수 있음
- 실행의 반환값이 아닌 원래 값에 영향을 주기 때문에 주의해서 사용
- 매개변수가 (int a, out int b)인 경우를 생각하면, 메서드 호출 시 a에 해당하는 값을 입력하면 그대로 들어가는 게 아니라 동일한 값이 복사되어 들어간다고 생각하면 됨. 반면, out인자가 붙은 파라미터에 특정 값 혹은 변수를 입력하면, 복사되어 들어가는 것이 아니라 실제로 변수의 참조를 적용해주기 때문에, 파라미터로 입력한 변수를 직접적으로 만진다고 생각하면 됨.
- out인자의 경우, 메서드 내에서 해당 매개변수에 새로운 값이 꼭 입력되어야 함. 초기화 필수
- ref는 대입을 하지 않더라도 에러 발생하지 않음. 값이 바뀔 수도, 바뀌지 않을 수도 있음.
- 보통은 복사의 형태로 값을 불러오기 때문에 성능 이슈가 발생. 따라서 ref로 주소만 참고하도록 하면 성능상 이점이 있음. 하지만 가독성과 유지보수 등의 이슈를 고려해서 적절한 상황에서만 사용하기.
[기록]
잘한 점 :
- 몰입하기
어려웠던 점 :
- 과제ㅋ
되돌아보기 :
- 오늘의 몰입도 : 80점
- 과제.... 재밌다...
- 스스로 찾아보기: 80점
- 과제의 기본적인 틀을 참고할 자료 없이 짠 것 칭찬해요
- 하지만 과제 요구사항 및 풀이가 있다는 사실을 여태껏 몰랐다니 최악입니다.
내일 목표
- 챕터 3 과제 완성