이번 학기에 C++을 수강하게 되었는데요,,
생각했던 것보다 훨씬 더 복잡하고 어렵더라고요
그래서 간단하게 C++정복기로다가 시험공부를 할 예정입니다..
정보 제공용이라기보다는,, 제 공부용이랄까요
그래서 내용이 일관적이지 못하기도 하고, 정돈되지 못한 모습입니다. 제 말로 제가 이해할 수 있게끔만 쓰다 보니까요.
혹시라도 참고하실 분들이 계신다면 이 점 감안하고 정말 참고용으로만!! 간단하게 봐주셨음 좋겠습니다.
궁금한 부분이 있으시면 댓글 달아주시면 답변 드리도록 하겠습니다!!
객체 지향 언어
객체/클래스
클래스(Class) - 객체를 만드는 틀/붕어빵틀!
객체(Object) - 클래스라는 틀에서 생겨난 실체(instance)/붕어빵!
- 객체 = 변수+함수로 구성
- 객체들은 별도의 공간에 생성됨.
- 하나의 클래스 틀에서 여러 개의 객체 생성가능
- 변수 = 데이터 = 속성(Attribute) = 특성 = property
- 함수 = 메소드 = 행위(Behavior) = 기능
객체 지향 특성
- 추상화
: 객체들의 공통적인 속성과 기능을 추출 - 캡슐화
: 데이터(변수)와 메소드(함수)를 하나로 묶음
원칙!: 데이터 구현을 숨기고(직접접근불가) public 함수를 통해서만 접근 - 상속성
: 자식 클래스가 부모 클래스의 변수(특성)과 함수(기능)을 물려 받음 - 다형성
: 하나의 기능이 경우에 따라 다르게 작동
- 오버로딩(중복정의)
- 오버라이딩(재정의)
NAMESPACE
: std:: C++ 표준에서 정의한 이름공간(namespace) 중 하나로, std::생략을 위해 using 지시어를 사용하여 명령어로 사용된다
C++ 클래스 만들기
- 클래스 선언부: 멤버 변수와 멤버 함수 선언, class 키워드
class Circle{ //class 키워드를 이용한 클래스 선언 int radius; //멤버 변수와 멤버 함수 선언(멤버함수는 원형으로 선언) public: //멤버에 대한 접근지정자 지정 double getArea(); };
- 클래스 구현부: 멤버 함수 정의(구현), 클래스이름::
//클래스에 정의된 멤버 함수 구현 double Circle::getArea(){ return 3.14 * radius * radius; }
- 객체 생성과 활용
- 객체 생성 : Circle dount; (클래스이름 객체이름;)
- 객체 활용: dount.radius = 1; (.연산자 이용하여 멤버 변수, 함수접근)
접근지정자
- private: 나만 접근(디폴트), public: 모두 접근, protected: 나&자식 접근
- 접근지정자 중복 사용 가능(private: 두번 쓰기.. 근데왜.)
- 멤버 변수는 private 지정이 바람직 -> getter/setter을 통해 접근
생성자(Constructor) / 소멸자(Destructor
생성자 (똑같은 탁구공이 생산되지만 페인트색으로 초기화되는 것처럼..)
: 객체가 생성되는 시점에서 자동으로 호출되는 멤버 함수
- 클래스 이름과 동일
- 리턴타입 없음
- 중복선언 가능(오버라이딩)/ 매개변수에 따라 다른 선언 가능
- 객체 생성 시 오직 한 번만 호출.
추가. 생성자 서두 초기화 : 멤버 변수 초기화 방법 중 하나
이런 방법도 있구나! 나는 안에서 radius=r; 선언법밖에 몰랐는데!
Circle::Circle(int r) : radius(r){
cout<<"ㅎㅇ"<<radius<<endl;
}
소멸자
: 객체가 소멸되는 시점에서 자동으로 호출되는 함수로, 객체 메모리 소멸 직전 호출됨
- 목적: 객체가 사라질 때 마무리 작업을 위함
- 실행 도중 동적으로 할당 받은 메모리 해제.
- 파일 저장 및 닫기, 네트워크 닫기
- 클래스 이름앞에 ~ 추가(틸드라고 함)
- 리턴타입 없음
- 중복 불가
- 매개변수 없음
기본생성자와 기본소멸자: 선언되지 않은 경우 자동 생성
생성은 순서대로! 소멸은 역순으로!
바람직한 C++ 프로그램 작성법
- 클래스 선언부: 헤더 파일(.h), 클래스 구현부: 클래스가 선언된 헤더파일을 include "Circle.h"함 (.cpp)
- main() 등의 전역함수나 변수는 다른 cpp파일에 분산 저장
- 조건컴파일문 #ifdef - #define - #endif
- 헤더파일 중복 include 문제를 해결하기 위한 방법
- 왜쓰는거지
인라인 함수 - 프로그램 성능 향상
: 프로그램의 성능을 위해 컴파일러가 함수 호출 부분을 실제 코드로 대체하고 싶을 때 인라인 함수로 선언한다.
간단하게 말하면, 인라인함수로 선언된 함수의 경우, 함수를 호출하게 되면, 함수 자체가 아닌 함수의 내용만이 호출된다고 생각하면 된다.
크게 바뀌는 건 없고, 그냥 실행속도가 빨라진다!
- 암묵적 인라인 : 클래스 선언부에 구현된 멤버 함수
- 명시적 인라인 : 함수 정의 맨 앞에 inline 키워드를 추가
- 추가 정보: C++에서의 구조체는 상속,멤버, 접근 등 모든 것이 클래스와 동일함. class대신 struct 키워드 사용하면 됨.
객체 포인터
: 객체의 주소값을 가지는 변수
- 선언: Circle *p;
- 초기화: p=&dount;
- 멤버 접근(->연산자): p->getArea();
- (중요!) 객체에서 접근은 .연산자, 주소에서 접근은 ->연산자
- p는 ->연산자로. (*p)는 . 연산자로 접근하기
객체 배열
- 선언/생성 - Circle circleArray[3];
- 객체 배열 선언 시에는 기본생성자가 자동 실행되는데(r매개변수있는 생성자는 호출 안됨) 여기서 기본생성자가 없으면 컴파일 오류가 발생한다.
- 멤버 접근(.연산자) : circleArray[0].getArea();
- 멤버 접근(포인터 이용):
//1. 포인터 p롤 객체처럼 접근
Circle *p;
p=circleArray; // 객체 배열의 첫번째를 가리킴
p++; //두번째됨
//2. 배열의 이름을 포인터로 사용
for(int i=0;i<3;i++)
cout<< (circleArray+i)->getArea()<<endl;
//3. 포인터 p의 정수 연산 이용
Circle *p = circleArray;
for(int i=0; i<3; i++)
cout << << (p +i) -> getArea() << endl;
- 소멸: 생성한 순서 반대로 소멸
- 만약, 객체 배열 생성자를 매개변수 있는 생성자로 지정하고 싶다면, 각각의 원소당 생성자를 생성과 동시에 초기화해야한다.
Circle circleArray[3] = { Circle(10), Circle(20), Circle() };
동적 메모리 할당
: 실생단계에서 메모리 공간을 할당하며, 반환을 사용자가 직접하기 때문에 정적 할당에 비해 메모리 누수의 가능성이 있다.
- 선언만 먼저 or 선언과 동시에 초기화 모두 가능. 단, 배열은 초기화 동시에 불가능.
- 기본 타입:
int *p = new int; p = 5; delete p;
- 기본 배열:
int *p = new int[5]; p[0] = 0; delete [] p;
- 객체 타입:
Circle *p = new Circle; Circle *q = new Circle(30); delete p; delete q;
- 객체 배열:
Circle *pArray = new Circle[3]; delete [] pArray;
this 포인터: this->radius
- 객체 자신 포인터, 컴파일러가 묵시적으로 선언
- 매개변수의 이름과 멤버 변수의 이름이 같은 경우 사용
- 멤버 함수가 객체 자신을 반환하는 경우 사용
- 멤버 함수가 아닌 함수에서 사용 불가 / static 멤버 함수 에서 사용 불가
delete 유의사항
- 객체 배열의 소멸은 [2]->[1]->[0] 마찬가지로 역순 실행된다.
int *p = new int [10];
delete p;
// 비정상 반환. //delete [] p; 여야 함.
int *q = new int;
delete [] q;
// 비정상 반환. //delete q; 여야 함.
string 클래스
- 객체 생성: string name; string address("suin");
string str;//1 기본생성자-빈 문자열 스트링 객체
string address("서울시 성북구");//2 매개변수 있는 생성자 - 문자열 초기화
string copyAddress(address); //3 복사 생성자 - address를 복사생성
char text[] = {'L', 'o', 'v', 'e', ' ', 'C', '+', '+', '\0'};
string title(text); // 4 “Love C++" 문자열을 가진 title 생성
- 문자열 입력: cin>> name; getline(cin,name);
- 문자열 출력: cout<<name<<endl;
- 연산자 : =,+,<,>,==,!=, [] 등등
- 멤버 함수
- s1.length()/s1.size() : 길이
- s1.substr(1,2): 일부 자르기
- s1.find(s2): 검색
- s1.at[2], s1[2]: 가리키기
- s1.erase(2,2): 삭제
- stoi(year): 숫자변환
- s1.append(): 연결
- s1.compare(s2): 비교
정적 함수(Static)
- 프로그램이 시작할 때, 클래스 당 하나만 생성
- 생명주기(Life cycle): 프로그램이 시작될 때 생성, 프로그램이 종료되면 소멸
- 사용 범위: 선언된 범위, 접근 지정(public, private 등)에 따름
- 클래스의 모든 객체들이 공유함
- 객체의 멤버로 접근, 클래스명과 ::로 접근
- static 멤버 함수는 static 멤버 변수에 접근하고 static 멤버 함수를 호출할 수 있지만,non-static 멤버에는 접근할 수 없음
- this 사용 불가
- 추가로, non-static 멤버는 static/non-static 모두 접근이 가능하다.
함수 중복
- 다형성, 중복된 함수 이름 동일
- 매개변수 타입이 다르거나 개수가 다름
- 리턴 타입은 함수 중복과 무관
디폴트 매개변수
- 매개변수에 값이 넘어오지 않는 경우, 디폴트 값을 받도록 선언된 매개변수
- 디폴트 매개변수는 보통 매개변수의 앞에 선언될 수 없기 때문에 끝 쪽에 몰려 선언 (int a, int b, int c=0) 이런 식으로
우선은 여기서 마무리하고(니가뭔데)
2탄으로 돌아오도록 하겠습니다.
감사합니다.
'개발' 카테고리의 다른 글
[c++] - 템플릿을 이용한 가변인자 (0) | 2024.09.02 |
---|---|
[C++] C++ 정복 메모장2 (2) | 2023.12.09 |