👾 내일배움캠프/🎮 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 과제 완성