C & C++/C++ 개인 공부
[C++] 1일차 수업 정리 .1
Bueong_E
2023. 3. 9. 15:21
반응형
SMALL
1. C++ 프로그래밍 개요
- CPP 확장자로 저장
- 빈프로젝트로 비주얼스튜디오에서 시작
- C와 동일하게 소스파일에서 CPP 확장자 파일을 추가하여 사용
- iostream :표준 입출력 관련 라이브러리 (기본 API)
- #include<라이브러리명> 으로 라이브러리 사용
- main함수 사용은 C#과 동일
- cout 함수 : 표준 출력 함수
- << 사용하여 함수로 보낸다
- 세미콜론 (;)을 코드 줄마다 해주는 것도 동일
- std :: 를 이용하여 네임 스페이스 지정해주어야함'
2. 클래스와 객체
- 캡슐화란? 객체의 요소들을 보호하고 내부를 볼수 없게 하는 것이고 이것은 객체의 본질적인 특징이다.
- 목적은 객체 내 데이터에 대한 보안,보호,외부 접근을 제한하는 것이다. (객체 지향 언어의 특성)
- 외부의 인터페이스(정보 교환 및 통신)을 위해 객체의 일부분만을 공개
- 객체는 상태(state)와 행동(Behavior) 으로 구성
- 클래스란?
- 객체를 만들어내기 위해 정의된 설계도, 틀
- 클래스는 객체가 아니며 실체도 아님
- 멤버변수와 멤버 함수가 선언됨
- 객체(Object)란?
- 객체는 생성될떄 클래스의 모양을 그대로 가지고 탄생
- 멤버 변수와 멤버 함수로 구성
- 멤모리에 생성, 실체(instance) 라고도 부름
- 하나의 클래스 틀에서 찍어낸 여러개의객체 생성이 가능하고
- 각각의 객체는 별도의 메모리를 점유한다.
- 클래스 선언부란?
- class 키워드를 이용하여 선언
- 멤버 변수 멤버 함수 선언
- 멤버에 대한 접근 지정
- 객체 멤버 접근은 (.) 접근자 사용 (C#과 동일)
- 생성자
- 생성자를 구현을 해주면 해당 생성자는 인스턴스가 생성될때 자동으로 초기화됨
- 객체가 생성되는 시점에서 자동으로 호출되는 멤버 함수임
- 클래스 이름과 동일한 멤버 함수임
- 객체가 생성될때 객체가 필요한 초기화를 위해 존재함
- 이름은 반드시 클래스 이름과 동일해야함
- 리턴 타입을 선언하지 않음(void도 안됨)
- 객체 생성시 오직 한 번만 호출됨
- 중복 가능하며 선언되어있지 않으면 기본 생성자를 자동으로 생성
- 소멸자
- 소멸자는 생성자와 반대되는 개념
- 클래스 이름에 (~) 기호를 넣어 사용함
- 객체가 소멸되는 시점에서 자동으로 호출되는 멤버함수
- 오직 한번만 자동호출 임의로 호출 불가
- 객체 메모리 소멸 직전에 호출됨
- 객체가 사라질 때 마무리 작업을 위함
- 리턴타입 필요없음(void 도 안되는 건 생성자와 동일)
- 중복이 불가능하며 매개변수를 가지지 않음
- 선언되어 있지 않으면 기본 소멸자를 자동으로 생성되는 것도 동일
- 객체가 선언된 위치에 따른 분류
- 지역객체 (함수 내에 선언된 객체) - 함수가 호출되는 순간에 순서대로 생성
- 전역객체 (함수의 바깥에 선언된 객체) - 프로그램에 선언된 순서로 생성
- 소멸시에는 역순으로 소멸됨
- 함수 종료 - 역 객체가 생성된 순서의 역순으로 소멸
- 프로그램 종료 - 전역 객체가 생성된 순서의 역순으로 소멸
- new 를 이용하여 동적으로 생성된 객체
- new를 실행하는 순간 객체 생성
- delete 연산자를 실행할때 객체 소멸
- 캡슐화의 목적 (중요) - 객체 지향적인 언어를 사용할때는 가장 중요한 부분
- 객체 보호 , 보안
- C++에서 객체의 캡슐화 전략
- 객체의 상태를 나타내는 데이터 멤버(멤버변수) 에 대한 보호
- 중요한 멤버는 다른 클래스나 객체에서 접근할 수 없도록 보호
- 외부와의 인터페이스를 위해서 일부 멤버는 외부에 접근 허용
- 멤버에 대한 3가지 접근 지정자
- private - 동일한 클래스의 맴버 함수에만 제한함
- public - 모든 클래스에 허용
- protected - 클래스 자신과 상속받은 자식 클래스에만 허용
- 클래스 멤버 변수의 지정자
- private 지정이 바람직
- default는 private 인것도 C#과 동일
- 인란인 함수 (inline으로 선언된 함수)
- 인란인 함수에 대한 처리
- 인라인 함수를 호출하는 곳에 인라인 함수 코드를 확장 삽입
- 매크로와 유사
- 코드 확장 후 인라인 함수는 사라짐
- 인라인 함수 호출
- 함수 호출에 따른 오버헤드 존재하지 않음 (그만큼 처리 속도 향상)
- 프로그램의 실행 속도 개선
- 컴파일러에 의해 이루어짐
- 짧은 함수라면 인라인 함수 사용을 권장
- 인라인 함수를 호출하는 곳에 인라인 함수 코드를 확장 삽입
- 인라인 함수의 목적
- C++ 프로그램의 실행 속도 향상이 주목적
- 자주 호출되는 짧은 코드의 함수 호출에 대한 시간 소모를 줄임
- C++에는 짧은 코드의 멤버 함수가 많기 때문
- 인라인 함수 장점
- 프로그램 실행시간이 짧아짐
- 인라인 함수의 단점
- 인라인 함수 코드의 삽입으로 컴파일된 전체 코드 크기 증가
- 통계적으로 30% 정도 증가
- 짧은 코드의 함수를 인라인으로 선언하는 것이 좋음
- 인라인 함수 코드의 삽입으로 컴파일된 전체 코드 크기 증가
- 인라인 함수의 제약사항
- 인라인은 컴파일러에게 주는 요구 메시지
- 컴파일러가 판단하여 인라인 요구를 수행할지 결정
- recursion, 긴 함수, static 변수, 반복문, switch문,goto문 등을 가진 함수는 수용하지 않음 ( 중요 )
- 바람직한 C++ 코드 작성 예시
- 객체에 대한 포인터
- C언어의 포인터와 동일
- 객체의 주소값을 가지는 변수
- Circle *p 이러면 p변수는 Circle 클래스의 주소값을 가리킴
- -> 를 이용하여 멤버에 접근
- C++에서도 객체배열 사용 가능 (다차원 배열도 가능)
- 정적 할당
- 변수 선언을 통해 필요한 메모리 할당
- 많은 양의 메모리는 배열 선언을 통해 할당
- 변수 선언을 통해 필요한 메모리 할당
- 동적할당
- 필요한 양이 예측되지 않는 경우 프로그램 작성시 할당 받을수 없음
- 실행 중에 힙 메모리에서 할당
- C 언어의 동적 메모리 할당
- malloc() / free() 라이브러리 함수 사용
- new 연산자
- 기본 타입의 메모리 할당, 배열 할당, 객체 할당, 객체 배열 할당
- 객체의 동적 생성
- 힙 메모리로부터 객체를 위한 메모리 할당 요청
- 객체 할당 시 생성자 호출
- delete 연산자
- new로 할당 받은 메모리 반환
- 객체의 동적 소멸
- 소멸자 호출 뒤 객체를 힙에 반환
- 각 연산자 사용방법
- 데이터 타입 *포인터변수 = new 데이터 타입;
delete 포인터 변수;
- 데이터 타입 *포인터변수 = new 데이터 타입;
- 동적할당 메모리 초기화 및 delete 사용시 주의사항
- 배열은 동적할당시 초기화 불가능함
- 배열 delete 시에는 [] 를 넣어 배열임을 지정해주어야함
- 동적 메모리 할당과 메모리 누수
- this 포인터
- 컴파일러가 선언한 변수
- 멤버 함수에 컴파일러에 의해 묵시적으로 삽입 및 선언됨
- C#과 동일하게 좀더 확실하게 명시하기 위해 사용함
- 매개변수의 이름과 멤버 변수의 이름이 같은 경우 사용하면 좋음 (C#과 동일)
- 맴버 함수가 객체 자신의 주소를 리턴할때 쓰임 (C#과 동일)
- 제약사항
- 멤버 함수가 아닌 함수에서는 사용불가
- static 멤버 함수에서 this 사용 불가 (C#과 동일) - 객체가 생성되기 전에 static 함수 호출이 있을수 있기 때문
- 컴파일러가 선언한 변수
- C++의 문자열
- C string
- C++ string 클래스의 객체
- string 클래스
- 라이브러리 선언 해주어야함
- 가변크기 문자열로 사용 (C#과 동일)
- string.append("추가할 문자열") 등의 가변 문자열 사용 예시
- 당야한 문자열 연산을 실행하는 연산자와 멤버 함수 포함
- 문자열복사,비교,길이
- 문자열,스트링,문자열객체,스트링 객체등으로 혼용
- 문자열 입력 cin 과 >> 연산자 사용
- 문자열출력 cout과 << 연산자 사
- 문자열 숫자변환은 stoi 함수사용
반응형
LIST