데이터 타입, 변수, 배열

데이터 타입

primitive 타입과 reference 타입

  • primitive 타입(기본형)

    • 실제 값을 저장한다.

  • reference 타입 (참조형)

    • 어떤 값이 저장되어 있는 메모리 주소(객체의 주소)를 저장한다.

    • 선언 시 클래스 이름을 참조 변수의 타입으로 사용한다.

primitive 타입

  • 종류

    • 논리형(boolean), 문자형(char), 정수형(byte, short, int, long), 실수형(float, double)

  • 값의 범위

  • 기본값

byte             0
short            0
int              0
long             0L
float            0.0f
double           0.0d
boolean          false
char            '\u0000'

리터럴

개념

  • 상수

    • 한번 값을 저장하면 다른 값으로 변경할 수 없는 저장 공간

    • final을 사용하여 선언과 동시에 초기화해야 한다.

    • 리터럴에 의미있는 이름을 붙여 코드의 이해와 수정을 쉽게 만든다.

  • 리터럴

    • 그 자체로 값을 의미하는 것

    • ex) final int MAX_VALUE= 30; 일 때 30이 리터럴이다. int value= 10; 일 때에도 10이 리터럴이다.

타입

  • 정수형과 실수형

    • 2진수일 경우 접두사 '0b'

    • 8진수일 경우 접두사 '0'

    • 16진수일 경우 접두사 '0x'

    • long 타입의 리터럴일 경우 접미사 'l' 또는 'L'

    • float 타입의 리터럴에는 접미사 'f' 또는 'F'

    • double 타입의 리터럴에는 접미사 'd' 또는 'D' 이지만 생략 가능

  • 문자열

    • 문자 하나를 감쌀 때 작은 따옴표 사용

    • 문자열을 감쌀 때 큰 따옴표 사용

    • 기본형 타입의 값을 string으로 바꿀 때 빈 문자열 ""를 더해주면 됨

    • 기본형 타입 + 문자열 타입 -> 기본형 타입이 문자열 타입으로 변환된 다음에 두 문자열이 더해짐

변수 선언 및 초기화 방법

변수: 값을 저장할 수 있는 메모리 공간

  • 변수를 선언할 때에는 타입을 지정하고 변수 이름을 붙인다.

int a;
  • 변수 선언 시, 메모리의 빈 공간에 변수 타입에 알맞는 크기의 저장 공간이 확보되고, 변수 이름을 통해 해당 저장 공간에 접근할 수 있다.

  • 초기화란, 변수를 사용하기 전 처음으로 값을 지정하는 것으로, 변수를 선언한 후 초기화할 수 있다.

  • 대입 연산자 '='을 이용해 왼쪽에는 변수, 오른쪽에는 할당하려는 값을 지정해 초기화한다.

a = 10;

변수의 스코프와 라이프타임

  • 변수 스코프: 해당 변수가 접근할 수 있는 변수, 객체 그리고 함수의 집합을 의미

  • 변수의 종류

    • 인스턴스 변수: 인스턴스가 생성될때 생성된다. 인스턴스 변수의 값을 읽거나 저장하려면 인스턴스를 먼저 생성해야 한다. 각각의 인스턴스마다 고유의 값을 가진다.

    • 클래스 변수: 인스턴스 변수에 static을 붙인다. 한 클래스의 모든 인스턴스가 공통된 값을 공유하게 된다. 클래스가 로딩될때 생성 (메모리에 딱 한번만 올라간다.)되고 종료 될 때 까지 유지된다. public을 붙이면 같은 프로그램 내에서 어디서든 접근할 수 있는 전역 변수가 된다. 인스턴스를 생성하지 않고 클래스이름.클래스변수명 을 통해서 접근가능하다.

    • 지역변수: 메서드 내에서 선언되고 메서드 내에서만 사용 가능하다. 메서드가 실행될때 메모리를 할당 받고, 메서드가 종료되면 소멸되어 사용 불가하다.

public class test {
    int instVar; // 인스턴스 변수    
    static int classVar; // 클래스 변수
    
    void method() {
    	int localVar; // 지역 변수
    }
}

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

  • 형변환 (casting)

    • 서로 다른 타입 간의 연산을 수행하기 위해 타입을 일치 시켜야 한다. 이 때 형변환으로 변수나 리터럴의 타입을 변환해야 한다.

    • 기본형에서 boolean을 제외한 나머지 타입들은 서로 형변환 가능

    • 큰 타입에서 작은 타입으로 변환하는 경우 값의 손실이 발생할 수 있다

  • 타입 프로모션

    • 크기가 더 작은 자료형을 더 큰 자료형에 대입할 때, 자동으로 작은 자료형이 큰 자료형으로 변환되는 현상

  • 클래스 간 형변환

    • 다형성이라는 성질을 통해 두 클래스가 상속 관계일 경우에만 가능한 형변환이다.

    • 부모클래스는 명시적인 타입캐스팅 없이 자식 클래스로 사용될 수 있음 (upcasting)

    • 자식클래스는 명시적인 타입캐스팅이 있다면 부모 클래스로 사용 가능 (downcasting)

배열 선언

1차원 배열

// 배열 선언 후 생성
int[] arr;
arr = new int[5];

// 배열 선언과 동시에 생성
int[] arr = new int[5];

// 배열 초기화
int[] arr = {1, 2, 3, 4, 5};

// 메소드의 인수로 배열을 전달하면서 초기화 -> 배열의 선언과 초기화를 따로 진행
int arr = new int[]{1, 2, 3, 4 ,5};

2차원 배열

// 배열 선언
int[][] arr;
int arr[][];
int[] arr[];

// 배열 선언과 동시에 초기화
int arr[][] = {
    {1,2,3},
    {4,5,6},
    {7,8,9}
};

타입 추론, var

  • 타입 추론

    • 개발자가 변수의 타입을 명시적으로 적어주지 않고도, 컴파일러가 자동으로 대입된 리터럴로 변수의 타입을 추론하는 것

  • var

    • 초기화 값이 있는 지역변수로만 선언 가능

    • 멤버변수, 또는 메소드의 파라미터, 리턴 타입으로 사용이 불가능

    • 컴파일 시점에, 컴파일러가 오른쪽의 초기화값 리터럴로 타입을 추론하여, 바이트 코드로 변경할 때 var 자리에 타입을 명시

    • 어떠한 타입도 아니고, 클래스에서 사용할 수 있는 예약어가 아니므로 변수명으로 사용 가능

    • 중간에 타입 변경 불가

출처

https://drinkcoldbrew.tistory.com/2

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

Last updated