1번.

new 연산자는 생성과 동시생성자를 호출한다. (생성자: 객체의 초기화를 담당)


그래서 malloc()을 이용한 동적할당은 따로 초기화 과정을 추가해야하지만, new는 그런 과정이 없다.

malloc()을 이용하여 동적할당을 할 경우 초기화는 memset() 함수를 쓰면 편하다.

만약 calloc()을 사용하면 할당과 동시에 메모리 초기화가 가능하다. 


2번.

malloc()함수이고, new 키워드는 연산자이다.


그러므로 malloc()은 별도의 헤더파일 추가가 필요하지만 new는 필요하지 않다.



*그럼 언제 malloc()이 유용할까?

객체와 관련된 작업이 아닐 경우, 그리고 할당과 해제가 반복되는 작업을 할 경우이다.

malloc()은 realloc()이라는 짝꿍이 존재한다.

new 연산자로 기존의 데이터를 유지하면서 새로운 할당이 필요할 경우, '할당 -> 복사 -> 해제'의 과정을 밟는다.

하지만 realloc()을 사용할 경우 기존의 메모리를 확장하거나 아니면 새로이 확장된 메모리를 할당한다.

그렇기에 따로 복사의 과정을 코드에 넣지 않아도 된다.



*주의점

객체의 생성은 무조건 new 연산자로 한다.

동적할당을 했으면 반드시 해제를 해준다. (Garbage Collector가 없는 언어의 경우)


realloc() 사용 시, 반드시 기존 메모리 주소에 대해 복사해두어야 한다.

왜냐하면 realloc() 실패 시, NULL주소를 반환하기에 기존 메모리 주소를 잃어버릴 경우가 있다.




*추가로 조사할 점.

메모리 할당을 위한 System Call 요청은 실행 스택에 메모리를 생성하는 것 만큼 빠르지 않다.

(잦은 할당/해제는 많은 오버헤드가 발생, 동적할당은 메모리 실행 스택이 아닌 Heap구조에 저장된다.)

또한,

malloc()이나 new는 할당 요청 Byte이외에도 얼마나 메모리를 요청했는지 기록을 위한 mstat구조체(4~32Byte)를 추가할당.



*그리고 Garbage Collector가 없는 이상 메모리의 획득과 해제는 항상 같은 흐름에서 끝나야한다.

(이를 방지하는 것이 바로 스마트포인터)


*malloc()이나 new의 잦은 할당과 해제는 다양한 메모리 블록 사이즈로 인한 메모리 단편화를 유발하였다.(이전 OS)



*마지막으로 메모리 풀의 등장배경과 이점은?



1. 개요

이 알고리즘 역시 짧은 시간내에 얼마나 명료하게 코딩할 수 있는지 검사하는 문제.

주어진 시간은 30분안에 풀어내야 한다.


입력 크기가 10이하고, 입력된 자연수 역시 작기 때문에 풀이는 재귀를 통한 전수조사법으로 접근했다.


간단한 생각들이지만, 얼핏 얼핏 혼동이 올 수 있다.


더 연습하고 더 반복 숙달하자.


2. 문제

여러개의 자연수를 입력하여, 그 수들을 이어붙여 만들 수 있는 가장 큰 수와 작은 수의 합을 구하시오.

(정렬로 풀이하면 안됨, 기존 입력된 자연수 형태를 유지해야 함, 자연수 입력은 10이하, 두 자리수 이하)


(예시)

2 9 10 21 24로 만들 수 있는 가장 큰 수는 92422110 이다. 분리해서 9+24+2+21+10.

이처럼 기존의 입력된 자연수를 바꿀 수 없기에 정렬 사용 불가능.


3. 전체코드 및 출력

3-1) 전체코드

-


3-2) 출력


4. 정리

반복, 계속 반복하자.


반복만이 학습의 지름길.



1. 개요

이 문제는 빠르게 문제를 해결하는 기본 모듈 작성 연습에 좋음.

걸린 시간은 20분 소요되어야 함.


프로그래밍은 논리다.


추상적인 논리가 아니라, 정말 논리연산자 처럼 딱딱 탁탁 철사의 요철처럼 맞물리게.

이것을 잘 맞물리게 만드는 것이 바로 논리에 대한 결과다.


머릿속에 복잡한 연산은 절대 빠르게 이루어지지 않으니, 그 복잡한 모든 것을 간단하고 명확히 나타내는 논리를 그려라.


2. 문제

하나의 자연수를 읽어서, 입력된 횟수까지 대칭이 될 수 있는지 판단하는 Reverse_Plus() 연산하는 알고리즘 작성.

Reverse_Plus()의 예.

입력: 7

1번 검사 -> 7 + 7 (7의 뒤집기)

2번 검사 -> 14 + 41 (14의 뒤집기)

3번 검사 -> 55 (대칭) - 발견


3. 전체코드 및 출력

3-1) 전체코드


3-2) 출력


4. 정리

코딩을 해갈수록 점점 뭐가 기본인지, 뭐가 기초인지, 알았던 기본 기초의 범위가 늘었다가 줄었다가 한다.

이젠 뭐가 어떻게 되는지 모르겠지만 계속 하자.



1. 개요

이 문제는 연속된 부분을 검사할 때 어떻게 해야하는지 연습하는데 좋은 문제다. 풀이 시간은 20분.


역시 연속된 부분 찾기는 연속된 길이의 맨 마지막에서부터 찾는게 깔끔한 것 같다.


현재 if문의 중첩이 조금있는데 이 부분이 마음에 안든다.


그리고 중복된 기능에 대해서 합치면 코드 길이를 줄일 수 있겠지만 역시나 명료함을 위해서 분리한다.




2. 문제

문자열을 입력받아서 각 문자열을 분리하여 각 단어를 조사한다.

각각의 단어가 모음이 연속해서 있는 단어들의 개수와, 자음이 3개 연속으로 있는 단어들의 개수를 출력.

(두 조건이 만족할 경우, 둘 다 개수가 올라간다.)


3. 전체코드 및 출력

3-1) 전체코드


3-2) 출력



4. 정리

참 이런거보면 피카소의 소 그림과 코딩과 설계는 그 관념은 다르지 않다는 걸 느낀다.

언제 한 번 지금껏 코딩하면서 느낀 생각들을 피카소의 소하고 내 느낌대로 비교한 글을 올려봐야겠다.



+ Recent posts