[Java Programming] 1.2 자바 프로그래밍 기초(자료형, 변수, 상수, 형변환)
프로젝트 이름 : 모두 소문자, 단어와단어사이는 언더바로 구분
클래스 이름 : 항상 대문자로 시작, 단어의 첫글자는 모두 대문자, 단어와단어사이는 구분자가 없음
변수 이름 : 첫글자는 항상 소문자, 나머지단어의 첫글자는 대문자 (carmel case 표기법)
Class
- Java Program에서 하나 이상의 정보를 표현하는 묶음
- Java파일은 Class를 의미함
- 클래스 이름과 파일이름은 동일해야함
자료형
- 메모리(RAM)에 데이터를 할당하기 위한 타입
- 자바의 자료형은 크게 2가지(기본자료형, 참조자료형)로 분류됨
-- 기본자료형(=primitive type) : 숫자, 문자(한글자), true/false(boolean)
-- 참조자료형(reference type) : 문자열, 배열 등 기본자료형을 제외한 모든것
변수와 변수 범위
- 변수 : 메모리(RAM) 주소의 별칭(Alias)
- 엑셀시트를 예로 든다면, 엑셀 '칸' = 메모리 / 메모리를 찾아가는 행 이름, 열 이름 = 변수
- 변수명을 지을때 : 변수가 어떤역할을 하는지 명확하게 표현해줘야됨
- 변수에 값을 '할당' 해야 메모리에 데이터가 생김(할당됨)
- 변수를 사용하는 이유 : cpu가 연산을 처리하기위해선 메모리에 값을 넣어줘야함 (연산에 필요한 데이터를 넘겨줘야하기 때문)
변수의 정의
- 같은 이름의 변수는 정의할 수 없음
자료형 변수명;
ex) int number;
변수 값 할당 (이미 정의된 변수에 값을 할당할 때)
변수명 = 값;
ex) number = 10;
변수의 정의와 할당을 동시에(가장많이 사용하는 방법)
자료형 변수명 = 값;
ex) int number = 5;
byte byteNumber = 1; //-128 ~ +127
System.out.println(byteNumber);
short shortNumber = 10; // -32,678 ~ +32,767
System.out.println(shortNumber);
int intNumber = 20; // 3_000_000_000 즉 30억을 int에 쓰면 에러
System.out.println(intNumber);
// L : f리터럴(대문자, 소문자 둘다 가능) 붙이는 이유 : 자바 정수 기본타입은 int
// int범위는 -21억~+21억. <- 이범위를 long에 넣을때는 L 붙여줘야됨.
// 이 범위를 벗어난 -30억~+30억은 L안붙여줘도 됨
long longNumber = 30L;
System.out.println(longNumber);
메모리(RAM)에서는 무슨일이 벌어졌을까?
- 임의의 메모리에 바이트(한칸 = 1 byte) 확보 후 값 할당 -> 각 메모리 주소에 변수명 매칭(별칭부여) -> 실제로는 모든 데이터는 2진수로 변환되어 저장됨(한칸마다 8개씩의 숫자가 있음. 8 bit = 1 byte)
(한칸 = 1 byte)
정수형 변수의 재할당 (= 값 수정)
- 할당 문법을 써주면 됨
public static void main(String[] args) {
int intNumber = 20; // 20할당
intNumber = 21; // 21 재할당
}
디버깅 하는 방법
line number 더블클릭해줌(break point 생성)
F11 - 해당라인( break point )부터 디버깅 시작
F5
F6 - 다음라인으로 진행
F7
F8 - 디버그 종료(다음 break point로 넘어가라)
부동소수점형 변수의 선언과 할당
- float 타입에 데이터 넣을때는 : 숫자 뒤에 f 붙여주기
float floatNumber = 10.55f;
System.out.println(floatNumber); //10.55
double doubleNumber = 11.556;
System.out.println(doubleNumber); // 11.556
문자형 변수(char)의 선언과 할당
- char('캐릭터'라고 읽음)
- 실무에서는 잘 안쓰임 (암호화 알고리즘에 사용)
- 문자형은 작은따옴표로 표현, 작은따옴표 안의 숫자는 문자로 처리됨
- 자바에서 한글자를 표현할때, 홑따옴표(' ') 사용함
- 자바 내부적으로는 char를 숫자로 취급하므로, 연산을 할 수 있다. (아래코드에서 letter + 1 = 66) -> (A = 65, B = 66, a = 93, b = 94 ..)
char letter = 'A';
System.out.println(letter); // A
System.out.println(letter + 1); //66
letter = 'B';
System.out.println(letter); // B
letter = '1'; //글자
System.out.println(letter); // 1
boolean(불린, 불리언)
- 맞다 / 아니다 만 처리함 -> 값이 true / false만 들어감
- true형 혹은 false 만 존재하는 타입
- 연산자, 제어문, 반복문에서 많이 사용됨
- boolean형 변수의 시작은 동사로 시작됨 ex) A=areYouDesigner
- 실무에서 엄청 많이 사용됨
boolean areYouStudent = true;
System.out.println(areYouStudent); // true
boolean areYouDesigner = false;
System.out.println(areYouDesigner); // false
변수의 범위
- 변수는 선언된 위치에따라 사용할 수 있는 범위가 달라짐
- 변수는 중괄호의 범위를 가짐 (변수가 정의된 라인부터 해당 중괄호가 끝나는 라인까지의 영역이 해당 변수를 사용할 수 있는 영역)
- 변수가 정의된 '이후' 사용할수 있음
- 중괄호 더블클릭하면 영역을 쉽게 확인할 수 있음
상수
- 절대 변하지 않는 값
- 변수가 정의되고 최초 한번 값이 할당되고 나면 : 다시는 재할당(수정/업데이트) 할 수 없는 변수
- 값을 할당 한 순간부터 변경이 안되는 것이므로, 정의를 해놓고, 그 이후에 할당을 하기도 함(단, 할당이후에는 값 변경 불가능)
- 상수는 전부 대문자로 적어야 함. 단어와 단어는 언더바로 구분 ex) SPEED_OF_LIGHT, MAX_VALUE, PI, E
- 변수로 처음 정의를 한 후, 상수로 해당 변수를 변경할 수 없음(반대도 마찬가지)
상수의 정의와 할당
- 변수 정의시 타입 앞에 final 붙이면 상수가 됨
final int SPEED_OF_LIGHT = 299_972_458;
System.out.println(SPEED_OF_LIGHT);
//SPEED_OF_LIGHT = 10;// 에러
Java에는 이미 여러 상수들의 정의되어있음
System.out.println(Math.PI); // 3.141592653589793
System.out.println(Math.E); // 2.718281828459045
// int type의 최댓값
System.out.println(Integer.MAX_VALUE); // 2147483647
// int type의 최소값
System.out.println(Integer.MIN_VALUE); // -2147483648
형 변환
- 자바에서 지원하는 기본자료형은 각각 고유한 바이트크기를 가지고있음
묵시적(암묵적) 형 변환
- ex) 4 byte 크기의 int 변수 값을 8 byte 크기의 long 변수에 할당하면? : long의범위가 int 보다 크기때문에, int값을 long에 할당하는데 무리가 없음
- byte -> short -> int -> long 은 묵시적 형변환을 함 (크기(범위)가 점점 커지므로) -> 반대방향으로는 불가능
int normalNumber = Integer.MAX_VALUE;
long bigNumber = normalNumber;
System.out.println(normalNumber); // 2147483647
System.out.println(bigNumber); // 2147483647
//변수명이 동일하므로 아래와 같이 선언할 수 없음
int number = 10;
long number = 10;
크기가 큰 long 형을 작은 int형으로 자연스러운 변환은 불가능함 -> 명시적 형변환을 해야함
명시적 형변환
- 할당을 하려는 변수 앞에다가 형을 적어줌
long bigNumber = Long.MAX_VALUE;
int normalNumber = bigNumber; //에러
System.out.println(bigNumber);
System.out.println(normalNumber);
단, 범위를 벗어난 수를 넣었을때, 할당범위를 초과하는 버그가 발생할 수 있음
long bigNumber1 = Integer.MAX_VALUE + 1L; //int범위를 벗어남
int normalNumber1 = (int) bigNumber1; // int로 명시적 형변환(하지만 이미 bigNumber은 int범위를 벗어남)
System.out.println(bigNumber1); // 2147483648
System.out.println(normalNumber1); // -2147483648
음수값이 나오는 이유 -> 정수오버플로우!
여기에(A) 1을 더하면
이렇게 음수값이 나오게 됨 (= 정수 오버플로우)
만약, int최대값에 2를 더하면 -> 1 더했을때와 1만큼 차이남
long bigNumber1 = Integer.MAX_VALUE + 2L; // -2147483647
정수 <-> 부동소수점 형변환
= 묵시적 형변환!(부동소수점이 표현하는범위가 정수보다 크기 때문1)
- int type, float type -> byte는 같지만, float 가 표현하는 숫자의 범위가 더 큼!
// 정수 -> 부동소수점 형변환 : 묵시적 형변환
int num = 10;
float fnum = num;
double dnum = num;
System.out.println(num);
System.out.println(fnum);
System.out.println(dnum);
// 부동소수점 -> 정수 : 명시적 형변환 (소수점이하 탈락함)
float fnum1 = 10.9f;
int num1 = (int) fnum1;
System.out.println(fnum1); //10.9
System.out.println(num1); //10
double dnum = 11.15;
num = (int) dnum;
System.out.println(dnum); // 11.15
System.out.println(num); // 11
부동소수점 소수점 처리
- Java에서 소수점 자리 처리는 유연하지 못함 : 원하는 자릿수만큼 곱한 후 처리해야함
- 실무에서 많이 쓰임
// 부동소수점 소수점 처리
double dnum2 = 29.37;
double dnum3 = dnum2 * 10; // double로 형변환 됨
System.out.println(dnum3); //293.7
dnum3 = Math.round(dnum3);
System.out.println(dnum3); //294.0
double dnum4 = dnum3 / 10; // double로 형변환 됨
System.out.println(dnum4); // 29.4
문자열을 byte short int long float double boolean char로 변환 가능!
문자열
- 여러개의 글자들을 나열한것
- 문자열 변수의 타입은 String을 사용. 큰 따옴표(" ")로 감싸야 함
- String 변수명 = "Hello, World!";
- 문자열을 정수로 변환하려면 : 타입.parseType(문자) 를 사용
- 회원가입시 나이, 생일등을 받을때 컴퓨터는 이를 문자열로 판단하고, 이를 숫자로 계산하기 위해서는 숫자로 바꿔줘야함. 이럴때 사용
//10이라는 문자를 10이라는 숫자로 변경
String numberString = "10";
byte byteNumber1 = Byte.parseByte(numberString);
System.out.println(byteNumber1);
- char은 정수형이 아닌 문자열이므로, 정수형이 아닌 문자열을 변환하려고 하면 에러가 발생
- 부동소수점을 정수형으로 변환하려고 해도 에러가 발생
- 문자열을 부동소수점으로 변환하려면 타입.parseType(문자) 를 사용
- 문자열을 불린으로 변환하려면 Boolean.parseBoolean(문자) 를 사용