2022-01-04(화) 8주차 1일
그 값이 음성이든 영상이든 그림이든 글자든 숫자든 메모리에 저장된다.
부동소수점을 저장하나 텍스트를 저장하나 똑같으면 구분할 방법이 없음
저장을 할 때도 배치가 달라짐
부동소수점은 지수부와 가수부로 나누고
지수부 Excess-K
가수부 Signed Magnitude
자바 명세서에는 레퍼런스 주소는 최대 몇 바이트까지 한다 이런 말이 없음
상황에 따라서 32 bit JVM / 64 bit JVM
레퍼런스는 주소가 몇 바이트인지 안 따짐
레퍼런스의 주소가 몇 바이트인지 집착하지 말기
기계에 가까우면 Low Level Language
사람에 가까우면 High Level Language
프로그램을 짜다 보면 나이를 저장하려면 int, 돈 저장 long, 몸무게나 키는 float이나 double, 직장 다니고 있는지 상태는 boolean, 이름 char 배열 String
덩어리 데이터를 다룬다
의료시스템이면 환자 정보, 이름, 주소, 나이, 혈액형
쇼핑몰을 만든다고 하면
상품 정보, 상품 이름, 제조사, 가격, 설명
주문 정보를 다룬다면
주문일자, 수량, 쿠폰을 썼는지, 현재 주문의 상태, 결제수단
덩어리 데이터를 다룰 타입을 자바에서 제공 안 함
그때 쓰는 문법이 클래스
새로운 데이터 덩어리 설계
데이터 덩어리 → 데이터 타입
새로운 데이터 타입을 정의할 때 문법
int a;
정수값을 담을 4 byte 메모리를 만들고 이름을 a라고 하자.
클래스로 정의할 때는 이렇게 하면 안 됨
A obj;
A 설계도에 따라서 메모리에 만드는 게 아님
메모리의 주소
A 설계도에 따라 만든 메모리의 주소
new 명령을 사용해야 됨
A 설계도에 따라서
offset
주소값
reference value (주소값)
인스턴스 변수
‐ new 명령을 통해 생성된다.
‐ Heap 영역에 생성된다.
클래스 로딩(loading)
외부저장장치(HDD, SSD, CD-ROM, USB 등)에 보관된 .class 파일을 읽어서 메모리(RAM)에 복사한다.
CPU (중앙처리장치) : 기계어 명령 처리
RAM : CPU에 연결되어 있다.
HDD/SSD/... : RAM과 연결되어 있다. CPU랑 연결이 안 되어 있음.
CPU는 빠른데 HDD는 느려서 연결 안 함
HDD에서 RAM(메모리)으로 실행할 명령이나 데이터를 복사한다.
그런 다음에 RAM에서 CPU로 명령이나 데이터 전달
HDD에서 CPU 전달하는 거 아님
아예 CPU 안에 메모리를 집어넣어버림
Apple M1
칩 안에 넣어버림
CPU + 메모리
한 칩 위에 올림
System on chip (SOC)
엄청 빠름
일단 메모리로 복사해야 됨
무조건 이 방식
HDD에서 CPU로 다이렉트로 읽는 거 불가능
RAM에 있는 데이터를 CPU가 읽는 거
aaa.jpg
bbb.avi
ccc.wav
ddd.mp3
xxx.txt
yyy.md
zzz.java
contacts.cvs
contacts.xls
어떤 파일이든 무조건 RAM으로 복사해야 됨
그래야 뭘 처리하든지 함
외부 메모리에 있는 걸 내부 메모리에 복사하는 걸 loading 이라고 한다.
RAM에서 HDD로 저장할 때는 save 라는 표현을 쓴다
RAM으로 올린다는 건 지금부터 CPU를 통해서 처리하겠다
save 그냥 보관하겠다
시작은 .class 파일을 읽어서 메모리에 올려야 한다.
메서드를 사용하려면 메서드를 포함하고 있는 .class 파일을 메모리에 올려야 한다.
메모리에 올리는 게 우선! 그게 제일 첫 번째!
그 행위를 class loading 이라고 한다.
클래스 로딩 자체를 왜 하는지 이해하기
관련된 클래스 수백개가 메모리에 올라오는 거
실제로는 수백개
String 클래스만 봐도
Exam0130 실행하려면 로딩해야 되는데 로딩하기 전에 사용한 클래스들 다 로딩해야 됨
다른 클래스를 쓰고 다른 클래스가 또 다른 클래스를 쓰고 있고
몇백개 몇천개 됨
최소 몇 메가가 메모리를 차지하고 있는 거
기본적으로 딸려서 메모리에 올라오는 클래스들이 엄청 많음
클래스를 메모리에 로딩하는 걸
HDD 메모리에 올려야 된다는
다른 언어를 배울
어떤 언어를 배우든 간에
컴퓨터에 돌아가는 모든 기능은 일단은 메모리에 올려야 된다
CPU가 처리할 명령어가 다룰 데이터는 RAM에 있어야 됨
HDD에 있는 건 못 다룸
내가 처리할 게 1TB고 메모리가 16GB
어떻게?
순차적으로 처리
영화를 보는데 영화의 크기가 16GB
메모리가 8GB
CPU가 데이터를 처리하려면 무조건 메모리에 올려야된댔음
1시간짜리가 16GB라는 거
지금 당장 사용자에게 보여줘야 되는 건 1초
앞으로 2~3분 동안 재생할 데이터만 가져와서 변환해서 화면에 출력
재생할 동안에 다음 2~3분 동안 출력할 데이터
항상 RAM으로 올려서 처리
그 중의 일부를 앞부분부터 계속 가져오면서 변환 처리
스트리밍
클릭한 위치에 있는 영상만 가져와서
파일이 메모리보다 큰 경우
그 파일 전체를 메모리에 올려야 되는 게 아니라 일부만
그러나 변하지 않는 건 CPU가 데이터를 읽어서 처리하고 명령어를 읽으려면 무조건 HDD에서 메모리에 올린 다음에
앞으로 끊임없이 loading 이라는 용어를 만나게 될 거임
결과를 저장하는 게 save
loading
CPU가 작업할 때 사용할 명령어나 데이터를 메모리에 올리는 거
컴파일하면 클래스 파일이 생김
JVM이 실행하려면 메모리에 올려야 됨
클래스 파일을 메모리에 올려야 됨
HDD에 있는 걸 메모리에 올려야 된다
명령어를 실행하거나 데이터를 처리하려면 무조건 HDD에서 메모리에 올려야 된다. (loading)
메모리에 있는 데이터를 HDD로 보내는 걸 save 라고 한다.
JVM을 실행하는 동안 한 번 클래스가 로딩되면 같은 클래스에 대해 중복 로딩되지 않는다.
클래스의 코드를 사용하는 시점에 메모리(Method Area 영역)에 로딩된다.
주의! Heap에는 개발자가 작성한 명령어가 없다.
클래스 변수와 인스턴스 변수 : oop.ex03.Exam0140
com.eomcs.oop.ex03.Exam0140.java
클래스 변수와 인스턴스 변수 생성 시점과 메모리 영역
클래스 로딩될 때 중첩 클래스까지 자동 로딩되는 게 아님
Exam0140 클래스가 품고 있는 중첩 클래스까지 자동으로 로딩되는 게 아니다
A.v1 = 100;
사용하는 시점에 로딩된다.
스태틱 필드가 있는지 확인한다.
static int v1;
int 타입이니까 기본값 0으로 세팅된다.
클래스 변수나 인스턴스 변수는 자동 초기화된다.
A 라는 클래스에 v1 이라는 변수를 찾아서 100을 집어 넣어라
⑤
new
인스턴스를 만들 때는 static이 안 붙은 변수를 만든다.
A.v2 = 200;
// 컴파일 오류!
A 클래스에 v2 라는 변수는 없다.
인스턴스 주소를 줘야 됨
⑧ p.v2 = 200;
실행
⑨ A p2 = new A();
실행
A 클래스 설계도에 따라서 non-static 변수를 Heap에 만들라
주의! 클래스를 로딩할 거라고 착각하는 경우
다음과 같이 레퍼런스 변수를 선언할 때는 클래스를 로딩하지 않는다.
스태틱 필드가 언제 생성되고 어디에 생성되는지
인스턴스 필드가 언제 생성되고 어디에 생성되는지
com.eomcs.oop.ex03.Exam0150.java
클래스 변수와 인스턴스 변수 응용
클래스 필드는 인스턴스를 생성할 필요 없이 클래스 이름으로 바로 사용한다.
인스턴스 필드는 new 명령을 수행해야지만 생성된다.
인스턴스 필드는 인스턴스의 주소가 있어야만 접근할 수 있다.
클래스 이름으로는 인스턴스 필드에 접근할 수 없다.
new 명령
Heap에 인스턴스 변수만 만들어진다.
static으로 선언된 변수와 non-static으로 선언된 변수의 차이
인스턴스 안에서는 메서드가 없다
인스턴스란 non-static 변수의 묶음이다
메서드는 Method Area에 있다
클래스 변수는 클래스가 로딩될 때 딱 한 번 만들어진다.
com.eomcs.oop.ex03.Exam0160.java
클래스 변수의 응용 : 클래스 변수 활용 전
회원의 타입을 지정할 때 숫자를 이용하였다.
소스 코드를 작성한 후 시간이 오래 지나면 숫자의 의미를 기억하기가 쉽지 않다.
주석이나 개발 문서를 자세히 살펴보지 않는 이상에는 숫자의 의미를 파악하기 쉽지 않다.
com.eomcs.oop.ex03.Exam0161 ~ 163
클래스 변수의 응용
0: 손님, 1: 회원, 2: 관리자
상수 변수
public static final
com.eomcs.oop.ex03.Member.java
import static com.eomcs.oop.ex03.Member.GUEST;
import 다음에 static 붙여야 됨
com.eomcs.oop.ex03.Exam0210.java
인스턴스 메서드와 클래스 메서드
인스턴스 변수를 사용하지 않을 경우 클래스 메서드로 선언하라!
인스턴스 변수를 사용할 경우 인스턴스 메서드로 선언하라!
일단 인스턴스 메서드로 만들고 인스턴스 변수를 사용하지 않으면 그때 클래스 메서드로 전환하라!
스태틱 메서드와 인스턴스 메서드
static 초기화 블록과 인스턴스 초기화 블록
생성자
로컬 변수가 먼저 다 만들어진다.
스태틱 필드는 Method Area, 인스턴스 필드는 Heap
인스턴스 메서드든 클래스 메서드든 모두 Method Area 영역에 올라간다.
java-lang/bin/main/com/eomcs/oop/ex03/Exam0210$A.class
com.eomcs.oop.ex03.Exam0210.java
인스턴스 메서드 - 내장 변수 this
클래스 메서드는 this 라는 내장 변수가 존재하지 않는다.
인스턴스 주소를 받을 필요가 없다.
인스턴스 메서드는 this 라는 내장 변수가 존재한다.
인스턴스 주소를 받을 변수가 내장되어 있다.
인스턴스 메서드의 this 변수는 메서드를 호출할 때 전달한 인스턴스 주소 값을 가진다.
this에는 유효한 인스턴스 주소가 들어 있어야 한다.
hidden 변수
built-in 변수
클래스 메서드에는 this 라는 변수가 없기 때문에 못 쓰는 거
Local variable table
this를 선언하지 않아도 컴파일러가 자동으로 만든 거
내가 this 선언하면 안 됨
클래스에 인스턴스 변수가 없으면 new 하면 Heap에 아무것도 안 만들어지냐?
최소 메모리가 생성된다.
클래스 정보가 붙는다.
이 인스턴스가 어느 클래스의 인스턴스인지 정보가 붙음
인스턴스를 생성할 때 클래스에 대한 정보가 추가된다.
인스턴스 변수가 없더라도 최소 크기의 인스턴스가 생성된다.
인스턴스가 안 만들어지는 경우는 없다!
인스턴스 메서드의 로컬 변수는 최소 1개는 만들어진다. (this)
NullPointerException
인스턴스 즉시 에러
com.eomcs.oop.ex03.Exam0220.java
스태틱 메서드는 this 라는 변수가 존재하지 않는다.
Cannot use this in a static context
인스턴스 메서드는 인스턴스 주소를 받을 변수가 내장되어 있다. (this)
인스턴스 변수를 사용할 때 this를 생략할 수 있다.
void m4(int value) {
로컬 변수 이름과 인스턴스 변수 이름이 같으면 가까운 로컬 변수 이름을 가리킨다.
인스턴스 변수를 가리키고 싶으면 this 생략하지 말고 this.value 라고 한다.
인스턴스 메서드에는 인스턴스 주소를 받을 수 있는 내장 변수 this가 있다.
인스턴스 메서드의 this 변수는 메서드를 호출할 때 전달한 인스턴스 주소 값을 가진다.
A obj2 = null;
primitive 타입 변수
reference 타입 변수 : 주소 저장
primitive 타입 8개를 제외한 나머지 모든 타입은 주소를 저장하는 레퍼런스 타입이다.
A 클래스 설계도에 따라서 Heap에 만들어진 인스턴스 주소를 담는 변수
클래스 정보... 타입 정보
이 인스턴스가 무슨 타입이냐
인스턴스 메서드는 항상 내장 변수 this가 만들어진다.
인스턴스 변수와 스태틱 변수는 기본값으로 자동 초기화된다.
결국엔 이진수로 0
메모리에 0으로 처리됨
int result;
result : int
변수 선언은 메모리를 만들라는 명령어
변수 선언은 명령문이니까 Method Area에 있음
정수 값을 담을 4바이트 메모리를 준비하라! 그 메모리의 이름을 result로 하자!
this에 저장된 주소로 찾아가서 그 인스턴스의 result 변수 값을 value와 합쳐서 다시 result 변수에 담아라!
인스턴스 메서드든 클래스 메서드든 모두 Method Area 영역에 올라간다.
int i; ← 얘 자체가 변수가 아님. 명령문이다.
i = 100;
JVM Stack에 만들어진 i에 100을 집어넣어라
인스턴스를 사용하지 않는 메서드는 static 메서드로 만든다.
com.eomcs.oop.ex03.Exam0320.java
this 객체
this에 저장된 주소로 찾아가서 그 인스턴스의 kor 값과
this에 저장된 주소로 찾아가서 그 인스턴스의 eng 값과
더해서
this에 저장된 주소로 찾아가서 그 인스턴스의 sum 변수에 집어넣는다.
this 객체 또는 this가 가리키는 객체
static이 되는 순간 this 라는 변수는 사라진다.
static 메서드는 this 라는 변수가 존재하지 않는다.
인스턴스 생성
인스턴스 주소를 앞쪽에서 넘겨준다
this 변수에 호출할 때 넘겨준 인스턴스 주소가 저장된다.
com.eomcs.oop.ex03.Exam0410.java
리턴타입 절대 적으면 안 됨
생성자는 값을 리턴할 수 없음
기본 생성자(default constructor) : 파라미터가 없는 생성자
Score s1 = new Score();
// 드디어 클래스 명 다음에 오는 괄호()의 의미를 알게 되었다.
자바의 모든 클래스는 생성자가 있다.
s3.Score();
// 생성자는 따로 호출할 수 없다!
생성자가 한 개라도 있으면 컴파일러는 기본 생성자를 만들어주지 않는다.
기본 세팅
기본값으로 세팅
이 인스턴스를 쓰기 전에 기본적으로 필수적으로 설정해야 되는 값이 있다면 생성자 안에서 설정하라는 거
유효한 기본값들
0이 아닌 다른 값으로 세팅되어야 하는 상황
유효한 값으로 설정
'생성자'라는 메서드다
자동으로 호출됨
com.eomcs.oop.ex03.Exam0430.java
생성자 - 여러 개의 생성자 정의하기
생성자 파라미터 타입이나 개수가 다르다.
생성자
인스턴스(객체)를 생성한 후, 쓰이기 전에 유효한 값으로 초기화시키는 작업을 수행한다.
생성자가 여러 개일 때, 파라미터에 전달하는 값으로 호출될 생성자를 구분한다.
com.eomcs.oop.ex03.Exam0110 ~ 430
110 ~ 430
Author And Source
이 문제에 관하여(2022-01-04(화) 8주차 1일), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@banana/2022-01-04화-8주차-1일저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)