본문 바로가기

카테고리 없음

자바 2주차 과제 - 데이터 타입, 변수 그리고 배열

목표

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

학습할 것

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

 


1. Primitive Type (기본형, 프리미티브 타입)

  • 총 8가지의 기본형 타입이 있음
  • 자바에서 기본 자료형은 사용전에 반드시 Declared 되어야함
  • C에서와 다르게 OS에 따라 자료형의 길이가 변하지 않음
  • 실제값이 저장되는 공간으로 Stack 메모리 공간에 저장됨
  • 객체가 타입이 아니고, 기본값이 있어서 Null이 존재하지 않음
  Type Default Value(기본값) Size (할당크기) Range of Values (표현 가능 범위)
Integer byte 0 1 byte  -128 ~ 127
short 0 2 byte -32,768 ~ 32,767
int (default) 0 4 byte  -2,147,483,648 ~ 2,147,483,647
long 0 8 byte -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807
Floating-Point float 0.0 4 byte 소수점 7 자리까지
double (default) 0.0 8 byte 소수점 16 자리까지
Char char \u0000 2 byte (유니코드)  0 ~ 65,535
Bool boolean false 1 byte true, false

 

더보기: 자바의 데이터 타입(Primitive Type)의 유의사항과 응용: https://gbsb.tistory.com/144?category=735872


2. Reference Type (참조형 타입)

  • 기본형 타입을 제외한 타입들이 모두 참조형 타입이다.
  • 빈 객체를 의미하는 Null이 존재한다. 그리고 기본값이 Null이다.
  • 값이 저장되어 있는 곳의 주소값을 저장하는 공간으로 힙 (Heap) 메모리에 저장됩니다.
  • Primitive Type vs Reference Type: 
  • 메모리상에 할당되는 각각의 공간에 실제 값이 들어가면 Primitive 타입이고, 다른 것을 참조하기 위한 주소값이 들어가면 Reference Type 이다.
  • 클래스 타입, 인터페이스 타입, 배열 타입, 열거 타입이 있습니다.

3. Literal (리터럴)

  • 데이터 그 자체를 의미한다. 변수에 넣는 변하지 않는 데이터를 의미한다.
  • 프로그램에서 직접 표현한 값이다.
  • 소스 코드의 고정된 값을 대표하는 용어이다.
  • 정수, 실수, 문자, 논리, 문자열 리터럴이 존재한다.
int trueNum = 1;
  • 여기서 trueNum은 변수고 1이 리터럴이다.

 

  • integer (정수) 리터럴: 모든 정수 값은 정수 리터럴이다. 
int dec = 15; // 10진수 리터럴 15
int bin = 0b1101; // 0b로 시작하니 2진수 리터럴
int oct = 013; // 0으로 시작하면 8진수 리터럴
int hex = 0x13; // 0x로 시작하면 16진수 리터럴
long long_dec = 15L; // long타입 리터럴은 l 또는 L을 붙여 표시한다.

 

  • float (실수) 리터럴: 소수점이나 지수형태로 표현한 값
double a = 0.1122;
double b = 1122E-5; // 1122 * 10 * (-5) = 0.01122와 동일하다

float c = 0.1122f;
double d = .1122D;

 

  • char (문자) 리터럴: 단일 인용부호 (' ')로 문자를 표현해야한다. (" ") 이걸로 하면 Compile Error
char a = 'D';
char b = "E"; // Compile Error

Compile Error Message: Main.java:15: error: incompatible types: String cannot be converted to char char b = "g"; ^ 1 error

 

 

  • boolean (논리) 리터럴
boolean a = true;
boolean b = 10 > 0; // b 는 true
boolean c = 0; // C언어에서와 다르게 boolean type으로 1,0을 참, 거짓으로 사용불가능하다.

 

  • string (문자열) 리터럴
    • null 리터럴은 레퍼런스에 대입해서 사용한다.
    • 기본타입에는 사용이 불가능하고 String 같은경우에는 Class여서 사용 가능하다.
int a = null; // compile error
String str = null;
str = "JAVA"

 

참고: mine-it-record.tistory.com/100

 


4. 변수 선언 및 초기화하는 방법

변수란? 값을 저장할 수 있는 메모리 공간에 붙여진 이름이다. 변수라는 것을 선언하면 메모리 공간이 할당되고 할당된 메모리 공간에 이름이 붙는다.

 

변수선언

int num; // 변수형식 변수이름
int num = 20; // 변수형식 변수이름 = 초기화값
int num1, num2, num3, num4; // 변수형식 변수이름1, 변수이름2, 변수이름3, 변수이름4
int num1 = 10, num2 = 20, num3 = 30, num4 = 40; // 변수형식 변수이름1 = 초기화값, 변수이름2 = 초기화값, 변수이름3 = 초기화값, 변수이름4 = 초기화값;

 

 

변수의 초기화

변수를 선얺하고 값을 저장하는 것을 변수 초기화라고 한다. 변수의 초기화의 경우에 따라 필수적일수도 선택적일수도있지만 가능하면 선언과 동시에 적절값으로 초기화하는게 좋다. 

멤버 변수는 초기화 하지 않아도 변수의 타입에 맞는 기본값으로 초기화가 이루어지지만, 지역변수는 사용하기 전에 반드시 초기화가 이루어져야한다.

 


 

5. 변수 스코프와 라이프타임

  • 변수 스코프: 변수를 사용할수있는 범위를 이야기한다. {중괄호} 안에서 변수를 선언했을 경우 영역이 끝나기 전까지는 어디서든 사용이 가능하다.  
  • 자바의 변수 (클래스, 인스턴스, 지역변수)
    • 변수의 선언 위치에따라서 종류가 달라진다.
public class test {

	int instVar; // 인스턴스 변수    
    static int classVar; // 클래스 변수
    
    void method() {
    	int localVar; // 지역 변수
    }
}
변수의 종류 선언위치 생성시기 (메모리 활당 시기)
클래스 변수 클래스 영역 클래스가 메모리에 올라갈때
인스턴스 변수 인스턴스가 생성될때
지역 변수 클래스 이외의 영역 (메서드, 생성자, 초기화 블럭) 변수 선언문이 수행 되었을때

 

  • 인스턴스 변수: 인스턴스가 생성될때 생성된다. 인스턴스 변수의 값을 읽거나 저장하려면 인스턴스를 먼저 생성해야하고 인스턴스별로 다른값을 가질수있다. 각각의 인스턴스마다 고유의 값을 가져가야할때는 인스턴스 변수로 선언을 한다.
  • 클래스 변수: 인스턴스 변수에 static만 붙여주면 된다. 인스턴스 변수는 각각 고유한 값을 가지지만 클래스 변수는 모든 인스턴스가 공통된 값을 공유하게 된다. 한 클래스의 모든 인스턴스들이 공통으로 가져야할 때 클래스 변수로 선언한다. 클래스가 로딩될때 생성 (메모리에 딱 한번만 올라간다.)되고 종료 될 때 까지 유지되는 클래스 변수는 public을 붙이면 같은 프로그램 내에서 어디서든 접근할 수 있는 전역 변수가 된다.  또한 인스턴스가 변수의 접근법과 다르게 인스턴스를 생성하지 않고 클래스이름.클래스변수명 을 통해서 접근가능하다.
  • 지역변수: 메서드 내에서 선언되고 메서드 내에서만 사용 가능하다. 메서드가 실행될때 메모리를 할당 받고 메서드가 끝나면 소멸되므로 사용이 불가능하다.

 


6. 타입 변환, 캐스팅 그리고 타입 프로모션

타입변환(캐스팅)은 특정 자료형을 다른 자료형으로 변환하는 예를들면, int형과 float형은 자료형을 저장하는 방식이 다르다. 또, int와 long도 자료를 저장하는 방식이 다르다. 특정 자료형을 다른 자료형과 호환되게 변경하는 방법을 타입변환, 타입케스팅, 형변환이라고 한다.

 

Primitive 타입들은 타입캐스팅이 모두 가능하게 되어있다. 문제가 생길경우는 큰 데이터형을 작은 데이터형으로 변환하게되면 테이터 손실이 있을수있다. 하지만 캐스팅이 실패하지는 않는다.

 

타입 프로모션이란 크기가 더 작은 자료형을 더 큰 자료형에 대입할 때, 자동으로 작은 자료형이 큰 자료형으로 변환되는 현상이다. 문제없이 자동 변환된다. (e.g. int -> float) 크기가 더 큰 자료형에 더 작은 자료형을 자연스럽게 넣을 수 있는것이라고 생각하면 된다.

 

클래스에서도 타입 변환(캐스팅)이 존재한다. 

하지만, 기본적으로 클래스 타입들은 타입 캐스팅이 불가능하지만, 다형성이라는 성질을 통해서 두 클래스가 상속 관계일 경우에 타입 변환이 가능하다.

  • 부모클래스는 명시적인 타입캐스팅 없이 자식과 연결 할 수 있다. 이를 업캐스팅(Up-casting)이라 한다. 
  • 자식클래스는 명시적인 타입캐스팅이 있다면 부모와 연결 할 수 있다. 이를 다운캐스팅(Donw-Casting)이라 한다.
  • 상속관계가 아니면 타입캐스팅은 불가능하다. 

 

참고: kamang-it.tistory.com/entry/Java-19%ED%83%80%EC%9E%85%ED%98%95-%EB%B3%80%ED%99%98Type-Casting


7. 1차 및 2차 배열 선언하기

변수는 하나의 데이터를 저장하지만, 배열은 여러개의 데이터들을 인덱스구조에 저장을 한다. 배열의 길이는 한번 생성하면 줄이거나 늘릴수없고 같은 타입들만이 배열의 원소로 사용된다.

 

1차원 배열

// 1. 배열 선언, 생성, 할당을 동시에 (2가지 방법)
// <자료형>[] 배열이름 = {원소들} 
// <자료형> 배열이름[] = {원소들}

int[] score = {10, 11, 12}; // or
int score[] = {10, 11, 12};


// 2. 배열 선언후에 생성과 할당을 하는방법

int score[];
string name[]; // 배열 선언

score = new int[] {10, 50, 100};
name = new string[] {"white", "ship}; // 생성과 할당

// 3. 배열 선언 후 -> 생성 후 -> 할당
int score[]; // 선언
score = new int[3]; // 생성
score[0] = 10;
score[1] = 50;
score[2] = 100; // 할당

 

 

2차원 배열

배열의 배열이라고 생각하면 된다.

int[][] array1 = new int[2][3]; // 정수를 3개씩 저장할수있는 배열이 2개가 생성된다.
int[][] array2 = new int[4][]; // array2는 4개짜리 배열을 참조한다. 그리고 4개짜리의 배열 각각은 아직 참조하는 배열이 없다.

array2[0] = new int[1]; // 정수 하나를 저장할 수 있는 배열을 생성 array2의 0 번째 요소가된다.
array2[1] = new int[2]; // 정수 두개를 저장할 수 있는 배열을 생성 array2의 1 번째 요소가된다.
array2[2] = new int[3]; // 정수 세개를 저장할 수 있는 배열을 생성 array2의 2 번째 요소가된다.

int[][] array2 = {{0}, {1, 2}, {3, 4, 5}}; // 선언과 동시에 초기화

 


8. 타입 추론, var

 

타입추론이란 타입이 안정해진 변수타입을 컴파일러가 유추하는 기능이다. 

var 는 자바 10부터 타입추론을 가능할수있는 키워드로 추가되었다. 이 키워드는 지역변수이면서 선언과 동시에 초기화가 반드시 되어야한다. msg는 컴파일되는 과정에서 컴파일러가 String으로 추론이 가능하다.

var msg = "Hello, hope to complete STUDYHALLE! :)";

 

 

 

참고: velog.io/@composite/Java-10-%EC%97%90%EC%84%9C-var-%EC%9E%AC%EB%8C%80%EB%A1%9C-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0