[자바 라이브 스터디] 2주차 - 자바 데이터 타입, 변수 그리고 배열1. 프리미티브 타입 종류와 값의 범위 그리고 기본 값2. 프리미티브 타입과 레퍼런스 타입3. 리터럴4. 변수 선언 및 초기화하는 방법5. 변수의 스코프와 라이프타임6. 타입 변환, 캐스팅 그리고 타입 프로모션7. 1차 및 2차 배열 선언하기8. 타입 추론, var
[자바 라이브 스터디] 2주차 - 자바 데이터 타입, 변수 그리고 배열
- 목표) 자바의 프리미티브 타입, 변수 그리고 배열을 사용하는 방법을 익힙니다.
1. 프리미티브 타입 종류와 값의 범위 그리고 기본 값
- 정의) 자바가 제공하는 기본 타입(Primitive type) 종류는 총 8개임
- 특징)
- 기본 타입 종류
- long 타입 변수에 정수 리터럴 저장할 때, 정수 리터럴이 int타입의 허용 범위 이내라면 L 붙이지 않아도 됨.
long a=10;← OKlong a=100000000000000;← 컴파일 에러long a=100000000000000L;← OK
저장되는 값 | 타입 종류 | 메모리 사용 크기 | 저장되는 값의 허용 범위 | 기본값 |
정수 타입 | byte | 1 byte (8 bit) | ~ | 0 |
ㅤ | short | 2 byte (16 bit) | ~ | 0 |
ㅤ | int (기본) | 4 byte (32 bit) | ~ (21억…) | 0 |
ㅤ | long | 8 byte (64 bit) | ~ | 0L |
ㅤ | char | 2 byte (유니코드) | ~ | '\u0000' |
실수 타입 | float | 4 byte | ~
(소수점 아래 7자리) | 0.0F |
ㅤ | double (기본) | 8 byte | ~ (소수점 아래 15자리) | 0.0 |
논리 타입 | boolean | 1 byte | true, false | false |
float, double vs BigDecimal 클래스float, double: 변수의 타입(primitive type)- 내부적으로 수를 이진수의 근사치로 저장
- 사칙 연산 시 기대한 값과 다른 값 출력함 (부동 소수점 연산)
- 소수점의 정밀도에 있어 한계가 있음
BigDecimal:java.math패키지에 있는 클래스- 내부적으로 수를 십진수로 저장
- 정확한 소수점 연산을 수행할 수 있어서 신뢰성이 높은 계산이 가능
- Java에서 숫자를 정밀하게 저장하고 표현할 수 있는 유일한 방법으로, 돈과 소수점 다룰 때 필수
- 소수점 이하의 자리수에 대한 제한이 없으며, 거의 무한한 정밀도를 제공
- 속도가 기본 타입보다 느림
int vs Integer 클래스int: 변수의 타입(primitive type)- 산술 연산 가능함
- null로 초기화 불가
Integer: 래퍼 클래스 (Wrapper class)- Unboxing( ex. Integer to int )하지 않을 시 산술 연산 불가능함
- null값 처리 가능
래퍼 클래스
- 정의) 기본형을 객체로 다루기 위해 사용하는 클래스들
- 예시) 모든 기본형은 래퍼 클래스 생성할 수 있음
Primitive type | Wrapper class |
byte | Byte |
short | Short |
int | Integer |
long | Long |
char | Character |
float | Float |
double | Double |
boolean | Boolean |
- 특징) 사용하는 경우는 아래와 같음
- 메소드에 전달된 파라미터를 수정하려 할 때
- 파라미터로 객체가 전달되면 얕은 복사가 일어나 객체의 참조를 복사하기 때문에, 원래 객체와 전달된 파라미터는 같은 객체를 가리킴
- 기본형 값이 아닌 객체로 저장해야 할 때
- 제네릭 컬렉션에 기본 데이터 타입을 저장하려면 해당 기본 데이터 타입의 Wrapper 클래스를 사용 →
ArrayList<Integer> numbers = new ArrayList<Integer>();) - 객체 간 비교가 필요할 때
- null 값을 처리할 수 있어야 할 때
- 데이터베이스나 외부 API와 상호작용할 때 유용
2. 프리미티브 타입과 레퍼런스 타입
- 정의) 기본 타입은 실제 값을 변수 안에 저장하지만, 참조 타입은 값이 저장된 메모리 상의 주소를 변수 안에 저장함
- 특징)
- 참조 타입 종류
- 기본값은 전부 null이고, 할당되는 메모리 크기는 전부 4byte(객체의 주소값)임
- 메모리 생성 위치
- 기본 타입의 메모리 생성 위치는 스택임
- 기본 타입 변수는 스택 영역에 직접 값을 저장함
- 참조 타입의 메모리 생성 위치는 힙임
- 참조 타입 변수는 힙 영역에 저장된 실제 객체의 주소 값을 스택 영역에 저장해 객체를 참조함
타입 종류 | 예시 |
배열 | int[] arr = new int[5]; |
열거 | enum Hi {HI, HELLO} |
클래스 | String str = "test"; |
인터페이스 | ㅤ |
JVM이 사용하는 메모리 영역
메소드 영역- 정의) JVM이 시작될 때 생성되고, 모든 스레드가 공유하는 영역
- 특징) 컴파일 된 바이트 코드(.class)들이 저장됨
- 정적 필드(static field)
- 상수(constant)
- 메소드(method) 코드
- 생성자(constructor) 생성자
- 과정) 생성 과정
- 소스 코드 작성 (.java)
- 컴파일 : 바이트 코드 파일 생성 (.class)
- 자바 프로그램을 실행하면 바이트 코드 파일이 메소드 영역에 로딩된다.
힙 영역- 정의) 객체와 배열이 저장되는 영역
- 특징)
- 힙 영역에 생성된 객체와 배열은 JVM 스택 영역의 변수에서 참조함
- 참조를 잃어버린 객체나 배열은 변수가 꺼내올 수 없으므로(의미 없는 객체가 되기 때문에), 자동으로 Garbage Collector(쓰레기 수집기)에 의해 힙 영역에서 제거됨
JVM 스택 영역- 정의) 각 스레드마다 하나씩 존재하며 스레드가 시작될 때 할당되는 영역
- 특징)
- 메소드를 호출할 때 프레임 추가하고, 해당 프레임은 메소드가 종료될 때 제거함
- 프레임 내부의 로컬 변수 스택에 변수들이 추가되거나 제거됨
- 변수 생성 시점은 변수가 초기화될 때(값 저장될 때)
- 변수 제거 시점은 선언된 블록을 벗어났을 때
3. 리터럴
- 정의) 소스 코드에서 프로그래머에 의해 직접 입력된 값 (소스 코드의 고정된 값)
- 종류)
- 정수 리터럴 → byte, short, int, long, char에 저장됨
- 10진수(소수점 없는 숫자)
- 2진수(0b…, 0B…), 8진수(0…), 16진수(0x…, 0X…)
- 실수 리터럴 → float, double에 저장됨
- 10진수(소수점이 있는 숫자)
- 지수와 가수로 표현 : 5e2(500.0), 5E-2(0.05)
- 문자 리터럴 → char에 저장됨
- 하나의 문자를 작은 따옴표로 감싼 것
- 유니코드(세계 각국 문자를 2byte로 표현할 수 있는 숫자로 매핑한 국제 표준 규약)로 변환되어 저장됨
- ‘a’ → 유니코드 65
- 문자열 리터럴 → String에 저장됨
- 큰 따옴표로 감싼 문자들
- 논리 리터럴 → boolean에 저장됨
- true, false, 10 > 0…
- C와 달리 boolean 타입으론 1,0을 참,거짓으로 사용 불가
4. 변수 선언 및 초기화하는 방법
- 선언하고자 하는 변수들이 같은 타입일 경우, 한 줄로 동시에 선언 및 초기화 가능
- 이미 선언된 변수들은 동시에 초기화시킬 수는 없음
- 변수 이름 명명 규칙
- 첫 번째 글자는 문자, $, _ 로 시작해야 하며, 숫자로 시작할 수 없음
- 영어 대소문자가 구분됨
- 자바에서 미리 정의된 예약어(keyword)는 사용 불가
- 문자 수 길이에 제한이 없고, 공백을 포함해서는 안됨
- 관례 : Camel Case (ex. numberOfStudents)
- String 변수
- String 객체가 생성된 후, String 변수가 해당 객체를 참조함
- Sol 1) 문자열 리터럴로 생성
- 문자열 리터럴이 동일하다면, 같은 String 객체 공유하도록 되어 있음
==은 변수에 저장된 객체의 주소값이 동일한지 검사equals()는 동일한 객체건 다른 객체건 상관 없이, 내부 문자열이 동일한지 검사- Sol 2) new 연산자로 생성
- 무조건 새로운 String 객체를 생성함
5. 변수의 스코프와 라이프타임
- 클래스 변수
- 정의) 클래스 내에서
static키워드로 선언된 변수로서, 해당 클래스의 모든 인스턴스들이 공유하는 변수 - 특징)
- 클래스가 메모리에 로드될 때 할당되고, 프로그램이 종료될 때까지 유지됨
- 클래스 이름을 통해 접근하며, 객체를 생성하지 않고도 클래스 변수에 접근할 수 있음
- 클래스의 모든 인스턴스들이 동일한 클래스 변수의 값을 공유함
- 인스턴스 변수
- 정의) 클래스 내에서 선언된 변수로서, 클래스의 인스턴스(객체)마다 각각 별도의 값을 가질 수 있는 변수
- 특징)
- 객체가 생성될 때 메모리에 할당되고, 해당 객체의 라이프타임과 동일하게 유지됨
- 객체를 통해 접근하며, 각 인스턴스마다 독립적인 값을 갖기 때문에 서로 다른 객체에서 서로 다른 값을 가질 수 있음
- 로컬 변수
- 정의) 메소드, 생성자, 블록 내에서 선언된 변수로서, 해당 블록 내에서만 접근 가능한 변수
- 특징)
- 메소드 블록 내부에서만 사용되고 메소드 실행이 끝나면 메모리에서 자동으로 없어짐
6. 타입 변환, 캐스팅 그리고 타입 프로모션
- 자동 타입 변환(Promotion)
- 정의) 값의 허용 범위가 작은 타입이 큰 타입으로 저장될 때 발생하는 것
- Widening type cast
- byte < short < int < long < float < double
- 예시)
- 산술 연산에서의 자동 타입 변환
- 피연산자로 정수/실수 타입 변수가 사용되면, 두 피연산자 중 허용 범위가 큰 쪽으로 자동 타입 변환되어 연산 수행함
- 피연산자로 정수 타입 변수가 사용되면, int 타입보다 작은 byte, short 타입 변수는 int 타입으로 자동 타입 변환되어 연산 수행함
- byte, short 타입 변수는 무조건 int로 타입 변환되니, 처음부터 피연산자로 int 타입 변수를 사용하는 것이 타입 변환을 줄여 실행 성능 향상시키는 방법임
- 문자열 결합 연산에서의 자동 타입 변환
- 피연산자 중 하나가 문자열일 경우엔 나머지 피연산자도 문자열로 자동 변환되어 문자열 결합 연산 수행함
- 강제 타입 변환(Casting)
- 정의) 값의 허용 범위가 큰 타입을 작은 타입으로 강제로 나눠서 저장하는 것
- Narrow type cast
- 예시) 문자열과 기본 타입 간의 강제 타입 변환
- 기본 타입 → String
String str = String.valueOf(num);// 얜 결국Integer.toString()을 호출함String str = Integer.toString(num);- String → 기본 타입
int num = Integer.parseInt(str);//원시데이터인 int타입을 반환int num = Integer.valueOf(str);// Integger 래퍼 객체를 반환- Autoboxing and Unboxing : Integer 객체 리턴 받아서 int 변수에 할당하면 자동 형변환 일어나서 둘 중 뭘 쓰던 상관 없음
- Char[] → String
String str = String.valueOf(arr);- String → Char[]
char[] arr = str.toCharArray();- for문
- 번외
7. 1차 및 2차 배열 선언하기
- 1차원 배열
- 중괄호
{ }는 주어진 값들을 항목으로 가지는 배열 객체를 힙에 생성(int 타입 크기의 요소 5개를 할당)하고, 배열 객체의 주소값을 리턴함 - 배열 변수 a는 리턴된 주소값을 저장함으로써 참조 이루어짐
- 2차원 배열
- 자바는 2차원 배열을 중첩 배열 방식으로 구현함
8. 타입 추론, var
- 정의) 타입이 정해지지 않은 변수에 대해서 컴파일러가 변수의 타입을 스스로 찾아낼 수 있도록 하는 기능
- 특징)
- 자바에선 10버전 이상부터 추가됨
var a = "hi"; - 타입을 명시하지 않아도 되기에 코드량 줄이고 코드 가독성 높일 수 있음
- 주의할 점)
- 초기화값이 있는 지역변수 (Local Vairable)로만 선언 가능
- 멤버변수, 파라미터, 리턴타입으로 사용 불가
- var와 다이아몬드 연산자를 같이 사용하게 되면 컴파일 에러가 발생함
var b = new ArrayList<>();// 컴파일 에러- IDE가 없으면 어떤 데이터 타입이 들어오는지 확인하기 어려움
참고
- 책 : 혼자 공부하는 자바

![[백기선 자바] 자바 데이터 타입, 변수 그리고 배열](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F301eb74c-edaf-492f-9dca-9be8a3bbf75e%2F%25EC%25BA%25A1%25EC%25B2%2598.jpg?table=block&id=8a9bb495-929f-4174-b811-a8552bece499&cache=v2)






![[자바 11] 람다에서 var 사용하기](https://www.notion.so/image/https%3A%2F%2Fi.ytimg.com%2Fvi%2Ftjj-XLk4CSA%2Fhqdefault.jpg?table=block&id=6bf52ec2-b020-4dd7-8222-b9daf9ff1ca7&cache=v2)



![[JAVA] 참조 타입](https://www.notion.so/image/https%3A%2F%2Fvelog.velcdn.com%2Fimages%2Fy55nms%2Fpost%2F80551eba-4538-44b2-9bc6-12acdbede49a%2Fimage.png?table=block&id=6215b685-85b8-45cd-9054-38961e943215&cache=v2)

![[Java] 자바 문자열을 다루는 String 클래스 메소드 총정리](https://www.notion.so/image/https%3A%2F%2Fhongong.hanbit.co.kr%2Fwp-content%2Fuploads%2F2023%2F03%2FJava-%EC%9E%90%EB%B0%94-%EB%AC%B8%EC%9E%90%EC%97%B4%EC%9D%84-%EB%8B%A4%EB%A3%A8%EB%8A%94-String-%ED%81%B4%EB%9E%98%EC%8A%A4-%EB%A9%94%EC%86%8C%EB%93%9C-%EC%B4%9D%EC%A0%95%EB%A6%AC.png?table=block&id=1e2a17cd-86bc-41a2-a8a4-0def4c7d1cc0&cache=v2)

![[Java] 자바 배열(array) 선언하고 생성하기](https://www.notion.so/image/https%3A%2F%2Fhongong.hanbit.co.kr%2Fwp-content%2Fuploads%2F2023%2F03%2F%EC%9E%90%EB%B0%94-%EB%B0%B0%EC%97%B4-%EC%84%A0%EC%96%B8-%EB%B0%B0%EC%97%B4-%EC%83%9D%EC%84%B1.png?table=block&id=a5e9a4e7-3efd-4d0c-8a70-ea29775b0489&cache=v2)