IT 프로그래밍/객체지향프로그래밍 57

[c++] 접근 제어와 캡슐화 & 연산자 오버로딩

private를 통해 접근을 제어하는 이유private 지정자는 하나의 지정자를 다른 외부로부터 이 클래스를 상대적으로 독립성을 가지게 해주는 역할을 합니다. 코딩을 하다가 어떤 이유로 변수의 이름 같은 경우를 바꿔야하는 경우가 발생합니다. 하나를 바꾸게 되면 코드 전체를 훑어가면서 이름을 다 바꿔줘야 합니다.  어떤 변수나 이름을 바꾸게 되면 그 파급효과가 프로그램의 전체에 영향을 미칠 수 있습니다. 모든 부분을 찾아서 해줘야 하지만 클래스에 데이터 멤버를 private로 할 경우 private 멤버는 이 클래스 내부에서만 접근이 가능하므로 클래스 외부에 대해서는 신경 쓸 필요가 없어집니다.  상대적인 독립성을 가진다는 간단한 예입니다.  접근할 수 없는 멤버들은 최소화해주면서 만들어주면 됩니다.  p..

객체지향프로그래밍 그룹액티비티5

그룹 액티비티 1번class myClass{ int pra = 5;public: int pub = 10; void set_pr(int x) { pra = x; } void set_pu(int x) { pub = x; }};int main() { myClass m; int a, b; a = m.pra; b = m.pub; m.set_pr(100); m.set_pu(200); return 0;}pra가 private로 선언되어 있습니다. private로 선언되어 있을 경우 클래스 외부에서 직접 접근할 수 없기 대문에 오류가 나옵니다. 이런 경우 public으로 처리를 해서 해야합니다. 아니면 public에 get_pr() 함수를 생성해서 처리해줘도 됩니다. class myClass{ int pra = 5;p..

[c++] Generic 프로그래밍과 Template

int compare(string& v1, string& v2){ if (v1 기능적으로 같지만 타입이 다르기 때문에 이렇게 세개의 함수를 만들어주고 있습니다. 정수는 정수, 실수는 실수, 문자열은 문자열 이런식으로 되어 있는데요. 논리적으로는 완전히 똑같은데 데이터의 타입이 다르기 때문에 이렇게 해주는 것입니다. 이것은 똑같은 로직인데 데이터의 타입이 다르다는 이유만으로 똑같은 함수 여러개를 만들어야 한다는 것은 조금 짜증나는 일입니다.  그래서 c++은 template를 제공하는데요. Templatetemplate int compare(T& v1, T& v2){ if (v1 template는 실제 객체가 아니라 실제 객체의 틀이라고 보면 됩니다. 붕어빵이 있을 때 붕어빵을 만드는 틀이라고 생각하시면 ..

[C++] 상속이란?

컴퓨터를 생각해봅시다. 컴퓨터에 들어가는 제품은 노트북에도 들어갑니다.  이 경우에 부모와 자식간의 관계에 있는 클래스라 규정이며 이것은 바로 상속이라고 합니다. A notebook is a Computer이다. 이 경우 Notebook 클래스를 새롭게 정의하는 대신 computer 클래스를 확장하여 간단히 정리할 수 있습니다.  추가되는 멤버들만 기술함으로써 정의할 수 있는 것입니다.  클래스class Computer{public: string manufacturer; string processor; int ramSize; int diskSize; double processorSpeed; double computerPower() { return ramSize * processorSpeed; } dou..

[c++]포인터와 참조 설명

int main(){ int value = 5; int& ref = value; cout 참조는 별명처럼 사용할 수 있습니다. value의 또다른 이름으로 간주하고 사용할 수 있는 것인데요. #include #include using namespace std;int main(){ int value = 5; int* ptr = nullptr; ptr = &value; int& ref = value; cout 포인터의 주소는 value의 주소와 똑같은 것을 볼 수 있습니다. 하지만 포인터 자체의 주소를 치면 다른 것을 볼 수 있는데요. 이것에서 포인트도 변수라는 사실을 알 수 있습니다.  int& ref;이렇게는 불가능합니다. 참조가 별명같은 느낌인데 원래 이름이 없다면 별명도 지을 수 없겠죠? 원래 이..

[따배시 6.12] 동적 할당 배열

int main(){ int length = 5; int array[length]; return 0;}배열은 고정이 되어 있어야 가능한데요.이런 식으로는 불가능합니다. int main(){ const int length = 5; int array[length]; return 0;}이런 식으로 const를 해주면 정상적으로 작동하게 됩니다. 이것을 동적 배열이 가능하도록 바꿔보겠습니다. delete[] array;긴 사이즈  (배열) 등의 new를 제거할 때는 []를 써줘야 합니다. #include #include using namespace std;int main(){ int length; cin >> length; int* array = new int[length]; array[0] = 1; array..

[따배시 6.11] 메모리 동적할당 new 와 delete, 메모리누수

정적 메모리 할당 / stack int array[1000000]; //stack이렇게 선언해주는 것, 우리가 일반적으로 쓰는 코드가 바로 정적메모리입니다. 이런 정적 메모리 할당은 stack에 들어가며 이것은 용량이 그렇게 크지는 않은데요. 동적 메모리 할당 / heap new int;new int는 os에 4바이트 만큼 가져오면서 그 주소를 가져오는 것입니다. 그렇기 때문에 포인터로 받아야 하는데요.int* ptr = new int;*ptr = 7;이런식으로 해줄 수 있는 겁니다. 배열 동적할당을 해주면 장점이 많이 생기기 때문에 이 동적 메모리 할당을 하는 것인데요. 이런식으로 os로부터 4바이트를 가져와서 할당을 해주는 것을 기억해주셔야 합니다. 할당하면서 초기화를 해줄 수 있는데요.int mai..

[따배시 8.4] 생성자 멤버 초기화 목록

public: Something() { m_i = 1; m_d = 3.14; m_c = 'a'; }이런 식으로 생성자를 만들어줄 수도 있지만 더 간편한 방법이 존재합니다. initialize list라고 말합니다. public: Something() : m_i(1), m_d(3.14), m_c('a') {}이런식으로 써도 똑같은 방식이며 실전에서는 이러한 방식을 주로 사용할 것입니다.  전체 코드#include using namespace std;class Something{private: int m_i; double m_d; char m_c;public: Something() : m_i(1), m_d(3.14), m_c('a') {} void print() { cout 이런 식으로 써줄 수 ..

[8.3] 생성자 c++

#include using namespace std;class Fraction{private: int m_numerator; int m_denominator;public: Fraction() { m_numerator = 0; m_denominator = 1; } void print() { cout 반환 name이 없고 class와 이름이 같은 것은 생성자입니다. 외부에서 호출하려고 쓰려는 것이 아닌 어떤 변수를 만들 때 해당 변수의 값을 지정하고 싶을 때 이런 식으로 해주는 것입니다.  생성자 안에서 numerator의 값을 바꾸면 편하게 바꿔줄 수 있는 것입니다.  #include using namespace std;class Fraction{private: int m_numerator; int ..

[C++] 백준 4150번 피보나치 수

문제  코드#include #include #include #include #include using namespace std;string sum(string x, string y){ int num; int carry = 0; string result; reverse(x.begin(), x.end()); reverse(y.begin(), y.end()); while (x.length() y.length()) { y += '0'; } for (int i = 0; i > n; string a; string b; string result; a = '0'; b = '1'; if (n == 0) { result = "0"; } if (n == 1) { result = "1"; } for (int i = ..