Programming Language/C++
[C++] 예외처리
[C++] 예외처리
2022.12.18C++ 에서 를 include하면 특정 데이터 타입이 표현할 수 있는 최대 / 최소 범위를 구할 수 있다. int 나 long 타입으로 변수를 지정하고, 해당 데이터 타입이 표현할 수 있는 수를 넘어선 수를 저장하면 어떻게 될까? 코드를 실행하는 환경에 따라 다르지만, 이 경우는 undefined behavior이다. (언어에 정의 돼 있지 않다) unsigned의 경우는 좀 다르다. undefined behavior가 아니다. unsigned의 경우 표현할 수 있는 수를 넘어선 수는 wrap around로 처리된다. unsigned 데이터 타입을 다루지 않는 경우 항상 undefined behavior에 의존해서 프로그램을 작성할 수 없으니 오버플로우나 언더플로우가 발생할 수 있는 연산은 연산 전에 체..
[C++] Template
[C++] Template
2022.12.17C++은 Template을 통해 Generic Programming을 지원한다. (Compile time Polymorphism) (제네릭 프로그래밍은 데이터 형식에 의존하지 않고, 하나의 값이 여러 다른 데이터 타입들을 가질 수 있는 기술에 중점을 두어 재사용성을 높일 수 있는 프로그래밍 방식 - 위키백과) C++에서 Template은 class 와 function으로 나뉜다. 1. Class Template 클래스들이 여러 개 있는데 자료형만 다른 경우 template을 적용해 간단하게 표현할 수 있다. (template 선언 시 넘겨주는 type-parameter-key 값인 typename과 class는 같은 역할을 한다) 컴파일러는 Pair 와 Pair을 보고 template을 참고해 해당하는 ..
[C++] STL
[C++] STL
2022.12.15Standard Template Library. C++에 이미 정의돼있는 라이브러리를 의미한다. STL에는 데이터를 저장하는 객체인 Container / 여러 가지 편리한 메서드를 제공하는 Algorithm과 Functions / Container의 객체를 가리키는 Iterator 로 총 4가지 종류가 있다. 이 중 Container에 대해 살펴보자. 1. Array int arr[10]; 에서 사용하는 C-style 배열과는 다르다. 왼쪽과 같이 Random Access 방식으로 요소에 접근 할 때는 오류를 뱉지 않지만, 오른쪽과 같이 array STL을 사용해서 요소에 접근 시 오류를 뱉는다. 런타임 시간에 invalid index를 체크해준다. 2. vector vector 컨테이너 내부 요소들은 ..
[C++] Design Pattern
[C++] Design Pattern
2022.11.24클래스와 객체의 관계를 어떻게 구성해야 할까? 이런 상황에서 클래스는 어떻게 구성해야 할까? 위와 같이 자주 발생하는 문제에 대한 정리된 해결책을 디자인 패턴이라고 한다. 디자인 패턴은 문제 해결의 방법론이고, Paradigm에 맞춰서 정의된다. (함수형 언어의 paradigm, 객체지향 언어의 paradigm) 몇 가지 디자인 패턴에 대해 알아보자. Singleton 클래스가 하나의 인스턴스만을 가지도록 한다. 클래스의 생성자를 private 접근제어자로 정의하고, instance를 static 으로 정의해 어디서든지 해당 instance로 접근할 수 있되, 인스턴스의 생성은 단 한 번만 진행되도록 한다. Builder 복잡한 객체를 한 단계씩 생성한다. 생성해야 하는 객체가 복잡해지면 생성자로 넘겨야..
[C++] 정리 (1)
[C++] 정리 (1)
2022.11.231. cast / dispatch Dynamic cast / Dynamic dispatch Static cast / Static dispatch 제대로 정리하자. cast 는 형변환이고 dispatch는 함수 호출이다. static은 컴파일 시간이고 dynamic은 런타임 시간이다. 위의 부분을 제대로 짚고 다시 공부하자. 2. 함수, 메서드, 프로시저 셋 다 프로그램의 일부비슷한 의미라서.. 혼용해서 사용해도 괜찮다. 맥락에 따라 다르게 사용하기도 한다. 클래스 안에 있으면 메서드, 호출하는건 함수로 부른다. 함수와 프로시저는 같이 사용하는 편이다. (https://murphymoon.tistory.com/entry/%ED%94%84%EB%A1%9C%EC%8B%9C%EC%A0%80procedure-%E..
[C++] OOP (5) Dynamic dispatch / Multiple Inheritance
[C++] OOP (5) Dynamic dispatch / Multiple Inheritance
2022.11.22객체지향 언어에는 같은 signature를 가진 함수를 여러 개 정의할 수 있다. (signature 가 다르면 다른 함수이다) 이를 function overloading 이라고 부르고, 여러 함수 중 어떤 함수가 호출될지는 컴파일 시간에 정해진다. 여기까지는 지난번에 배웠고.. 이번에 살펴볼 function overriding 은 부모에서 정의된 함수를 자식이 새로 정의하는 작업이다. 함수를 사용할 때 어떤 함수가 불리는지는 런타임 시간에 정해진다. 즉, Dynamic dispatch를 사용한다. 런타임 시간에 불리는 함수가 결정되는 경우를 Dynamic dispatch 라고 부른다. 런타임 오버헤드가 있어 성능은 떨어질 수 있지만 코드를 훨씬 효과적으로 작성할 수 있어 상황에 맞춰서 사용한다. C++..
[C++] OOP (4) Type Casting
[C++] OOP (4) Type Casting
2022.10.19부모 타입의 포인터가 자식 타입의 객체를 가리키도록 해서 UpCasting을 구현할 수 있는데.. 자식 객체는 부모 객체보다 더 많은 정보를 가지고 있기 때문에 부모 타입의 포인터로 자식 타입만 가지고 있는 정보에 접근하는건 불가능하다. 부모 타입인 Car에는 money 메서드가 없지만, 자식 타입인 Bus에는 money 메서드가 있다. 따라서 Car* 타입으로는 자식 타입인 Bus의 정보에 접근 할 수 없다. foo 내부 함수를 바꿔보자. void foo(Car* car) { Bus* bus = static_cast(car); bus->money(); } Car* 타입을 Bus* 타입으로 바꿨다. (DownCasting) DownCasting은 위험할 수 있다. 위에서 언급했듯 부모보다 자식에 정보가 ..
[C++] OOP (3) Inheritance / 연산자 오버로딩
[C++] OOP (3) Inheritance / 연산자 오버로딩
2022.10.12C++ 은 Operation Overloading. 연산자 오버로딩을 지원한다. 출력과 입력 시 시프트 연산자와 함께 사용하는 cin과 cout도 연산자 오버로딩의 예시이다. 함수 오버로딩은 같은 이름의 함수를 정의하고 그 중 하나를 사용하는걸 말한다. 연산자 오버로딩도 본질은 다르지 않다. 연산자를 여러 개 정의하고 그 중 하나를 선택할 때 사용한다. 오버로딩이 불가능한 연산자도 있으니, 주의해서 사용하자. 연산자 오버로딩은 두 가지로 분류해서 사용한다. 1. 클래스 내부에서 연산자 오버로딩을 정의한다. 클래스 내부에서 정의할 경우 *this 가 사용된다. 즉, 오버로딩된 연산자의 선언부에서 첫 번째 인자는 user-defined type의 객체가 들어온다. this의 특성으로 해당 객체의 privat..
[C++] C++과 Java
[C++] C++과 Java
2022.10.05같은 객체지향언어이고 문법도 비슷하지만, 언어를 깊게 이해하기 위해서는 두 언어의 차이점을 알아야 한다. 우선 C++이 자바보다 먼저 나왔고, 자바는 C++의 뒤를 잇는 완전한 객체지향을 지향하는 언어이다. 즉, C++은 자바만큼 객체지향을 완벽하게 지원하지는 않는다고 생각할 수 있다. 객체의 생성자를 정의할 때 C++은 initialization list와 몸통부 사용할 수 있지만 자바에서는 initialization list를 지원하지 않는다. 원래 C++은 initialization list를 사용해 변수를 초기화하고 생성자의 몸통부를 통해 별도의 작업을 수행하라는 의도로 이렇게 설계됐지만, 자바를 설계할 때는 두 가지 작업을 한 번에 처리하는게 합리적이라고 판단해 initialization lis..
[C++] Memory Allocation / static
[C++] Memory Allocation / static
2022.10.05C와 비슷한 양상을 보인다. 스택 메모리, 힙 메모리, static 메모리로 구분된다. 메모리는 선형으로 구성돼있고 컴파일러의 판단으로 특정 부분은 스택 메모리로 사용되고 또 어떤 부분은 힙 메모리, static 메모리로 정하고 사용한다. 스택 메모리의 제일 처음에는 메인 메서드가 올라간다. 이후 메인 메서드가 함수를 호출함에 따라 메인 메서드 위로 여러 메서드들이 쌓이게 되고, 각각의 메서드들이 종료될 때 마다 스택 메모리에 선언됐던 정보들이 날아가고 메인 메서드가 종료되면 프로그램이 종료된다. (스택에 올라간 메서드에서 if - else / for / while 문법을 사용하면 또 다시 스택을 만들어진 후 해당 지역변수들이 올라가고, 문장이 마무리되면 스택에서 pop 된다.) C에서의 malloc 혹..
[C++] OOP (2) 함수 오버로딩 / 함수 호출
[C++] OOP (2) 함수 오버로딩 / 함수 호출
2022.09.28C++의 메모리 모델은 C와 동일하다. 간단하게 관련 문법을 살펴보자. RHS : Right Hand Side expression LHS : Left Hand Side expression &x : RHS에서 x의 주소를 반환한다. (x값이 저장된 메모리 주소를 반환한다) &x : LHS에서는 Reference Type을 의미한다. *x : RHS에서 x가 가리키는 주소의 값을 반환한다. (x값으로 메모리 주소를 가진다. x값이 가리키는 주소에 할당된 값을 반환한다) *x : LHS에서 RHS의 값을 x가 가리키는 주소에 값으로 할당한다. (x값으로 메모리 주소를 가진다. x값이 가리키는 주소에 RHS 값을 할당한다) Const 기본 개념은 이쪽을 참고하자. (https://13months.tistory...
[C++] OOP (1) 개념 / namespace
[C++] OOP (1) 개념 / namespace
2022.09.14C++은 C에 객체지향 개념이 추가된 언어로 이해하면 편하다. 문법과 메모리 관리 등 여러 부분이 C와 유사하지만, char 리터럴의 바이트 크기와 같이 다른 부분이 있어 아예 동일하지는 않다. Class & Object 클래스는 설계도이고, Object는 설계도를 통해 만든 결과물이다. Abstraction 사용자가 객체의 구체적인 구현을 몰라도 기능을 사용할 수 있도록 한다. 메서드를 호출하면 메서드가 실행돼 실행 결과를 얻지만, 사용자는 메서드가 어떻게 구현됐는지 몰라도 된다. Encapsulation 객체 내부의 상태를 검증되지 않은 접근으로부터 보호한다. 즉, 사용자가 객체 내부 상태에 직접 접근하는걸 방지하고 메서드를 통해 접근하는 등 접근 방법을 제한한다. Inheritance 객체가 다른 ..