Programming Language
[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 객체가 다른 ..
자바 예외 이해하기
자바 예외 이해하기
2022.09.03예외도 객체로 분류되기 때문에 다른 객체들과 마찬가지로 최상위 부모는 Object이다. Throwable은 Object바로 아래의 최상위 예외로, Exception과 Error를 자손으로 가진다. Error 메모리 부족이나 심각한 시스템 오류처럼 애플리케이션 레벨에서 복구 할 수 없는 시스템 예외이다. 에러가 발생하면 잡으려고 하지 말고 그냥 두자. 조상 에러를 catch로 잡으면 하위 예외도 함께 잡힌다. (던질 때도 마찬가지) 그러니 애플리케이션 로직에서 Error 예외를 잡지 않도록 하기 위해 Throwable 예외도 잡지 않도록 하자. 애플리케이션 로직은 Exception부터 필요한 예외로 생각하면 된다. Exception 애플리케이션에서 잡을 수 있는 실질적인 최상위 예외이다. Exception..
[C] 정리 (2)
[C] 정리 (2)
2022.06.14C에서 문자열을 다룰 때는 char타입의 배열을 사용하고, 배열의 마지막에는 문자열의 끝을 의미하는 \0 (널 문자)가 들어간다. 즉, char배열의 크기와 문자열의 길이는 다를 수 있다. 널 문자를 적절히 사용해 문자열을 효과적으로 다루자. - scanf를 사용해 문자열을 저장할 때 배열의 최대치를 넘어가는 경우를 방지하기 위해 "%48s"처럼 최대 몇 글자까지만 입력하라는 제한을 설정할 수 있다. - gets()와 puts()를 통해 문자열만을 입력받고 출력받을 수 있다, 줄 단위로 입력받고 줄 단위로 출력받을 수 있어 공백이나 탭을 문자열에 포함할 수 있다. gets 대신 fgets를 사용해 배열의 크기를 초과하지 않도록 설정할 수 있다. - 모든 배열은 1차원배열로 생각될 수 있고, 모든 요소가 ..
[C] typedef / Union
[C] typedef / Union
2022.05.26typedef typedef int INT; 위와 같이 작성하면 INT라는 이름의 타입을 새로 생성한다. 자바에서 클래스의 이름을 타입처럼 사용하듯, 여기서도 비슷한 맥락으로 생각하면 된다. 지난번에 배운 구조체를 정의할 때는 struct struct_name variable_name 이렇게 길게 선언해야 했는데, typedef로 미리 구조체를 어떻게 사용할 지 명시해 두면 좀 더 간결하게 사용할 수 있다. 위와 같이 활용한다. 원래 이름은 아예 생략해서 사용할 수도 있다. Union C말고 다른 언어에서는 거의 사용하지 않는 타입이다. 위의 그림을 살펴보자. Union 타입으로 정의하면, 멤버변수들이 같은 위치에서 시작하게 된다. 즉, mem1에 10을 넣고 mem2에 20을 넣으면 mem1에 10을 ..
[C] 구조체
[C] 구조체
2022.05.26자바에 클래스가 있다면, C에는 구조체가 있다. (struct) 물론 모든 부분이 같지는 않고, C의 구조체의 마지막에는 세미콜론을 붙여야 하고, C의 구조체의 멤버로는 메서드가 포함될 수 없는 등 다른 부분이 있다. 구조체의 메모리 모양, 선언, 접근 방법은 자바에서 배운 내용과 비슷하다. 이 부분에서 잠깐 "배열의 이름은 포인터다"를 떠올릴 수 있는데, 구조체의 이름도 구조체의 첫 번째 멤버의 주소라고 생각할 수 있다. (구조체에서 메모리는 연속적으로 구성되어있다.) 구조체를 선언하면서 동시에 그 구조체 타입의 변수도 선언할 수 있음을 기억해 두자. 따로 따로 선언하는 것과 같은 효과를 낸다. 선언과 초기화를 동시에 진행할 수도 있다. 위의 두 가지를 한 번에 사용할 수도 있다. #include #i..
[C] 동적 메모리
[C] 동적 메모리
2022.05.23메모리를 동적으로 할당받을 때 malloc외에도 realloc, xalloc, calloc 등 alloc의 가족들이 있다. 하나 하나 살펴보자. calloc calloc은 인자 전달 방식과 메모리를 0으로 초기화하는 부분 말고는 malloc과 동일하다. int *p = (int*)calloc(24, sizeof(int)); int *p = (int*)malloc(sizeof(int)* 24); 두 문장은 같은 역할을 한다. realloc int *p = (int*)malloc(3 * sizeof(int)); int *np = (int*)realloc(p, 5*sizeof(int)); realloc은 원래 사용하던 공간을 최대한 재활용하는 방향으로 메모리를 확보한다. 이전 포인터 p근처 공간이 넉넉하면 주..
[C] Stack / Heap
[C] Stack / Heap
2022.05.23스택 메모리에는 지역변수, 인자, 리턴 값 등이 있다고 배웠다. 스택 메모리에서는 변수의 선언 위치에 따라 생성/제거 시기가 정해지지만, 힙 메모리에서는 개발자 마음대로 쓰고 버릴 수 있다. 마치 전역변수처럼, 한 번 선언해두면 여러 함수에서 함께 사용할 수 있지만, 전역변수와는 달리 다 썼다 싶으면 제거할 수도 있다. 스택 / 힙 메모리 구조는 C뿐만 아니라 거의 모든 프로그래밍 언어에서 공통되는 요소이다. 자바를 예로 들면, A a = new A(); 코드를 실행하면, new 연산자가 힙 메모리에 공간을 확보한 후 동적 변수를 만든다. 그러고 나서, 동적 변수에 OID(Object Identifier)를 붙여주고 new연산자는 A의 생성자를 실행한 후 OID를 리턴한다. 오른쪽 그림에서 그래프 형태는..
[C] 배열 포인터 / 포인터 배열 정리
[C] 배열 포인터 / 포인터 배열 정리
2022.05.11배열 포인터는 다차원배열 / 포인터 배열은 일차원배열. 함수의 인자로 다차원배열을 전달해야 하는 경우가 있을텐데, 배열의 포인터를 적절히 사용하도록 하자. 앞에서 계속 확인한 바와 같이 이차원 배열을 포인터로 표현할 때도 연산은 비슷한 양상을 보인다.
[C] 배열의 포인터
[C] 배열의 포인터
2022.05.01지난번에 포인터의 배열을 포인터의 포인터로 바꿔서 표현할 수 있다는걸 배웠다. 그럼 이제 배열의 포인터에 대해 공부할 차례이다. 말 그대로 포인터 변수를 따라가면 배열이 나오는.. 그런 상황에서 배열의 포인터를 사용한다. 뒤에 [10]을 붙여서 주소를 통해 찾아간 값이 10의 크기를 가지는 char타입의 배열임을 명시해준다. 포인터의 배열과 배열의 포인터를 헷갈리지 말자. 괄호를 어떻게 붙이는가에 따라 두 가지가 갈린다. 예시를 통해 정리하자.
[C] 이중 포인터
[C] 이중 포인터
2022.05.01포인터 변수는 어떤 값의 주소를 담는 변수이다. 그러면 포인터 변수의 주소를 담는 값도 있지 않을까? 즉, 포인터의 포인터도 있지 않을까? 주소 1048로 찾아가면 double타입의 3.14가 있는데.. 주소 1072로 찾아가면 주소 1096이 있다. 주소는 혼자 사용하면 아무 의미가 없다. 의미가 생기려면 1096을 주소로 찾아갔을 때 얻을 수 있는 특정 값을 알 수 있어야 하지 않을까? 포인터의 포인터는 int ** d 처럼 타입과 * 두 개로 표현한다. 변수 d 는 * 타입. 즉, 주소 타입이고, 그 주소를 찾아가면 또 다시 주소가 나오고, 그 주소를 찾아가면 int값이 나온다.. 정도로 생각할 수 있다. 예제를 통해 확실하게 잡고 넘어가자. 포인터의 포인터가 존재함을 알았는데.. 그럼 포인터의 배..
[C] 다차원 배열 초기화
[C] 다차원 배열 초기화
2022.05.01정방형 배열의 형태를 지니게 하기 위해 남는 공간은 0으로 채워준다. 2차운 배열에서 row부분의 크기는 생략할 수 있다. (알아서 계산해준다.) 2차원 배열을 1차원 배열의 모음으로 해석할 수 있다. 1차원 배열에서 포인터를 사용해 배열을 다룬 것 처럼, 2차원 배열에서도 첫 번째 요소의 주소를 취할 수 있다. 문자열을 배열로 다룰 때 자주 사용된다. 3차원 배열도 크게 다른 부분은 없다. 지정할 때 높이 / row / column 순으로 지정함을 기억하자.