프로그래밍 언어

    C/C++ 포인터 역참조 (deference)

    배열의 포인터는 크게 *(단일 포인터) 또는 **(이중 포인터)로 받을 수가 있다. 역참조는 해당 포인터가 자기 자신을 가리키게끔 하는건데 예시로 *ptr이면 ptr-> 성질과 비슷하다, 즉 null 포인터일 시 당연히 뻥난다. *ptr는 arr의 시작 주소를 받아내고 전체 배열의 접근이 가능하다. *ptr2는 단일 주소 포인터다, 오직 할당받은 &배열[인덱스]에만 접근 가능하다. *(ptr3)[10] 이건 이중 포인터로 받아내는 것이다, 2차원 배열 또는 포인터 배열로 접근할 수가 있다. #include using namespace std; int main() { int arr[10]{ 5 }; for (int i = 1; i < 10; i++) arr[i] = arr[i - 1] + 5; int* p..

    C++ 얕은 복사 깊은 복사 (Shallow/Deep Copy)

    아래와 같이 코드를 작성하면 a1 객체와 a2 객체가 서로 같은 int형에 대한 포인터 변수를 공유하기 때문에 이미 해제된걸 재해제 하기 때문이다. #include using namespace std; class A { int* ptr = nullptr; public: A() { ptr = new int(); } A(const A& Ref) { this->ptr = Ref.ptr; } ~A() { delete ptr; } }; int main() { // 기본 생성자 호출 A a1; // 복사 생성자 호출 A a2(a1); } 이를 해결하기 위해선 ptr를 참조 대상값 가지고서 재 할당 해줘야한다. #include using namespace std; class A { int* ptr = nullptr;..

    C++ 임시 객체 (Temporary Object)

    임시 객체를 r-value로 알고있는데 이는 틀렸다, 임시 객체 또한 const&로 파라미터로 넘길 수가 있다. r-value move semantics #include using namespace std; class Vector { public: float x = 0, y = 0, z = 0; public: Vector(float Val) : x(Val),y(Val),z(Val) { } static float Length(const Vector& Vec) { return Vec.x + Vec.y + Vec.z; } }; int main() { cout

    C# 부모 클래스 함수 호출과 오버라이딩 (base / override)

    개념 부모 클래스 내 함수를 자식 클래스 재정의 하는 것이며 C++하곤 살짝 다른 개념이다 기본적으로 룰이 존재하는데. 1. 절대로 private이면 안된다. 2. C++과 다르게 같은 함수명을 적어도 컴파일러는 알아채질 못한다. using System; using System.Collections.Generic; using System.Runtime.InteropServices; namespace ConsoleApplication1 { public class Parent { int mVal = 0; public int ValProp { get { return mVal; } set { mVal = value; } } public Parent() { this.mVal = 10; Console.WriteLi..

    C++ 부모 클래스 함수 호출과 오버라이딩 (override)

    오버라이딩 핵심 개념 오버라이딩은 부모 클래스에서 정의한걸 재정의 하는 것이다. 추상클래스 (순수 가상 함수) 참조 아래와 같이 부모 클래스에선 virtual 키워드를 붙여준 뒤 함수를 정의하고 자식 클래스에서 재정의 하는 것이다. virtual로 시작 (생략 가능) 그리고 마지막엔 override 붙일 수가 있다. (이것 또한 생략 가능) #include using namespace std; class Parent { int mVal = 0; public: virtual void Fn1() { } virtual void Fn2() { } virtual void Fn3() { } virtual void Fn4() = 0; }; class Child : public Parent { public: void ..

    C# 자기 자신 참조 (this) / 위임 생성자 (delegating constructor)

    C#은 C++과 다르게 위임 생성자 호출 시 부모 클래스 또는 자기 클래스 명칭을 사용하지 않는다. 아래와 같이 하면 에러가 뜬다. using System; using System.Collections.Generic; using System.Runtime.InteropServices; namespace ConsoleApplication1 { public class Test { int mVal = 0; public int ValProp { get { return mVal; } set { mVal = value; } } public Test() { Console.WriteLine("기본 생성자"); } public Test(int Val) : Test() { ValProp = Val; Console.Writ..

    C++ 자기 자신 참조 (this)

    아래 코드를 살펴보면 Set 함수에서 멤버 변수 val에 파라미터로 넘어오는 값을 대입하고자 하는데 공교롭게도 val을 파라미터로 넘어오는 값으로 인식한다 val은 초기화가 안됐으므로 쓰레기값이 출력될거다. #include using namespace std; class Parent { int val; public: void Set(int val) { val = val; } int Get() const { return val; } }; int main() { Parent parent; parent.Set(10); cout

    C++ 추상 클래스 / 순수 가상 함수 (Pure Virtual Function)

    순수 가상함수란 선언(declaration)만 있고 구현(definition)이 없는 가상 함수다. virtual void Func() = 0; 추상 클래스 위와 같은 순수 가상함수를 하나라도 가지고 있는 클래스를 추상클래스(abstract class)라고 한다. 추상 클래스는 객체를 생성할 수 없다. 추상 클래스는 멤버 함수의 원형만을 정의하고 그 구현은 자식 클래스에서 하게 된다. 추상 클래스를 상속받는 자식 클래스는 반드시 순수 가상함수를 오버라이딩 하여 재정의 해야만 한다. 그렇지 않다면 아래 그림과 같이 컴파일 오류가 난다. 이렇게 추상클래스를 활용하면 파생클래스에서 순수 가상함수를 재정의 하게끔 강제할 수 있다. #include using namespace std; class Parent { ..

    C# 추상 클래스 (abstract)

    추상 클래스(abstract class)와 추상 메서드(abstract method)이다. 추상 메서드는 abstract 예약어가 지정되고 구현 코드가 없는 Method이다. 추상 메서드는 반드시 추상 클래스 안에서만 선언할 수 있으며, 추상 메서드를 하나라도 가지고 있으면 추상 클래스로 만들어줘야 한다. 특징 추상 메서드에는 접근 제한자로 private를 사용할 수 없다. new를 사용해 인스턴스로 만들 수 없다 추상 메서드만을 가질 수 있다. abstract class Employee { public int EmpID { get; private set; } public long Salary { get; set; } public Employee(int empId, long salary) { EmpID ..

    C# 인터페이스 (interface)

    인터페이스는 계약이라고 볼 수 있다. interface는 클래스가 아니기 때문에 다중 상속이 가능하다. 인터페이스는 추상 메서드만 0개 이상 담고 있는 추상 클래스라고 봐도 무방하다. 특징 Method만을 포함할 수 있다. 비어 있는 인터페이스 정의가 가능하다. 자식 클래스에서 구현할 때, 반드시 public 접근 제한사를 명시해야 한다. (인터페이스명을 직접 붙이면 생략 가능) 인터페이스명을 직접 붙이는 경우에는 반드시 인터페이스로 형변환해야 호출이 가능하다. C#에서는 property가 메서드로 구현되기 때문에 인터페이스에 포함 가능하다. interface IFlyable { void Fly(); } interface IRunnable { void Run(); void Stop(); } abstrac..