프로그래밍 언어 64

생성자를 통한 자동 형변환, 변환 함수

생성자를 통한 자동 형변환 생성자를 자동 데이터형 변환 함수로 동작하게 하는 것은 멋진 기능처럼 보이지만, 프로그래머들이 C++를 많이 경험하게 되면, 자동 데이터형 변환이 항상 바람직한 것은 아니라는 것을 알게 된다. 되려 예상치도 못한 부작용을 일으킬 수도 있다는 프로그래머들은 알게 될 경우도 있다. 그래서, 최신 C++ 시스템에는 자동 데이터형 변환을 못하게 하는 explicit라는 새로운 키워드가 추가되었다. explicit Stonewt (double lbs);// 암시적 데이터형 변환을 허용하지 않는다. 위 예제와 같이 생성자에 explicit 앞의 예와 같은 암시적 데이터형 변환을 못하게 막는다. 그러나 다음과 같은 명시적 데이터형 강제 변환은 여전히 허용한다. 즉 explicit 는 암시적..

분할 컴파일

헤더 파일과 cpp 파일을 구분해놓지 않으면 여러모로 번거로운 일이 생긴다. 예를 들어서, 두 개의 지원 함수를 하나의 별도의 파일에 넣었다고 가정한다면, 양쪽 파일에 있는 그 함수 모두 그 구조체 선언을 사용하기 때문이며, 일일이 번거롭게 그것들을 직접 타이핑하면 실수를 저지를 위험도 있을 뿐만 아니라, 변경할 일이 생기면 둘 다 변경해 주어야 한다. 쉽게 말해서, 하나의 프로그램을 여러 파일에 펼칠 때에는 새로운 문제가 발생한다. 그러므로 원본 프로그램을 다음 과 같이 세 부분으로 분할할 수 있다. 분할 기준은 다음과 같다. 구조체 선언과, 그 구조체를 사용하는 함수들의 원형이 들어 있는 헤더 파일 = .h 그 구조체에 관련된 함수들의 코드가 들어 있는 소스 코드 파일 = .cpp 그 구조체에 관련된..

L-Value R-Value

L-Value는 간단히 말하자면 식별 가능한(즉, 주소가 있는) 메모리에 위치한 객체이다. 1. 모든 구문에서 할당되었을 때, "L-Value"는 반드시 데이터를 저장할 수 있는 기능을 가져야 한다. 2. L-Value는 반드시 함수나, 식 ( a+b와 같은), 상수 ( 3, 4, 등등)가 될 수 없다. L - Value : L - Value는 객체를 식별하는 메모리 위치를 말한다. L - Value는 대입 연산자 (=) 의 오른쪽 또는 왼쪽에 나타낼 수 있다. +임시 변수 = R-Value C++는 실제 매개변수와 참조 매개변수가 일치하지 않을 때 임시 변수를 생성할 수 있다. 죄근의 C++는 매개변수가 const 참조일 경우에만 이것을 허용한다. 이것은 새로운 제약이다. C++가 어떤 경우에 임시 변..

vector 와 array

vector 는 동적 배열 구조로 구성 요소가 생성되고 삭제되면서, 스스로 크기를 자동적으로 조절한다. 이는 우리가 동적 배열을 하게되면 new와 delete를 사용하지만, 실제로 vector 클래스는 메모리를 관리하기 위해서 그 과정을 자동적으로 진행한다. 백터의 인덱스는 연속된 스토리지 배치되어 백터 데이터는 끝에 삽입된다. 배열을 확장해야 하는 경우는 위치에 따라 시간이 달리 걸린다. 마지막 인덱스를 제거하는 것은 크기 조정이 수행되지 않으므로 바로 제거가 가능하여, 일정 시간만 소요된다. 인덱스를 시작 부분이나 중간 부분에 끼워 넣거나 제거할 때는 시간이 더욱 걸린다. 1) vector container 란? vector 컨테이너는 자동으로 메모리가 할당되는 배열. 이라고 생각하면 될거같습니다. ..

Generic & Function Overload

제네릭 프로그래밍 제네릭 프로그래밍의 사전적 정의 제네릭 프로그래밍은 데이터 타입에 의존하지 않고, (다양한 데이터형을 받을 수 있다는 말은 즉, = 다향성(polymorphism)을 뜻한다. 그 프로그래밍 언어의 자료형 체계의 성질을 나타내는 것으로, 프로그램 언어의 각 요소 (상수, 변수, 식, 오브젝트, 함수, 메소드 등) 들이 다양한 자료형(type)에 속하는 것이 허가되는 성질을 가리킨다. 반댓말은 단항성(monomorphism)으로, 프로그램 언어의 각 요소가 한가지 형태만 가지는 성질을 가리킨다.) 하나의 값이 여러 다른 데이터 타입들을 가질 수 있는 기술에 중점을 두어 재사용성을 높일 수 있는 프로그래밍 방식이다. 제네릭 프로그래밍은 여러 가지 유용한 소프트웨어 컴포넌트들을 체계적으로 융합..

클래스

추상화( = Abstraction ) 데이터 추상화란 가장 본질적이고 중요한 OOP(= 객체지향프로그램) C++ 언어의 특색 중 하나이다. 추상화란 의미는 나타낸다 오롯이 중요한 정보는 표시하고, 세부 사항은 숨기는 것을 의미한다. 데이터 추상화를 예를 들면 사람이 차를 운전하는 실제 사례를 예시로 들어보겠다. 사람이 엑셀레이터를 밟으면 차의 속도가 빨라지거나 브레이크를 밟으면 차가 멈춘다는 것만 알고 있을 뿐, 실제로 액셀러레이터를 밟으면 어떻게 속도가 빨라지는지, 차의 내부 메커니즘이나 차의 엑설레이터, 브레이크 등의 구현에 대해서는 알지 못한다. 이것이 바로 추상화이다. 1. Data Abstraction 데이터 추상화 이 타입은, 오직 필수적인 정보에 대해서만 보여주고 불필요한 정보는 숨긴다. 2..

20230130 그간 배운 변수와 함수 상수 등 정리

1-1) 지역 변수(=Local Variable) 란? 지역 변수의 정의는, 초기값이 변수에 설정되고 함수나 메서드 또는 블록에서 사용되는 것이다. 이 변수는 오직 함수나 메서드 혹은 다른 블록으로 넘어 갈때, 즉, 지역 변수가 살아있던 블록이나 메서드 혹은 함수가 아닌 다음 블록이나 메서드 함수에서는 자연적으로 파괴되어야만 유의미한 변수이다. 지역 변수가 해당된 함수, 메서드, 블록말고 다른 외부에서 참조되는 경우 프로그램은 오류를 반환한다. 전역 변수와 지역 변수는 같은 이름을 사용할 수 있으나, 혹은 같은 지역변수라 하더라도 더 영역이 넓은 블록에 있는 같은 이름의 지역 변수와 그 영역 내에 더 좁은 영역의 블록의 지역 변수가 같을 수 있다. 하지만 이들을 구별하는 것은 변수가 작동하는 경계 범위에..

C++ 생성자 (constructor)와 소멸자 (destructor)

생성자는 그 클래스의 객체가 생성될 때 복사 생성자 역할 - 디폴트 복사 생성자는 static 멤버를 제외한 멤버들을 멤버별로 복사한다. 각 멤버는 값으로 복사된다. - 멤버별 복사 또는 얕은 복사라고 부른다. - 클래스가, 새로운 객체가 생성될 때마다 값이 변하는 static 데이터 멤버를 가지고 있다면, 그 상황을 처리하는 명시적 복사 생성자를 제공해야한다. - 프로그램이 복사 생성자를(명시적or암시적) 사용하지 않으면, 컴파일러는 함수 정의가 아니라 원형만 제공한다. 복사 생성자 사용 하는 곳 - 새 객체를 동일한 클래스이 다른 객체로 초기화할 때 - 객체가 함수에 값으로 전달될 때 - 함수가 객체를 값으로 리턴할 때 - 컴파일러가 임시 객체를 생성할 때 디폴트 생성자 - 인수를 취하지 않는 생성자..

사용자 정의 타입 (user-define data type)

C++에서는 기본타입 (int, double etc), const 제한자, 선언 연산으로 생성할 수 있는 내장 타입과 추상화 메커니즘을 바탕으로 만들어진 사용자 정의 타입 2가지로 나뉜다. 내장 타입 같은 경우에는 로우 레벨에 가깝게 설계돼였으며, 전통적으로 하드웨어의 능력을 직접적이고 효율적으로 사용한다. 반면에 프로그래머로 하여금 진보된 어플리케이션을 쉽게 작성하게 해주는 하이 레벨 기능을 제공하지 않는다. 사용자 정의 타입과 같은 경우에는 프로그래머가 스스로 적절한 표현방식과 연산을 갖춘 타입을 설계하고 구현하며, 간단하고 편리하게 사용할 수 있게 해준다. 사용자 정의 타입의 대표적인 예로 "클래스"와 "열거형"을 들 수 있다. 구조체 새로운 타입을 만드는 첫 단계에 필요한 구성 요소를 데이터 구조..