Programming Language 71

[C++] 오버라이딩(Overriding)과 정적 바인딩(Static Binding)

오버라이딩(Overriding)과 정적 바인딩(Static Binding)override : 우선하다overload: 다중 정의overwrite : 덮어 쓰다Overriding#include using namespace std;class Base { public: int a = 10; // Base() : a(10) {}이랑 똑같음. void Print() { cout int a = 10;생성자가 호출될 때, 멤버 변수 a를 10으로 초기화 된다class Derived : public Base { public: int a = 20; void Print() { cout 멤버 변수의 이름이 같다면, 자기 고유멤버가 상속멤버보다 우선순위가 높다.d에서 멤..

[C++] 상속이 필요한 이유(1)

상속이 필요한 이유(1)상속이 필요한 이유에 대해서 알아보자example) 메신저 프로그램텍스트, 이미지 등의 포맷을 갖는 데이터를 전송한다상속을 사용하지 않고 코드를 작성해보자// 상속을 사용하지 않은 코드#include #include using namespace std;class Image { public: operator string() { return "사진"; }};class TextMessage { public: TextMessage(int sendTime, string sendName, string text) { this->sendTime = sendTime; // this->sendTime을 안쓰고 sendTime을 쓰면 매개변수 값을 매..

[C++] 상속(Inheritance)과 접근제어(Access Control)

상속과 접근제어상속(Inheritance)부모가 자식에게 상속하면, 부모의 멤버들을 전부 사용하고, 자식만의 고유한 멤버를 추가로 가질 수 있다포함관계 : 부모가 자식을 포함하는 관계남자 ) 총각 이듯이 부모 ) 자식이다.자식이 부모한테 포함되는거고, 부모의 멤버가 자식의 멤버에 포함되는 것이다.#include using namespace std;class Base { public: void bFunc() { cout 자식 클래스(파생 클래스) 뒤에 콜론 ":"을 붙인 뒤 접근제어자와 부모 클래스를 적어준 뒤 선언하면 된다class Derived : public Base { // Base를 부모로 하는 클래스 public: void dFunc() { cout ..

[C++] Implicit Conversion(묵시적 형변환)

Implicit Conversion(묵시적 형변환)묵시적 형변환과 명시적 형변환묵시적(암시적) 형변환: implicit conversion형변환을 겉으로 드러내지 않음명시적 형변환: explicit conversion형변환을 명시한다변환 생성자#include #include using namespace std;class Item { public: Item(int num) : num(num) { // 변환 생성자 cout 이동생성자를 통해 i3로 대입 // 묵시적 변환 Item i4 = (Item)4; // Item(int num) 생성자가 형 변환까지 하고 있음. // 명시적 변환전부 Item(int num) 생성자를 호출우리가 알고 있는 일반적인 일반적인 생성..

[C++] 이동 시맨틱(Move Semantics): 이동 생성자, 이동 대입 연산자

이동 시맨틱(Move Semantics): 이동 생성자, 이동 대입 연산자필독아래에서 주의해서 봐야할 내용이 있습니다. C++17부터 Guarenteed Copy Elision(보장된 복사 생략)이라는 개념이 들어오면서 단순히 함수의 리턴값을 대입하는 경우 임시 객체를 만드는 과정을 생략합니다. 아래 예시에서도 단순히 함수의 리턴 값을 대입하고 있는데, 이 글은 C++11을 기준으로 작성된 내용이므로 실제 컴파일러에서 코드를 돌리는 것과 동일하게 작동하지 않습니다. 이동 시맨틱에 대해서 배운다는 목적으로 아래 내용을 참조하면 되겠습니다.깊은 복사의 문제점을 해결하기 위해 얕은 복사를 사용객체를 복사할 때 하나 하나 많은 양의 값을 복사를 해야함.깊은 복사가 필요 없는 경우도 존재함// 고의적으로 얕은 복..

[Java] 09. OOP - 추상 클래스(abstract class)

추상 클래스(abstract class)미완성 설계도로 완성된 제품을 만들 수 없듯이 추상클래스로 인스턴스는 생성할 수 없다.추상 클래스는 상속을 통해서 자손클래스에 의해서만 완성될 수 있다.추상 클래스는 새로운 클래스를 작성하는데 있어서 바탕이 되는 조상클래스로서의 중요한 의미를 갖는다abstract class 클래스이름 { // ...}키워드 'abstract'를 붙이기만 하면 된다추상 클래스에도 생성자가 있으며, 멤버변수와 메서드를 가질 수 있다추상메서드(abstract method)선언부만 작성하고 구현부는 작성하지 않은 채로 남겨 둔 메서드. 미완성 메서드임미완성으로 남겨둔 이유는?메서드의 내용이 상속받는 클래스에 따라 달라질 수 있기 때문에 조상 클래스에서는 선언부만을 작성하고, 주석을 ..

[Java] 08. OOP - 다형성(polymorphism)

다형성(polymorphism)여러가지 형태를 가질 수 있는 능력자바에서는 한 타입의 참조변수로 여러 타입의 객체를 참조할 수 있도록 함으로써 다형성을 구현조상클래스 타입의 참조변수로 자손클래스의 인스턴스를 참조할 수 있도록 하였다공통으로 포함된 인스턴스만 접근할 수 있다같은 타입의 인스턴스라도 참조변수의 타입에 따라 사용할 수 있는 멤버의 개수가 달라진다반대로 자손 타입의 참조변수로 조상 타입을 참조할 수 없음(컴파일 에러)참조변수가 사용할 수 있는 멤버의 개수는 인스턴스의 멤버 개수보다 같거나 적어야 한다참조변수의 형변환기본형 변수와 같이 참조변수도 형변환이 가능함단, 서로 상속 관게에 있는 클래스 사이에서만 가능함 (부모 자식)Up-casting : 자손타입을 부모타입에 // 형 변환 생략 가능(..

[C++] 대입 연산자 오버로딩

대입 연산자 오버로딩대입 연산자(=)는 객체에 다른 객체의 값을 할당하는 데 사용됨대입 연산자 오버로딩을 통해 자신이 정의한 클래스에 대해 대입 연산자의 동작을 사용자 지정하거나 확장함기본적으로 C++ 컴파일러는 멤버변수 단위로 얕은 복사(shallow copy)를 수행하지만, 깊은 복사(deep copy)를 수행하도록 지정할 수 있음/* 생략 */// 대입 연산자 오버로딩String &operator=(const String &rhs) { // 참조로 선언하지 않으면 rhs(s1)이라는 복사 생성자가 작동해서 복잡해짐. if (this != &rhs) { // 자기 자신을 대입하는 경우를 막기. // 만약 strData에 어떤 값이 존재한..

[C++] 복사 생성자 오버로딩

복사 생성자 오버로딩복사 생성자란 객체를 다른 객체로 복사하는 데 사용되는 특별한 생성자동일한 클래스의 다른 객체로부터 호출되며, 그 결과로 현재 객체가 다른 객체와 동일한 상태로 초기화됨/* 생략 */// 복사 !!!생성자!!!의 작동 String(const String &rhs) { // String s2(s1); 사용시 발생하는 일. // const String rhs 로 선언하면 안된다(무한 루프에 빠짐) cout String(const String &rhs) 에서 rhs가 아닌 &rhs를 사용해야 함레퍼런스로 선언하지 않으면 매개변수가 전달되는 과정에서 rhs(전달된 매개변수) 가 일어남이는 다시 복사 생성자를 호출하므로, 무한 루프에 빠지게 됨따라서 매개변수를 ..

[C++] 깊은 복사와 얕은 복사(Deep Copy, Shallow Copy)

깊은 복사와 얕은 복사(Deep Copy, Shallow Copy) 깊은 복사 / 얕은 복사란 얕은 복사 : 복사된 객체가 원본 객체의 요소들을 참조 예시 int *a = new int(5); int *b = new int(3); a = b; delete a; delete b; 3이 저장된 공간을 두 번 지움 5가 저장된 공간이 안지워짐 위와 같은 복사를 얕은 복사라 한다.(참조만 복사) 객체 내부에 참조 타입이 있는 경우에는 얕은 복사로 인해 문제가 발생할 수 있음 깊은 복사 : 원본 객체의 완전한 복사본을 생성, 복사된 객체는 완전히 독립적인 새로운 객체를 가지게 됨 내부에 있는 모든 객체들까지 재귀적으로 복사함 예시 int *a = new int(5); int *b = new int(3); *a =..