형변환 (Type Conversion)
하나의 타입을 다른 타입으로 바꾸는 것을 타입 변환 혹은 형변환 이라고 한다. 예를 들어 byte 타입을 int 타입으로 변환하거나 반대로 int 타입을 byte 타입으로 변환하는 것을 말한다.
자바에서 형변환은 일종의 "물건을 담는 상자"에 비유할 수 있다.
1. 작은 상자에서 큰 상자로 옮기기 (자동 형변환, Upcasting)
작은 상자에 담긴 물건을 큰 상자로 옮기는 것은 쉽다.
예를 들어, 작은 상자에 담긴 사과를 큰 상자로 옮기는 것은 간단하다.
자바에서는 작은 데이터 타입에서 큰 데이터 타입으로 형변환할 때 자동으로 변환이 이루어진다.
더 큰 상자(더 큰 데이터 타입)에 작은 물건(작은 데이터 타입)을 넣는 것과 같다.
작은 상자에서 큰 상자로 이동하는 것이므로 자연스럽다.
int 작은상자 = 10;
long 큰상자 = 작은상자; // 자동 형변환
2. 큰 상자에서 작은 상자로 옮기기 (강제 형변환, Downcasting)
반대로 큰 상자에 담긴 물건을 작은 상자로 옮기는 것은 주의가 필요하다.
예를 들어, 큰 상자에 담긴 여러 개의 물건을 작은 상자로 옮기려고 하면 작은 상자가 꽉 차거나 넘칠 수 있다.
자바에서는 큰 데이터 타입에서 작은 데이터 타입으로 형변환할 때 명시적으로 변환을 지시해야 한다. ex) (double)123
작은 상자에 맞지 않을 수도 있기 때문에 조심스럽게 옮기는 것과 같다.
8byte인 long를 4byte인 int 타입에 담을 수는 없다. 그래서 이럴 경우에 long를 int 타입으로 바꿔줘야 하는 것이다.
long 큰상자 = 10L;
int 작은상자 = (int) 큰상자; // 강제 형변환
주의할 점
강제적인 동작이므로 만일 데이터의 손실이 일어난다면 정확한 연산을 수행할 수 없기 때문에 예상치 못한 결과를 얻을 수 있다.
실수 타입을 정수 타입으로 변환할 때도 문제가 생길 수 있다.
소수점이 포함된 실수 double 타입에서 int 타입으로 형변환을 해버리면 소수점 이하의 데이터는 버려진다.
double num1 = 12.3456;
int num2 = (int)num1; // 12
데이터 손실을 방지하기 위한 대표적인 방법은 형변환 전에 값이 변환 대상 타입의 범위 내에 있는지 확인하는 것이다.
이를 위해서 각 기본 데이터 타입에 대해 최대값과 최소값을 나타내는 상수를 제공하고 있다.
자바 기본 데이터 타입과 그 최대값 및 최소값을 나타내는 상수들을 보자.
정수값과 실수값을 다른 타입으로 변환하고자 할 때, 변환될 타입의 최소값과 최대값을 벗어나는지 검사하고, 벗어난다면 타입 변환을 하지 않는 식으로 하는 것이 좋다.
자바는 또한 각 기본 타입에 대해 최소값과 최대값을 상수로 제공하여 개발자가 형변환 전에 해당 값이 범위 내에 있는지 쉽게 확인할 수 있도록 하고 있다.
조건문
조건문은 프로그램의 흐름을 제어하기 위해 사용된다.
자바에서 사용되는 주요 조건문은 if, if-else, if-else if-else, switch 등이 있다.
if 문
if 문은 조건이 참일 때만 코드를 실행한다.
public class IfExample {
public static void main(String[] args) {
int 점수 = 85;
if (점수 > 80) {
System.out.println("점수가 80보다 큽니다.");
}
}
}
if-else 문
if 문 다음에 else 문을 사용하여 조건이 거짓일 때 실행할 코드를 지정할 수 있다.
public class IfElseExample {
public static void main(String[] args) {
int 점수 = 75;
if (점수 > 80) {
System.out.println("점수가 80보다 큽니다.");
} else {
System.out.println("점수가 80보다 작거나 같습니다.");
}
}
}
if-else if-else 문
여러 조건을 순차적으로 검사하고, 첫 번째로 참인 조건의 코드 블록을 실행한다.
public class IfElseIfElseExample {
public static void main(String[] args) {
int 점수 = 85;
if (점수 >= 90) {
System.out.println("A 학점입니다.");
} else if (점수 >= 80) {
System.out.println("B 학점입니다.");
} else if (점수 >= 70) {
System.out.println("C 학점입니다.");
} else {
System.out.println("F 학점입니다.");
}
}
}
switch 문
switch 문은 변수의 값을 여러 가지 경우에 따라 비교하여, 해당하는 경우의 코드 블록을 실행한다.
주로 하나의 변수의 여러 값에 대해 다른 동작을 수행할 때 쓴다.
public class SwitchExample {
public static void main(String[] args) {
int 등급 = 2;
switch (등급) {
case 1:
System.out.println("등급 1: 우수");
break;
case 2:
System.out.println("등급 2: 보통");
break;
case 3:
System.out.println("등급 3: 미흡");
break;
default:
System.out.println("유효하지 않은 등급");
break;
}
}
}
반복문
자바에선 여러 종류의 반복문을 제공하여 코드 블록을 여러 번 수행할 수 있게 한.
for, while, do-while 등의 반복문이 있다.
반복문은 무한 루프의 위험성이 있으니 종료 조건을 명확히 주는 것에 신경 써야 한다.
for 문
for 문은 반복 횟수가 명확할 때 주로 사용된다. 초기화, 조건 검사, 증감식을 한 줄에 작성할 수 있어 간결하다.
public class ForLoopExample {
public static void main(String[] args) {
for (int i = 0; i < 5; i++) {
System.out.println("i의 값: " + i);
}
}
}
while 문
while 문은 조건이 참인 동안 반복을 수행한다. 조건이 처음부터 거짓이면 한 번도 실행되지 않을 수 있다.
public class WhileLoopExample {
public static void main(String[] args) {
int i = 0;
while (i < 5) {
System.out.println("i의 값: " + i);
i++;
}
}
}
do-while 문
do-while 문은 코드 블록을 최소한 한 번은 실행한 후 조건을 검사한다. 조건이 거짓이더라도 한 번은 실행된다.
public class DoWhileLoopExample {
public static void main(String[] args) {
int i = 0;
do {
System.out.println("i의 값: " + i);
i++;
} while (i < 5);
}
}
for each
전통적인 for문으로 배열을 순회할 때는 인덱스를 다뤄야 한다. 이럴 때 .length를 사용하곤 한다.
public class TraditionalForLoopExample {
public static void main(String[] args) {
int[] numbers = {1, 2, 3, 4, 5};
for (int i = 0; i < numbers.length; i++) {
System.out.println("숫자: " + numbers[i]);
}
}
}
이와 다르게 for each 문은 배열이나 컬렉션을 순회할 때 사용한다. 인덱스를 사용할 필요 없이 각 요소에 접근할 수 있다.
public class ForEachLoopExample {
public static void main(String[] args) {
int[] numbers = {1, 2, 3, 4, 5};
for (int number : numbers) {
System.out.println("숫자: " + number);
}
}
}
컬렉션에서도 사용할 수 있다.
import java.util.ArrayList;
import java.util.List;
public class ForEachLoopWithCollectionExample {
public static void main(String[] args) {
List<String> fruits = new ArrayList<>();
fruits.add("사과");
fruits.add("바나나");
fruits.add("체리");
for (String fruit : fruits) {
System.out.println("과일: " + fruit);
}
}
}
다음 게시물부터는 객체지향을 다루도록 하겠다
'Language > Java' 카테고리의 다른 글
[Java] 다형성의 본질과 활용 (1) | 2024.12.31 |
---|---|
[Java] String / StringBuffer / StringBuilder 차이점 (0) | 2024.10.04 |
[Java] 인터페이스 (50) | 2024.06.22 |
[Java] 멤버 변수 초기화에 관하여 (52) | 2024.06.21 |
[Java] 자바 설명, 자료형, 변수, 상수 개념 및 사용 (2) | 2024.04.28 |