C# 문법 종합반 3일차 및 비트연산자 강의
Chapter .1 클래스와 객체
Content .1 객체지향 프로그래밍의 특징
- 캡슐화(Encapsulation)
- 상속(Inheritance)
- 다형성(Polymorphism)
- 추상화(Abstraction)
- 객체(Object)
Content .2 클래스의 구성 요소
- 필드(Fields)
- 메서드(Methods)
- 생성자(Constructors)
- 소멸자(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();
Content .6 구조체 vs 클래스
- 사용자 정의 형식을 만드는 데 두 가지 모두 사용 가능
- 구조체 : 값 형식 / 스택에 할당 / 값이 복사됨 / 상속 불가 / 작은 크기의 데이터 저장이나 단순한 데이터 구조에 적합
- 클래스 : 참조 형식 / 힙에 할당 / 참조로 전달 / 단일 상속 및 다중 상속 가능 / 복잡한 객체를 표현하고 다양한 기능을 제공하기 위해 사용
Content .7 접근 제한자
- public: 외부에서 자유롭게 접근이 가능 (마당)
- private: 같은 클래스 내부에서만 접근 가능 (개인 방)
- protected: 같은 클래스 내부와 상속받은 클래스에서만 접근 가능 (집 안 거실)
Content .8 필드와 메서드
- 필드 : 변수 / 클래스의 상태를 나타내는 데이터 저장
- 메서드 : 함수 / 클래스의 동작을 정의하고 실행
Content .9 생성자
- 객체가 생성될 때 호출되는 특별한 메서드
- 클래스의 인스턴스를 초기화하고, 필요한 초기값을 설정하는 역할을 수행
- 생성자는 클래스와 동일한 이름을 가지며, 반환 타입이 없음
- 객체를 생성할 때 new 키워드와 함께 호출
- 객체를 초기화하는 과정에서 필요한 작업을 수행
- 매개변수의 개수와 타입에 따라 다른 생성자를 호출할 수 있음 (생성자 오버로딩)
- 기본적으로 매개변수가 없는 디폴트 생성자가 클래스에 자동으로 생성
- 사용자가 직접 정의한 생성자가 있는 경우 디폴트 생성자가 자동으로 생성되지 않음
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 소멸자
- 객체가 소멸되는 시점에서 자동으로 호출되는 특별한 메서드
- 객체의 사용이 종료되고 메모리에서 해제될 때 자동으로 호출되어 필요한 정리 작업을 수행
- 클래스와 동일한 이름을 가지며, 이름 앞에 ~ 기호를 붙여 표현
- 소멸자는 반환 타입이 없고 매개변수를 가질 수 없음
- C#에서는 가비지 컬렉터(Garbage Collector)에 의해 관리되는 메모리 해제를 담당
- 명시적으로 소멸자를 호출하는 것은 일반적으로 권장되지 않음
Content .11 소멸자의 역할
- 자원 해제
- 파일 핸들, 네트워크 연결, 데이터베이스 연결 등의 외부 리소스를 사용한 경우, 소멸자를 통해 해당 리소스를 해제 가능
- 메모리 해제
- 객체가 사용한 메모리를 해제하고 관련된 자원을 정리 가능
- 로깅 및 디버깅
- 객체가 소멸되는 시점에 로깅 작업을 수행하거나 디버깅 정보를 기록 가능
class Person
{
private string name;
public Person(string newName)
{
name = newName;
Console.WriteLine("Person 객체 생성");
}
~Person()
{
Console.WriteLine("Person 객체 소멸");
}
}
Content .12 포로퍼티 (Property)
- 프로퍼티란?
- 클래스 멤버로 객체의 필드 값을 읽거나 설정하는데 사용되는 접근자
- 객체의 필드에 간접적으로 값을 설정하거나 읽을 수 있도록 함
- 필드에 대한 접근 제어와 데이터 유효성 검사 등을 수행
- 객체 상태를 나타내는 데이터 역할이지만, 외부에서 접근할 때 추가적인 로직을 수행 가능
- 프로퍼티 구문
- 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; }
}
}
- 자동 프로퍼티
- 프로퍼티를 간단하게 정의하고 사용할 수 있는 편리한 기능
- 필드의 선언과 접근자 메서드의 구현을 컴파일러가 자동으로 처리
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 상속의 장점
- 코드의 재사용성
- 상속으로 기존 클래스의 코드를 재사용할 수 있어 반복적인 코드 작성을 줄일 수 있음
- 계층 구조의 표현
- 클래스 간의 계층 구조를 표현하여 코드의 구조를 명확하게 표현 가능
- 유지보수성의 향상
- 기존 클래스의 수정이 필요한 경우 해당 클래스만 수정하면 됨
Content .3 상속의 종류
- 단일 상속 : 1부모 1자식 (C# 가능)
- 다중 상속 : 여러부모 1자식 (C# 불가능)
- 인터페이스 상속 : 클래스가 인터페이스를 상속 받음 / 1클래스 여러 인터페이스
Content .4 상속의 특징
- 부모 클래스의 멤버에 접근
- 기존 클래스 멤버에 접근 가능하며, 클래스의 기능을 재사용 가능
- 부모의 지갑에 손대고 돈을 사용 가능
- 메서드 재정의
- 자식 클래스는 부모 클래스의 메서드를 재정의하여 자신에게 맞게 수정 가능
- 부모가 교과서 사라고 번 돈을 간식 사먹는데 사용 가능
- 상속의 깊이
- 클래스는 다수의 계층적인 상속 구조를 가질 수 있음
- 상속 깊이가 깊어질 수록 클래스 간의 관계가 복잡해질 수 있어 적절한 상속 깊이를 유지 및 사용해야 함
- 아빠 위에 할아버지 위에 증조 할아버지인데 증조 할아버지 성함 모르니까 할아버지까지만 관계 유지하자!
Content .5 접근 제한자와 상속
- 부모 클래스의 멤버의 접근 제한자에 따라 자식 클래스에서 해당 멤버에 접근할 수 있는 범위가 결정됨
- 접근 제한자를 통해 상속된 멤버의 가시성을 조절하여 캡슐화와 정보 은닉을 구현 가능
Content .6 가상(Virtual) 메서드
- 부모 클래스에서만 정의 가능
- 가상 메서드를 통해 자식 클래스에서 부모 클래스의 메서드를 변경하거나 확장 가능
Content .7 추상(Abstract) 메서드
- 직접적으로 인스턴스 생성 불가한 클래스
- 상속을 위한 베이스 클래스
- 추상 메서드를 사용할 경우 자식 클래스에서 반드시 구현이 되어야 함
Content .8 오버라이딩(Overriding)
- 부모 클래스에서 이미 정의된 메서드를 자식 클래스에서 재정의하는 것을 의미
- 상속관계을 전제로 메서드의 이름, 매개변수, 반환타입 동일해야 함
- 함수를 덮어 쓰게 하는 것
Content .9 오버로딩 (Overloading)
- 같은 메서드 이름이지만, 매개변수의 개수, 타입, 순서가 다른 여러 개의 메서드를 정의하는 것을 의미
- 함수를 읽게 하는 것
Chapter .3 Stack 과 Queue
Content .1 Stack
- Stack은 쌓아 올린다는 것을 의미
- 같은 구조와 크기의 자료를 정해진 방향으로만 저장 가능
- top으로 정한 곳을 통해서만 접근 가능
- 삽인하는 연산 "push" / 삭제하는 연산 "pop"
- 후입선출 (LIFO, Last In First Out) 구조
Content .2 Queue
- Queue는 줄을 서서 기다린다는 것을 의미
- 삭제연산만 수행되는 곳 front -> 디큐 (dnQueue)
- 삽입연삼나 수행되는 곳 rear -> 인큐 (enQueue)
- 선입선출 (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 단항연산자
int a = 0;
a = a++;
a = ++a;
Content .5 비교연산자
Content .6 논리연산자
- &&, ||, !, ^
- &&, || 의 경우 앞의 값의 결과에 따라 뒤를 생략하기도 함
Content .7 비트연산자
- 2진법이 베이스인 연산
(우측으로 이동 -> 나누기2)
- <<(좌측으로 이동 <- 곱하기2)
- ex) 9<<1 (좌측으로 1칸 이동 1001(9) -> 10010(18))
Content .8 비트연산 나누기
int i = 5;
i = i & 1;
- 비트연산에서 나머지를 구할 때 '&' 을 사용
- 비트연산에서 몫을 구할 때 ">>"을 사용
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 부분도 비트연산자가 활용됨
- 실무에서도 활용되기 때문에 필수적인 요소