자바-2(자바 데이터 타입, 변수 그리고 배열)

dragonappear·2021년 3월 7일
0

Java

목록 보기
2/22

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


학습할 것

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


프리미티브 타입 종류와 값의 범위 그리고 기본 값


프리미티브 타입과 레퍼런스 타입

  • 기본형 타입:
    - 총 8가지의 기본형 타입을 제공한다.
    - 기본값이 있기 때문에 null이 존재하지 않는다.
    - 실제 값을 저장하는 공간으로 stack 메모리에 저장된다.
    - 만약 컴파일타임때 타입의 범위를 벗어나면 컴파일에러가 발생한다.
    - 자바 8부터는 unsigned를 사용할수있다.
  • 레퍼런스 타입:
    - 기본형을 제외한 타입들이 모두 레퍼런스 타입이다.
    - null이 존재한다.
    - 값이 저장되어있는 곳의 주소값을 저장하는 공간으로 힙(heap) 메모리에 저장된다.
    - 문법상 에러가 없더라도 런타임 때 에러가 발생할수있다.

리터럴:

  • 그 자체로 데이터인 것을 리터럴이라고 한다. (ex:'A',"ABC",123)
  • long 타입의 리터럴에는 접미사'L'or'l'을 반드시 붙여야한다. 리터럴에 접미사가 붙어있지 않으면 int타입으로 간주하기 때문이다.
  • float 타입의 리터럴에는 접미사'f'가 사용되고, double형 리터럴에는 'd'가 사용된다.
  • 정수형에서는 int가 기본 자료형인것 처럼 실수형에서는 double이 기본자료형이라서 접미사를 생략하면 double형 리터럴로 간주된다.
int a = 1; //리터럴은 1
final int a = 1; //상수로 선언

변수의 종류:

  • 변수에는 클래스 변수, 인스턴스 변수, 지역 변수로 나눌수있다.
  • 클래스 변수: 클래스가 참조될때 활용되어 전체 클래스에 적용된다.
  • 인스턴스 변수: 객체가 생성될때 같이 생성된다.
  • 지역 변수: 메소드안에서 선언되고 메소드 안에서만 사용가능하다.
  • static 메소드에서 인스턴스 변수를 사용할수 없는이유: static 변수나 메소드가 만들어지는 시점은 메모리에 클래스를 로딩하는 시점인데, 인스턴스 메소드나 변수가 처리되고 만들어지는 시점은 클래스의 인스턴스가 만들어지고부터이다. 클래스 로딩하는 시점에 아직 만들어지지 않은것을 로딩하고 쓰는것은 불가능하다. 반대로 인스턴스에서는 static 타입을 참조할수있다.

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

  • 변수를 사용하기 위해서는 먼저 변수를 선언해야한다. 변수가 선언되면 메모리에 변수의 타입에 알맞는 크기의 저장공간이 확보된다.
  • 변수 선언하는 방법:
int number;
  • 변수를 선언한 후부터는 변수를 사용할 수 있으며, 변수를 사용하기에 앞서 적절한 값을 저장해주는 것을 초기화라고 한다
  • 변수 초기화하는 방법:
  1. 명시적 초기화:
short a = 4; // 변수를 저장할때 short형은 int형으로 변환해서 사용하기 때문에 왠만하면 int로 사용하는 것이 낫다.
int number=10;
int number = 1_000_000_000; // 이런식으로도 저
장이 가능하다.
BigInteger bigNumber = BigInteger.valueOf(22억); // 큰 범위의 숫자는 BigInteger를 사용하는 것이 낫다.

2.생성자활용 초기화:

ClassA ca = new ClassA();
ca.a=1;
ca.b='A';
ca.c="KSB";
// 기본 생성자 말고 매개변수가 정해진 생성자가 정의되어 있다면
ClassA ca = new(1,'A',"KSB");
  1. 초기화블록을 활용한 클래스,인스턴스 변수 초기화
class ClassA{
	static {} // 클래스 초기화 블럭
    { } // 인스턴스 초기화 블럭
}

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

  • 변수의 스코프란 변수에 대하여 접근과 변수가 존재할 수 있는 영역을 의미한다.
  • 프로그램에서 사용되는 변수는 사용가능한 스코프를 가진다.
  • 변수가 선언된 블럭이 변수의 스코프이다.

public class VarScope{
	int global = 10; // global의 스코프는 클래스전체
    public void scopeTest(int value){ // 메소드 선언부에 존재하므로 스코프는 메소드 블럭내이다.
    	int local = 10; // 스코프는 메소드 블럭내이다.
    }
}
  • 클래스변수의 라이프타임은 프로그램이 종료할때까지 적용된다.
  • 인스턴스변수의 라이프타임은 인스턴스가 참조되고 있을때에는 유지되다가 객체를 참조하는 변수가 없을 경우 JVM의 Garbage Collector가 제거한다.
  • 지역변수의 경우 메소드가 끝나면 소멸된다.
  • 인스턴스 변수와 클래스 변수는 서로 메모리에 로딩되는 시점이 다르다.

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

  • 자바에서의 연산은 동일한 데이터 타입에서만 가능하다.
  • 프로그램을 짜다보면 서로 다른 데이터 타입끼리의 연산이 필요로 한 경우가 있다.
  • 그럴때, 캐스팅(강제 형변환) 과 타입 프로모션(자동 형변환)이 있다.
  1. 타입 프로모션(자동 형변환)
byte a = 10;
int b = a;
  • 이럴경우에는 1byte의 변수를 4byte인 int에 넣기 때문에 별다른 오류나 문법의 필요없이 형변환이 자동으로 이뤄지게 된다.
  • 자동 형변환 순서: byte(1) < short(2) < int(4) < long(8) < float(4) < double(8)
  1. 캐스팅
short a= 7410;   
byte b = (byte)a; // 캐스팅의 결과로 b=-14가 된다.

1차 및 2차 배열 선언하기:

  • 자바에서 1차원 배열의 선언은 두가지 방법으로 가능하다.
int arr[]; // 가능
int[] arr; // 가능
// 이처럼 선언하면 배열은 null값을 가지게 된다.
  • 초기화 방법
// 이후 이처럼 초기화를 하면 배열의 주소가 할당되어 사용할수있게 된다.
int[] arr = new int[3];
// or
int[] arr = {0,1,2};
// or
int[] array;
Arrays.fill(array,1);
  • 자바에서 2차원 배열선언 역시 동일하다.
int[][] array;
int array[][];
  • 초기화 방법
int[][] array = new int[4][3];
// or
int[][] array={{0, 1, 2},{3,4,5},{6,7,8},{9,10,11}};

타입 추론, var

  • 타입추론이란 코드 작성당시에는 타입을 정하지 않았지만, 컴파일러가 그 타입을 유추하는 것이다.
  • 자바 10부터 타입추론을 지원하는 var이라는 키워드가 추가되어 자바에서도 타입추론을 사용가능하게 되었다.
  • var은 지역변수로 사용해야하고 선언과 동시에 초기화가 필요하다.

참고

0개의 댓글