본문 바로가기
개발

[C++] C++ 정복 메모장

by 수인분당선 2023. 12. 8.
반응형

이번 학기에 C++을 수강하게 되었는데요,,
생각했던 것보다 훨씬 더 복잡하고 어렵더라고요
그래서 간단하게 C++정복기로다가 시험공부를 할 예정입니다..
정보 제공용이라기보다는,, 제 공부용이랄까요
그래서 내용이 일관적이지 못하기도 하고, 정돈되지 못한 모습입니다. 제 말로 제가 이해할 수 있게끔만 쓰다 보니까요.
혹시라도 참고하실 분들이 계신다면 이 점 감안하고 정말 참고용으로만!! 간단하게 봐주셨음 좋겠습니다.

궁금한 부분이 있으시면 댓글 달아주시면 답변 드리도록 하겠습니다!!


객체 지향 언어

객체/클래스

클래스(Class) - 객체를 만드는 틀/붕어빵틀!
객체(Object) - 클래스라는 틀에서 생겨난 실체(instance)/붕어빵!

  • 객체 = 변수+함수로 구성
  • 객체들은 별도의 공간에 생성됨.
  • 하나의 클래스 틀에서 여러 개의 객체 생성가능
  • 변수 = 데이터 = 속성(Attribute) = 특성 = property
  • 함수 = 메소드 = 행위(Behavior) = 기능

객체 지향 특성

  1. 추상화
    : 객체들의 공통적인 속성과 기능을 추출
  2. 캡슐화
    : 데이터(변수)와 메소드(함수)를 하나로 묶음
    원칙!: 데이터 구현을 숨기고(직접접근불가) public 함수를 통해서만 접근
  3. 상속성
    : 자식 클래스가 부모 클래스의 변수(특성)과 함수(기능)을 물려 받음
  4. 다형성
    : 하나의 기능이 경우에 따라 다르게 작동
  • 오버로딩(중복정의)
  • 오버라이딩(재정의)

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