객체지향 및 cpp 강의 필기
https://lagifun-inforecord.tistory.com/106
위의 링크에 해당하는 강의를 수강하면서 기록한 필기
1.
객체 - 실물을 객체라고도, 인스턴스를 객체라고도 함
클래스 - 객체를 추상화
인스턴스 - 클래스를 프로그램에서 선언. 메모리에 할당된 상태
클래스 맴버
- 맴버 함수 : 메소드 라고도 함
- 맴버 변수 : 필드 라고도 함
2.
변수 종류, 위치에 따라
1) 클래스 내
- 인스턴스 변수, 일반 변수
- 클래스 변수: 인스턴스 변수에 static을 붙임. 모든 인스턴스 객체에서 공유되는 변수(메모리가 공유된다)
클래스 밖에서 초기화과정이 필요하다
2) 클래스 매소드 혹은 클래스 밖 일반함수내
- 지역변수
- 정적 변수, 함수종료 시에도 남아있다
3) 클래스 밖
- 전역변수
- 정적변수
3.
맴버 초기화
- 클래스 정의 시 초기화가 불가능 하여 클래스가 생성되는 순간에 초기화 리스트를 사용하여 초기화를 수행해야하는 맴버
: 참조형 맴버, 상수맴버
- 초기화 리스트란 클래스 생성사 옆에 ':'를 사용하여 정의한다
ex) car() : speed(10) {} ;
1) 상수 맴버 초기화
- const int a = 10; -> 컴파일 오류(변수가 생성되기 전 정의)
- const int a; a = 10; -> 컴파일 오류(상수 선언이후 값 변경 불가)
- const int a; 클래스생성자():a(10){} -> 가능
2) 참조형 맴버 초기화
- string &a; 클래스 생성자(string input):a(input){}
3) 객체 맴버 초기화
- int x, y; 클래스생성자(int a, int b):x(a), y(b){}
4.
const를 사용한 함수선언 방식 3가지
- 반환형, 매개변수, 함수뒤(ex: void func() const {} )
- https://dhdnjswo5000.tistory.com/m/5
5.
함수 중복(overloading) vs 함수 재정의(overriding)
- 함수 중복
같은 이름의 함수를 여러개 정의하는 것
같은 이름의 함수에서 매개변수, 반환자료형이 다르게 정의하는 것
- 함수 재정의
부모 클래스의 함수를 사용속받아 자식클래스에서 함수를 제정의 하는것
반환 자료형 및 매개변수의 개수, 자료형이 동일하다
6.
연산자 중복(overloading)
- cpp에서 기존에 존재하는 연산자를 기반으로 연산자 함수를 중복 정의한다
- 해당 연산자를 기반으로 한 새로운 타입의(보통 객체) 연산을 위해 연산자 중복을 사용한다
- 연산자 중복이 불가능한 연산자가 있다. ex) *, ::, ? 등
7.
변환 생성자
- 생성자에서 초기값을 입력받아 객체의 맴버변수를 초기화하는 것
- 버그의 원인이 될 수 있다.(int a = 3.14; 처럼)
- 생성자 앞에 explict 키워드를 붙이면 컴파일러가 컴파일시 자동형변환을 제한한다(막는다)
변환 연산자
- 형변환 연산자를 '연산자 중복'하여 특정 자료형에 객체를 대입 연산하는 것
ex)
book class 안에서,
operator int() const { return a;}
main() 안에서,
void main() { book b1; int target = b1; }
8.
연산자 결합방향(연산자 연산방향)
- 참조링크 : https://studymake.tistory.com/201
9.
상속은 is-a관계이다 ex) 자동자는 탈것이다(car is a vehicle, vehicle : 부모, car : 자식)
10. 상속의 접근 지정자
- 아래의 링크 2개가 제일 깔끔하게 표로 정리되었다고 생각한다
- 참조링크 1: https://jerryjerryjerry.tistory.com/10
- 참조링크 2: https://computer-science-student.tistory.com/52
11.
객체 간의 형변환
1) 상향 형변환(upcasting)
- 자식클래스 타입을 부모클래스 타입으로 변환
ex) 부모 *a = new 자식();
2) 하향 형변환(downcasting)
- 부모클래스 타입을 자식 클래스 타입으로 변환
ex) 자식 *b = new 부모();
* 보통 상향 형변환이 수행되면, 해당 객체는 부모의 맴버에만 접근이 가능하다.
* 상향 형변환된 부모 객체가 자식 클래스의 맴버에 접근하기
((자식 *)a) -> 자식의맴버함수(); -> 하향 형변환이 수행된다
* 참조자를 이용한 형변환
자식 b;
부모 &a = b; -> 상향 형변환 수행
((자식 &)a).자식의맴버함수(); -> 하향 형변환이 수행
* 함수 호출 시에서도 형변환 규칙이 그대로 적용된다. 따라서 함수의 매개변수에 객체입력 시, 자식보다는 부모 클래스 탑으로 선언하는 것이 좋다.
ex)
void 함수(부모 &s, int x, int y)
{
s.부모함수(x, y);
}
int main()
{
자식 a;
함수(a, 0, 0);
}
12.
출력 스트림의 출력형식
- 참조링크 : https://cplusplus.com/reference/ios/
- 몇 개만 정리한다면..
1) fixed : 고정 소수점 표기법 사용
2) dec : 10진법 출력
3) oct : 8진법 출력
4) hex : 16진법 출력
5) uppercase : 대문자 표기
13.
가상함수
- 부모 클래스에서 상속받을 클래스에서 재정의할 것으로 기대하고 정의해놓은 함수
- 예) virtual void func();
- 참조링크 : https://coding-factory.tistory.com/699
추상 클래스
- 하나 이상의 순수 가상 함수가 있는 클래스
- 순수 가상함수 : virtual void func() = 0;
- 참조링크 : https://velog.io/@hyongti/C%EC%B6%94%EC%83%81%ED%81%B4%EB%9E%98%EC%8A%A4-vs.-%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4-%ED%81%B4%EB%9E%98%EC%8A%A4
인터페이스 클래스
- cpp에서는 interface 클래스라는 키워드가 없다.(개념이 없다고 보아도 좋을 듯. java와의 차이점)
- 따라서 인터페이스라는 개념을 구현하기 위해 순수 가상함수를 사용한다.
- 단, 인터페이스 클래스(부모)에 가상소멸자를 사용해야 정상적으로 소멸이 된다.
- 참조링크1 : https://hwan-shell.tistory.com/223
- 참조링크2 : https://bloodstrawberry.tistory.com/515
14.
정적바인딩 vs 동적 바인딩
- 정적 바인딩 : 컴파일 단계에서 바인딩이 완료되는 것.
- 동적 바인딩 : 함수 호출시에 실제 호출되는 함수가 결정되는 것(지연바인딩(late binding)라고도 한다)
- 참조링크 : https://www.techiedelight.com/ko/difference-between-static-dynamic-binding-cpp/
15. string 클래스 맴버함수
- https://cplusplus.com/reference/string/string/
'Study > 프로그래밍_언어' 카테고리의 다른 글
cpp와 java의 차이 (0) | 2023.03.03 |
---|---|
cpp - 후기 (0) | 2022.10.07 |
시작 (0) | 2020.07.22 |
C언어 보충6 - 18, 19장, 추가사항 (0) | 2018.02.03 |
C언어 보충5 - 16, 17장 (0) | 2018.02.03 |