JaeWon's Devlog
article thumbnail
반응형

- 해당 내용은 백기선 님의 자바 온라인 스터디 공부 및 제출 목적

   -> https://github.com/whiteship/live-study/issues/2

 

2주차 과제: 자바 데이터 타입, 변수 그리고 배열 · Issue #2 · whiteship/live-study

목표 자바의 프리미티브 타입, 변수 그리고 배열을 사용하는 방법을 익힙니다. 학습할 것 프리미티브 타입 종류와 값의 범위 그리고 기본 값 프리미티브 타입과 레퍼런스 타입 리터럴 변수 선언

github.com


목표

  • 자바의 프리미티브 타입, 변수 그리고 배열을 사용하는 방법을 익힙니다.

학습할 것

  1. 프리미티브 타입 종류와 값의 범위 그리고 기본 값
  2. 프리미티브 타입과 레퍼런스 타입
  3. 리터럴
  4. 변수 선언 및 초기화하는 방법
  5. 변수의 스코프와 라이프타임
  6. 타입 변환, 캐스팅 그리고 타입 프로모션
  7. 1차 및 2차 배열 선언하기
  8. 타입 추론, 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}
};

http://www.tcpschool.com/java/java_array_twoDimensional

  • 가변 배열
    - 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<>();
반응형
profile

JaeWon's Devlog

@Wonol

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!