Download presentation
Presentation is loading. Please wait.
1
원시 변수와 레퍼런스 변수에 대해 알아봅니다. 변수가 저장되는 힙에 대해 알아봅니다. 배열에 대해 알아봅니다.
3장. 네 변수를 알라 원시 변수와 레퍼런스 변수에 대해 알아봅니다. 변수가 저장되는 힙에 대해 알아봅니다. 배열에 대해 알아봅니다.
2
네 변수를 알라 변수의 용도 객체의 상태 지역변수 인자 리턴 유형
3
변수 선언 유형 안전성 (type-safety) 자바에서는 유형을 철저하게 따집니다.
Rabbit hopper = new Giraffe(); hopper.hop(); Rabbit 변수
4
변수 선언 변수를 선언하는 데 있어서 필요한 것 유형 이름 변수 유형 (int, double, String 등)
변수 이름 (count, size, name, myDog 등) int count; 유형 이름
5
원시 유형 변수를 컵에 비유해봅시다. 모 커피 가게에서 파는 컵 크기 자바 원시 정수 변수의 크기
small short tall grande long int short byte
6
원시 유형 정수와 부동소수점 유형 정수 유형 부동소수점 유형 byte short int long 8 16 32 64
float double
7
원시 유형 유형 비트 수 범위 부울과 문자 숫자 (모두 부호가 있음) 부동소수점 소수 boolean JVM에 따라 다름
true, false char 16 비트 0 ~ 65535 숫자 (모두 부호가 있음) 정수 byte 8 비트 -128 ~ 127 short ~ 32767 int 32 비트 ~ long 64 비트 -아주 큰 값 ~ 아주 큰 값 부동소수점 소수 float 다양함 double
8
원시 유형 원시 변수 선언 및 대입 예 int x; x = 234; byte b = 89;
boolean isFun = true; double d = ; char c = ‘f’; int z = x; boolean isPunkRock; isPunkRock = false; boolean powerOn; powerOn = isFun; long big = ; float f = 32.5f;
9
원시값 대입 넘치게 하지 마세요. 변수에 값을 대입할 때는 유형을 잘 맞춰야 합니다. 해당 유형의 변수에 들어갈 수 없는 너무 큰 값을 대입하면 (컵의 크기에 비해 너무 많은 양을 집어넣으려고 하면) 넘치고 말 테니까요. int x = 24; byte b = x; 이와 반대로 큰 컵에 적은 양의 내용물을 집어넣는 것은 가능합니다. byte b = 24; int x = b;
10
원시값 대입 변수에 값을 대입하는 방법 등호 옆에 리터럴 값 입력 한 변수의 값을 다른 변수에 대입
x = 12, isGood = true 등 한 변수의 값을 다른 변수에 대입 x = y 위의 두 가지 방법을 결합한 방법 x = y + 43 int size = 32; char initial = ‘j’; double d = ; boolean isCrazy; isCrazy = true; int y = x + 456;
11
키워드와 변수명 명명 규칙 (클래스, 메소드, 변수) 알파벳, 밑줄(_), 달러 기호($)로 시작해야 합니다.
두 번째 문자부터는 숫자를 쓸 수도 있습니다. 하지만 숫자로 시작할 수는 없습니다. 예약어는 이름으로 쓸 수 없습니다. boolean char byte short int long float double B C B S I L F D Be Careful! Bears Shouldn’t Ingest Large Furry Dogs.
12
예약어 예약어에는 다음과 같은 것이 있습니다. 이런 예약어를 클래스, 메소드, 변수 이름으로 사용하면 반드시 문제가 생깁니다.
절대 쓰지 마세요. boolean byte char double float int long short public private protected abstract final native static strictfp synchronized transient volatile if else do while switch case default for break continue assert class extends implements import instanceof interface new package super this catch finally try throw throws return void const goto
13
객체 레퍼런스 객체란 무엇일까? 객체 변수라는 것은 없습니다. 객체 레퍼런스라는 것만 있습니다.
객체 레퍼런스에는 객체에 접근하는 방법을 알려주는 비트가 들어있습니다. 객체 레퍼런스에는 실제 객체가 들어있는 것은 아니고 그 객체를 가리키는 무언가가 있을 뿐입니다.
14
객체 레퍼런스 Dog d = new Dog(); d.bark();
Dog 레퍼런스 변수는 Dog 객체에 대한 리모컨이라고 생각하면 됩니다. 이 리모컨을 가지고 해당 객체에 어떤 일을 지시할 수 있습니다.
15
객체 레퍼런스 레퍼런스 (비트 수는 중요하지 않음) byte short int long
16
객체 레퍼런스 원시 변수 레퍼런스 변수 Dog 객체 00000111 Dog byte byte x = 7;
Dog myDog = new Dog(); Dog 객체 byte Dog
17
객체 선언, 생성 및 대입 1. 레퍼런스 변수 선언 Dog myDog = new Dog();
18
객체 선언, 생성 및 대입 2. 객체 생성 Dog myDog = new Dog(); Dog 객체
19
객체 선언, 생성 및 대입 3. 객체와 레퍼런스 연결 Dog myDog = new Dog(); Dog 객체
20
바보 같은 질문은 없습니다 레퍼런스 변수의 크기는 얼마인가요?
알 수 없습니다. 레퍼런스의 내부적인 표현 방식은 공개되어있지 않고, 프로그래머 입장에서 굳이 알 필요도 없습니다. 메모리 할당과 관련된 문제를 생각할 때도 중요한 것은 객체 레퍼런스의 개수가 아니라 객체의 개수, 그리고 객체의 크기입니다.
21
바보 같은 질문은 없습니다 그러면 모든 객체 레퍼런스의 크기가 객체의 실제 크기와는 상관없이 똑같은가요?
예. 같은 JVM에서는 객체의 크기와는 상관없이 레퍼런스의 크기는 모두 같습니다. 다만, JVM에 따라서 레퍼런스의 크기가 다를 수는 있습니다.
22
바보 같은 질문은 없습니다 레퍼런스 변수에 대해 C에서처럼 증가 연산 같은 것을 적용시킬 수 있나요?
23
힙과 가비지 컬렉션 1 2 힙 레퍼런스: 2개 객체: 2개 Book b = new Book();
Book c = new Book(); 1 b Book 객체 Book 2 Book 객체 c 힙 Book 레퍼런스: 2개 객체: 2개
24
힙과 가비지 컬렉션 1 2 힙 레퍼런스: 3개 객체: 2개 Book d = c; Book 객체 Book 객체 b Book c
25
x 힙과 가비지 컬렉션 1 2 힙 레퍼런스: 3개 객체: 2개 c = b; Book 객체 Book 객체 b Book c d
26
힙에서의 삶과 죽음 1 2 힙 활성 레퍼런스: 2개 접근할 수 있는 객체: 2개 Book b = new Book();
Book c = new Book(); 1 b Book 객체 Book 2 Book 객체 c 힙 Book 활성 레퍼런스: 2개 접근할 수 있는 객체: 2개
27
힙에서의 삶과 죽음 1 2 힙 활성 레퍼런스: 2개 접근할 수 있는 객체: 1개 버림받은 객체: 1개 b = c;
Book 객체 Book 2 Book 객체 c 힙 활성 레퍼런스: 2개 접근할 수 있는 객체: 1개 버림받은 객체: 1개 Book
28
x 힙에서의 삶과 죽음 1 2 힙 활성 레퍼런스: 1개 널 레퍼런스: 1개 접근할 수 있는 객체: 1개 버림받은 객체: 1개
c = null; 1 b Book 객체 Book 2 x 힙 Book 객체 c 활성 레퍼런스: 1개 널 레퍼런스: 1개 접근할 수 있는 객체: 1개 버림받은 객체: 1개 Book
29
배열 1. int 배열 변수 선언 2. 길이가 7인 int 배열을 만들어서 변수에 대입 3. 각 원소에 int 값 대입
int[] nums; 2. 길이가 7인 int 배열을 만들어서 변수에 대입 nums = new int[7]; 3. 각 원소에 int 값 대입 nums[0] = 6; nums[1] = 19; nums[2] = 44; nums[3] = 42; nums[4] = 10; nums[5] = 20; nums[6] = 1; int 배열 객체 (int[]) nums int[]
30
배열 1. Dog 배열 변수 선언 2. 길이가 7인 Dog 배열을 만들어서 변수에 대입 3. 각 원소에 Dog 레퍼런스 대입
Dog[] pets; 2. 길이가 7인 Dog 배열을 만들어서 변수에 대입 pets = new Dog[7]; 3. 각 원소에 Dog 레퍼런스 대입 Dog 객체 Dog 객체 pets[0] = new Dog(); pets[1] = new Dog(); Dog 배열 객체 (Dog[]) pets Dog[]
31
레퍼런스 변수를 이용한 객체 조작 Dog fido = new Dog(); fido.name = “Fido”;
bark() eat() chaseCat() Dog fido = new Dog(); fido.name = “Fido”; fido.bark(); fido.chaseCat(); Dog 객체 fido Dog
32
배열과 객체 레퍼런스 배열에 들어있는 객체 레퍼런스를 사용할 때도 똑같은 식으로 사용하면 됩니다.
Dog[] myDogs = new Dog[3]; myDogs[0] = new Dog(); myDogs[0].name = “Fido”; myDogs[0].bark(); 92 페이지에 있는 예제를 직접 돌려봅시다.
33
핵심 정리 변수에는 원시 변수와 레퍼런스 변수가 있습니다. 변수를 선언할 때는 이름과 유형이 필요합니다.
원시 변수의 값은 그 값을 표시하는 비트로 구성됩니다. 레퍼런스 변수의 값은 힙에 들어있는 객체를 건드릴 수 있는 방법을 나타내는 비트입니다. 레퍼런스 변수는 리모컨과 같습니다. 레퍼런스 변수에 대해 점 연산자(.)를 사용하는 것은 리모컨의 버튼을 눌러서 메소드나 인스턴스 변수를 액세스하는 것과 비슷합니다. 모든 배열은 객체입니다.
Similar presentations