230504(목) 모각코 제8회 명령형 언어와 객체지향언어 그리고 포인터 핥아먹기
장수미2023. 5. 12. 15:58
안녕하세요. 디비술사입니다.
오랜만에? 아니 처음으로?
정상적인 글제목으로 찾아왔습니다.
저 분명 아파서 누워있었던게
엊그제같은데 (엊그제 맞음)
어제부로 독감약도 다 먹었습니다.
더이상 기침도 안나네요.
인턴관련 면접(미팅)만 4번 봤습니다.
아파 죽어도
면접은 다 보고 죽어야죠? 하하
이틀전에 최종 의사결정까지 마쳐서
홀가분하네요.
오늘은 프로그래밍언어론 수업 내용을 다룰겁니다.
요즘 프언수업이 참 재밌거든요.
재밌었던 수업 내용
+
남아서 교수님께 질문했던 내용
복습 떠먹여드리겠습니다.
앗 전 디비술사인데...
아무튼 그렇게 됐습니다.
시작해봅시다...
1. 명령형 언어와 객체지향 언어
C언어와 같은
명령형 언어는...
컴퓨터에게 실행해야 하는
명령문의 순서와 논리를 직접 지정하는 방식
으로 작동합니다.
챗지피티한테 물어보고 왔어요.
하지만
코드의 라인수가 길어지면서...
더 적합한 언어 or 설계 기법이 필요했어요.
그리고 예전에 썼던 코드도
재사용할 수 있으면 좋겠네요.
그래서 나온게
객체지향(OOP)입니다.
C++과 Java가 대표적인 언어입니다.
2. 객체지향이 효율이 떨어진다고?
저는 이 개념을 하도 중요하게 가르치기에
심지어 객체지향프로그래밍! 이라는 과목까지 있기에
객체지향이 좋기만 한건줄 알았습니다만
객체지향은... 단점이 있습니다.
바로 효율이 많이 떨어진다!
는 것인데요.
근데 교수님께서 효율이 떨어진다고
한마디만 하고 넘어가시기에
굉장히 혼란스러워하며
남아서 질문했습니다.
?? : 교수님 왜.. 객체지향은 효율이 많이 떨어지나요..?
교수님 : 😏
2-1. 딴소리
제 질문 자체가
프언수업을 좋아할 수 밖에 없는 이유인것같습니다.
되게 두루뭉술하게 머릿속을 떠다니는
CS지식들을 정리해서
다잡아주는 수업입니다.
그래서 저랑 비슷한 성향을 가진분들이
(하루종일 대체 이건 왜 이런거야? 만 생각하시는 분)
들으면 매우 좋은 수업입니다.
심지어 수업중에 본인이 궁금한 거 질문도 가능함.
3. 객체지향의 특징
일단 프로그램을 '객체지향' 으로 작성하겠다는 말 자체가
코드 작성시
(명령형 언어에 비해)
제약을 많이 두겠다는 말입니다.
예를 들면
private, public 개념도
(제약을 두는 개념)
그 중 하나 입니다.
그리고 더 중요한 이유가 있습니다.
바로 객체지향 언어는
동적 메모리를 잘 사용할 수 있도록
여러가지 기능들을 제공한다는 점입니다.
(dynamic합니다.)
러프하게 말하자면
동적 메모리는
객체의 크기가 항상 고정적일 수 없으니
상황에 따라 4, 1300, 55, 이런식으로
원하는 만큼 주고싶다!
그럴때 씁니다.
하지만 이러한 동적 메모리 처리를
많이, 자주 쓰면
당연히 메모리 사용이
비효율적일 수 밖에 없습니다...
운영체제에서 배웠던
조각화 현상
segmentation fault가
더 자주 일어날 수 밖에 없습니다.
즉 효율이 많이 떨어집니다.
그렇습니다... 객체지향이란건
태어날때부터 비효율적인 개념이었던 것입니다.
하지만 그 단점을 뛰어넘는
장점이 있기에 사용하는 것이겠죠😎
4. 명령형 언어의 특징
C언어의 특징이 간결하다, 효율적이다
라는 것을 떠올리면
객체지향 언어와 명령형 언어는
확실히 다른 개념임을 알 수 있습니다.
C언어가 간결하고 효율적인 언어인 이유도
C언어가 static하기 때문이다
라고 설명할 수 있습니다.
C언어와 같은 명령형 언어의 경우
동적 메모리 관리가 어렵습니다.
(매우 취약하다.)
4-1. 빡침의 해소
아... 이걸 알게되니까
C++ 알고리즘 문제 풀 당시에
제 노트북 실행환경에서
배열의 크기에 n을 넣을 수 없었던
이유를 깨닫게 됐습니다.
C/C++컴파일러가...
C언어처럼 컴파일 한거구나
(좀 옛날버전이구나)
진짜 빡쳤었는데... 아주 조금 이해됨
5. C언어 포인터의 3가지 특징을 배우고...
저는 프로그래밍 언어론 수업 중에 매우 감동받았습니다.
이걸... 정리해주시다니
이 간지러운 곳을 박박 긁어주시다니
여러분께도 효자손을 추천드립니다.
본론을 말씀드리겠습니다.
C언어의 포인터 개념은
무려! 3가지 기능을 합니다.
6. 1번째 aliasing
alias: 별명
안알려주셔도 다 아시겠지만
i = 100;
의 값을
포인터 p로 대신 쓸 수 있다
다른 이름으로 부를 수 있다!(=별명)
6-1. Java에서는 aliasing을?
Java에는 다들 아시듯
포인터가 없습니다.
aliasing기능을
reference type으로
대체했습니다.
(사실 언어마다 비슷한 점을 찾아 공부할게 아니라
아예 따로 분리해서 생각하는 것이 맞다!
라고 생각하는 분들도 계셔서
대체라는 말이 조심스럽긴 하지만...
서로 다른 언어에서
비슷한 개념이
다른 방식으로 표현되었다!
로 생각하면 좋을듯
투머치토커)
7. 2번째 Pointing (Linked List)
원래 이게 주 기능입니다.
당연함 이름부터 포인터임
우리에겐...
포인터는 aliasing을 한다는 개념이
왠지 더 익숙하네요.
트리와 같은 자료구조에서
다음 노드를 가리키고~
이 부분에서 쓰이는
Pointing
이라는 개념입니다.
저는 그래서 트리를 python이나 java로 짜신 분들...
신기함 어케 짜신거임? 가능은 하지만... 비교적 힘들 것 같은디
7-1. Pascal의 Pointer Type
포인터의 원래 기능은 가리키는 거라 했죠?
어디서 나온 말이냐 거짓말구라치지마라
뇌피셜이 아닙니다.
파스칼에서 포인터 타입이
오직 Pointing의 기능만 합니다....!!!
궁금하면 더 찾아보시길
7-2. 파스칼이 뭔데
1970년대에 개발된 프로그래밍 언어입니다.
프로그래밍 교육과 과학 기술 분야에서 널리 사용되었습니다.
특히 파스칼은 간결하고 구조화된 프로그래밍을 지원하기 때문에
프로그래밍 이론을 설명할때
유용하게 쓰이는 언어입니다.
프언 한 수업당 3번 이상 파스칼 얘기가 나옵니다.
8. 3번째 Heap 메모리 할당(Dynamic, malloc)
전 이게 수업 끝나고
기억이 안났거든요...
수업 들을때도
진짜 굳이...? 저걸 포인터로?
하면서 들어서 그런가
기억에 남지 않았습니다.
하지만 이제 기억이 납니다.
그래서 조금 신났음!
C언어에서
동적 메모리를 할당할때도
포인터를 쓴다는 놀라운 사실...
알고계셨나요?
전 아니요 몰랐어요.
8-1. 굳이? 시러잉
C++은 저와 생각이 같았는지
동적 메모리 할당시
malloc(), free() 대신
new()와 delete()를 사용합니다.
제가 자꾸 C언어랑 C++이랑
이름이 비슷해서
헷갈리게 되는데
프언 수업을 들을때마다
분명히 다른 점이 있다는 걸
깨닫습니다.
8-2. ??: 너 울어?
교수님께서 delete()...를 설명하실때
메모리 사용하고 끝마칠때,
특히 tree나 linked list를 구현할때..
반환을 안하면 오류가 난다.
라고 하셨는데요...
제가 B-tree짤 때 그랬어요...
delete()를 안써서...
몇시간을 헤매고... 네...
추억이네요.
Java는 함수나 프로그램이 끝날때
자동 반환 해주지요?
가비지 컬랙션..
개념만 배울때는 소중한걸 몰랐는데...
다들 자바 쓰세요...
오늘 또 신나서
길게 썼네요.
근데 전 개발자 안할거예요.
다들 아프지마세요.
감사합니다.
'장수미' 카테고리의 다른 글
230519(목) 모각코 제9회 리터럴을 프라이팬에 구워서 상수와 드셔보세요. (1) | 2023.05.19 |
---|---|
230504(목) 모각코 제7회 부상투혼(負傷鬪魂) 그리고 MySQL WordBench unconnected 이슈 해결 (5) | 2023.05.07 |
230413(목) 모각코 제6회 이번 퀴즈의 최종 점수는 4.00/10.00입니다. (2) | 2023.04.14 |
230406(목) 모각코 제5회 디비술사의 디비디비딥 (2) | 2023.04.06 |
230330(목) 모각코 제4회 DB술사의 OS 숏퀴즈 점수 공개 (2) | 2023.03.31 |