Presentation is loading. Please wait.

Presentation is loading. Please wait.

Java의 정석 제 2 장 변수(Variable) Java 정석 남궁성 강의

Similar presentations


Presentation on theme: "Java의 정석 제 2 장 변수(Variable) Java 정석 남궁성 강의"— Presentation transcript:

1 Java의 정석 제 2 장 변수(Variable) Java 정석 2008. 4. 15 남궁성 강의
Chapter 2. 변수(Variable) Java의 정석 제 2 장 변수(Variable) 남궁성 강의

2 Java 1. 변수(Variable)란? 2. 변수의 타입(Type) 3. 변수의 선언방법
정석 Chapter 2. 변수(Variable) 1. 변수(Variable)란? 2. 변수의 타입(Type) 3. 변수의 선언방법 4. 명명규칙(Naming Convention) 5. 변수, 상수, 리터럴 6. 리터럴과 접미사 7. 변수의 기본값과 초기화 8. 문자와 문자열 9. 정수의 오버플로우(Overflow) 10. 형변환(Casting)

3 1. 변수(Variable)란? Java 변하는 수? 하나의 값을 저장할 수 있는 기억공간 정석 의
Chapter 2. 변수(Variable) 1. 변수(Variable)란? 변하는 수? 하나의 값을 저장할 수 있는 기억공간

4 2. 변수의 타입(Data type) 값 Java 문자 - char 숫자 정수 - byte , short , int
정석 Chapter 2. 변수(Variable) 2. 변수의 타입(Data type) 문자 - char 숫자 정수 - byte , short , int , long 실수 - float , double 앞에서 변수가 값을 저장하기 위한 기억공간이라고 하였는데요. 변수에 어떤 값을 저장할 것인가에 따라 변수의 타입이 결정됩니다. 그러면… 우리가 자주 사용하는 값의 종류에는 어떤 것들이 있을까요… 먼저 문자가 있겠고요. 가,나, 다, A,B,C와 같은 값들… 그리고 숫자도 있겠지요… 숫자는 다시 정수와 실수로 나눠지고요. 정수는 1,2,3, 100, 200 … 이런 값들이 정수고요. 실수는 0.1, 3.14와 같이 소수점이 있는 수라는 것은 설명을 안해도 이미 잘 알고 계실겁니다. 변수에 문자를 저장하고자 한다면, 변수의 타입을 char로 지정해야하고요. 정수를 저장하고자 한다면, byte, short, int, long 중의 하나를 선택해야야합니다. 정수는 가장 많이 쓰이는 값이기 때문에… 4개의 타입으로 세분화 하였고요. 저장하고자 하는 값의 크기와 용도에 따라 이 4개의 타입 중에서 선택하면 됩니다. 각 타입의 차이와 특징에 대해서는 잠시 후에 자세히 알아볼 것입니다. 그리고… 실수에는 float와 double 두 개의 타입이 있습니다. 이 외에… 논리값을 저장하는데 사용되는 boolean이 있는데요. boolean타입의 변수에는 참과 거짓을 의미하는 true와 false를 저장할 수 있습니다. 자바에서는 이처럼 값의 종류에 따라 8개의 타입을 정의하였는데요. 이 8개의 타입을 기본형, primitive type이라고 합니다. 값, 즉 데이터를 저장하는데 가장 기본이 되는 타입이라는 것이죠. 논리 - boolean

5 2. 변수의 타입(Data type) Java 정석 ▶ 기본형(Primitive type)
Chapter 2. 변수(Variable) 2. 변수의 타입(Data type) ▶ 기본형(Primitive type) 8개 (boolean, char, byte, short, int, long, float, double) 실제 값을 저장 변수의 타입은 크게 기본형과 참조형… 두 가지로 나눌 수 있는데요. 기본형은 방금 전에 배우신 8개의 타입… boolean, char, byte, short, int, long, float, double을 말하고요… 변수의 타입이 기본형인 경우, 변수는 실제 값을 저장합니다. 참조형은 기본형 8개를 제외한 나머지 타입이 모두 해당됩니다. 기본형은 자바를 설계한 사람들이 8개로 정해놓았기 때문에 더 추가할 수 없지만 참조형은 우리 마음대로 추가할 수 있습니다. 만일 우리가 새로운 클래스를 정의하면 새로운 참조형이 하나 생성되는 겁니다. 그래서 기본형과 달리 참조형은 그 수가 정해져있지 않습니다. 클래스에 대해서는 나중에 자세히 설명할 것이니까 지금은 참고만 하고 넘어가세요. 기본형에는 실제 값을 저장하지만, 참조형에는 객체의 위치를 알려주는 객체의 주소값을 저장합니다. 객체를 생성하고, 생성된 객체의 주소를 참조형 변수에 저장해서 객체를 다룰 수 있게 되는 것입니다. 기본형 변수들은 타입에 따라서 크기가 다르지만, 모든 참조형 변수는 4 byte로 동일합니다. 그래서 참조형이 가질수 있는 값의 범위를 16진수로 표시하면 0부터 ffffffff(에프 * 8)…. 모두 8개의 f가 나오는데요. F는 16진수로 15를 의미하고요. 하나의 f는 4bit이므로 4곱하기8은 32이므로 32비트 즉 4바이트가 됩니다. ▶ 참조형(Reference type) - 기본형을 제외한 나머지(String, System 등) - 객체의 주소를 저장(4 byte, 0x ~0xffffffff)

6 기본형(Primitive type) Java 정석
정석 Chapter 2. 변수(Variable) 기본형(Primitive type) ▶ 논리형 – true와 false중 하나를 값으로 갖으며, 조건식과 논리적 계산에 사용된다. ▶ 문자형 – 문자를 저장하는데 사용되며, 변수 당 하나의 문자만을 저장할 수 있다. ▶ 정수형 – 정수 값을 저장하는데 사용된다. 주로 사용하는 것은 int와 long이며, byte는 이진데이터를 다루는데 사용되며, short은 c언어와의 호환을 위해 추가되었다. ▶ 실수형 – 실수 값을 저장하는데 사용된다. float와 double이 있다. 크기 종류 논리형 문자형 정수형 실수형 1 2 4 8 이제 기본형에 대해서 자세히 알아보도록 하겠습니다. 기본형은 크게 논리형, 문자형, 정수형, 실수형으로 나눌 수 있고요. 논리형은… boolean하나 밖에 없고요. True와 false 중 하나를 값으로 갖으며, 조건식과 논리적 계산에 사용됩니다. 문자형도 char하나 밖에 없고요. 문자를 저장하는데 사용됩니다. 그런데, char타입의 변수는 단 한 개의 문자밖에 저장할 수 없습니다. 여러문자를 저장하려면 String을 사용해야하는데요. String에 대해서는 잠시후에 다시 설명 드리겠습니다. 정수형은 byte, short, int, long이 있는데… 주로 사용되는 것은 int와 long입니다. Byte는 이진데이터를 다루는데 사용되고요. Short은 C언어와의 호환을 위해 추가하였지만, 잘 사용되지 않습니다. 마지막으로 실수형에는 float와 double이 있죠. 기본형을 종류와 크기로 분류해서 표를 그려보겠습니다. 크기는 1부터 시작해서 두배로 올라갑니다. 1, 2, 4, 8 바이트… 제일 큰 자료형이 8바이트입니다. 논리형 boolean은 1바이트이고요. 문자형 char는 2바이트, byte는 1바이트 short은 2바이트 int는 4바이트 long은 8바이트… Float는 4바이트 double은 8바이트입니다. 이 표는 여러분들이 직접 여러 번 그려서… 완전히 외워야하는 데요. 제 설명을 듣고 나면 외우기가 좀 쉬워지실 겁니다. Boolean은 true와 false 두가지 값 밖에 없기 때문에… 1 bit만으로도 충분히 저장이 가능하지만 자바에서 데이터를 다루는 최소단위가 byte이기 때문에 좀 낭비같지만 1 byte를 사용합니다. 자바에서는 2바이트 문자체계인 유니코드를 사용하기 때문에 char의 크기는 2byte입니다. Byte는 크기가 1 byte라서 byte이고요. 4바이트인 int를 기준으로 짧아서 short이고 길어서 long입니다. Short은 4바이트인 Int보다 작으니까 2 byte이고요. Long은 크니까 8 바이트 입니다. Short과 long은 서로 반대말이니까 외우기 쉽죠? Float는 실수를 부동 소수점 방식… floating-point방식으로 저장하기 때문에 float이고요. Double은 float보다 두배의 정밀도를 갖기 때문에 double입니다. 크기도 float의 두배인 8바이트죠. 정수형 중에는 int가 default타입이고요. 실수형 중에는 double이 default타입입니다. Default타입에 대해서는 나중에 다시 설명하겠습니다. boolean char byte short int long float double

7 Java 정석 1 bit 8 bit = 1 byte byte -27 ~ 27-1
정석 Chapter 2. 변수(Variable) 1 bit 8 bit = 1 byte byte -27 ~ 27-1 float =32 bit = 4 byte S 7 bit S E(8) M(23) short ~ 215-1 double =64 bit = 8 byte S 15 bit S E(11) M(52) char 0 ~ 216-1 가장 작은 데이터 단위는 비트입니다. 1 bit로 표현할 수 있는 수는 0과 1 두 개 입니다. 비트가 8개 모이면 1 byte가 됩니다. 1 byte는 2의 8제곱, 즉 256개의 수를 표현할 수 있습니다. 정수형인 byte는 1 byte, 즉 8비트 입니다. 8개의 자리 중에서 맨 왼쪽 한자리는 부호자리로 사용합니다. 부호자리의 값이 0이면 양수이고 1이면 음수입니다. 그래서 Byte로 표현할 수 있는 값의 범위는 -2의 7제곱 부터 2의 7제곱 -1입니다. -1을 해주는 이유는 범위에 0이 포함되어 있기 때문입니다. 음수 128개+ 양수 127개 + 1개(0) 모두 합하면 256개입니다. ( =256) 좀전에 설명한 것과 같이… 8비트로는 256개의 숫자를 표현할 수 있습니다. Short과 char은 둘다 2byte라서 표현할 수 있는 값의 수가 2의 16제곱, 즉 65536개입니다. Char는 문자를 저장하기 위한 타입이지만 실제로는 문자의 코드인 숫자, 정수가 저장됩니다. 그래서 char는 정수와 관계가 깊습니다. 문자의 코드에는 음수가 없기 때문에 맨 왼쪽 한자리를 부호자리로 사용하지 않습니다. 그래서 short과 char가 표현할 수 있는 수의 개수는 같지만, 범위는 서로 다르다는 것을 확인하세요. 4개의 정수형 중에서 int를 주로 사용합니다. 저장할 값의 범위가 적다고 해서 메모리를 절약할 의도로 byte나 short을 사용하지 않는 것이 좋습니다. 값의 범위를 넘기 쉽고, 연산과정에서 int로 자동변환되기 때문입니다. 전 페이지에서 설명한 것과 같이 byte는 이진데이터를 저장할 때, short은 c언어와의 호환을 위해서 사용하시면 됩니다. 그 외의 경우에는 정수를 저장할 때 int를 사용하세요. Int의 범위를 넘는 수를 저장할 때만 long을 사용하면 됩니다. Int의 최대값은 2의 31제곱이니까… 2곱하기 2의 10제곱 곱하기 2의 10제곱 곱하기 2의 10제곱입니다. 2의 10제곱은 1024이므로 1000으로 계산하면…. 2*1000*1000*1000 즉 2곱하기 10의 9제곱입니다. 각 타입의 크기만 알면 이와 같은 방식으로 최대값과 최소값을 계산할 수 있기 때문에 각 타입의 최대값, 최소값을 굳이 외우지 않아도 됩니다. 실수는 정수와 저장방식이 달라서 부호자리, 지수, 가수… 이렇게 세부분으로 되어 있습니다. 예를 들어 실수 는 * 10의 2제곱으로 표현할 수 있고 가수는 이고요. 지수는 2가 됩니다. float는 최대 10의 38제곱 정도의 값을 저장할 수 있으며 소수점이하 7~9자리까지 표현할 수 있습니다. 실수의 크기가 10의 38제곱을 넘거나 소수점 이하 7~9자리를 넘는 정밀도를 요구하는 경우에는 Double을 사용해야 합니다. 16 bit int ~ 231-1 S 31 bit long -263 ~ 263-1 S 63 bit

8 3. 변수의 선언방법 타입 변수명; Java int score ; score = 100; int score = 100;
정석 Chapter 2. 변수(Variable) 3. 변수의 선언방법 타입 변수명; int score ; score = 100; int score = 100; 변수에 값을 저장하기 위해 제일 먼저 해야하는 일이 변수를 선언하는 것입니다. 변수를 선언하는 방법은 아주 간단합니다. 변수의 타입과 변수명을 써주기만 하면 됩니다. 정수값을 저장하기 위해 다음과 같이 int타입의 score라는 변수를 선언하면… Int의 크기인 4 byte의 기억공간이 만들어집니다. 변수명은 가능하면 이해하기 쉬운 의미있는 것으로 하는 것이 좋고요. 변수끼리 서로 구별될 수 있게 다른 이름을 사용해야 합니다. 저장공간이 마련되었으니, 이제 이 저장공간에 값을 저장해야겠죠. 예를 들어 score라는 변수에 100을 저장하려면 이와 같이 합니다.(밑줄그면서…) 이 등호는 같다는 의미가 아니라 오른쪽 값을 왼쪽 변수에 저장하라는 의미입니다. 자세한 것은 제3장 연산자에서 다룰 것이고요. 지금은 변수에 값을 저장하려면 이렇게 한다고만 알아두세요. 이 두 라인을 아래와 같이 한 줄로 줄여쓸 수도 있습니다. 그 아래줄은 참조형 변수의 경우를 예로 들은 건데요… 변수 str의 타입이 전에 배운 8개의 기본형이 아니지요? 기본형이 아닌 것은 모두 참조형입니다. 참조형에는 실제 값이 아닌 객체의 주소값이 들어간다고 했습니다. 그러면 이 라인이 수행되었을 때 어떤일이 일어나는지 그림으로 설명하겠습니다. 먼저 String타입의 변수 str이 만들어지고요. 참조변수는 모두 4바이트니까 4바이트의 기억공간이 만들어지고요. 그 다음에 “abc”라는 문자열을 담은 String객체가 만들어집니다. 그리고 객체가 만들어진 주소가 변수 str에 저장됩니다. 만일 String객체가 주소 0x100에 만들어졌다면 변수 str에는 0x100이 저장되겠죠. 그리고 이 변수가 객체를 참조하고 있다는 의미로 화살표를 그려줍니다. 그 다음 라인에서 참조형 변수 str에 null을 저장하면 str에는 null이 됩니다. Null이라는 것은 0과는 달라서 아무런 값도 갖지 않는 것을 의미합니다. 참조형 변수가 null이라는 것은 어떠한 객체도 참조 하고 있지 않다는 것을 의미합니다. (변수의 값을 null로 바꾸고... 화살표를 지운다.) String str = new String(“abc”); str = null;

9 4. 명명규칙(Naming convention)
Java 정석 Chapter 2. 변수(Variable) 4. 명명규칙(Naming convention) 1. 대소문자가 구분되며 길이에 제한이 없다. - True와 true는 서로 다른 것으로 간주된다. 2. 예약어(Reserved word)를 사용해서는 안 된다. - true는 예약어라 사용할 수 없지만, True는 가능하다. 명명규칙이라는 것은 이름을 짓는 규칙을 말합니다. 변수나 클래스, 메서드 등의 이름을 지을 때 지켜야하는 몇가지 규칙이 있습니다. 첫번째, 대소문자가 구분되며 길이에 제한이 없다. 처음에 자바를 배울때 제일 실수를 많이 하는 것이 대소문자인데요. 자바는 대소문자를 구분하기 때문에 주의를 많이 기울이셔야합니다. 이름을 지을 때 길이에 제한이 없다고는 하지만 전혀 제한이 없는 것은 아니고요. 의미를 이해하기 쉬울정도의 적당한 길이로 하면 되겠습니다. 두번째로 예약어를 사용해서는 안된다. 자바에서 자체적으로 사용하는 단어들이 있습니다. 이 단어들을 예약어 또는 키워드라고도 하는데요. 예를 들어 int나 long과 같은 것들이 모두 예약어입니다. Int나 long을 변수나 메서드의 이름으로 사용해서는 안된다는 얘깁니다. 책에 보면 예약어 목록이 나와있긴 한데요. 굳이 따로 외우실 필요는 없고요… 진도를 나가면서 하나씩 배워나가면 됩니다. 에딧플러스와 같은 에디터에서 예약어는 따로 구별할 수 있도록 색깔로 표시해주기도 합니다. 세번째, 숫자로 시작해서는 안된다. 네번째로 특수문자는 _와 $만을 허용한다. 자바는 유니코드를 지원하기 때문에 변수의 이름을 지을 때 한글을 사용할 수도 있지만, 특수기호는 사용할 수 없습니다. 단지 언더스코어와 달러표시만을 허용합니다. 3. 숫자로 시작해서는 안 된다. - top10은 허용하지만, 7up은 허용되지 않는다. 4. 특수문자는 ‘_’와 ‘$’만을 허용한다. - $harp은 허용되지만 S#arp는 허용되지 않는다.

10 4. 명명규칙 - 권장사항 Java 1. 클래스 이름의 첫 글자는 항상 대문자로 한다.
정석 Chapter 2. 변수(Variable) 4. 명명규칙 - 권장사항 1. 클래스 이름의 첫 글자는 항상 대문자로 한다. - 변수와 메서드 이름의 첫 글자는 항상 소문자로 한다. 2. 여러 단어 이름은 단어의 첫 글자를 대문자로 한다. - lastIndexOf, StringBuffer 바로 전에 배운 4가지 명명규칙 외에 몇가지 권장사항이 더 있는데요. 말 그대로 권장사항이라서 반드시 지켜야하는 것은 아니지만 많은 자바개발자들이 따르는 규칙이므로 가능하면 지키는 것이 좋습니다. 첫번째, 클래스 이름의 첫글자는 항상 대문자로 한다. 어떤 이름을 봤을 때 첫글자가 대문자이면… 아 … 이것은 클래스 이구나…하고 쉽게 알 수 있습니다. 반대로 변수와 메서드의 이름은 첫글자를 소문자로 해야겠죠. 두번째, 여러 단어 이름은 단어의 첫 글자를 대문자로 한다. 여러단어의 조합으로 이루어진 이름은 각 단어의 첫글자는 대문자로 해서 가독성을 높이는게 좋습니다. 예를 들면 lastIndexOf는 last, index, of 모두 세단어로 이루어져 있는데 각 단어의 첫글자를 대문자로 하니까 훨씬 눈에 잘 들어옵니다. lastIndexOf의 첫글자가 대문자가 아니니까 클래스이름이 아니라는 것을 추측할 수 있고요. StringBuffer는 두 단어로 이루어져 있는데… 첫글자가 대문자이니 클래스라는 것을 알 수 있습니다. 세번째로… 상수의 이름은 대문자로 한다. 단어는 ‘_’로 구분한다. 상수는 변수처럼 값을 저장할 수 있기는 한데, 한번 저장하면 값을 바꿀 수 없는 것이 상수입니다. 상수의 이름은 모두 대문자로 해서 변수와 쉽게 구별할 수 있게 하는 것이 보통입니다. 그리고 모두 대문자이기 때문에 여러단어로 이루어진 경우 ‘_’를 이용해서 구분해줍니다. 3. 상수의 이름은 대문자로 한다. 단어는 ‘_’로 구분한다. - PI, MAX_NUMBER

11 5. 변수, 상수, 리터럴 Java int score = 100; score = 200; char ch = ‘A’;
정석 Chapter 2. 변수(Variable) 5. 변수, 상수, 리터럴 ▶ 변수(variable) – 하나의 값을 저장하기 위한 공간 ▶ 상수(constant) – 한 번만 값을 저장할 수 있는 공간 ▶ 리터럴(literal) – 그 자체로 값을 의미하는 것 int score = 100; score = 200; char ch = ‘A’; String str = “abc”; ` final int MAX = 100; MAX = 200; // 에러

12 6. 리터럴과 접미사 Java boolean power = true; long l = 10000000000L;
정석 Chapter 2. 변수(Variable) 6. 리터럴과 접미사 boolean power = true; long l = L; char ch = ‘A’; float f = 3.14f char ch = ‘\u0041’; double d = 3.14d char tab = ‘\t’; float f = 100f; byte b = 127; 10. 10.0 개행문자는 ‘\n’이라고 설명한다. short s = 32767; .10 0.10 int i = 100; 10f 10.0f 3.14e3f 3140.0f int oct = 0100; 1e1 10.0 int hex = 0x100;

13 7. 변수의 기본값과 초기화 Java 변수의 초기화 : 변수에 처음으로 값을 저장하는 것 정석
Chapter 2. 변수(Variable) 7. 변수의 기본값과 초기화 변수의 초기화 : 변수에 처음으로 값을 저장하는 것 * 지역변수는 사용되기 전에 반드시 초기화해주어야 한다. 자료형 기본값 boolean false char ‘\u0000’ byte short int long 0L float 0.0f double 0.0d 또는 0.0 참조형 변수 null boolean isGood = false; char grade = ‘ ‘; // 공백 byte b = 0; short s = 0; int i = 0; long l = 0; // 0L로 자동변환 float f = 0; // 0.0f로 자동변환 double d = 0; // 0.0로 자동변환 String s1 = null; String s2 = “”; // 빈 문자열 변수의 초기화란 변수에 처음으로 값을 저장하는 것을 초기화라고 하는데요. 변수의 선언과 동시에 적절한 값으로 초기화 해주는 것이 좋습니다. 변수의 종류에 따라서… 각 타입의 기본값으로 자동 초기화되기도 하는데요. 지역변수는 자동초기화가 되지 않습니다. 여러분들이 6장 객체지향개념에 들어가기 전까지 선언할 변수는 모두 지역변수이기 때문에 변수를 선언하고 나면 반드시 직접 초기화를 해주셔야 합니다. 그렇지 않으면 컴파일 할 때 에러가 발생합니다. 오른쪽 코드와 같이 선언과 동시에 초기화 해주도록 하세요. 먼저 왼쪽의 표를 보시면… 각 변수 타입의 기본값이 있습니다. 이 값들은 변수가 자동초기화 될 때 사용되는 값인데요. 자동초기화에 대해서는 나중에 자세히 설명할 것이고요. 지금은 각 타입의 기본값을 가볍게 확인하고 넘어가시면 되겠습니다. Boolean의 기본값이 false라는 것 눈여겨 보시고요. 숫자타입은 다 0인데… long은 0이 아니라 0L이라는 것. 그리고 float의 경우 반드시 접미사 f를 붙여줘야 한다는 것에 주의 하시면 되겠습니다. 그리고 모든 참조형 변수의 기본값은 null입니다. Null은 어떠한 객체도 참조하지 않고 있다는 것을 의미합니다.

14 8. 문자와 문자열 Java “” + 7 “” + “7” “7” “”+7+7 “7”+7 “7”+”7” “77” 7+7+””
정석 Chapter 2. 변수(Variable) 8. 문자와 문자열 char ch = ‘A’; String s1 = “A” + “B”; // “AB” char ch = ‘AB’; // 에러 “” + 7 “” + “7” “7” String s1 = “AB”; char ch = ‘’; // 에러 “”+7+7 “7”+7 “7”+”7” “77” String s1 = “”; 이번엔 문자와 문자열에 대해서 정리해보겠습니다. 문자를 저장하는 char타입의 변수로는 단 하나의 문자밖에 저장할 수 없습니다. 그래서 이와 같이 둘 이상의 문자를 저장하려고 하면 에러가 발생합니다. 여러 문자를 저장하려면 문자열을 사용해야 하는데요… 자바에서는 문자열을 String이라는 클래스를 제공합니다. 원래 클래스는 객체를 생성해야하는데… String클래스의 경우에만 특별하게 기본형에 값을 저장하는 것과 같은 표현을 허용합니다. String에는 아무런 내용도 없는 빈문자열을 저장할 수 있지만 Char는 반드시 한 문자를 지정해주어야합니다. 그리고 String은 문자열을 덧셈연산자를 통해 결합할 수 있습니다. 이렇게 A와 B 두 개의 문자열을 더하면 AB가 됩니다. 문자열끼리만 결합할 수 있는게 아니라 문자열과 숫자를 결합할 수 도 있습니다. 빈 문자열과 숫자7을 더하면, 숫자 7이 문자열 7로 자동변환 된다음에 결합되어 문자열 7을 결과로 얻습니다. 프로그래밍을 하다보면 기본형과 문자열간의 변환을 해야하는 경우가 많은데요. 이 것이 바로 숫자를 문자열로 변환하는 방법이고요. 반대로 문자열을 숫자로 변환하는 방법은 앞으로 배우게 될 것입니다. 문자열 결합은 왼쪽에서 오른쪽으로 진행되기 때문에… 순서에 따라 전혀다른 결과가 나올 수도 있습니다. 어떠한 타입의 값이든 문자열과 결합하면 … 그 결과는 문자열이 된다는 사실을 잘 기억해두세요. 7+7+”” 14+”” “14”+”” “14” 문자열 + any type 문자열 any type + 문자열 문자열

15 9. 정수의 오버플로우(Overflow) Java 정석 byte b = 127; byte b = 128; //에러
Chapter 2. 변수(Variable) 9. 정수의 오버플로우(Overflow) byte b = 127; byte b = 128; //에러 b = b + 1; // b에 저장된 값을 1증가 최대값 127 2 1 -1 -2 -128 최대값 999 998 001 000 -127 -128 127 126 001 000 999 998 정수의 오버플로우라는 것은 정수에 저장할 수 있는 최대값을 넘는 것을 의미합니다. 먼저 다음과 같이 byte타입의 변수 b에 byte타입의 최대값인 127을 저장합니다. 만일 byte타입의 최대값을 넘는 128로 초기화 하려고 하면 에러가 발생합니다. 그러면… b에 127이 저장되어 있을 때 b의 값을 1 증가시키면 어떤 결과가 나올까요… Byte가 저장할 수있는 최대값을 넘었지만 에러가 발생하지 않습니다. 그러나 우리가 예상한 것과 달리 128이 아닌 -128을 결과로 얻습니다. 왜냐면… 최대값을 넘어서면 최소값이 되기 때문입니다. 이해하기 쉽게 제가 그림을 그려봤습니다. 긴 종이에 Byte의 최소값 부터 최대값을 순서대로 적은 다음, 양 끝을 붙이면… 이런 모양이 될 것입니다. 최대값인 127에서 1증가하면 최소값인 -128이 되고 최소값인 -128에서 1이 감소하면 최대값인 127이 됩니다. 이 것은 마치 자동차 주행거리 메터기와 같이 0부터 시작해서 최대값이 넘어가면 다시 0이 되는 것과 같은 이치입니다. 비교해보면 쉽게 이해가 가실 겁니다. 최소값 최소값 최대값 최대값 최소값 최소값

16 Java 정석 1. 부호가 없는 정수 2. 부호가 있는 정수 최대값 최대값 최소값 최소값 최대값 최대값 최소값 최소값 1111
정석 Chapter 2. 변수(Variable) 1. 부호가 없는 정수 2. 부호가 있는 정수 최대값 1111 1110 0001 0000 최대값 0111 0110 0001 0000 1111 1001 1000 0001 0000 1111 1110 1001 1000 0111 0110 최소값 최소값 최대값 최대값 이번엔 실제로 정수가 저장되는 방식인 2진수로 예를 들겠습니다. 4 bit는 2의 4제곱인 16개의 값을 표현할 수 있기 때문에 0부터 15까지의 값을 표현할 수 있습니다. 그러나 부호가 있는 경우에는 범위가 달라서 -8~7까지의 값을 표현할 수 있습니다. 그래서 부호가 있는 경우에는 2진수 1111이 10진수로 15이지만, 부호가 있는 경우 -1이 됩니다. 이처럼 2진수로 같은 표현이더라도 부호가 있을 때와 없을 때가 서로 다르다는 것을 알 수 있습니다. 여기서 보면 0000보다 하나 작은 값이니까 -1이라는 것을 쉽게 아실 수 있습니다. 0001이 1이라고 해서 -1은 부호자리가 1인 1001이 -1이 아니냐고 질문받는 경우도 있는데요. 음의 정수는 부호자리의 값만 바꾼다고 해서 얻을 수 있는 것은 아니고요. 변환하는 방법이 있습니다. 다음장인 제 3장 연산자에서 자세히 설명하겠습니다. 여러분들의 이해를 돕기 위해 제가 2진수 카운터를 만들어봤습니다. 10진수라면 9다음에 0이 되겠지만 2진수니까 1다음에 0이 됩니다. 최소값 최소값 1씩 증가하는 2진 카운터 1씩 감소하는 2진 카운터 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

17 10. 형변환(Casting) Java 형변환이란? 정석 - 값의 타입을 다른 타입으로 변환하는 것이다.
Chapter 2. 변수(Variable) 10. 형변환(Casting) 형변환이란? - 값의 타입을 다른 타입으로 변환하는 것이다. - boolean을 제외한 7개의 기본형은 서로 형변환이 가능하다. float f = 1.6f; int i = (int)f; 형변환… 형변환이란… 값의 타입을 다른 타입으로 변환하는 것입니다. 프로그래밍을 하다보면 서로 다른 타입의 값들을 계산해야하는 경우가 자주 발생합니다. 우리가 덧셈을 할 때 자리수를 맞춰주는 것 처럼… 계산을 하기전에 값의 타입을 맞춰준 다음에 계산을 합니다. 형변환하는 방법은 아주 간단합니다. 형변환 하려는 타입을 괄호안에 적어서 리터럴이나 변수 앞에 붙여주기만 하면 됩니다. 기본형과 참조형간에는 형변환이 안되고요. 기본형 중에는 boolean을 제외한 7개의 타입은 형변환이 가능합니다. 정수를 char타입으로 변환하면, 정수값에 해당하는 유니코드의 문자가 되고 문자를 int타입으로 변환하면, 문자의 유니코드값을 얻을 수 있습니다. 그리고. 실수값을 정수로 형변환 할 때 반올림이 아닌 버림이 된다는 점… 주의하시기 바랍니다. 변 환 수 식 결 과 int → char (char)65 ‘A’ char → int (int)‘A’ 65 float → int (int)1.6f 1 int → float (float)10 10.0f

18 Java 정석 1. byte → int 2. int → byte byte b = 10; int i2 = 300;
정석 Chapter 2. 변수(Variable) 1. byte → int byte b = 10; int i = b; // 생략가능 2. int → byte int i2 = 300; byte b2 = (byte)i2; // 생략불가 (int) 타입을 변환하는 경우에는 형변환을 명시해주는 것이 원칙이지만… 크기가 작은 타입에서 큰타입으로 변환하는 경우에는 형변환을 생략할 수 있습니다. 형변환을 생략했다고 해서 형변환이 안되는 것은 아니고… 실행시에 컴퓨터에 의해서 자동적으로 형변환이 됩니다. 반대로 큰 타입에서 작은 타입으로 형변환하는 경우에는 반드시 명시적으로 형변환을 해줘야합니다. 그렇지 않으면 컴파일 시에 에러가 발생합니다. 큰타입에서 작은 타입으로 변환하는 경우에는 값손실이 발생할 수 있지만, 작은 타입에서 큰 타입으로 변환하는 경우에는 값손실이 발생하지 않기 때문에 형변환을 자동적으로 수행하도록 허용하는 것입니다. 형변환 과정을 그림으로 보면… Byte를 int로 변환하는 경우에는 1바이트를 4바이트에 저장하는 것이기 때문에 나머지 빈자리 3바이트를 0으로 채우기만 하면 되므로 원래의 값이 손실없이 보존됩니다. 그러나 int를 byte로 변환하는 경우에는 4바이트의 값을 1바이트에 저장하는 것이기 때문에 원래의 4바이트 중에서 앞의 3바이트를 잃게 되므로 값손실이 발생할 수 있습니다. 아래 그림에서 화살표 방향으로의 변환은 형변환을 생략할 수 있다는 것을 의미합니다. Short과 char는 같은 2바이트이지만 표현할 수 있는 값의 범위가 서로 다르기 때문에 자동형변환이 되지 않습니다. Long이 8바이트인데도 4바이트인 float로 자동형변환이 되는 이유는 Float가 4바이트이지만, long과는 표현방식이 달라서 더 큰 범위를 표현할 수 있기 때문입니다. 형변환을 할 때는 형변환을 명시적으로 해주면 제일 확실하겠지만, 자동형변환되는 경우에는 생략하는 것이 보다 깔끔한 코딩이 될 것입니다.

19 감사합니다. http://www.javachobo.com Java 정석
정석 Chapter 2. 변수(Variable) 감사합니다. 더 많은 동영상강좌를 아래의 사이트에서 구하실 수 있습니다. 이 동영상강좌는 비상업적 용도일 경우에 한해서 저자의 허가없이 배포하실 수 있습니다. 그러나 일부 무단전제 및 변경은 금지합니다. 관련문의 : 남궁성


Download ppt "Java의 정석 제 2 장 변수(Variable) Java 정석 남궁성 강의"

Similar presentations


Ads by Google