{TIL} 클래스와 객체, 상속, 비트연산자

Kwaksang·2024년 4월 24일

TIL

목록 보기
7/37
post-thumbnail

C# 문법 종합반 3일차 및 비트연산자 강의

Chapter .1 클래스와 객체

Content .1 객체지향 프로그래밍의 특징

  1. 캡슐화(Encapsulation)
  2. 상속(Inheritance)
  3. 다형성(Polymorphism)
  4. 추상화(Abstraction)
  5. 객체(Object)

Content .2 클래스의 구성 요소

  1. 필드(Fields)
  2. 메서드(Methods)
  3. 생성자(Constructors)
  4. 소멸자(Destructors)

Content .3 클래스

  • 객체 생성을 위한 템플릿 or 설계도
  • 속성과 동작을 가짐 (속성 : 필드 / 동작 : 메서드)
  • 객체 생성을 위해 클래스를 사용해서 인스턴스를 생성해야 함

Content .4 객체

  • 클래스의 인스턴스 (클래스의 실체화된 형태)
  • 객체는 클래스로부터 생성, 각 객체는 독립적인 상태를 가지고 있음 (고유한 데이터 가질 수 있음)

클래스가 붕어빵 기계라면, 객체는 그로 인해 만들어지는 붕어빵

Content .5 클래스 선언과 인스턴스

  • 클래스는 데이터와 메서드를 하나로 묶은 사용자 정의 타입
// 클래스 구조 기초

class Person
{
    public string Name;
    public int Age;

    public void PrintInfo()
    {
        Console.WriteLine("Name: " + Name);
        Console.WriteLine("Age: " + Age);
    }
}

Person p = new Person();
p.Name = "John";
p.Age = 30;
p.PrintInfo(); // 출력: Name: John, Age: 30

Content .6 구조체 vs 클래스

  • 사용자 정의 형식을 만드는 데 두 가지 모두 사용 가능
  • 구조체 : 값 형식 / 스택에 할당 / 값이 복사됨 / 상속 불가 / 작은 크기의 데이터 저장이나 단순한 데이터 구조에 적합
  • 클래스 : 참조 형식 / 힙에 할당 / 참조로 전달 / 단일 상속 및 다중 상속 가능 / 복잡한 객체를 표현하고 다양한 기능을 제공하기 위해 사용

Content .7 접근 제한자

  • public: 외부에서 자유롭게 접근이 가능 (마당)
  • private: 같은 클래스 내부에서만 접근 가능 (개인 방)
  • protected: 같은 클래스 내부와 상속받은 클래스에서만 접근 가능 (집 안 거실)

Content .8 필드와 메서드

  1. 필드 : 변수 / 클래스의 상태를 나타내는 데이터 저장
  2. 메서드 : 함수 / 클래스의 동작을 정의하고 실행

Content .9 생성자

  1. 객체가 생성될 때 호출되는 특별한 메서드
  2. 클래스의 인스턴스를 초기화하고, 필요한 초기값을 설정하는 역할을 수행
  3. 생성자는 클래스와 동일한 이름을 가지며, 반환 타입이 없음
  4. 객체를 생성할 때 new 키워드와 함께 호출
  5. 객체를 초기화하는 과정에서 필요한 작업을 수행
  6. 매개변수의 개수와 타입에 따라 다른 생성자를 호출할 수 있음 (생성자 오버로딩)
  7. 기본적으로 매개변수가 없는 디폴트 생성자가 클래스에 자동으로 생성
  8. 사용자가 직접 정의한 생성자가 있는 경우 디폴트 생성자가 자동으로 생성되지 않음
class Person
{
    private string name;
    private int age;

    // 매개변수가 없는 디폴트 생성자
    public Person()
    {
        name = "Unknown";
        age = 0;
    }

    // 매개변수를 받는 생성자
    public Person(string newName, int newAge)
    {
        name = newName;
        age = newAge;
    }

    public void PrintInfo()
    {
        Console.WriteLine($"Name: {name}, Age: {age}");
    }
}

Content .10 소멸자

  1. 객체가 소멸되는 시점에서 자동으로 호출되는 특별한 메서드
  2. 객체의 사용이 종료되고 메모리에서 해제될 때 자동으로 호출되어 필요한 정리 작업을 수행
  3. 클래스와 동일한 이름을 가지며, 이름 앞에 ~ 기호를 붙여 표현
  4. 소멸자는 반환 타입이 없고 매개변수를 가질 수 없음
  5. C#에서는 가비지 컬렉터(Garbage Collector)에 의해 관리되는 메모리 해제를 담당
  6. 명시적으로 소멸자를 호출하는 것은 일반적으로 권장되지 않음

Content .11 소멸자의 역할

  1. 자원 해제
  • 파일 핸들, 네트워크 연결, 데이터베이스 연결 등의 외부 리소스를 사용한 경우, 소멸자를 통해 해당 리소스를 해제 가능
  1. 메모리 해제
  • 객체가 사용한 메모리를 해제하고 관련된 자원을 정리 가능
  1. 로깅 및 디버깅
  • 객체가 소멸되는 시점에 로깅 작업을 수행하거나 디버깅 정보를 기록 가능
// 소멸자 예시

class Person
{
    private string name;

    public Person(string newName)
    {
        name = newName;
        Console.WriteLine("Person 객체 생성");
    }

    ~Person()
    {
        Console.WriteLine("Person 객체 소멸");
    }
}

Content .12 포로퍼티 (Property)

  1. 프로퍼티란?
  • 클래스 멤버로 객체의 필드 값을 읽거나 설정하는데 사용되는 접근자
  • 객체의 필드에 간접적으로 값을 설정하거나 읽을 수 있도록 함
  • 필드에 대한 접근 제어와 데이터 유효성 검사 등을 수행
  • 객체 상태를 나타내는 데이터 역할이지만, 외부에서 접근할 때 추가적인 로직을 수행 가능
  1. 프로퍼티 구문
  • get 과 set 접근자를사용하여 값을 읽고 설정하는 동작을 정의
  • get 접근자는 프로퍼티의 값을 반환 (return)
  • set 접근자는 프로퍼티의 값을 설정 (value)
class Person
{
    private string name;
    private int age;

    public string Name
    {
        get { return name; }
        set { name = value; }
    }

    public int Age
    {
        get { return age; }
        set { age = value; }
    }
}
  1. 자동 프로퍼티
  • 프로퍼티를 간단하게 정의하고 사용할 수 있는 편리한 기능
  • 필드의 선언과 접근자 메서드의 구현을 컴파일러가 자동으로 처리
class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

Person person = new Person();
person.Name = "John";     // 값을 설정
person.Age = 25;          // 값을 설정

Console.WriteLine($"Name: {person.Name}, Age: {person.Age}");  // 값을 읽어 출력

Chapter .2 상속과 다형성

Content .1 상속이란?

  • 기존의 클래스를 확장 or 재사용하여 새로운 클래스를 생성
  • 자식 클래스는 부모 클래스의 멤버를 상속받아 사용 가능
  • 상속을 통해 부모 클래스의 기능을 확장하거나 수정하여 새로운 클래스를 정의

Content .2 상속의 장점

  1. 코드의 재사용성
  • 상속으로 기존 클래스의 코드를 재사용할 수 있어 반복적인 코드 작성을 줄일 수 있음
  1. 계층 구조의 표현
  • 클래스 간의 계층 구조를 표현하여 코드의 구조를 명확하게 표현 가능
  1. 유지보수성의 향상
  • 기존 클래스의 수정이 필요한 경우 해당 클래스만 수정하면 됨

Content .3 상속의 종류

  1. 단일 상속 : 1부모 1자식 (C# 가능)
  2. 다중 상속 : 여러부모 1자식 (C# 불가능)
  3. 인터페이스 상속 : 클래스가 인터페이스를 상속 받음 / 1클래스 여러 인터페이스

Content .4 상속의 특징

  1. 부모 클래스의 멤버에 접근
  • 기존 클래스 멤버에 접근 가능하며, 클래스의 기능을 재사용 가능
  • 부모의 지갑에 손대고 돈을 사용 가능
  1. 메서드 재정의
  • 자식 클래스는 부모 클래스의 메서드를 재정의하여 자신에게 맞게 수정 가능
  • 부모가 교과서 사라고 번 돈을 간식 사먹는데 사용 가능
  1. 상속의 깊이
  • 클래스는 다수의 계층적인 상속 구조를 가질 수 있음
  • 상속 깊이가 깊어질 수록 클래스 간의 관계가 복잡해질 수 있어 적절한 상속 깊이를 유지 및 사용해야 함
  • 아빠 위에 할아버지 위에 증조 할아버지인데 증조 할아버지 성함 모르니까 할아버지까지만 관계 유지하자!

Content .5 접근 제한자와 상속

  • 부모 클래스의 멤버의 접근 제한자에 따라 자식 클래스에서 해당 멤버에 접근할 수 있는 범위가 결정됨
  • 접근 제한자를 통해 상속된 멤버의 가시성을 조절하여 캡슐화와 정보 은닉을 구현 가능

Content .6 가상(Virtual) 메서드

  • 부모 클래스에서만 정의 가능
  • 가상 메서드를 통해 자식 클래스에서 부모 클래스의 메서드를 변경하거나 확장 가능

Content .7 추상(Abstract) 메서드

  • 직접적으로 인스턴스 생성 불가한 클래스
  • 상속을 위한 베이스 클래스
  • 추상 메서드를 사용할 경우 자식 클래스에서 반드시 구현이 되어야 함

Content .8 오버라이딩(Overriding)

  • 부모 클래스에서 이미 정의된 메서드를 자식 클래스에서 재정의하는 것을 의미
  • 상속관계을 전제로 메서드의 이름, 매개변수, 반환타입 동일해야 함
  • 함수를 덮어 쓰게 하는 것

Content .9 오버로딩 (Overloading)

  • 같은 메서드 이름이지만, 매개변수의 개수, 타입, 순서가 다른 여러 개의 메서드를 정의하는 것을 의미
  • 함수를 읽게 하는 것

Chapter .3 Stack 과 Queue

Content .1 Stack

  1. Stack은 쌓아 올린다는 것을 의미
  2. 같은 구조와 크기의 자료를 정해진 방향으로만 저장 가능
  3. top으로 정한 곳을 통해서만 접근 가능
  4. 삽인하는 연산 "push" / 삭제하는 연산 "pop"
  5. 후입선출 (LIFO, Last In First Out) 구조

Content .2 Queue

  1. Queue는 줄을 서서 기다린다는 것을 의미
  2. 삭제연산만 수행되는 곳 front -> 디큐 (dnQueue)
  3. 삽입연삼나 수행되는 곳 rear -> 인큐 (enQueue)
  4. 선입선출 (FIFO, First In First Out) 구조

Chapter .4 이성언 튜터님 연산자 강의

Content .1 코드의 구성

  • 형 : Value 값, 형태, 모습
  • 식 : 연산자
  • 문 : 문법, 문자

Content .2 산술연산자

  • +, -, *, /, %

Content .3 할당연산자

  • 변수에 값을 할당하는 것
  • ex) a = 5;
  • +=, -=, *=, /=, %=
// 예시

int a = 5;

a = a+5;
a += 5;
// 두 연산이 같음

Content .4 단항연산자

  • X++, X--, ++X, --X
// 예시

int a = 0;
a = a++;
// a는 0이기에 0부터 1씩 늘어남
a = ++a;
// a는 0이지만 1이 먼저 추가되어 1부터 1씩 늘어남

Content .5 비교연산자

  • ==, !=, >, <, >=, <=

Content .6 논리연산자

  • &&, ||, !, ^
  • &&, || 의 경우 앞의 값의 결과에 따라 뒤를 생략하기도 함

Content .7 비트연산자

  • 2진법이 베이스인 연산
  • (우측으로 이동 -> 나누기2)

  • <<(좌측으로 이동 <- 곱하기2)
  • ex) 9<<1 (좌측으로 1칸 이동 1001(9) -> 10010(18))

Content .8 비트연산 나누기

// 예시

int i = 5; // 0101
i = i & 1; // 0001
  • 비트연산에서 나머지를 구할 때 '&' 을 사용
  • 비트연산에서 몫을 구할 때 ">>"을 사용

Content .9 단축평가

  • &, |, ~, ^
int a = 0;
int b = 1;
int c = 2;
int d = 3;

bool boo1 = a > b && c++ > d; // 좌측 값 결과에 따라 우측 값 생략
bool boo2 = a > b & c++ > d; // 좌측 값과 별개로 우측 값 계산

아래와 같이 비트 모양이 깃발과 유사하여 "비트플래그" 라고 함

Content .10 비트연산자 - 게임활용

  • 위와 같이 각 자릿수에 맞는 디버프 효과를 정해서 게임에 활용 가능
  • ex) 철권에 적용 했을 시에 커맨드 버튼과 2진법을 섞어 스킬을 활용했음
  • 장점 : 숫자만 움직이니 보안상에도 좋음

Content .11 비트연산자 - Unity 활용

  • Inspecter 창에서 Layer 부분도 비트연산자가 활용됨
  • 실무에서도 활용되기 때문에 필수적인 요소
profile
게임은 재미와 기능!

0개의 댓글