변수 명명 규칙
- 변수 이름은 숫자로 시작 x, 포함하는 것은 가능
- 공백 X
- 예약어 X
- 영문자, 숫자, 달러($), 밑줄(_) 만 사용 가능
관례
- 소문자로 시작하며 여러 단어로 이루어진 변수일 때 낙타 표기법(Camel Case)로 표기
클래스 명명 규칙
- 대문자로 시작, 낙타 표기법으로 표기
상수 명명 규칙
- 모두 대문자로 사용하며 단어 구분은 밑줄(_)
패키지 명명 규칙
- 모두 소문자로 사용
자바14에서의 switch
- 기존 switch문
public static void main(String[] args) {
int grade = 0;
int coupon;
switch (grade) {
case 0:
coupon = 1000;
break;
case 1:
coupon = 2000;
break;
case 2:
coupon = 3000;
break;
default:
coupon = 500;
break;
}
}
- 자바14
public static void main(String[] args) {
int grade = 0;
int coupon = switch (grade) {
case 0 -> 1000;
case 1 -> 2000;
case 2 -> 3000;
default -> 500;
};
System.out.println(coupon);
}
- switch 표현식 전체가 한 문장으로 취급되며 반환 값이 있는 함수처럼 동작.
- 조건식이 문자열인 경우 equals로 비교함.
public static void main(String[] args) {
String grade = "abc";
int coupon = switch (grade) {
case "ab" -> 1000;
case "abc" -> 2000;
case "a" -> 3000;
default -> 500;
};
System.out.println(coupon);
}
참고 : switch 문에서 default는 필수가 아님. 다만 반환값이 있는 경우에는 컴파일 에러가 날 수 있으니 조심
삼항연산자 → (조건) ? 참표현식 : 거짓표현식
String status = (age >= 18) ? "성인" : "미성년"
형변환
- 작은 범위 → 큰 범위 (문제 없음)
- int(4Byte) → long(8Byte) → double(8Byte)
- int to float, long to double이 가능한 이유
- int와 float는 같은 4Byte지만 int의 경우 부호 1bit, 값 31bit를 사용한다. float는 부호 1bit, 지수 8bit, 가수 23bit를 (부동소수점)사용함으로써 훨씬 큰 범위를 담을 수 있게 된다. long to double 역시 마찬가지.
- 큰 범위 → 작은 범위
- 소수점 버림, 오버플로우 문제가 발생할 수 있음.
자동 형변환
자바에서 작은 범위 → 큰 범위의 형변환은 허용되는데 이 때 대입하는 타입을 맞추어야 하므로 자바는 아래와 같이 자동으로 묵시적인 형변환이 일어난다.
int intValue;
double doubleValue;
intValue = 10;
doubleValue = intValue;
doubleValue = (double) intValue;
doubleValue = (double) 10;
doubleValue = 10.0;
명시적 형변환
큰 범위 → 작은 범위로 형변환 할 시 다음과 같은 컴파일 에러가 발생.
java: incompatible types: possible lossy conversion from double to int
따라서 아래와 같이 명시적으로 형변환을 해야함.
int intValue = (int) doubleValue;
큰 범위 → 작은 범위는 위에서 말한 것 처럼 오버플로우, 소수점 버림 문제가 발생할 수 있는데 자동으로 형변환이 된다면 문제를 인식하지 못한 채 넘어갈 수도 있기 때문에 이러한 위험을 감수하고 형변환을 할 것임을 개발자가 직접 명시해주어야 하고 이를 명시적 형변환이라고 한다.
long maxInt = 2147483647;
long overInt= 2147483648L;
int intValue = 0;
intValue = (int) maxInt
System.out.println("maxInt : " + intValue);
intValue = (int) overInt;
System.out.println("overInt : " + intValue)
/*
결과
maxInt : 2147483647
overInt : -2147483648
오버플로우가 발생하면 보통 처음으로 돌아감.
*/
계산 시에 형변환 주의!
- 같은 타입끼리의 계산은 같은 타입의 결과를 도출
- 서로 다른 타입끼리의 계산은 큰 범위의 타입으로 자동 형변환 후 도출
double ex = 3 / 2;
/*
result = ?
3 / 2 -> int, int 계산이므로 int 타입인 1이 나옴
그 이후 (double) 1
즉 ex = 1.0이 된다.
*/
자바의 변수 데이터 타입
- 기본형(Primitive Type) : 변수에 사용할 값을 직접 넣는 데이터 타입 (int, long, boolean …)
- 크기가 정해져 있어(정적) 빠르고 메모리를 효율적으로 처리
- 참조형(Reference Type) : 데이터에 접근하기 위한 주소를 저장하는 데이터 타입 (객체, 클래스 …)
- 크기가 동적으로 할당되어 복잡한 데이터 구조 관리에 용이
자바에서의 break
자바에서 break 는 일반적으로 반복문 1개의 스코프를 벗어날 때 사용되지만 예외적으로 if문 내부에서의 break는 if를 감싸고 있는 루프문을 벗어남.
자바에서의 변수
지역변수 : 개발자가 직접 초기화를 해주어야 함
멤버변수 : 인스턴스를 생성할 때 초기값으로 자동 초기화가 되며 초기값을 지정 가능
왜 지역변수는 초기화를 해야하고 멤버변수는 초기화를 안해도 되는걸까?
- java: variable a might not have been initialized
변수가 초기화 되지않았음을 의미 → 변수는 메모리를 차지하는데 메모리는 컴퓨터의 여러 시스템이 공유함. 즉 변수 선언 시에 해당 변수는 메모리를 차지하고 사용하는데 기존에 그 메모리에 어떠한 값들이 있었는지 알 수 없음 따라서 이상한 값이 출력될 수 있으므로 자바는 변수 초기화를 강제함.
반면에 인스턴스화 될 때 내부의 멤버 변수는 힙 메모리에 저장되고 이 때 JVM이 자동으로 해당 타입의 기본 값을 할당하여 멤버변수는 초기화가 필요없음.
this
this → 인스턴스 자신의 참조값을 가리킴
this() → 생성자 내부에서 다른 자신의 생성자를 호출하는 것이 가능하며 생성자 첫 줄에만 작성해야함
'JAVA' 카테고리의 다른 글
[자바] 상속, 추상클래스, 인터페이스 (0) | 2024.12.24 |
---|---|
[자바] 상수와 리터럴 (0) | 2024.12.24 |
[자바] static 변수와 메서드 (1) | 2024.12.24 |
[자바] 접근 제어자 (0) | 2024.12.24 |
[자바] 자바 동작 방식과 구조 (0) | 2024.12.24 |