프로그래밍 언어 93

복사 생성자

복사 생성자복사 생성자란 무엇일까?Java에는 없는데 C++에는 있는 기능이다.그럼 C에는 있을까? 없다.OOP의 개념이 있어야 생성자가 있다.생성자라는 개념이 있으려면 OOP가 있어야 한다. 그럼 Java는 OOP인데 왜 복사 생성자가 없냐?클론 함수 ( = clone()) 이런 걸 사용해서 쓴다. 그럼 복사 생성자는 어떻게 만들까? 자신과 같은 클래스에 있는 개체를 매개변수로 받는 코드를 짜면 된다. 즉, 매개변수가 다른 개체 그것도나랑 똑같은 클래스에 속한 개체면 복사 생성자이다. // Vector.hclass Vector{public: Vector(const Vector& other);private: int mX; int mY;};// Vector.cppVector::Vector(const Vec..

구조체와 클래스의 차이

구조체와 클래스의 차이 중 가장 먼저 설명할 수 있는 것은기본 접근 권한이 다르다는 것이다. struct 는 기본적으로 public이고,class 는 기본적으로 private이다. 컴퓨터는 struct와 class을 구분할까?-> 어셈블리단에서는 이 둘의 차이가 있을까? 안난다.C에 있던 기능이 다른 언어에 있다면, 고급 엔지니어가 만든 기능이다. 그럼 컴퓨터는 struct를 알까?모른다. 그룹개념도 없다 따로따로 노는 건데 사실은,메모리 어디에 접근한다 일 뿐이지,클래스와 구조체는 거의 차이없이 돈다. 근데 컴파일러는 구분할까?구분한다.컴파일러 에러가 잡아내기 때문에컴파일러는 private와 pubilc의 차이점을 안다. 구조체에 관한 코딩표준(기본) C++에서는 구조체를 클래스처럼 쓸 수 있다.하지만..

new와 malloc의 차이

C++ new 및 delete는 연산자이다.C스타일 malloc은 라이브러리에 내장된 함수이다. 할당 연산자인 new의 기본 형식은 다음과 같다.포인터 = new 타입 [(초기값)]; 즉, 차이점은 다음과 같다. 1. malloc/free는 라이브러리가 제공하는 함수인데 비해new/delete는 언어가 제공하는 연산자이다.그래서 별도의 헤더 파일을 포함할 필요없이 언제든지 사용할 수 있다.이 연산자를 쓴다고 해서 프로그램이 커지는 것도 아니다.연산자이기 때문에 사용자 정의 타입에 대해 오버로딩 할 수도 있다. 사용자 정의 타입 오버로당 예시// microsoft 출저class MyClass{public: void * operator new[] (size_t) { return 0; } ..

Java와 C++의 차이로 배우는 소멸자와 const 멤버 함수

소멸자는 언제 호출되길래 소멸자라 부를까? 생성자가 언제 호출되는 지 기억하는가?오브젝트가 새로 만들어질 때이다.스택에 in place되거나 힙에 new로 할당 될 때이다.두 경우 모두 생성자가 호출된다. 그럼 소멸자는 이 객체가 지워질 때 호출된다.new 만든 객체가 delete로 지워질 때,스택에 만든 오브젝트면 스택에서 없어지면서 호출된다. 자바같은 경우에는 소멸자가 없다.없을 수 밖에 없는게 소멸자는 뭐 할 일이 없기 때문이다.C++는 소멸자가 있다.그 이유는 뭘까?C++는 메모리 관리를 스스로 해줘야한다.따라서 만약에 C++ 클래스 안에서 내가 메모리를 할당을 한 상황이라면내 오브젝트가 언제 지워지는 지 알아야그 안에서 할당한 메모리도 지울 수 있다.그 시기를 알기 위해서 사용하는 것이 소멸자이..

Java와 C++ 로 비교하는 - 초기화 리스트와 기본 생성자

대입의 개념과 초기화 리스트의 차이//Javaclass Vector{ public: vector() { //이건 대입 mX = 0; mY = 0 }}/C++class Vector{public : vector(); //이건 초기화 : mX(0),mY(0) {}}  실제 코드 상에서는 대입과 초기화 리스트가 차이가 없어보인다.근데 초기화 해야하는 이유는대입은 초기화가 된 이후에 실행되는 애이고,초기화 리스트는 실제 오브젝트가 만들어질 때 초기화하는 것이다. 초기화 리스트를 권장하는 이유는 다음과 같다.특히 멤버 변수를 대입 없이 초기화 할 수 있으며상수나 참조 변수도 초기화가 가능하다. 다음과 같이 const나 참조는 선언 이후에 대입할 수 ..

Java와 C++/C 차이 개체 배열, 선언문 관례

//JavaVector[] list = new Vector[10]//C++Vector* list = new Vector 위는 실질적으로 다른 코드이다Java의 new는 실제 vector 10개의 공간만 있고아무런 값도 들어있지 않은 nullprt이 10개 만들어진다. 그마다 vector를 만들어주려면 for문 돌면서 Vector 10개 만들어 줘야한다. C++에서는 이런 혼돈이 없다.new Vector하면 진짜 Vector를 10개 만들어준다.즉, 포인터를 담을 수 있는 공간 10개를 만들어주는 것이 아니라오브젝트 10개를 진짜 만들어준다. 글로 말하면 이해가 조금 안되는데 다음 그림을 보면 이해가 쉬울 것이다. 때문에 Java에서는 Vector 포인터라고 하는 것과 같다. 따라서 Java에서의 코드를 ..

C++ 에서 가상 함수가 필요한 이유는 무엇인가?

C++에서 가상 함수란 무엇인가?C++의 가상 함수는 파생 클래스에서다형성을 달성하기 위해 재정의할 수 있는 기본 클래스 멤버 함수입니다.virtual 키워드를 사용하여 기본 클래스에서 함수를 선언할 수 있습니다.기본 클래스에서 함수를 선언하면포인터나 참조를 사용하여 가상 클래스를 호출하고파생 클래스에서 가상 버전을 실행할 수 있습니다.따라서 컴파일러에게 런타임 중에 객체의 유형을 결정하고함수 바인딩(늦은 바인딩 또는 동적 연결)을 생성하도록 요청합니다. C++의 가상 함수는 참조 또는 포인터를 통해 올바른 함수를 호출하는 데 도움이 됩니다. C++ 프로그래밍 언어에서는 단일 포인터만 사용하여 모든 파생 클래스 객체를 참조할 수 있습니다. 포인터는 모든 파생 객체를 참조하므로 이를 호출하면 기본 클래스에..

STL 여섯 가지 주요 컴포넌트 - 컨테이너 - 시퀀스 컨테이너

STL에는 여섯 가지 주요 컴포넌트가 있다. 컨테이너, 제네릭 알고리즘, 반복자, 함수 객체, 어댑터, 할당기가 포함되어 있다. STL에는 두 가지 종류의 컨테이너가 있는데,하나는 시퀀스 컨테이너이고, 다른 하나는 정렬 연관 컨테이너이다. 시퀀스 컨테이너는 타입이 동일한 객체들을 선형으로 구성한 컬렉션이다.STL의 시퀀스 컨테이너에는 다음 세 가지 종류가 있다. vector : 가변 길이 시퀀스를 임의 접근할 수 있으며,시퀀스 맨 끝에서 수행되는 삽입과 삭제는 아모타이즈드 상수 시간에 수행이 가능하다.(여기서 임의 접근이 가능하다는 것은시퀀스의 i번째 원소를 접근하는데 걸리는 시간이 상수 시간이라는 것을 의미한다.이는 다시 말해, i값에 상관없이 소요 시간은 항상 일정하다는 뜻이다.) deque : 이것..

* const 와 reference

레퍼런스도 이제 어셈수준에서는 포인터와 똑같이 작동한다. c는 어셈블리어를 제외하면,가장 기계어와 가까운 고급언어이다. c에 없는 기능이 어떠한 언어에 추가되었다면,이는 사용자의 편의성에 의해 고급 (엔지니어 or) 프로그래머가 제작한 것이다. 그렇다면 c에 없는 c++에 있는 레퍼런스를 만드려 한다면 어떻게 만드는 것이 좋은가? * const 를 쓰면 된다. * const는 선언과 동시에 초기화해줘야하며,실제로 레퍼런스와 * const의 초기화 오류는 똑같이 작동된다.  다음과 같이 초기화 한 후에, 값을 바꿀 수 없다는 점, 포인터로 해당 기능을 만들 수 있다는 점은* const를 쓰면 C++의 레퍼런스와 같이 사용할 수 있다.

함수 뒤에 const? 너 누군데

멤버 함수 뒤에 const를 붙이면const 키워드로 멤버 함수를 선언하면 함수가 자신이 호출되는 개체를 수정하지 않는 "읽기 전용" 함수로 지정하는 것이다. const 객체들은 const 맴버함수만 호출할수 있다.그렇다고 일반 객체는 const가 뒤에 있는 맴버함수도 가능하지 않다는 것은 아니다. int getMonth() const; // A read-only function 그럼 앞에 쓰면? 반환값을 상수화 하는 것이다.const int A(); // 반환값을 상수화한다. 주로 참조값으로 반환이기 때문에 const를 붙여줘야 할 때 쓰인다.  그럼 매개변수에 const는?매개변수를 call by reference일때 즉 참조값으로 받을때 사용한다.속도는 높이고 싶은데 참조값을 변경하기 싫을때..