🟨 목 차 🟨
1. 자바에서는 네 가지의 변수가 존재한다.
2. 변수 이름은 이렇게 지어라.
3. 크게 보면 자바에는 두 가지 자료형이 있다.
4. 8비트와 byte 타입
5. byte 형이 만들어진 이유
6.다른 정수형 타입들은 어떻게 활용할까?
7. 소수점을 처리하고 싶다.
8. char와 bolean는 어떻게 쓰이는 건가?
9. 기본 자료형의 기본 값은 뭘까?
◼️ 1. 자바에서는 네 가지의 변수가 존재한다. ◼️
어떤 프로그래밍 언어를 사용하든 간에, 내용을 어디엔가 담아 둬야 한다. 그 담아 두는 것을 변수라고 한다.
그 담아 두는 것에는 항상 이름을 정해 주어야 한다.
package Part3;
public class Calc {
public static void main(String[] args) {
System.out.println("Calculator class started");
Calculator calc = new Calculator();
int a = 10;
int b = 20;
calc.add(a, b);
calc.substract(a, b);
calc.multiply(a, b);
calc.divide(a, b);
System.out.println("add= " + calc.add(a, b) );
System.out.println("substract= " + calc.substract(a, b) );
System.out.println("multiply= " + calc.multiply(a, b) );
System.out.println("divide= " + calc.divide(a, b) );
}
}
저번 시간에 했던 코드를 보자. 여기서 변수를 찾아보면 누가 봐도 10과 20를 저장한 a,b가 변수이다. 하지만 또 변수가 있다.
바로 args 이다. 변수는 영어로 number가 아니라 variable인데 이것은 변동이 심한, 가변적인 이라는 뜻이 있다.
==> 즉, 변수는 한국말로 변수일 뿐이지 숫자를 의미하는 것이 절대 아니다. 그래서 args도 변수 이다.
또한 calc 또한 변수이다. 왜냐하면 객체이기 때문에 뭔가를 담아 둘 수 있기 때문이다.
결론으로 자바에서는 네 가지의 변수가 있다.
- 지역 변수 : 중괄호 내에서 선언된 변수, 지역 변수를 선언한 중괄호 내에서만 유효하다
- 매개 변수 : 메소드에 넘겨주는 변수, 메소드가 호출될 때 생명이 시작되고, 메소드가 끝나면 소멸된다.
- 인스턴스 변수 : 메소드 밖에, 클래스 안에 선언된 변수, 앞에는 static이라는 예약어가 없어야 한다.
객체가 생성될 때 생명이 시작되고, 그 객체를 참조하고 있는 다른 객체가 없으면 소멸되다. - 클래스 변수 : 인스턴스 변수처럼 밖에, 클래스 안에 선언된 변수 중에서 타입 선언 앞에 static이라는 예약어가 있는 변수
클래스가 처음 호출될 때 생명이 시작되고, 자바 프로그램이 끝날 때 소멸된다.
네 가지 변수들에 대해 위치가 다르다고 복잡하게 이름을 지어주는 이유는 무엇일까 ?
==> 각 변수의 생명주기가 다르기 때문에 이름을 구분지어 불러준다.
[EX]
package Part4;
public class VariableTypekor {
int instanceVariable; // 인스턴스변수
static int classVariable; //클래스변수
public void method(int parametor) { // 매개변수
int localVariable; // 지역변수
}
}
또한 다른 메소드의 지역 변수의 이름이 같아도 그 변수는 서로 다른것이다.
또한 같은 중괄호 안에서 지역변수 이름을 동일하게 선언하면 안된다.
◼️ 2. 변수 이름은 이렇게 지어라. ◼️
- 길이의 제한은 없다.
- 첫 문자는 유니코드, 알파벳, $, _ 만 올 수 있다. [ 일반적으로 보통 $와 _로 시작하지 않는다.
- 두번째 문자부터는 유니코드 문자, 알파벳, 숫자, $, _ 중 아무것이나 사용할 수 있다.
- 보통은 메소드 이름처럼 지정해서 사용한다. 첫 문자는 소문자로 시작하는 단어이고, 두번째 단어의 첫 문자만 대문자로 시작하면 된다.
- 상수(Constat value)의 경우에는 모두 대문자로 지정하며, 단어와 단어 사이에는 _로 구분을 한다. 여기서 상수라는 것은 절대 변하지 않는 값을 이야기한다. 따라서 계속 값이 변하는 일반적인 변수는 _를 붙이지 않는게 좋다.
[EX]
- 사용 가능한 예 : godOfJava, $godOfJava, _god_of_java, god_of_java, BASIC_JAVA, godOfJava1, godOfJava2
- 사용 불가한 예 : 8thBook
- 사용 가능하면서 명명 규칙을 잘 지킨 예 : godOfJava, BASIC_JAVA, godOfJava1, godOfJava2
◼️ 3. 크게 보면 자바에는 두 가지 자료형이 있다. ◼️
자바의 타입(자료형)은 기본 자료형, 참조 자료형으로 나뉜다.
참조 자료형은 우리가 마음대로 만들 수 있지만, 기본 자료형은 우리가 추가로 만들 수 없다.
int a= 10;
Calculator calc = new Calculator();
위의 두 코드를 보게 되면 int를 초기화 할때는 그냥 값을 바로 적어 주었고, Calculator를 초기화 할때는 new라는 예약어를 생성을 한다.
자바에서는 이렇게 new를 사용해서 초기화 하는것을 참조 자료형, 그렇지 않고 바로 초기화가 가능한 것을 기본 자료형이라고 한다.
*참조 자료형중에서 딱 하나 예외 인 것이 있는데 바로 문자열을 다루는 String 이다.
String을 초기화 할 수 있는 방법은 값을 바로 넣어주는 방법과 new를 사용해서 초기화 시켜주는 방법 2가지가 있기 때문이다.
String bookName1 = 'God Of Java";
String bookName2 = String ("God Of Java");
◼️ 4. 기본 자료형은 8개이다. ◼️
자바의 기본 자료형은 8개이다.
- 정수형 : bytem short, int, long, char
- 소수형 : float, double
- 기타 : boolean
char를 제외하고 순서대로 해당 타입의 범위가 정해진다.
==> bsil fd(비실한 FD)로 외워보자.
모든 자바의 숫자 타입들은 2의 배수로 범위가 정해진다.
◼️ 4. 8비트와 byte 타입 ◼️
byte는 8비트의 부호가 있는(Signed 타입이다.
컴퓨터는 0과 1밖에 모른다. 그래서 8비트라는 것은 0과 1로 표현할 수 있는 공간이 8개가 있다는 말이다.
아래 사진 처럼 8개의 공간에 1이 모두 채워진다고 하면 255가 나와야한다.
하지만 byte의 범위는 반토막이 나있을까 ?
==> 그 이유는 자바의 기본 자료형에 포함된 숫자들은 모두 부호가 있는 Signed 타입들이다. 그런데 공간은 8개이다. 그렇기에 음수와 양수를 표현하기 위해선 맨 앞에 있는 값이 0이면 양수, 1이면 음수로 정하기로 했다.
그래서 양수의 최댓값을 구하면 아래의 사진과 같이 127이 나올 것이다.
하지만 byte의 모든 공간을 1로 채우면 -127이 되어야 정상인데 최솟값의 범위는 -128이다. 그 이유는 무엇일까?
==> 그 이유는 하나의 값이라도 더 제공할 수 있도록 선배들이 고민 했기 때문이다. 따라서 byte의 최솟값은 10000000 이다.
[ 1 1111111 일 경우, 맨 앞의 1은 부호의 1 이다. 1 0000000 일 경우, 맨 앞의 1은 값의 1 이다. ]
즉, 위에 있는 사진이 byte의 양수 최대값, 음수 최소값이다. [ 간단하게 생각해서 절대값으로 따지면, 최소값의 절대값이 최대값의 절대값보다 1이 더 크다. ]
[EX]
package Part4;
public class PrimitiveTypes {
public static void main(String[] args) {
PrimitiveTypes types = new PrimitiveTypes();
types.CheckByte();
}
public void CheckByte() {
byte byteMin = -128;
byte byteMax = 127;
System.out.println("byteMin="+byteMin);
System.out.println("byteMax="+byteMax);
byteMin = (byte) (byteMin-1);
byteMax = (byte) (byteMax-1);
System.out.println("byteMin-1="+byteMin);
System.out.println("byteMax+1="+byteMax);
}
}
byteMin=-128
byteMax=127
byteMin-1=127
byteMax+1=-128
위의 코드의 결과를 보게 되면 byteMin의 값이 -128으로 최솟값이였는데 여기서 -1을 더 해주었는데 최댓값 127이 되었고
반대로 byteMax의 값이 127로 최댓값이였는데 여기서 +1을 해주었는데 최솟값 -128이 나왔다.
==> 왜냐하면 byte의 최솟값 1000_0000 인 값에서 1을 빼면 0111_111이 된다.
또한 byte의 최댓값 0111_1111 인 값에서 1을 더하면 1000_000이 될 것 이기 때문이다.
만약에 상황을 바꿔서 최솟값인 -128에서 1을 빼고 다시 더하면 어떻게 될까?
==> 당연히 -128이 나온다.
◼️ 5. byte 형이 만들어진 이유 ◼️
int나 long 타입처럼 큰 공간을 주고 사용하면 편할텐데 왜 byte형을 만들었을까?
만약 동영상을 저장하고, 이미지를 저장할 때, 저장데이터가 모두 int 타입일 경우에,
단순히 숫자 하나를 표현하기 위해서 32개의 0과 1을 표시하기 위한 공간이 필요하다.
==> 즉 byte 대비 4배의 저장공간이 더 필요하게 되는 것이다. 그래서 많은 부분에서 데이터를 저장할 때 byte 값들을 조합해서 사용한다.그래야 적은 공간에 많은 내용을 저장할 수 있기 때문이다.
◼️ 6.다른 정수형 타입들은 어떻게 활용할까? ◼️
byte에 대해서 이해했을 것이다. 그렇다면 short, int, long형은 언제 사용할까?
byte로는 표현하기 부족하고, int로 표현하기에는 너무 공간 낭비가 심하다고 생각할 때 사용하는 것
==> short (-32,768 ~ 32,767) / byte보다 제공할 수 있는 데이터의 범위가 훨씬 크다.
일반적으로 아주 큰 숫자를 계산하지 않는 한 int가 많이 사용되며 int만으로 부족할 때 long형을 사용한다.
일반적으로 웹 애플리케이션을 개발할 때는 byte나 short가 사용되는 비율보다 int나 long을 사용하는 비율이 훨씬 많다.
==> 데이터를 저장할 목적이 아닌 계산하기 위한 목적으로 byte나 short를 사용하면 원하지 않는 계산이 될 확률이 높기 때문.
long 타입을 선언할 때는 L을 붙여주는 것이 좋다.
[EX]
public void checkOtherTypes() {
short shrotMax=32767;
int intMax = 2147483647;
long longMax=9223372036854775807L;
}
뒤에 long 타입을 선언할때 L을 붙여주지 않으면 오류가 난다.
◼️ 7. 소수점을 처리하고 싶다. ◼️
float와 double은 모두 소수점 값을 처리하기 위해 사용된다.
float는 32비트[ 부호(1자리) + 지수(8자리) + 가수(23자리) = 32 비트 ]
double는 64비트[ 부호(1자리) + 지수(11자리) + 가수(52자리) = 64 비트 ]
==> 이 두가지 소수점은 간단한 계산에서는 사용해도 무방하지만, 돈 계산과 같이 중요한 부부에서는 이 타입을 사용하면 안된다.
왜나하면 float와 double은 32비트와 64비트로 제공할 수 있는 범위를 넘어서면 그 값의 정확성을 보장하지 못하기 떄문이다.
[ 돈 계산과 같이 정확한 계산이 요구될 때 java.math.BigDecimal 이라는 클래스 사용 ]
소수점 처리를 할 때 일반적으로 double를 많이 사용한다.(개발자에 따라서 float를 주로 사용하는 개발자도 있다.)
float는 byte나 short의 용도와 거의 비슷하다.
◼️ 8. char와 bolean는 어떻게 쓰이는 건가? ◼️
char는 캐릭터라고 읽고, 문자열과 관련된 부분에서 사용한다.
정의를 할 때 홑따옴표를 사용한다.
[EX]
public void checkChar() {
char charMin = '\u0000';
char charMax = '\uffff';
System.out.println("charMin=["+charMin+"]");
System.out.println("charMax=["+charMax+"]");
}
charMin=[]
charMax=[占?]
결과값이 공백이 뜬다.
char은 정수형이라고 했다. 정말 char가 정수형이라면, int intValue= 'a'; 를 사용해도 무방할 것이다.
public void checkChar() {
char charMin = '\u0000';
char charMax = '\uffff';
System.out.println("charMin=["+charMin+"]");
System.out.println("charMax=["+charMax+"]");
int intValue='a';
System.out.println("intValue=["+intValue+"]");
}
harMin=[]
charMax=[占?]
intValue=[97]
97이라고 결과 값이 나온 이유는 a가 아스키(ASCII) 코드 번호 97 이기 때문이다.
[ *옛날에는 1byte 단위의 문자 아스키(ASCII)를 만들었고 그 중 a는 97이다.
자바에서는 유니코드(Unicode) 2byte(16비트)를 사용하기 때문에 아스키가 할당된 값들이 먼저 나오고 그 다음에 미리 정해져 있는 유니코드들이 존재한다. ]
char의 값을 지정하는 방법은 크게 세가지다.
- 홀 따옴표 안에 직접 'a'와 같이 그 값을 넣는것이다.
- '\u0000' 과 같이 홑 따옴표 안에 \u와 16진수 값을 넣는다.
- 해당 값의 유니코드 번호를 지정한다.
char 정의 예시
- 올바른 예 : char a= 'a'; , char c ='가'; , char e = '\u1188'; , char g = 999;
- 올바르지 않은 예 : char b = 'ab'; char d = '\u967'; char f = -1;
boolean은 "true"와 "false" 두 개의 값 밖에 없다.
즉, 참과 거짓 밖에 없는 타입이다.
◼️ 9. 기본 자료형의 기본 값은 뭘까? ◼️
자바의 모든 자료형은 값을 지정하지 앟으면 기본값을 사용한다.
지역 변수로 기본자료형을 사용할 때에는 기본 값이 자동으로 적용되지 않고 반드시 값을 지정해야만 한다.
즉, 인스턴스 변수, 클래스 변수, 매개 변수는 값을 지정하지 않아도 컴파일이 되기는 한다, 하지만 이렇게 개발하는 것은 매우 안좋은 습관이다. 명시적으로 기본값을 지정해주는게 좋다.
char를 제외한 모든 숫자의 기본값은 0이다. char은 아무것도 없는 것으로 보이지만, 실제로 '\u0000' 값이 출력된 것이다.
또한 boolean의 기본값은 false 이다.
제일 중요한거는 명시적으로 기본값을 지정해주는 습관이 중요하다는 것이다.
'JAVA > 자바의신 1' 카테고리의 다른 글
6장 제가 조건을 좀 따져요(if ,for, while, continue, break) (0) | 2022.09.03 |
---|---|
5장 계산을 하고 싶어요 (0) | 2022.09.03 |
3장 자바를 제대로 알려면 객체가 무엇인지 알아야 한다. (0) | 2022.09.02 |
2장 Hello God Of Java (0) | 2022.09.01 |
1장 프로그래밍이란 무엇인가? (0) | 2022.09.01 |