☆ 도움을 주신 분 ☆ ★ http://tang1993.tistory.com 임태영블로그 ★ #pragma warning(disable:4996) #include "stdafx.h" #include #include #include using namespace std; //이름 클래스 class Name{ string name; public: void setName(string name) { this->name = name; } string getName() { return name; } }; //과목 클래스 class Subject { int subject; public: void setSub(int subject) { this->subject = subject; } int getSub() { retur..
오버로딩 불가능 연산자 이유 : C++의 문법규칙을 보존하기 위함 - 멤버 접근 연산자 - 멤버 포인터 연산자 : .* - 범위 지졍 연산자 : :: - 조건 연산자(3항 연산자) : ?: - 바이트 단위 크기 계산 : sizeof - RTTI 관련 연산자 : typeid - 형변환 연산자 : static_cast - 형변환 연산자 : dynamic_case - 형변환 연산자 : const_cast - 형변환 연산자 : reinterpret_cast
템플릿 - 다형성의 종류 중 하나 - 일반화 프로그램 -> 타입 제한이 없다. 즉, 타입을 지정해 줄 수 없다 기본 형태 template 종류 1. Template 함수 - C++에서만 존재 -> JAVA에서는 없다 #include "stdafx.h" #include #include using namespace std; template void change(T &t1, T &t2); void main() { int a = 1, b = 2; char c = 'A', d = 'B'; float e = 3.7f, f = 4.3f; change(a, b); cout
string을 사용하지 않고 string 역할을 하는 객체를 생성하여 사용 #include "stdafx.h" #pragma warning(disable:4996) #include #include using namespace std; class MyString { char *str; //문자 메모리 공간 할당 int len; //문자열 길이 저장 변수 public : MyString() { len = 0; str = NULL; } //소멸자 ~MyString() { delete[] str; } //1번 MyString(const char *p) { //문자열 길이 구하기 len = strlen(p) + 1; //길이를 알려주는 함수 -> null이 빠지기 때문에 +1을 해줌 //메모리 할당 str = n..
연산자 함수 : 객체를 가지고 연산 처리를 할 수 있게 해주는것 - 값 + 객체 - 원래 의미를 바꾸지 말라 -> 이유 : 동적 메모리 할당 - 새로운 연산자를 만들면 안된다 - friend를 많이 쓰는 대표적인 함수 기본 형태 리턴타입 operator 연산자(매개변수 리스트); #default로 존재하는 함수 - 생성자 소멸자 복사 대입연산자 中 대입연산자 사용 #복사 생성자 : 객체 생성 할 때 객체를 대입하기 위해 만듬 #대입 : 객체 생성 이후에 객체를 대입하는것 방법 1. 멤버 함수 - this가 있다 : 자기 자신으로 넘길 수 있다 #include "stdafx.h" #include using namespace std; class A { int a; public : A(int a = 1000)..
friend - 접근 지정자에 상관없이 모두 public으로 인식하여 사용한다 - 캡슐화의 파괴 주범 - 코드의 확장을 위해 사용 - 원래 내꺼가 되어야 하는데, 접근할 수 없을 때 사용 -> 다 접근할 수 있게 권한을 줌 - 연산자 함수에서 사용 ex) 3 + 객체 관계 1. friend class 2. friend method : 객체 안에 있는 특정 메소드만 friend 적용 3. friend function : 외부함수에서 접근 - 가장 많이 씀 - class A가 있고 class B가 있을 때, class A에 아무곳에 friend B; 라고 선언하면 B에 접근이 가능 #include "stdafx.h" #include using namespace std; class A { int money; ..
stack - FILO : First In Last Out - 처음에 넣는 값이 제일 나중에 나온다 queue - FIFO : First In First Out - 처음에 넣는 값이 제일 처음에 나온다 Stack Queue Memory #include "stdafx.h" #include using namespace std; class Memory { protected: int *m; public: int count = 0; Memory() { m = new int[20]; } virtual ~Memory() { //생성자 함수와 소멸자 함수는 세트 delete[] m; } void push(int i) { //stack과 queue의 공통적을 데이터를 넣는 일을 하는 함수 if (full()) { m[c..
가상 함수 - 추상 메소드의 한 종류 - 많이 쓰면 쓸수록 메모리 낭비가 생길 수 있다 - 사용자가 동적 바인딩을 항상 쓰지 않기 때문에 가상 함수를 쓴다 - 오버라이딩을 할 때 무조건 가상함수를 쓴다고 생각하면 된다 int a int b *vptr 가상함수를 사용하면 *vptr의 공간이 생긴다 소멸자에서 무조건 생성해야함 #include "stdafx.h" #include using namespace std; class A { public : A() { cout
동적 바인딩 : 부모가 자식을 접근하는 방식 - 포인터를 사용 - is ~a 관계일때만 사용 가능 //has ~a로 상속받으면 오류 - 동적 바인딩과 정적 바인딩의 방식은 다르지만, 결과는 같아야 한다 - 부모가 인식할 수 있는 범위까지만 사용가능하다 ->즉. 부모만 가지고 있는 경우, 또는 오버라이딩한 멤버만 접근 가능 정적 바인딩 : 내꺼를 가지고 접근 장점 1. 자식이 여러명일 때 2. 코드를 간략하게 짤 수 있다 #include "stdafx.h" #include using namespace std; class A { public : virtual void disp(); //함수 선언 void ccc() { cout
동적 바인딩 - 부모의 포인터로 자식을 접근하는 방식 - is ~a 관계일때만 사용 가능 //has ~a로 상속받으면 오류 - 동적 바인딩과 정적 바인딩의 방식은 다르지만, 결과는 같아야 한다 정적 바인딩 : 내꺼를 가지고 접근 단일 상속을 원칙으로 하되, 필요에 의해 다중 상속을 한다 #다중 상속 할때, 상속 방식을 꼭! 명시해야함 - private으로 자동으로 상속됨 다중 상속의 복잡성 만나는 구조로 상속을 받으면 같은게 2개를 상속 받아 쓰므로 터짐! -> 해결 : 가상상속 다중 상속 가상 상속 D가 어떤 부모 클래스 (B, C)를 사용할지에 따라 A를 사용하는 클래스가 지정되어 사용된다 다중 상속 주의점 1. 상속 방식을 명확하게 기재 2. 모호성 조심 -> 발생할 수 밖에 없는 상황이라면 가상 ..
클래스 관계도를 이용해서 급여 관리 프로그램 만들어보기 상위 데이터 클래스 #include "stdafx.h" #include #include #include #include using namespace std; class Info { //Info에 대한 정보를 넣는 data 클래스 string info; public: void setInfo(string info) { this->info = info; } string getInfo() { return info; } }; class Money { //Money에 대한 정보를 넣는 data 클래스 float money; public: void setMoney(float money) { this->money = money; } float getMoney() ..
클래스 관계 1. has ~a : 클래스의 내용을 가져다 쓴다 - data와 관리 class - 포함 object - 제일 많이 쓰는 방식 #include "stdafx.h" #include #include #include using namespace std; //has ~a 관계 class A { string name; public : A() { //디폴트 생성자 cout name = name; } string getName() const { return name; } }; class B { A aa; //포함 object int age; public : B() { cout age = age; } int getAge() const { return age; } //A를 가져다 쓰기 void setName..
const #레퍼런스 변수는 한번 참조하면 바꿀 수 없기 때문에 선언과 동시에 초기화를 해야한다 const도 레퍼런스와 마찬가지로 선언과 동시에 초기화를 해줘야한다 필드는 문법적으로 초기화를 시키지 못하기 때문에 콜론 초기화를 해준다 사용 목적 주로 사용자 캡슐화 목적으로 사용 1. Field - 필드 - 선언과 동시에 초기화를 해줘야 하는데 할 수가 없다 - 콜론 초기화 기법을 사용한다 - 깂을 읽기만 가능하다 # 콜론 초기화 : const와 필드 초기화 - this 대신에 사용하는 개념 #include "stdafx.h" #include #include using namespace std; class A { const int a; int b; public : A():a(10), b(20){ //생성자..
static method 생성시기 : 맨 처음 특징 1. class를 통 틀어서 오직 하나다 2. this pointer가 존재하지 않는다 3. instance field를 사용할 수 없다 기본 형태 클래스명::메소드( ); 객체.메소드( ); //객체를 만든 후 # :: - 범위 지정 연산자 (스코프) : 클래스 이름과 static 멤버 사이에서 static 멤버를 접근하기 위해 사용 #include "stdafx.h" #include #include using namespace std; class A { public : static void disp() { cout
this - JAVA : 자기 자신을 가리키는 레퍼런스 - C++ : 자기 자신을 가리키는 객체 포인터 - 인스턴스 함수의 첫번째 매개 변수에서 존재 -> 객체를 만들어야함 #static : 객체를 만들지 않아도 됨 #인스턴스 메소드 : 객체를 만들어야만 쓸 수 있는 메소드 -명시적으로 사용할 경우 -> 필드명과 지역변수가 같으면 무조건 this.을 써준다 -> 메소드에서 자기 자신을 리턴할때 사용 -> 반복적인 일을 할 때 #static 메소드에서 필드 값을 초기화 할 수 없다 -> this를 만들 수 없기 때문 - 쓰고 싶으면 생략 되어있는 것을 코딩 call by adress #include "stdafx.h" #include #include using namespace std; class A { ..
클래스 : 추상적인 것을 객체화 시킨 것 #객체 : 사람이 정의할 수 있는 모든 것 절차 지향 : 순서에 의해서 진행 -> C 스타일 객체 지향 : 확장성, 유지보수성이 가장 중요! 기본 형태 class 클래스 이름 { //내용 }; //세미 콜론 필수! 클래스 안에 들어가야할 내용 1. Member variable - 멤버 변수 // Field 2. Member function - 멤버 함수 // Method 3. Constructor - 생성자 default로 정의되는 함수 1. 생성자 함수 : 객체 등록 시 자동으로 호출되어지는 함수 - 역할 ㉠ 객체 필드 초기화 -> 쓰레기 값 방지 ㉡ 객체 등록 -> default - 접근 지정자는 주로 public을 사용 ( 필수는 아님 ) -> 외부 함수에서..
오버로딩 : 동일한 함수명으로 여러개의 함수를 제공 조건 1. 함수명은 같지만, 매개변수의 타입이나 갯수가 달라야한다 2. 리턴 타입은 상관없다 종류 1. 명시적 오버로딩 : 함수명은 같고, 매개변수나 파일의 갯수에 의해 구별 ex) void disp ( int a, int b ); void disp ( int a ); void disp ( ); => 함수가 3개 2. 암시적 오버로딩 : 한개의 함수로 여러개를 표현 - default 인자 값을 가질 수 있다 -> 내가 어떤 값을 주겠다 ex) void disp ( int a = 0, int b = 0 ); => 명시적 오버로딩의 예시를 하나로 만든것 disp ( 10, 20 ); disp ( 10 ); // disp ( 10, 0 ); disp ( );..
읽는 방법 right / left 규칙 1. right : 정체 2. left : 용도 ex) int *p[3]; 정체 : 배열이 3개 용도 : int pointer -> int *가 3개인 배열 int * int * int * ex) (*p)[3]; 정체 : 포인터 용도 : 한 행당 요소의 갯수가 3개 -> 한 행당 3개의 요소를 갖고 있는 2차원 배열 #include "stdafx.h" #include #include using namespace std; void main() { int a[2][3] = { 6,5,4,3,2,1 }; int i, j; int (*p)[3]; p = a; // 초기화 for (i = 0; i < 2; i++) { for (j = 0; j < 3; j++) { //아래의..
동적 메모리 동적 메모리는 이름이 없다 전역 변수를 사용하면 안된다 기본 형태 데이터 타입 *함수 이름 = new 데이터 타입 ex) int *p = new int; C 스타일 : ((int *)malloc(sizeof(int)); C++ 스타일 Example) 선언 : int *p; p = new int; p1 = new int[3]; // 배열 해제 : delete p; delete p1; // p1이 가리키는 주소만 지움 -> 다 지우는게 아님 delete [ ]p1; // 다 지움 - 배열 삭제하기 전까지는 p의 위치를 바꿔서는 안된다 #동적 메모리를 할당 할때, 소멸자가 하나밖에 없기 때문에 크기가 하나라도 배열로 선언한다 ex) int *p = new int[1]; 동적 메모리 - 성적 처리 ..
주소값 표현 방법 1. &변수 2. 배열명 3. 함수명 4. 문자열 5. 포인터 포인터 : 크기는 4byte로, 주소를 저장하는 변수 -> 간접 변수 pointer = point (address) + er -> 지시자 기본 형식 가르키는 타입 * 변수명; 기능 1. 오직 주소만 받을 수 있다 2. 받은 주소의 값을 알 수 있다 3. 받은 주소의 값을 변경할 수 있다 4. 주소를 사용할 수 있다 5. 1:1 방식 -> 동시에 여러개를 잡지를 못한다 포인터 법칙 1. 첨자와 갯수가 같으면 값, 다르면 주소이다 2. 주소도 차원이 있다 - 1개가 부족하면 1차원, 2개가 부족하면 2차원, 3개가 부족하면 3차원 3. 1차원 주소자에 +1을 하면, 한 요소의 사이즈 (하나의 변수) 2차원 주소자에 +1을 하면,..
call by value : 값을 사용 call by adress : 주소값을 지정해서 사용 call by reference : '*'를 쓰지않고 포인터 처럼 값을 넣어서 사용 #include "stdafx.h" #include using namespace std; //사용자 정의 함수 선언 void disp(int a); int input(int a); void input_add(int *a); void input_ref(int &a); void main() { int a = 10; disp(a); a = input(a); //call by value input_add(&a); //call by address input_ref(a); //call by reference disp(a); //int &a ..