본문 바로가기
JAVA

[자바] 자바 기초

by 감자b 2024. 12. 24.

변수 명명 규칙

  • 변수 이름은 숫자로 시작 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