1학년 때 시험 대비 할겸 정리해놨던 글
*절차지향 프로그래밍 : 데이터와 함수가 묶여있지 않다.
객체지향 프로그래밍 : 데이터와 함수가 묶여있다.
*객체는 상태와 동작을 가진다
객체의 상태 : 객체의 속성
객체의 동작 : 객체가 취할 수 있는 동작
*접근지정자
private 멤버는 클래스 안에서만 접근될 수 있다.
protected 멤버는 클래스안 & 상속된 클래스에서 접근가능
public 멤버는 어디서나 접근 가능
*객체의 멤버 접근
obj라는 객체의 radius 멤버 변수에 접근하려면
obj.radius = 3;
처럼 . 연산자를 사용
#include <iostream>
using namespace std;
class Circle {
public:
int radius;
string color;
double calcArea() {
return 3.14 * radius * radius;
}
};
int main() {
Circle obj;
obj.radius = 100;
obj.color = "blue";
cout << "원의 면적=" << obj.calcArea() << endl;
return 0;
}
*사각형 클래스
#include <iostream>
using namespace std;
class Rectangle {
public:
int width, height;
int calcArea() {
return width * height;
}
};
int main() {
Rectangle obj;
obj.width = 3;
obj.height = 4;
int area = obj.calcArea();
cout << "사각형 넓이는 " << area << endl;
return 0;
}
*Car 클래스 만들기
#include <iostream>
#include <string>
using namespace std;
class Car {
public:
int speed;
int gear;
string color;
void speedUp() {
speed += 10;
}
void speedDown() {
speed -= 10;
}
};
int main() {
Car myCar;
myCar.speed = 100;
myCar.gear = 3;
myCar.color = "red";
cout << myCar.speed << endl;
myCar.speedUp();
cout << myCar.speed << endl;
myCar.speedDown();
cout << myCar.speed << endl;
return 0;
}
*멤버함수의 중복 정의(동일한 이름의 함수를 여러개 정의하는 것)
void setSpeed(int s);
void setSpeed(double s);
이렇게 만들었는데 main 함수에서 obj.setSpeed(10.5)라고 했다면
두번째 함수가 실행됨
*객체지향의 개념들
자료 추상화 : 객체의 중요한 핵심적인 특징, 속성과 행위들을 추출하는 과정->구현과 분리
캡슐화 : 데이터와 알고리즘을 하나로 묶는것
정보은닉 : 내부 데이터, 내부 연산을 외부에서 접근하지 못하도록 은닉 혹은 격리
->접근 지정자를 private로 함
객체 외부에서 객체내의 자료로의 접근을 제한
상속 : 한 클래스가 기존의 다른 클래스에서 정의된 속성을 그대로 이어받아 사용
다형성 : 객체들의 타입이 다르면 동일한 메소드에 대하여 서로 다른 동작을 하는 것
*생성자의 특징
클래스 이름과 동일하다
반환값이 없다
반드시 public이어야 한다
중복 정의할 수 있다
*매개변수를 가지는 생성자
#include <iostream>
#include <string>
using namespace std;
class Car {
private:
int speed;
int gear;
string color;
public:
Car(int s, int g, string c) {
speed = s;
gear = g;
color = c;
}
void print() {
cout << "속도: " << speed << endl;
cout << "기어: " << gear << endl;
cout << "색상: " << color << endl;
}
};
int main() {
Car car1(1,2,"blue");
car1.print();
return 0;
}
생성자는 클래스 밖으로 Car:: 붙여서 빼도 된다.
*소멸자
#include <iostream>
#include <string>
using namespace std;
class Car {
private:
int speed;
int gear;
string color;
public:
Car(int s, int g, string c) {
speed = s;
gear = g;
color = c;
}
~Car() {
cout << "소멸자 호출" << endl;
}
void print() {
cout << "속도: " << speed << endl;
cout << "기어: " << gear << endl;
cout << "색상: " << color << endl;
}
};
int main() {
Car car1(1,2,"blue");
car1.print();
return 0;
}
*간단히 멤버 변수 초기화 하는 형식
Car(int s, int g, string c) : speed(s), gear(g), color(c){
//더하고 싶은 초기화 여기에
}
*복사생성자 : 한 객체의 내용을 다른 객체로 복사해서 생성
#include <iostream>
#include <string>
using namespace std;
class Car {
private:
int speed;
int gear;
string color;
public:
Car(int s, int g, string c) :speed(s), gear(g), color(c)
{
cout << "생성자 호출" << endl;
}
Car(const Car& obj) : speed(obj.speed), gear(obj.gear), color(obj.color)
{
cout << "복사 생성자 호출" << endl;
}
~Car() {
cout << "소멸자 호출" << endl;
}
void print() {
cout << "속도: " << speed << endl;
cout << "기어: " << gear << endl;
cout << "색상: " << color << endl;
}
};
int main() {
Car car1(1,2,"blue");
Car car2(car1);
car1.print();
car2.print();
return 0;
}
*얕은 복사 문제
#include <iostream>
#include <string>
using namespace std;
class Student {
char *name;
int number;
public:
Student(char *p, int n) {
cout << "메모리 할당" << endl;
name = new char[strlen(p)+1];
strcpy(name, p);
number = n;
}
~Student() {
cout << "메모리 소멸" << endl;
delete [] name;
}
};
int main() {
Student s1("Park", 20100001);
Student s2(s1);
return 0;
}
*깊은 복사
class Student{
Student(const Student& s){
cout << "메모리할당" <<endl;
name = new char[strlen(s.name)+1];
strcpy(name, s.name);
number = s.number;
}
...
};
*동적으로 할당 예시
int *p;
p=new int[10];
*p=10; //p[0]
delete [] p;
*함수가 객체를 반환하는 경우
함수가 객체를 반환할 때에도 객체의 내용이 복사될 뿐 원본이 전달되지 않는다.
#include <iostream>
#include <string>
using namespace std;
class Pizza {
public:
Pizza(int s) : size(s){}
int size;
};
Pizza createPizza() {
Pizza p(10);
return p;
}
int main() {
Pizza pizza = createPizza();
cout << pizza.size << "인치 피자" << endl;
return 0;
}