원시 타입과 참조 타입의 차이
1. 원시 타입(Primitive Type, 원시 타입 또는 기본형 타입)
특징
- 실제 데이터 값을 직접 저장 메모리 공간(Stack 메모리)에 10이나 ‘A’ 같은 실제 값을 저장
- 메모리 크기 고정
- 비어있는 상태(null)를 가질 수 없음 null 값 X → 값을 지정하지 않으면 0 이나 false 같은 기본값이 자동 저장
종류
- 숫자형:
- 정수형: byte(1), short(2), int(4), long(8)long보다 큰 범위면 실수로 쓰거나 객체 생성
- → 연산할 때 기본형인 int로 자동 변환되기에 byte, short는 잘 안 씀
- 실수형: float(4), double(8) float v = 3.14; 는 오류 남! → 더 큰 double값을 작은 float형에 넣으려고 해서
- → 기본형은 double, 숫자 뒤에 f 붙여야 float
- 문자형: char(2) → 널값 허용 X ‘’은 오류
- 논리형: boolean(크기 X) → true나 false만
2. 참조 타입(Reference Type)
: 이름 그대로 값을 직접 가지는 게 아니라, 값이 있는 곳의 주소(위치)를 참조함
예) String, 배열, 클래스(Class, 객체) 등
문자열은 String으로 대문자인 이유도 객체이기 때문(정의된 기본 타입이 아니라 생성된 객체)
특징
- 실제 값은 딴 곳에, 변수에는 주소만 저장 기본형 타입은 변수 메모리(Stack 메모리)에 실제 값을 저장 하지만 참조 타입은 데이터 크기가 가변적이기에, 아주 큰 Heap 메모리에 실제 데이터를 보관 / Stack 메모리에는 주소만 저장
- null 값 O null = 주소 없다는 의미 → 이때 주소 없이 접근하려고 하면 NullPointerException 에러 발생
- == 연산자로 비교할 때 주의 기본형 타입끼리 == 로 값을 비교, 하지만 참조 타입끼리 ==로 주소를 비교, .equals() 쓰면 값을 비교
리터럴
: 변수에 넣는 변하지 않는 데이터 값 그 자체
- 100(정수형 리터럴), 3.14(실수형 리터럴), true, false(논리형 리터럴)
- ‘A’(문자형 리터럴 → 문자는 1글자여야 함 ‘AB’는 오류)
- “”, “AB”(문자열 리터럴→ 0개 이상이면 가능함)
- ‘1’ + 1 → 49 + 1로 50(11아님) → 정수 규칙
- “1” + 1 → “11” → 문자열 규칙
- 이러한 규칙은 **문자열 > 실수 > 정수 순으로 데이터 손실을 막을 수 있는가(**데이터의 표현 범위가 더 넓은가)를 기준으로 서열이 정해짐
- 아스키코드: 0(48), A(65), a(97)
실습 내용
출력에서 리터럴 사용
System.out.print(변수명) → 변수 출력
System.out.print(”변수명”) 리터럴로 출력 → “변수명” 문자열로 출력
System.out.println(777777777L);은 long형 리터럴 사용
여기서 L을 빼면 int형 리터럴이 되지만 저 숫자는 int 범위를 벗어나기에 에러남!
r-value와 l-value이란?
int num = 10;
System.out.println(num);
이때, 출력되는 건 num의 값!
변수의 사용 시 값을 사용하는 경우엔 r-value, 방을 사용하는 경우엔 l-value
변수 = 식(리터럴, 변수, 연산식, 리턴 값이 있는 메서드의 호출 식)
왼쪽 변수는 방, 오른쪽 식은 값
r-value 용도를 쓸 때는 항상 초기화 필수!(값이 있어야 하기에)
변수 사용
: 중복되는 식을 제거하고 효율적으로 사용하기 위해
변수를 선언해두고 사용하지 않으면 메모리 낭비로 비효율!
문자형에 정수를 넣으면?
char v1 = 65;
System.out.println(v1); → A 출력(char에 정수를 넣었기 때문에 char로 자동 형변환)
char result = (char)('(' + ')'); → int보다 작은 타입을 연산하면 int로 변환되기에 char로 변환 후 저장
→ ‘(’의 아스키 코드 값 40이기에 result엔 40+41의 아스키 코드인 Q 출력
따라서 문자형과 같이 int보다 작은 타입에 연산식을 대입할 땐 int로 자동 변환 → 담을 수 없어서 오류!
그래서 형변환 필수임!!
'Java' 카테고리의 다른 글
| [Java] 제어문-if, switch / 반복문-for, while / 랜덤 함수 사용법 / final (4) | 2026.03.17 |
|---|---|
| [Java] 연산자 종류 / 참조 연산자 / instanceof / 논리 연산자 / 오류 주의 (0) | 2026.03.17 |
| [Do it! 알고리즘 코딩 테스트 자바] 그리디 알고리즘, 소수 구하기, 유클리드 호제법, 그래프 [13~18일차] (1) | 2026.03.15 |
| [Do it! 알고리즘 코딩 테스트 자바] 이진 탐색 (12일차) (0) | 2026.03.08 |
| [Do it! 알고리즘 코딩 테스트 자바] BFS 너비 우선 탐색 - 백준 1260(11일차) (0) | 2026.03.08 |