반응형
- 해당 내용은 백기선 님의 자바 온라인 스터디 공부 및 제출 목적
-> https://github.com/whiteship/live-study/issues/2
목표
- 자바의 프리미티브 타입, 변수 그리고 배열을 사용하는 방법을 익힙니다.
학습할 것
- 프리미티브 타입 종류와 값의 범위 그리고 기본 값
- 프리미티브 타입과 레퍼런스 타입
- 리터럴
- 변수 선언 및 초기화하는 방법
- 변수의 스코프와 라이프타임
- 타입 변환, 캐스팅 그리고 타입 프로모션
- 1차 및 2차 배열 선언하기
- 타입 추론, var
1. 프리미티브 타입 종류와 값의 범위 그리고 기본 값
- 총 8가지의 프리미티브 타입(Primitive Type, 기본형 타입)을 미리 정의하여 제공.
종류 | 타입 | 할당되는 메모리 크기 | 기본 값 | 값의 범위 |
논리형 | boolean | 1 Byte | false | true, false |
정수형 | byte | 1 Byte | 0 | -128 ~ 127 |
short | 2 Byte | 0 | -32,768 ~ 32,767 | |
int(기본) | 4 Byte | 0 | ~2,147,483,648 ~ 2,147,483,647 | |
long | 8 Byte | 0L | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 | |
실수형 | float | 4 Byte | 0.0F | 3.4 X 10^-38 ~ 3.4 X 10^38 |
double(기본) | 8 Byte | 0.0 | 1.7 X 10^-308 ~ 1.7 X 10^308 | |
문자형 | char | 2 Byte | '\u0000' | 0 ~ 65,535 혹은 '\u0000' ~ '\uffff' |
2. 프리미티브 타입과 레퍼런스 타입
- 프리미티브 타입
- 기본형 타입(Primitive Type)은 JAVA 언어에 내장된 기본 자료형 중 하나.
- 기본값이 있기 때문에 NULL 값이 존재하지 않음.
- 실제 값을 Stack 메모리에 저장. - 레퍼런스 타입
- 참조형 타입(Reference Type)은 기본형 타입을 제외한 모든 타입.
- 기본형 타입과 다르게 기본값이 없기 때문에 빈 객체를 의미하는 NULL 값이 존재.
- 값이 저장되어 있는 주소 값을 Heap 메모리에 저장. - 참조
3. 리터럴
- 리터럴(Literal)이란 소스 코드의 고정된 값을 대표하는 용어.
- 개발하며 변수에 직접 표현한 값.
- 일반적으로 Primitive type(int, float, boolean etc...)
- int a = 10;
- 위의 예를 살펴보면, int 뒤에 num은 변수명이며, 10은 이 변수의 데이터(값)이다.
- 이 10은 변하지 않는 데이터이며, 이것을 리터럴(literal)이라 한다.
- 참조
4. 변수 선언 및 초기화하는 방법
- int number; / String letter;
- 위의 예를 살펴보면, number 라는 int형 변수를 선언한 것이고, letter 라는 String형 변수를 선언한 것이다.
- 이렇게, 개발에 사용할 데이터를 저장하며 메모리에 할당하는 이 행위을 변수의 선언이라 한다.
- 하지만, number와 letter에 값이 없기 때문에, 사용할 수는 없다.
- number = 10; / letter = "Hello, World!";
- 이번에는 number 라는 변수에 10이라는 값을, letter 라는 변수에 Hello, World! 라는 문자열 값을 선언하였다.
- 이렇게, 변수에 처음 값을 저장시키는 행위를 변수의 초기화라 한다.
- 변수의 초기화를 하지 않고 사용하면, 쓰레기 값이 발생한다.
- 이것은 자신이 사용하는 메모리는 운영체제도 사용하고, 다른 프로그램들이 같이 사용하는 공유자원이기 때문에, 사용 후 남아 있는 쓰레기 값이 들어가 있을 수 있고, 이로 인해 초기화를 하지 않고 사용했을 때, 이 남아 있는 값이 나오게 된다.
- int num = 100;
- 위 예제는 변수의 선언 및 초기화를 동시에 한 것이다.
5. 변수의 스코프와 라이프타임
- 변수의 스코프(Scope)란 우리가 개발에서 선언한 변수의 사용 가능 범위.
- 변수가 선언된 블럭({})이 그 변수의 스코프 이다.
public class scopeTest {
int globalNum = 10;
public void test1(int val) {
int localNum = 50;
System.out.println("test1 globalNum : " + globalNum);
System.out.println("test1 localNum : " + localNum);
System.out.println("test1 val : " + val);
}
int plus = globalNum + localNum; <-- 에러(localNum이 선언되지 않음)
}
- 위의 예제를 살펴보면, globalNum은 해당 클래스 전체에서 사용 가능하며, localNum은 test1 메서드 안에서만 사용이 가능하다.
val은 블럭({}) 밖에 존재하지만, test1 메서드 선언부에 존재하므로 스코프는 test1 메서드 안이다. - plus 변수는 globalNum과 localNum을 더한 값을 저장하려고 하지만, localNum은 test1 메서드 밖에 있으므로, 사용할 수 없다.
public class scopeTest {
int globalNum = 10;
static int globalStaticNum = 30;
public static void main(String[] args) {
System.out.println(globalNum); //<-- 에러(static 으로 선언한 메소드 또는 변수는 같은 stati 로 선언된 곳에서 사용 가능)
System.out.println(globalStaticNum);
System.out.println(localNum); //<-- 에러(localNum은 test1 메소드에 선언한 지역 변수로 test1을 나오면 사용 불가능)
test1(100); //<-- main 메서드가 static 으로 선언되어, static으로 선언되지 않은 test1 메소드는 사용 불가
test2(100);
}
public void test1(int val) {
int localNum = 50;
System.out.println("test1 globalNum : " + globalNum);
System.out.println("test1 localNum : " + localNum);
System.out.println("test1 val : " + val);
}
public static void test2(int val) {
System.out.println("test2 val : " + val);
}
}
접근 범위(스코프) | 수명(라이프타임) | |
멤버 변수 | 클래스 내부에서 사용. private 제어자로 선언된 멤버변수가 아니면 다른 클래스에서도 사용가능. |
인스턴스 생성 시 힙 메모리에 할당되며 가비지 컬렉터가 수거할 때 까지 존재. |
지역 변수 | 로컬 변수라고도 한다. 선언 된 메소드 내부에서만 사용. |
메소드 호출 시 스택 메모리에 생성되었다가 호출이 끝나면 소멸. |
static 변수 | 클래스 변수라고도 한다. 클래스 내부에서 사용되고 private 제어자로 선언된 변수가 아니면 다른 클래스에서도 사용가능. |
static변수는 클래스의 인스턴스가 생성되기 이전부터 생성되어 있다. 프로그램 시작 시 데이터 메모리에 할당되고 프로그램 종료시까지 계속 남아있다가 프로그램이 종료되면서 메모리에서 소멸된다. |
6. 타입 변환, 캐스팅 그리고 타입 프로모션
- 하나의 타입을 다른 타입으로 변환 하는 것을 타입 변환(Type Conversion).
- Java 에서는 Boolean(true, false)형을 제외하고, 나머지 기본 타입끼리 서로 변환이 가능.
- 타입 변환에는 캐스팅(Casting, 명시적 형변환) 과 프로모션(Promotion, 묵시적 형변환) 두 종료가 존재.
- 프로모션(묵시적 형변환)
- 대입 연산이나 산술 연산에서 컴파일러가 자동으로 수행해주는 변환.
- 쉽게 말해, 작은 타입을 큰 타입으로 변환.
- Java 에서는 데이터의 손실이 발생하지 않거나, 손실이 최소화되는 방향으로 변환을 진행.
- byte형(1) → short형(2) → int형(4) → long형(8) → float형(4) → double형(8)
char형(2) ↗
double num1 = 10; // double형 보다 작은 int형의 값이므로 double형의 값으로 변환
int num2 = 3.14; // int형 보다 큰 double형의 값이므로 int형으로 변환 실패
double num3 = 7.0f + 3.14; // double형 보다 작은 float형의 값이므로 double형의 값으로 변환
byte num1 = 100; // byte형 변수에 표현 범위가 더 큰 int형 데이터를 대입. 하지만, 정수 100은 byte형 변수가 표현할 수 있는 범위 내에 있으므로, 자동으로 타입 변환
byte num2 = 200; // Byte형의 범위보다 큰 수로 존재하지 않으므로 변환 실패
int num3 = 9876543210; // int형의 범위보다 큰 수로 존재하지 않으므로 변환 실패
- 캐스팅(명시적 형변환)
- 사용자가 타입 캐스트 연산자(())를 사용하여 강제적으로 수행하는 변환.
- 강제 형변환이라고도 하며, 큰 타입을 작은 타입으로 변환하고자 할 때 사용.
- 다음과 같이 사용 => (변환할 타입) 변환할데이터.
int num1 = 1, num2 = 4;
double result1 = num1 / num2;
double result2 = (double) num1 / num2;
System.out.println(result1); // 결과 : 0
System.out.println(result2); // 결과 : 0.25
/*
1 나누기 4의 결과로는 0.25가 반환되지만, int형으로 자동 타입 변환되어 0이 반환되게 됩니다.(result1)
그리고서 double형 변수에 그 결과가 대입될 때, double형으로 자동 타입 변환되어 0.0이라는 결과가 출력(result2)
*/
7. 1차 및 2차 배열 선언하기
- 배열이란, 같은 타입의 변수들로 이루어진 집합.
- 배열을 구성하는 각각의 값을 요소(element)라 하며, 배열에서의 위치를 가리키는 숫자를 인덱스(index)라 한다.
- Java에서 index는 항상 0부터 시작하며 양의 정수만 가진다.
- 배열 선언에 따라 1차원 배열, 2차원 배열 ... 다차원 배열까지 선언 할 수 있다.
- 1차원 배열
- 가장 기본적인 배열
- 다음과 같이 사용 => 타입[] 배열명 = new 타입[배열길이];
- 배열의 길이보다 적은 수의 배열 요소만 초기화할 경우, 나머지 배열 요스들은 배열의 타입에 맞게 자동으로 초기화.
배열의 타입 | 초기값 |
char | '\u0000' |
byte, short, int | 0 |
long | 0L |
float | 0.0F |
double | 0.0 또는 0.0D |
boolean | false |
배열, 인스턴스 등 | null |
// String형의 array라는 배열명의 1차원 배열을 선언.
String[] array; // java에서는 이 방법을 많이 사용.
String array[];
// array라는 배열에 String형의 배열길이가 5인 배열 생성.
array = new String[5];
// 선언과 동시 생성
String[] array = new String[5];
// 배열의 초기화
array[0] = "Hello"; // 0번 인덱스에 Hello 라는 값을 저장
array[1] = "World!"; // 1번 인덱스에 World! 라는 값을 저장
// 나머지 2~4 인덱스에는 초기화를 안했기 때문에 null
// 동시에 배열의 선언, 생성, 초기화
int[] grade = new int[]{85, 65, 90}; // 길이가 3인 int형 배열을 선언과 동시에 초기화
- 2차원 배열
- 1차원 배열을 요소로 가지는 배열.
- Java 에서는 따로 2차원 배열이라는 타입이 존재하지 않는다.
- 다음과 같이 사용 => 타입[][] 배열이름 = new 타입[][]; / 타입 배열이름[][] / 타입[] 배열이름[];
// 2차원 배열 선언 및 생성
int[][] arr = new int[2][3];
// 배열 초기화
arr[0][0] = 10;
arr[0][1] = 20;
// 2차원 배열 선언 및 생성, 초기화
int[][] arr = {
{10, 20, 30},
{40, 50, 60}
};
- 가변 배열
- Java에서는 2차원 배열을 생성할 때 열의 길이를 명시하지 않음으로써, 행마다 다른 길이의 배열 요소를 저장할 수 있다.
- 이러한 행마다 다른 길이의 배열을 가변 배열이라 한다.
int[][] arr = new int[3][];
arr[0] = new int[2];
arr[1] = new int[4];
arr[2] = new int[1];
8. 타입 추론, var
- 타입 추론(Type Inference)이란 표현식의 타입을 컴파일러가 스스로 알아내 사용하는 기능.
- Java 10부터 var 라는 Local Variable Type-Inference 가 추가.
- 이 var 는 local variable(지역 변수) 이면서 선언과 동시에 intialize(초기화)가 필수적.
- 주의 할 점으로 <>(다이아몬드 연산자) 방식과 같이 사용하면 컴파일 에러가 발생.
// Java 9 이하
String text = "Hello, World!";
// Java 10 이상
var message = "This is Type-Inference"; // 컴파일러는 초기화 값을 통해 타입을 유추한다.
// 컴파일러가 타입을 유추할 수 있는 정보가 없다.
var list = new ArrayList<>();
반응형
'Study > Java(Online-Study)' 카테고리의 다른 글
6주차 과제: 상속 (0) | 2021.07.17 |
---|---|
5주차 과제: 클래스 - 이론(1) (0) | 2021.06.27 |
4주차 과제: 제어문 - 이론(1) (0) | 2021.06.20 |
3주차 과제 : 연산자 (0) | 2021.06.19 |
1주차 과제: JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가. (0) | 2020.11.19 |