(Day13) - 클래스, 메서드, 컴파일러, Call By Value & Reference
이 글은 제가 교육을 수강하며 기록하고 추가한 내용입니다. 강사님과 무관하게 잘못된 내용이 있을 수 있습니다.
클라우드 기반 웹 데브옵스 프로젝트 개발자 교육 과정 (5기)
- 비트캠프 엄진영 강사님 (https://github.com/eomjinyoung/)
- 훈련기관 : 네이버클라우드주식회사
- 기간: 2023-11-14 ~ 2024-5-22
- 남은 일자 : 115 일 ( 14/129 )
14일차(2023-12-01,금)
학습내용
- 메서드의 시그너처(Signature)와 바디(Body)란 무엇인가?
- 파라미터를 시그너처라고 부르며, 메서드의 코드블럭을 바디라고 부른다.
C 언어가 왜 등장했나? C는 왜 자유로운 문법을 가졌나?
유닉스 운영체제를 어셈블리언어로 만드니 CPU 바뀔 때마다 기계어 명령어 집합이 다르니 새로 해야 한다. 유닉스를 매번 그렇게 다시 프로그래밍을 하려니 힘들다. 그래서 B 언어의 특징을 기반으로 C 언어를 만들어서 기계어와 1:1 대응하는 어셈블리어와 다른 고수준언어를 만든다. 벨 연구소에서 만든거다. 벨 연구소는 그냥 다 박사다. 하드웨어 제어를 위한 유닉스를 위해 C 언어를 만들었다. 박사들이, 전문가들이 하드웨어를 제어하기 위한 소프트웨어를 만들기 위한 프로그래밍언어다. 그래서 문법이 엄격하지 않다. 사용자의 수준이 애초에 박사들이었다. 로컬 변수를 초기화하지 않아도 C는 컴파일러가 에러를 띄우지 않는다. C 언어가 일반사용자들에게도 쓰이기 시작하면서 C 언어의 자율성을 제대로 활용하지 못하고, 잘못된 메모리에 대한 접근(메모리바이얼레이션)이 너무 잦게 발생했다. 특히 드라이버와 같이 운영체제 소속 회사가 아닌 회사의 개발자들이 그런 실수를 많이 했다. 윈도우가 불안하다는 이야기, 그래픽카드의 드라이버(특히 엔당)로 인한 블루스크린들이 발생하는 이야기들은 이런 역사의 안에 있다. 그런 상황에서 비스타가 망했다. 운영체제는 메모리 접근에 대한 기록을 남기기 때문에, 시스템 관련해서 전문가들은 그 기록을 볼 수 있다. 속일 수가 없다.
자세한 내용은 빌게이츠 자서전을 봐보자?
기술 부채
리팩토링을 귀찮거나 비효율적인 것으로 생각하면 안된다. 처음부터 완벽한 코드를 개발할 수 있는 경우는 없다. 기술부채를 발생시키지 않는 경우는 없다.
개발자의 주화입마
사람이 능력을 잃어버리는 일. 주화입마. 2~3 년차에 주화입마가 빠지는 경우. 욕심이 너무 과한 경우. 기술부채는 신급의 개발자들도 피해갈 수 없다. 내가 실력이 나쁘건 좋건 신급이건 기술부채는 무조건 발생한다. 생물은 변화하고 진화하는 것처럼. 리팩토링은 언제나 나은 것. 기술적 부채가 발생하건 발생하지 않건 계속 짜라. 그리고 계속 리팩토링하라. 그러다 보면 패턴을 발견하게 되고 패턴의 발견을 반복하다보면 실력이 늘어가는 것이다. 처음부터 완벽하게 짜려고, 슈퍼클래스 서브클래스를 완벽하게, 메서드나 파라미터를 완벽하게 짜려고 하면 주화입마에 빠지게 된다.
따라하기 베끼기
어감이 좋지 않게 들린다면 잘못된 것이다. 바둑을 배울 때 기보를 공부하는 것이 좋지 않은 것인가? 창의성과 독창성, 천재성에 대해서 잘못된 신념을 가지지 말라.
메서드 명명 예시
동사구
명사구
Integer.
전치사구
toOOOOO
아침 복습
Parameter VS Argument
값을 넘겨줄 때는 Argument 메서드에서 값을 받는 것을 정의하는 것이 Parameter
Call by Value, Call by Reference 차이
Call by Value 는 메서드 호출 시 스택 영역에 있는 Primitive value 를 그대로 넘기면서 메서드를 호출하는 경우 Call by Reference 는 메서드 호출 시 힙 영역에 있는 인스턴스의 주소를 가진 레퍼런스를 넘기면서 메서드를 호출하는 경우
JVM 이 관리하는 메모리의 영역을 용도에 따라 설명하기
- JVM Method Area
- 코드 자체가 실행되기 위해 메모리에 코드를 올리는(적재하는, 로딩하는) 영역이다.
- JVM Stack
- 메서드의 로컬변수들을 올리기 위해서 사용하는 영역이다. Thread 당 하나의 JVM Stack이 존재한다. 메서드 호출이 끝나면 삭제된다.
- JVM Heap
- new 명령어를 통해서 메모리에 생성되는 경우 JVM 힙 영역에 생성된다. 수동으로 삭제하지 않고, GC를 통해서 삭제된다.
재귀호출을 다룰 수 있는가?
Stack Overflow란 무엇인가?
메서드 호출시마다 스택에 프레임이라는 단위로 메모리를 생성하고 그 내부에 로컬 변수들을 생성한다. 메서드를 재귀호출 등으로, 호출 후 리턴하지 않은 상태로 계속 호출하는 경우는 하나의 스택 영역 내에 계속하여 프레임이 쌓이고, 스택의 용량을 초과할 수 있다. 이 경우 스택이 넘쳤다 등으로 표현하며 Stack overflow가 발생했다고 한다.