분류 전체보기
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..
C# 클래스 접근 제한자 (Access Modifier)
접근 제한자에는 public, protected, internal, private가 있다. 클래스 기본형은 internal이다. 접근 제한자 설명 private 클래스 내부에서만 접근이 가능하다. public 모든 곳에서 해당 멤버로 접근이 가능하다. internal 같은 어셈블리에서만 public으로 접근이 가능하다. protected 클래스 외부에서 접근할 수 없으나 파생 클래스에서는 접근이 가능하다. protected internal 같은 어셈블리에서만 protected으로 접근이 가능하다. using System; using System.Collections.Generic; using System.Runtime.InteropServices; namespace ConsoleApplication1 {..
C++ 클래스 접근 제한자 (Access Modifier)
public, private, protected 바로 이 3가지이고 쓰여지는 이유는 객체지향 프로그래밍의 중요한 개념 중 하나는 데이터 숨김(은닉) 때문이다. 클래스 내에 멤버에 대한 접근 제한자를 두지 않으면 기본적으로 private이다. 구조체 멤버에 대한 기본적인 접근 제한자는 public이다. friend 키워드는 private와 protected의 원칙을 깨트림으로서 코드의 직관성과 흐름 파악을 복잡하게하는 goto같은 존재이다. friend 관련 글 참고 public public으로 선언된 데이터 멤버 및 멤버함수는 . 연산자를 사용하여 프로그램의 아무곳에서나 액세스 할 수 있다. private 클래스 멤버를 private으로 선언하면 해당 멤버는 오직 클래스 내부에서 접근할 수 있다, 외부의..