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

2020. 11. 19. 02:24
728x90

목표

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

학습할 것

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

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

 

 

 

기본형(Primitive type)

  • 논리형(boolean), 문자형(char), 정수형(byte, short, int, long), 실수형(float, double) 계산을 위한 실제값을 저장한다.
  • 기본값이 있기 때문에 Null값이 존재하지 않는다.
  • 기본형 타입에 Null값을 넣고 싶다면 래퍼클래스를 활용한다.
  • 실제 값을 저장하는 공간으로 스택(stack) 메모리에 저장된다.
  • 컴파일 시점에 담을 수 있는 크기를 벗어나면 컴파일 에러가 발생한다.

 

*래퍼 클래스(Wrapper Class)란?

    기본형 타입(primitive type)을 객체로 다루기 위해서 사용하는 클래스들을 래퍼클래스라고 한다.

    모든 기본형 타입은 값을 갖는 객체를 생성할수 있는데 이런 객체를 '포장객체'라고도 한다.

    (기본형 타입의 값을 내부에 두고 포장하기 때문)

    래퍼 클래스로 감싸고 있는 기본타입값은 외부에서 변경할 수 없다.

    변경하고 싶다면 새로운 포장객체를 만들어야 한다.

 

 

참조형(Reference type)

  • 어떤 값이 저장되어 있는 주소(memory address)를 값으로 갖는다.
  • 기본형을 제외한 타입들은 모두 참조형이다.
  • 빈 객체를 의미하는 Null이 존재한다.
  • 값이 저장되어 있는 곳의 주소값을 저장하는 공간으로 힙(heap) 메모리에 저장된다.
  • 객체나 배열을 Null값으로 받으면 NullPointException이 발생하므로 변수값을 넣어줘야한다.

 

*자료형(data type)과 타입(type)의 차이점

    기본형은 저장할 값의 종류에 따라 구분되므로 기본형의 종류를 얘기할 때는 '자료형'이라는 용어를 사용.

    참조형은 항상 '객체의 주소(4byte 정수)를 저장하므로 값이 아닌, 객체의 종류에 의해 구분되므로 참조형 변수의 종류를 구분할 때      는 '타입'이라는 용어를 사용.

    타입이 자료형을 포함하는 넓은 의미의 용어이므로 굳이 구분하지 않아도 된다.

 

 


 

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

 

 

 

 


 

리터럴

 

 

 

상수

  • 상수(constant)는 변수와 마찬가지로 '값을 저장할 수 있는 공간'이지만,
  • 변수와 달리 한번 값을 저장하면 다른 값으로 변경할 수 없다.
  • 변수의 타입 앞에 키워드 'final'을 붙여준다
  • 상수는 반드시 선언과 함께 초기화해야하며, 그 후부터는 상수의 값을 변경하는 것이 불가하다.
  • 상수의 이름은 모두 대문자로 하는것이 암묵적인 관례.
  • 여러 단어로 이루어져있을 경우, '_'로 구분한다.
final int NUM = 123;

 

리터럴

  • 프로그래밍에서 상수를 '값을 한번 저장하면 변경할 수 없는 저장공간'으로 정의했기 때문에 이와 구분하기 위해              원래의 상수를 상수 대신 리터럴이라는 용어를 사용한다.
  • 기존의 알고 있던 '상수'의 다른이름.
  • 그 자체로 값을 의미하는 것.

 

 


 

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

 

 

 

변수(variable)

값을 저장할 수 있는 메모리상의 공간.

 

 

변수 선언

int num;  // num이라는 이름의 변수를 선언

int : 변수 타입

num : 변수 이름

 

  • 변수 타입은 변수에 저장될 값이 어떤 타입인지를 지정하는것.
  • 변수 이름은 변수에 붙인 이름.
  • 변수는 '값을 저장할 수 있는 메모리 공간'이므로 변수의 이름은 메모리 공간에 이름을 붙여주는것.
  • 이름을 이용해 저장공간(변수)에 값을 저장하고, 저장된 값을 읽어올 수 있다.

 

변수를 선언하면 메모리의 빈 공간에 변수타입에 맞는 크기의 저장공간이 확보되고,

앞으로 이 공간은 변수이름을 통해 사용할 수 있게 된다.

 

 

 

변수의 초기화

 

  • 변수를 사용하기 전에 처음으로 값을 저장하는 것.
  • 알수없는 값(쓰레기값, garbage value)이 남아 있을 수 있기 때문에 변수를 사용하기 전에 반드시 초기화(initialization)를 해야한다.
  • 변수에 값을 저장할 때는 대입연산자 '='를 사용
  • 오른쪽의 값을 왼쪽(변수)에 저장하라는 뜻.
int x;   // 변수의 선언
x = 0;   // 변수의 초기화

int x = 0;  // 변수 x를 선언하고 0으로 초기화 한다.

 

 


 

 

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

 

 

 

변수의 스코프

프로그램상에서 사용되는 변수들이 사용 가능한 범위

 

 

변수는 클래스변수, 인스턴스변수, 지역변수 세 종류가 있다. 

변수의 종류를 결정짓는 중요한 요소는 '변수의 선언된 위치'

 

 

1. 클래스 변수

  • 클래스 영역에 선언되며, 인스턴스 변수앞에 static이 붙은 변수이다.
  • 클래스변수는 모든 인스턴스가 공통된 저장공간(변수)을 공유하게 된다.
  • 한 클래스의 모든 인스턴스들이 공통적인 값을 유지해야하는 속성의 경우 클래스변수로 선언.
  • 인스턴스를 생성하지 않고도 언제라도 바로 사용할 수 있다.
  • 클래스가 메모리에 로딩될  때 생성되어 프로그램이 종료될 때 까지 유지된다.
  • public을 앞에 붙이면 같은 프로그램 내에서 어디서나 접근할 수 있는 '전역변수(global variable)'의 성격을 갖는다.

 

 

2. 인스턴스 변수

  • 클래스 영역에 선언되며, 클래스의 인스턴스를 생성할 때 만들어진다.
  • 인스턴스 변수의 값을 읽어 오거나 저장하기 위해서는 먼저 인스턴스를 생성해야 한다.
  • 인스턴스는 독립적인 저장공간을 가지므로 서로 다른 값을 가질 수 있다.
  • 인스턴스마다 고유한 상태를 유지해야하는 속성의 경우, 인스턴스 변수로 선언한다.

 

 

3. 지역변수

  • 메서드 내에 선언되어 메서드 내에서만 사용가능.
  • 메서드가 종료되면 소멸되어 사용할수 없게 된다.
  • 지역변수가 선언된 블럭{} 내에서만 사용가능하며, 블럭{}을 벗어나면 소멸되어 사용할 수 없다.

 

 

 

 


 

 

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

 

 

 

형변환(casting)

변수 또는상수의 타입을 다른 타입으로 변환하는 것.

 

 

서로 다른 타입간의 대입이나 연산을 할 때 형변환으로 타입을 일치시켜서 하는것이 원칙이다.

 

1.자동형변환

표현범위가 좁은 타입에서 넓은 타입으로 형변환하는 경우,

값손실이 없으므로 두 타입중에서 표현범위가 더 넓은 쪽으로 형변환된다.

 

- boolean을 제외한 나머지 7개의 기본형은 서로 형변환이 가능하다.

- 기본형과 참조형은 서로 형변환할 수 없다.

- 서로 다른 타입의 변수간 연산은 형변환을 하는 것이 원칙이지만,

   값의 범위가 작은 타입에서 큰 타입으로의 형변환은 생략할 수 있다.

 

규칙

  • 왼쪽에서 오른쪽으로의 변환은 형변환 연산자를 사용하지 않아도 자동 형변환이 되며, 그 반대 방향으로의 변환은 반드시 형변환 연산자를 써줘야 한다.
  • 실수형은 정수형과 값을 표현하는 방식이 다르기 때문에 같은 크기일지라도 실수형이 정수형보다 큰 범위를 갖기 때문에 오른쪽에 위치한다.
  • char 와 short는 같은 크기지만 서로 범위가달라서 어느쪽으로의 형변환도 값 손실이 발생할 수 있으므로 자동형변환 할 수 없다.

 

 

2.강제 타입 변환

표현범위가 넓은 타입은 좁은 타입으로 자동 형변환을 할 수 없기 때문에 강제 타입변환을 사용한다.

(타입) 피연산자

double d = 12.3;
int i = (int)d;

큰 타입에서 작은 타입으로 변환할 때, 값의 손실이 일어나지 않도록 주의해야한다.

 

 

3. 연산식에서의 자동타입변환과 강제 타입변환.

서로 다른 타입의 피연산자가 있을 경우, 두 연산자 중 크기가 큰 타입으로 자동타입변환 후 연산을 수행한다.

 

*연산 시 자동 타입 변환 정리

    정수와 실수 연산 = 실수형 타입(double)

    정수와 정수 연산 = int

    실수와 실수 연산 = double

    큰 타입과 작은 타입 연산 = 큰 타입

 

 

 


 

 

1차 및 2차 배열 선언하기

 

 

 

 

배열 - 같은 타입의 여러 변수를 하나의 묶음으로 다루는 것. 

 

  • 배열의 생성

           타입[] 변수이름 = new 타입[길이];

              배열 선언             배열 생성           

 

  - int[] score = new int[5];

  - int[] score = new int[]{1,2,3,4,5};

  - int[] score = {1, 2, 3, 4, 5};

 

 배열을 선언하는 것은 참조변수를 위한 공간이 만들어질 뿐,

 배열을 생성해야만 비로소 값을 저장할 수 있는 공간이 만들어지는 것이다.

 

 

ex)  int [] score;

          :  int형 배열 참조변수 score을 선언, 데이터를 저장할 수 있는 공간은 아직 마련되지 않음.

 

        score = new int[5];

           :  연산자 new에 의해서 메모리의 빈공간에 5개의 int형 데이터를 저장할 수 있는 공간이 마련됨.

              각 배열 요소는 자동적으로 int의 기본값인 0으로 초기화 된다.

              대입연산자 '='에 의해 배열의 주소가 변수 score에 저장된다.

 

 

 

  • 2차원 배열의선언
- 타입[][] 변수이름;

- 타입 변수이름[][];

- 타입[] 변수이름[];

 

 

 

  • 2차원 배열 초기화
    - int[][] arr = new int[5][4];



    - int[][] arr = new int[][]{{1,2,3,4,5},{1,2,3,4,}};



    - int[] score = {
                        {1, 2, 3, 4, 5},

                        {1, 2, 3, 4}

                     };

             

 

  • 배열의 길이  =>     배열이름. length; 

          배열은 한번 생성하면 길이를 변경할 수 없기 때문에 이미 생성된 배열의 길이는 변하지 않는다.

          배열이름.length는 상수 이고, 읽을수만 있고 변경할 수 없다.

 

 

 


 

타입 추론, var

 

 

타입추론이란

 

코드 작성 당시 타입이 정해지지 않았지만, 컴파일러가 그 타입을 유추하는 것이다.

 

var

자바 10부터 타입 추론을 지원하는 var키워드가 추가되었다. 이 키워드는 local variable이면서 선언과 동시에 initializer가 필수적으로 요구된다.

 

 

 

 


참고

 

-자바의 정석

-gbsb.tistory.com/6

-coding-factory.tistory.com/547

-linuxism.ustd.ip.or.kr/94

-kephilab.tistory.com/27

-velog.io/@bk_log/Java-%ED%83%80%EC%9E%85-%EC%B6%94%EB%A1%A0

728x90

BELATED ARTICLES

more