-
컴파일
흔히 소스코드(원시코드)라고 하는 개발자가 작성한 코드는 0과 1만을 이해할 수 있는 컴퓨터가 이해할 수 없기 때문에 컴파일이라는 과정을 통해 사람이 짠 코드를 컴퓨터가 이해할 수 있는 방식으로 바꾸는 과정을 일컫는다.
아주 먼 옛날 0과 1로만으로도 코딩을 했던 경우는 컴파일러가 필요 없었겠지만, 0과 1로만 이뤄진 코드를 읽는 것은 매우 시간이 많이 들고, 코드를 작성하는 과정에서도 실수가 많이 발생할 수 있기 때문에 점차 코드는 사람의 언어와 가까워졌고, 따라서 컴퓨터와 사람의 코드 사이에서 번역하는 과정이 필요하게 되었다.
파이썬같이 컴파일을 하지 않아도 되는 언어도 있다.
인터프리터 방식을 사용하는데, 이건 컴파일 없이 매 코드 줄을 읽어서 결과를 출력하는 방식이다.Java란?
1991년 고안되었고 처음에는 Oak이라 불렸으나, Green으로 개명되었다가, Java로 바뀌었고, 인기가 매우 많아져 후에 사람들을 매우 큰 혼동에 빠뜨리게 되는데 기여한다.
요즘 핫한 Javascript와 거의 아무 연관성이 없으나, 이름에 큰 영향을 주어 'java'script라는 이름을 갖게 한다.
둘은 다른 언어다!
클래스를 기반으로 코드를 작성하게 되어 객체 지향을 하지 않으려 해도 이미 객체 지향인 듯한 상황이 된다.
이제는 함수형 프로그래밍도 대두되고 있는데, 객체지향이란 기존의 절차지향 프로그램에서 한계점을 보완하기 위해 나오게 된 개념이다.
절차지향 프로그램은 제대로 짜지 않으면 흔히 말하는 스파게티 코드가 될 가능성이 난무하다.
내가 대학교 때 배웠던 포트란에서는 goto라는 게 있어서 아무데로나 갈 수 있는 엄청난 것이 있었으나, 포트란으로 큰 프로젝트를 해보지 않아서 모르겠지만, 유지보수 측면에서는 아마.. 문제가 매우 많을 것이다.객체 지향은 각각의 객체가 할 수 있는 일들(메소드)를 정해둬서 조금 더 깔끔하게 코드를 작성할 수 있고 유지보수가 편하다.
게임을 짤 때 절차형으로 짤 때와 객체지향으로 짤 때 엄청난 차이가 있을 것이다.
예를 들어 절차형으로 짜면 고객이 기능하나만 추가해달라고 했는데, 코드 전체를 수정해야될 수 있지만, 객체 지향으로 짜두면 그 객체부분위주로 수정을 해주면 되기 때문에 훨씬 유지 보수가 쉬워진다.
객체 지향의 대표적 특징에는 캡슐화, 추상화, 상속, 다형성 등이 있는데, 이 부분은 나중에 추가적으로 정리하는 것으로!
http://www.tcpschool.com/java/java_intro_basicGC(garbage collector)가 있어서 C언어와 달리 메모리 관리를 따로 안해줘도 돼서 안정적인 프로그램을 메모리 관리 없이 짤 수 있다.
보일러 플레이트
신문사에서 1890년 대에 자주 사용되는 문구에 대해 강철로 찍기 시작했는데, 이걸 보일러 플레이트라고 했고, 코딩할 때도 자주 사용하게 되는 코드를 보일러 플레이트라고 한다.
처음에 잘 모르더라도 일단 따라쳐야 하는 부분이다.
일단 따라하다가 나중에 점차 아 이게 이 의미구나.. 하는 시간이 올 것이다!
거의 항상 치게 되고, 거의 같은 내용이기 때문에, 자동으로 작성해주는 라이브러리 등이 있다.JVM (JRE, JDK도 함께 공부해보세요)
JVM은 컴파일된 자바 파일 (.class확장자)를 맥, 윈도우, 리눅스 관계없이 돌릴 수 있게 해주는 virtual machine이다!
.class파일을 어떤 OS에서나 JVM위에서 돌릴 수 있기 때문에, JVM은 OS에 의존적이고, 따라서 윈도우와 맥의 JVM은 다르다.
JRE은 자바 실행환경이다. JVM 이 자바 프로그램을 동작시킬 때 필요한 라이브러리 파일들과 기타 파일들을 가지고 있다.
JDK는 자바 개발도구(Java Development Kit)의 약자이다.
JDK는 JRE + 개발을 위해 필요한 도구(javac(컴파일 할 때 사용), java(컴파일된 파일을 실행할 때 사용) 등)들을 포함한다.
https://jeong-pro.tistory.com/148?category=793347https://post.naver.com/viewer/postView.nhn?volumeNo=23726161&memberNo=36733075
https://post.naver.com/viewer/postView.nhn?volumeNo=24042502&memberNo=36733075https://post.naver.com/viewer/postView.nhn?volumeNo=24042502&memberNo=36733075 https://johngrib.github.io/wiki/java8-why-permgen-removed/
.class파일과 .java파일의 차이
사람이 텍스트 파일인 .java파일을 자바언어로 작성하고나서 컴파일을 하면 .class파일이 생성되고, JVM이 돌릴 수 있는 상태가 된다.
Java complie 명령어와 옵션
javac -d <현재위치 기준 컴파일된 파일이 위치할 path (보통 classes)> <현재위치 기준 .java파일까지의 path>
명령어로 컴파일할 수 있다.
-d 옵션으로 컴파일 할 때 컴파일된 파일이 현재 위치를 기준으로 저장될 위치를 써줄 수 있다. -d옵션을 써주지 않으면 현재 위치에 저장된다.
컴파일된 파일을 실행할 때는
java <클래스명> 으로 실행할 수 있고, 이 때 당연히 .class파일이 있는 디렉토리에서 해당 명령어를 실행해야 한다.
만약 다른데에 있는 파일을 실행하려면 --class-path혹은 -cp 옵션을 주면된다.관심사의 분리
프로그램을 각기 다른 관심사(목적)를 갖고있는 부품들로 쪼개는 것을 의미한다.
관심사의 분리를 통해 깔끔하고 유지보수가 용이한 코드를 짤 수 있다.
비슷한 것 끼리 묶어두고 다른 것 끼리 떨어뜨려 놓으면 된다.변수
말그대로 변할 수 있는 값이다.
내가 원하는 변하는 값(변수)에 원하는 이름을 붙여서 해당 변수의 역할을 명확히 할 수 있다.
값만으로 이뤄진 코드가 있다면 각 값의 뜻을 모두 다 외우고 있지 않은 이상, 작성자도 1시간만 지나도 무슨 코드인지 이해를 못할 것이고, 다른 사람들은 당연히 이해를 못할 것이다.
그리고 같은 값을 갖고 있어도 다른 의미를 갖고 있을 수 있기 때문에 각각에 의미를 부여해주기 위해 사용한다.
같은 목적의 값들이 동일한 변수로 작성이 되면 해당 값을 수정할 때도 용이하다.타입
값의 종류를 뜻한다.
사람은 값을 보고 숫자인지 문자인지 바로 값의 종류를 판단할 수 있는 경우가 많지만,
컴퓨터한테는 하나하나 명확히 타입을 알려줘야 하는 과정이 필요하다.- 종류는 두 가지 방법으로 구분할 수 있다.
- 숫자 / 문자 / 불리언 (참거짓)
- 정수형
- byte ⇒ 8bits (1 byte)
- 2^8 개의 데이터 표현 가능
- 0 ~ 255 ( 부호 없을 때 범위)
- -128 ~ 127 (부호 있을 때)
- short ⇒ 16bits (2bytes)
- int → 32bits (4bytes)
- long → 64bits (8bytes)
- byte ⇒ 8bits (1 byte)
- 소수형
- float → 32 bits 부동 소수점
- 부동 소수점 : 위치가 변하는 소수점
- double → 64 bits 부동 소수점
- float → 32 bits 부동 소수점
- 불리언
- boolean → 불리언 (참 / 거짓) → true / false
- 문자형
- char → 16bits (2bytes) 문자
- String → N bytes … 가변길이 → 문자열
- 정수형
- 변수의 크기가 정해졌는가?
- 원시타입
- 변수의 사이즈(~bytes)가 정해진 타입
- 숫자형, 불리언, char이 해당
- 객체타입
- 변수의 사이즈가 변하는 타입
- String, 객체, 함수…. 다양한 종류가 포함된다.
- 원시타입
- 숫자 / 문자 / 불리언 (참거짓)
리터럴
프로그램에서 사용 중인 부동 소수점 숫자, 문자열, 불린 등 소스 코드의 값을 의미한다.
문자 vs 문자열
- char
- 16bits (2bytes) 문자형 타입
- 글자 하나
- 작은 따옴표로 감싸준다.
- 원시타입 변수이다.
- string
- N-byte 문자형 타입이다.
- 쌍따옴표로 감싸준다.
주석
프로그램을 돌릴 때는 인식되지 않지만 코드에 남겨두고 싶은 메세지가 있을 때 주석을 쓴다.
객체
모든 것은 다 객체로 볼 수 있다.
역할, 책임을 가지고 있는 같은 특징을 가지고 있는 것들의 모임이라고 볼 수 있다.
자세한 내용은 3주차 개념노트에 정리하겠습니다.new
객체를 생성해준다.
Class와 Instance
클래스는 종류, instance는 정말 실제로 존재하는 그 유일한 '것'을 의미한다.
그래서 '새'라고 했을 때 새는 종류이고, 정말 실제로 내 눈 앞에 있는 새 한마리 그 것은 instance이다.
모든 instance는 따라서 동일할 수 없다.
따라서 객체끼리는 ==로 비교가 불가능하다.import
다른 파일에 있는 프로그램을 끌어올 때 쓴다.
Single equal(=) vs Double equal(==)
single equal은 왼쪽에 오른쪽 값을 대입하는 연산자 이고,
double equal은 값이 같은지를 확인해서 true, false로 반환한다.
javascript에는 == 말고 ===도 있으니 타입까지 맞는지 보려면 ===를 사용해야한다.연산자와 연산자 우선순위
위에서 아래로 갈수록 우선순위가 떨어진다.
() 괄호 ^ 지수 * / 곱, 나눗셈 + - 더하기 빼기 == ≠ < > ≤ ≥ 비교 연산자 && AND || OR = 대입 제어 흐름 (Flow of Control)
프로그램의 진행 순서를 의미한다.
논리 연산자(AND / OR)
논리 연산자는 참인지 거짓인지 판단해준다.
and 논리식이 모두 참이면 참을 반환함. (AND 연산) or 논리식 중에서 하나라도 참이면 참을 반환함. (OR 연산) xor 논리식이 서로 다르면 참을 반환함. (XOR 연산) && 논리식이 모두 참이면 참을 반환함. (AND 연산) || 논리식 중에서 하나라도 참이면 참을 반환함. (OR 연산) ! 논리식의 결과가 참이면 거짓을, 거짓이면 참을 반환함. (NOT 연산) 다음은 논리 연산자의 모든 동작의 결과를 보여주는 진리표다.
ABA and B (A && B)A or B (A || B)A xor B!AA B A and B A or B A xor B !A true true true true false false true false false true true false false true false true true true false false false false false true 출처: http://www.tcpschool.com/php/php_operator_logic
비트 연산자
논리 연산을 할 때 사용하는 연산자이다.
또한, 비트 단위로 전체 비트를 왼쪽이나 오른쪽으로 이동시킬 때도 사용한다.& 대응되는 비트가 모두 1이면 1을 반환함. (비트 AND 연산) | 대응되는 비트 중에서 하나라도 1이면 1을 반환함. (비트 OR 연산) ^ 대응되는 비트가 서로 다르면 1을 반환함. (비트 XOR 연산) ~ 비트를 1이면 0으로, 0이면 1로 반전시킴. (비트 NOT 연산) << 지정한 수만큼 비트들을 전부 왼쪽으로 이동시킴. (left shift 연산) >> 부호를 유지하면서 지정한 수만큼 비트를 전부 오른쪽으로 이동시킴. (right shift 연산) 정수의 덧셈과 문자열의 덧셈의 차이
값의 타입에 따라 + 연산자가 다른 의미를 지닌다.
정수(int, double등)끼리 + 연산자를 사용하면 우리가 흔히 아는 수학의 덧셈으로 작용한다.
모든 언어에서 그렇지는 않지만 자바에서는 문자열에 + 연산자를 사용하면 직관적이게 두 값을 이어주는 방식으로 작용한다.바이트, 비트
4비트가 1바이트였던 적도 있었으나,
요즘은 1바이트 = 8비트라고 보면 된다.RAM
CPU와 보조기억장치 사이에서 작업대 역할을 하는 주기억장치이다.
속도는 CPU> RAM > 보조기억장치 순이다.
작업대 역할을 하기 때문에 꼭 RAM이 크다고 성능이 좋아지는 것은 아니다.
RAM이 커질 수록 많이 비싸지기 때문에, 자신의 목적에 맞는 적당한 용량의 RAM을 사면된다.
휘발성이라서 컴퓨터를 끄면 저장된 정보가 사라진다.
ROM과 달리 읽고 쓰는 게 모두 된다.ROM
메인보드에 내장되어 있다. 읽기만 가능하다. read only memory이다.
BIOS라는 프로그램이 들어가 있고, RAM과 달리 비휘발성이다.
따라서 부팅될 때마다 실행되는 BIOS가 들어있기 적합하다. (휘발성이면 컴퓨터가 꺼지면 다 날라간다..)최상위 비트 0과 1일 때 차이
최상위 비트가 0이라는 말은 양수나 0이라는 말이고, 1이란 말은 음수라는 뜻이다!
0에서 이진수 1을 빼면 underflow가 발생해서 11111..(byte에 따라 다름)이 된다.
그리고 -1 (2진수로 1111...)에 1을 더하면 1000000 인데,오버플로우 / 언더플로우
정수 자료형에서 저장할 수 있는 범위를 넘어선 경우 오버플로우가 발생한다.
컴퓨터는 0과 1로 이뤄져 있고, 숫자를 비롯한 모든 값은 일정 공간에 저장된다.
그리고 값마다 자료형이 있는데, 이 자료형에는 공간의 크기가 정해지기 때문에, 그 값이 가질 수 있는 최소와 최대 값이 정해져 있다.
예를 들어 1바이트 크기의 이진수 정수 11111111에 00000001을 더하면 수학적으로는 100000000이 되겠지만, 1바이트 크기를 넘어섰기 때문에, 컴퓨터는 00000000으로 인식을 한다.
char 이외에도 short, int, long, long long 등도 저장할 수 있는 범위를 넘어서면 최솟값부터 다시 시작하게 된다.
반대로 최솟값보다 작아지면 언더플로우(underflow)가 발생하여 최댓값부터 다시 시작하게 됩니다(값을 계속 뺀다면 최댓값에서 값이 계속 작아짐).▼ 그림 7‑2 정수의 오버플로우와 언더플로우부동 소수점
왜냐하면, 컴퓨터에서는 실수를 정수와 마찬가지로 2진수로만 표현해야 해서 정수보다 표현법이 훨씬 복잡해서 고정 소수점 방식과 부동소수점 방식이 생겼는데,
실수는 '.'을 기준으로 정수부와 소수부로 나눌 수 있고,
따라서 정수부를 2진수로 변환하고 소수부를 2진수로 변환해서 붙여서
32비트 실수를 고정 소수점 방식으로 표현하면 다음과 같이 표현할 수 있다.하지만 이 방식은 정수부와 소수부의 자릿수가 크지 않아서, 표현할 수 있는 범위가 매우 적다.
그래서 지금은 대부분 실수를 표현할 때 부동소수점 방식을 사용하는데,
실수는 보통 정수부와 소수부로 나누지만, 가수부와 지수부로 나누어 표현할 수도 있고,부동 소수점 방식은 이렇게 하나의 실수를 가수부와 지수부로 나누어 표현하는 방식이다.
단정밀도와 배정밀도
single precision(float), double precision(double)
영어가 더 이해하기 편한 것 같다.IEEE 754 규격
IEEE에서 개발한 컴퓨터에서 부동소수점을 표현하는 가장 널리 쓰이는 방식이다.
float 32bit 단정밀도 부호(1) 지수(8) 가수(23) double 64bit 배정밀도 부호(1) 지수(11) 가수 (52) 으로 표현하고,
10진수를 IEEE 754규격에 맞게 변환하려면
먼저 부호 생각하지 말고, 해당 숫자의 절댓값을 정규화한다.
정규화는 해당 숫자를 1.xxxxx * 2^n의 형태로 표현하는 것이다.
정규화 후 소수점 뒷부분을 가져오고, 23자리가 되도록 뒤에 0을 덧붙여준다.
bias 127을 n에 더해주고, 그걸 2진수로 바꿔서 지수부에 넣어주고, 맨 처음에 부호를 음수면 1 아니면 0을 넣어줘서 마무리하면 된다!'메가테라' 카테고리의 다른 글
6주차 개념노트 (HTML, CSS 총정리) (0) 2022.09.25 4주차 개념노트 (0) 2022.09.11 3주차 개념노트 (0) 2022.08.28 [메가테라 루틴] 쓸 데 없는 생각말고 그냥 코딩 하기나 해~ (0) 2022.08.22 2주차 개념노트 (0) 2022.08.21 - 종류는 두 가지 방법으로 구분할 수 있다.