Java에서 타입은 변수, 객체, 메서드 등의 데이터 종류와 크기를 정의. Java는 강타입 언어(Strongly Typed Language)이기 때문에 모든 변수와 표현식은 명확한 타입을 가져야 함.
- 강타입 언어(Strongly Typed Language)란 변수나 값의 데이터 타입이 엄격하게 정의되고, 타입 간의 변환이 명확히 규제되는 언어를 의미.
- 강타입 언어와 약타입 언어 비교
특징 강타입 언어 약타입 언어 타입 엄격성 타입 간 변환이 엄격 타입 변환이 자유로움 타입 검사 시점 주로 컴파일 단계에서 검사 실행 단계에서 타입이 결정되거나 변환됨 코드 안전성 타입 오류를 컴파일러가 감지 타입 오류가 실행 중 발생 가능 예시 Java, C#, Swift, Kotlin Python, JavaScript, PHP, Ruby
Java 타입의 분류
Java 타입은 크게 두 가지로 나뉨:
- 기본 타입(Primitive Types)
- 값 자체를 저장.
- Java의 가장 기본적인 데이터 타입.
- 참조 타입(Reference Types)
- 객체나 배열과 같은 데이터를 참조(주소)로 저장.
1. 기본 타입 (Primitive Types)
byte | 1 byte | 0 | -128 ~ 127 |
short | 2 bytes | 0 | -32,768 ~ 32,767 |
int | 4 bytes | 0 | -2³¹ ~ 2³¹-1 |
long | 8 bytes | 0L | -2⁶³ ~ 2⁶³-1 |
float | 4 bytes | 0.0f | 소수점 7자리 정도 |
double | 8 bytes | 0.0d | 소수점 15자리 정도 |
char | 2 bytes | \u0000 | 유니코드 문자 |
boolean | 1 bit | false | true 또는 false |
특징
- 메모리 효율적:
- 메모리에 고정된 크기를 차지하며, 값 자체를 저장.
- 속도 빠름:
- 참조 타입보다 연산 속도가 빠름.
- 기본값:
- 변수 선언 후 초기화하지 않으면 위의 기본값으로 설정.
2. 참조 타입 (Reference Types)
참조 타입은 객체의 메모리 주소를 저장함. 실제 데이터는 힙(Heap) 영역에 저장되고, 참조 타입 변수는 힙 메모리를 참조.
참조 타입 종류
1. 클래스(Class):
- 사용자 정의 객체를 생성.
- 예: String, 사용자 정의 클래스 등.
String text = "Hello"; // 참조 타입 |
2. 인터페이스(Interface):
- 클래스가 구현해야 할 메서드들의 집합.
List<Integer> list = new ArrayList<>(); |
- 동일한 타입의 요소를 저장하는 자료구조.
int[] numbers = {1, 2, 3, 4, 5}; |
- 상수 집합을 정의하는 특수 클래스.
enum Day { MONDAY, TUESDAY, WEDNESDAY } |
특징
- 동적 데이터 관리:
- 참조 타입은 힙 메모리를 사용하여 객체나 데이터를 동적으로 생성하고 관리.
- 기본값:
- 참조 타입 변수는 초기화하지 않으면 null 값을 가짐.
- 복잡한 데이터 표현 가능:
- 객체 지향적인 설계에 적합.
3. 기본 타입과 참조 타입의 차이
항목기본 타입참조 타입
데이터 저장 방식 | 값 자체 저장 | 객체의 메모리 주소 저장 |
메모리 영역 | 스택(Stack) | 힙(Heap) |
초기값 | 각 타입의 기본값 | null |
사용 예 | 숫자, 문자, 논리 값 저장 | 문자열, 배열, 사용자 정의 객체 |
4. 형 변환
Java는 두 가지 형 변환을 제공:
1. 자동 형 변환 (Implicit Casting):
- 작은 크기의 타입이 더 큰 크기의 타입으로 변환.
int num = 10; long bigNum = num; // int → long |
2. 명시적 형 변환 (Explicit Casting):
- 큰 크기의 타입을 작은 크기의 타입으로 변환. 데이터 손실 가능.
double value = 10.5; int intValue = (int) value; // double → int |
5. 예제

결론
- 기본 타입: 값 자체를 저장하고 메모리 사용이 효율적.
- 참조 타입: 객체, 배열 등 복잡한 데이터를 관리하며 동적 메모리를 사용.
Java의 타입 시스템은 데이터의 안정적 관리와 성능을 보장하기 위해 설계되었음.
자바에서 강제 형변환시 주의할점
- 강제 형변환이 필요한 상황
- 큰 데이터 타입 → 작은 데이터 타입:
- 예: double → int, long → short
- 상속 관계의 객체 변환:
- 예: 부모 클래스 → 자식 클래스.
데이터가 작은 타입의 범위를 초과하면 오버플로(Overflow) 또는 언더플로(Underflow)가 발생함.
증감연산자
후위 연산자를 붙여 출력해도 연산은 수행된다.
조건문(if)과 Switch문
1. switch문이 더 좋은 경우
1) 조건이 단일 변수 또는 값 비교일 때
- switch문은 하나의 정확한 값과 비교하는 경우에 최적화되어 있음.
- 여러 값을 비교해야 할 때 가독성이 뛰어남.
2) 값이 열거형(Enum)이나 문자열인 경우
- switch문은 enum 또는 String 값과 함께 사용할 때 적합함.
성능이 중요한 경우
- switch문은 컴파일 시점에 조건 분기를 최적화하므로, 조건이 많을 때 if-else보다 더 빠르게 실행됨.
- 특히 switch는 값 테이블을 생성하거나 jump table을 활용하여 분기를 처리함.
2. 언제 if문이 더 적합한가?
switch보다 if가 더 적합한 경우:
1. 복잡한 조건식:
- switch는 단순한 값 비교에 적합하며, 복잡한 조건식은 지원하지 않음.
if (x > 10 && x < 20) { System.out.println("x는 10과 20 사이에 있습니다."); } |
2. 범위 조건:
- if는 값의 범위를 확인하거나 논리 연산을 수행하는 데 적합함.
if (age >= 13 && age <= 19) { System.out.println("청소년입니다."); } |
3. 단일 조건 검사:
- 간단한 참/거짓 조건일 경우 if문이 더 직관적임.
if (isActive) { System.out.println("활성 상태입니다."); } |
3. 정리: switch와 if 사용 기준
상황추천 문법
단순한 값 비교 | switch |
조건이 복잡하거나 논리 연산이 필요 | if |
조건 분기가 많고, 값이 명확한 상수인 경우 | switch |
범위나 논리 조건 | if |
성능이 중요한 경우 | switch |
값이 enum 또는 String인 경우 | switch |
결론
- switch는 단순한 값 비교에 최적화된 구조로, 가독성과 성능에서 유리.
- if는 복잡한 조건이나 범위 검사에 적합.
반복문(Loop)의 흐름을 제어하기 위해 사용하는 키워드 : continue와 break
1. continue
역할
- 현재 반복을 건너뛰고, 다음 반복을 실행.
- 반복문의 조건 검사로 이동하여 루프를 계속 실행.
주요 특징
- 반복문(for, while, do-while) 내에서 사용 가능.
- 현재 반복만 스킵하며, 전체 반복문을 종료하지 않음.
- continue의 영향 범위
- 가장 가까운 반복문의 현재 반복을 건너뛰고, 조건식 검사로 이동.
- 반복문은 종료되지 않고, 다음 반복으로 넘어감.
- 중첩 반복문에서 특정 반복문의 다음 반복으로 이동하려면 라벨(label) 사용.
2. break
역할
- 반복문을 즉시 종료하고, 반복문 뒤의 코드로 실행 흐름을 이동함.
주요 특징
- 반복문(for, while, do-while)과 switch문에서 사용 가능.
- 반복문의 실행을 즉시 종료.
- 중첩 반복문에서 사용 시 가장 가까운 반복문만 종료.
- break의 영향 범위
- 가장 가까운 반복문 또는 switch문을 즉시 종료.
- break를 호출한 반복문 전체를 중단하고, 다음 코드로 실행 흐름을 이동.
- 중첩 for문에서의 break는 내부 for문만 종료.
- 중첩 반복문에서 특정 반복문을 종료하려면 라벨(label)을 사용.
- ex) break outer 실행 시, 라벨이 선언된 반복문(외부 for문)이 종료됨.
- 성능 측면에서는 라벨을 사용한 break와 플래그 변수를 사용하는 방식 사이에 큰 차이가 없음.
- 라벨 사용 예시
do-while문
do-while문은 반복문이 실행되기 전에 조건을 검사하지 않고, 반드시 한 번은 실행되는 특징이 있음.
사용자 입력을 받아 양수만 더하는 코드
설명 :
do 블록:
- 사용자가 입력한 숫자를 처리하고, 조건을 확인하기 전에 한 번 실행.
- 입력된 값이 양수이면 sum에 더함.
while 조건:
- 입력된 값이 0 이상일 때만 반복.
- 음수가 입력되면 반복 종료.
일단 do를 하게되고 이후 while문의 참 거짓에따라 반복문을 종료할지 정하게 된다.