Java

[Java Programming] 1.2 자바 프로그래밍 기초(자료형, 변수, 상수, 형변환)

코딩펭귄 2024. 1. 17. 14:05
프로젝트 이름 : 모두 소문자, 단어와단어사이는 언더바로 구분
클래스 이름 : 항상 대문자로 시작, 단어의 첫글자는 모두 대문자, 단어와단어사이는 구분자가 없음
변수 이름 : 첫글자는 항상 소문자, 나머지단어의 첫글자는 대문자 (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(문자) 를 사용