목차
프리미티브 타입 종류와 값의 범위 그리고 기본 값
기본형(primitive type)
분류 | 타입 | 기본형 | 값의 범위 | 값의 범위 |
논리형 | boolean | false | false, true | 1 byte |
문자형 | char | '\u0000’ | ‘\u0000’ ~ ‘\uffff’ (0 ~ 65535) | 2 byte |
정수형 | byte | 0 | -128 ~ 127 | 1 byte |
short | 0 | 32,768 ~ 32,767 | 2 byte | |
int | 0 | -2,147,483,648 ~ -2,147,483,647 | 4 byte | |
long | 0L | -9,223,372,036,854,775,808 ~ -9,223,372,036,854,775,807 | 8 byte | |
실수형 | float | 0.0f | 1.4E-45 ~ 3.4028235E38 | 4 byte |
double | 0.0d | 4.9E-324 ~ 1.7976931348623157E308 | 8 byte |
- Stack(스택 영역, 정적 메모리 영역)에 기본타입 변수가 할당되고 변수의 실제 값들이 저장됨
- 메모리에 고정된 크기로 저장되고 변수에 데이터의 값을 저장
- 논리형, 문자형, 정수형, 실수형으로 구분됨
- 논리형(boolean)
- true와 false 중 하나를 값으로 가짐
- 조건식과 논리적 계산에 사용
- 다른 기본형과의 연산 불가
- 문자형(char)
- 문자를 저장하는데 사용(정수(유니코드)로 저장)
- 변수에 하나의 문자만 저장
- 정수형 또는 실수형과의 연산도 가능
- Java에서 유일하게 제공되는 unsigned 형태
- unsigned : 음수 없이 0부터 시작하여 양수 값만 가지는 데이터 형태
- 정수형(byte, short, int, long)
- 정수를 저장하는데 사용
- 주로 int가 사용됨
- byte는 이진 데이터를 다를 때 사용되며, short는 C언어와의 호환을 위해 추가됨
- 실수형(float, double)
- 실수를 저장하는데 사용
- 주로 double이 사용됨
- 논리형(boolean)
래퍼 클래스(Wrapper Class)
기본 자료타입(primitive type)을 객체로 다루기 위해서 사용하는 클래스
primitive type | wrapper class |
byte | Byte |
char | Character |
int | Integer |
float | Float |
double | Double |
boolean | Boolean |
long | Long |
short | Short |
- 박싱(Boxing)과 언박싱(UnBoxing)
- valueOf()와 parseInt()
- Integer.valueOf(String): Integer 클래스를 리턴하기 때문에 산술 연산을 할 수 없다.
- Integer.parseInt(String): int 형을 리턴하기 때문에 산술 연산을 할 수 있다.
레퍼런스 타입(참조 타입, Reference Type)
Primitive Type을 제외한 모든 타입을 포함(문자열, 배열, 열거, 클래스, 인터페이스 등)
- heap(동적 메모리 영역) 영역에 할당됨
- 참조타입(Reference Type) 객체들의 주소는 스택 영역에 저장 → Stack 메모리에는 참조값만 있고, 실제값은 Heap 메모리에 존재
- 크기가 정해져 있지 않음 → 프로그램 실행시 메모리에 동적으로 할당
- 참조하는 변수가 없으면 자바의 가비지 컬렉터가 제거
- 기본적으로 java.lang.Object를 상속받으면 reference type이 된다
- 빈 객체를 의미하는 null이 존재 → 런타임 에러가 발생한다(배열을 null 로 받으면 NullPointerException)
프리미티브 타입과 레퍼런스 타입 차이점
- null 포함 가능 여부
- primitive type은 null X
- reference type은 null O
- 제너릭 타입 사용 여부
- primitive type은 제너릭 타입에서 사용 X
- reference type은 제너릭 타입에서 사용 O
- 속도 차이
- primitive type은 Stack 메모리에 값이 존재
- reference type은 Stack 메모리에는 참조값만 있고, 실제값은 Heap 메모리에 존재 → 값을 필요로 할 때마다 Unboxing 과정 거치기 때문에 속도가 비교적 느림
- 예외적으로 엄청 큰 숫자를 복사해야 한다면, 참조값만 넘길 수 있는 reference type이 좋을 수 도 있다.
- 메모리 차이
- primitive type < reference type
- Boxing, Unboxing
- Boxing(박싱): primitive type을 reference type으로 변환 시키는 것
- Unboxing(언박싱): reference type을 primitive type으로 변환 시키는 것
- 자바 1.5부터 Auto Boxing / Unboxing 기능 추가
리터럴(literal)
=값, 변수나 상수에 저장되는 값 그 자체를 의미
종류 | 리터럴 |
논리형 | false, true |
정수형 | 123, 0b0101, 077, 0xFF, 100L |
실수형 | 3.14, 3.0e8, 1.4f |
문자형 | ‘A’, ‘1’, ‘\n’ |
문자열 | “ABC”, “123”, “A”, “true” |
정수형
15 → 10진수 리터럴 15
015 → 0으로 시작하면 8진수, 십진수값으로 13 출력
0x15 → 0x로 시작하면 16진수, 십진수값으로 21 출력
0b0101 → 0b로 시작하면 2진수, 십진수값으로 5 출력
실수형
E, e: 10의 제곱을 나타내는 기호
변수 선언 및 초기화하는 방법
변수 선언: 메모리에 데이터를 저장할 공간을 지정
변수타입 변수이름;
ex. int age; // age라는 이름의 변수 선언
ex. int age1, age2, age3, ..., age10; // 같은 형식의 변수 여러 개 동시 선언
변수 초기화: 변수를 사용하기 전에 처음으로 값을 저장하는 것
변수타입 변수명 = 초기화할 값;
ex. int age = 25; // 변수 age를 선언하고 25로 초기화
ex. int age1 = 10, age2 = 20, age3 = 30, ..., age10 = 100; // 같은 형식의 변수 여러 개 동시 선언 및 초기화
변수의 스코프와 라이프타임
변수의 스코프
프로그램상에서 사용되는 변수들의 사용 가능한 범위 / 변수가 존재할 수 있는 영역
class Variables{
int iv; // 인스턴스 변수 -> 클래스 영역
static int cv; // 클래스 변수(static변수, 공유변수) -> 클래스 영역
void method(){
int lv = 0; // 지역 변수 -> 메서드 영역
}
}
- 클래스 변수(class variable): 클래스 내의 모든 곳
- 인스턴스 변수(instance variable): 각각의 인스턴스
- 지역 변수(local variable): 메소드 안
라이프타임(생명주기)
변수가 메모리에 할당된 시점부터 반환되는 시점까지의 시간
프로그램이 함수 내에 진입할 때 메모리에 할당되고, 빠져나갈 때 해제가 일어남
- 클래스 변수
static 키워드가 붙은 필드 변수, Heap 영역에서 관리
- 생성: 클래스가 메모리에 올라갈 때
- 종료: 프로그램이 끝날 때 까지 or 클래스가 메모리에 로드되는 동안((JVM의 Garbage Collector가 제거))
- 인스턴스 변수
class scope 에서 작성된 변수
- 생성: 인스턴스가 생성되었을 때
- 종료: 인스턴스가 메모리에 남아있을 때까지(JVM의 Garbage Collector가 제거)
- 지역 변수
Method, Loop Scope 등에서 생성되어 사용되는 지역 변수
- 생성: 변수 선언문이 수행되었을 때
- 종료: 컨트롤이 선언된 블록을 떠날 때까지
타입 변환, 캐스팅 그리고 타입 프로모션
타입 변환
서로 다른 데이터 타입끼리의 연산이 필요로 한 경우 타입 변환이 일어남
기본형과 참조형은 서로 형변환이 불가함
타입 변환 종류
- 타입 캐스팅(묵시적 타입 변환, 자동 타입 변환, Type Casting)
- 큰 타입 변수 = 작은 타입 변수
- 크기가 더 큰 자료형을 크기가 더 작은 자료형에 대입
- 자동으로 타입 변환
- 기본형 중에서 자동 형변환이 가능한 방향
- byte → short / char → int → long → float → double
- 타입 프로모션(명시적 타입 변환, 강제 타입 변환, Type Promotion)
- 작은 타입 변수 = (작은 타입)큰 타입 변수
- 작은 크기를 가지는 자료형을 큰 크기를 가지는 자료형에 대입
- 강제로 타입 변환 → 데이터의 손실이 발생 (자바 컴파일러는 오류를 발생시킴)
1차 및 2차 배열 선언하기
1차 배열
- 선언
타입[] 변수이름;
int[] score;
String[] name;타입 변수이름[];
int score[];
String name[];
- 생성
타입[] 변수이름; // 배열을 선언(배열을 다루기 위한 참조변수 선언) 변수이름 = new 타입[길이]; // 배열을 생성(실제 저장공간 생성) ex. int[] score; // int 타입의 배열을 다루기 위한 참조변수 score 선언 score = new int[5]; // int 타입의 값 5개를 저장할 수 있는 배열
- 선언과 동시에 생성
타입[] 변수이름 = new 타입[길이]; // 배열의 선언과 생성을 동시에 int[] score = new int[5]; // 길이가 5인 int배열
2차 배열
- 선언
타입[][] 변수이름;
ex. int[][] score;타입 변수이름[][];
ex. int score[][];타입[] 변수이름[];
int[] score[];
- 생성
타입[][] 변수이름; // 배열을 선언(배열을 다루기 위한 참조변수 선언) 변수이름 = new 타입[행][열]; // 배열을 생성(실제 저장공간 생성) ex. int[][] score; // int 타입의 배열을 다루기 위한 참조변수 score 선언 score = new int[4][3]; // 4행 3열의 2차원 배열 생성
- 선언과 동시에 생성
타입[][] 변수이름 = new 타입[행][열]; // 배열의 선언과 생성을 동시에 int[][] score = new int[4][3]; // 4행 3열의 2차원 배열 생성
타입 추론, var
타입추론
타입이 정해지지 않은 변수에 대해서 컴파일러가 변수의 타입을 스스로 찾아낼 수 있도록 하는 기능
var
- Java 10부터 지원
- 지역변수로 사용해야 함
- 선언과 동시에 반드시 초기화를 해야 함
- null 초기화하면 작동하지 않음
- 람다 표현식에는 var 사용할 수 없음
- 변수 이름에 []를 사용할 수 없고 선언과 동시에 {}에 값 대입을 이용할 수 없음
public class Main {
public static void main( String[] args) {
var hello = "world";
var hi; // 컴파일 에러
System.out.println(hello instanceof String); // 타입 추론 후 String이면 true가 반환
}
}
출처
https://coding-factory.tistory.com/547
https://yeastriver.tistory.com/7
https://velog.io/@gillog/원시타입-참조타입Primitive-Type-Reference-Type
https://mine-it-record.tistory.com/100
https://velog.io/@jaden_94/2주차-항해일지
https://lob-dev.tistory.com/entry/Live-StudyWeek-02-자바-데이터-타입-변수-그리고-배열
https://www.aladin.co.kr/shop/wproduct.aspx?ItemId=76083001 자바의 정석 - 남궁성
https://young-bin.tistory.com/48
https://itcoin.tistory.com/426
https://github.com/kksb0831/Practice_project/blob/master/Java_Study_02.md
'스터디 > whiteship - live-study' 카테고리의 다른 글
[백기선님 라이브 스터디] 3주차 - 연산자 (0) | 2022.04.11 |
---|---|
[백기선님 라이브 스터디] 1주차 - JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가 (0) | 2022.03.29 |
댓글