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

2020. 11. 19. 20:52백기선의 온라인 자바 스터디

반응형

- 목표

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


- 학습할 것

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

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

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

 - 기본형 (Primitive Type)

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

 

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

A. 자바의 자료형은 크게 기본 타입(primitive type)과 참조 타입(reference type)으로 나누어집니다. 대표적으로 기본 타입은 char, int, float, double, boolean 등이 있고 참조 타입은 class, interface 등이 있는데 프로그래밍을 하다 보면 기본 타입의 데이터를 객체로 표현해야 하는 경우가 종종 있습니다. 이럴 때에 기본 자료타입(primitive type)을 객체로 다루기 위해서 사용하는 클래스들을 래퍼 클래스(wrapper class)라고 합니다. 자바는 모든 기본타입(primitive type)은 값을 갖는 객체를 생성할 수 있습니다. 이런 객체를 포장 객체라고도 하는데 그 이유는 기본 타입의 값을 내부에 두고 포장하기 때문입니다. 래퍼 클래스로 감싸고 있는 기본 타입 값은 외부에서 변경할 수 없습니다. 만약 값을 변경하고 싶다면 새로운 포장 객체를 만들어야 합니다. (ex. char -> Character, int -> Integer ..)

 

- 참조형(Reference Type)

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

 

* Q. 자료형(data type)과 타입(type)의 차이가 무엇인가.

A. 기본형은 저장할 값(data)의 종류에 따라 구분되므로 기본형의 종류를 얘기할 때는 '자료형(data type)'이라는 용어를 씁니다. 그러나 참조형은 항상 '객체의 주소(4 byte 정수)'를 저장하므로 값(datd)이 아닌, 객체의 종류에 의해 구분되므로 참조형 변수의 종류를 구분할때는 '타입(type)'이라는 용어를 사용합니다. '타입(type)'이 '자료형(data type)'을 포함하는 보다 넓은 의미의 용어이므로 굳이 구분하지 않아도 됩니다.

* 기본형과 참조형의 메모리 관리 (stack 과 heap)
 -출처 : https://beomseok95.tistory.com/m/221?category=1064782

 

Java - 메모리관리 ( 스택& 힙) [펌]

Java - 메모리관리 ( 스택& 힙) 출처 -> https://yaboong.github.io/java/2018/05/26/java-memory-management/ 자바 메모리 관리 - 스택 & 힙 개요 Java 에서 메모리 관리는 어떻게 이루어지는지 알아보기 위..

beomseok95.tistory.com

 

● 리터럴

- 상수(Constant)의 개념 파악하기

  • 상수는 변하지 않는 변수를 뜻함. 변수와는 달리 한번 값을 저장하면 다른 값(메모리 값)으로 변경할 수 없음.
  • 값을 저장할 수 있는 공간.

    - final int MAX_SPEED;              //에러. 상수는 선언과 동시에 초기화해야함.
    - final int MAX_VALUE = 100;     //OK. 선언과 동시에 초기화했음.
    - MAX_VALUE = 200;                //에러. 상수의 값은 변경할 수 없음.

  • 상수는 반드시 선언과 동시에 초기화 해야함. 상수의 이름은 모두 대문자로 하는것이 암묵적인 관례. 여러단어일 경우는 '_' 로 구분한다.

- 리터럴(literal) 이란?

  • 리터럴은 변수의 값이 변하지 않는 데이터(메모리 위치 안에 값)를 의미한다.
  • 프로그래밍에서는 상수를 '값을 한 번 저장하면 변경할 수 없는 저장공간'으로 정의하였기 때문에 이와 구분하기 위해 상수를 다른이름으로 불러야만 했다. 
  • 리터럴은 우리가 기존에 알고 있던 '상수'의 다른 이름일 뿐이다.

리터럴과 접미사.

 

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

- 변수(variable) 란?

   : 단 하나의 값을 저장할 수 있는 메모리 공간.

- 변수 선언 및 초기화

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

* int : 변수타입 // age : 변수이름

int age = 25;       //age라는 변수를 25로 초기화.
int a, b;
int x=0, y=0;

* 변수의 초기화 : 변수를 사용하기 전에 처음으로 값을 저장하는 것.
* 메모리는 여러 프로그램이 공유하는 자원이므로 전에 다른 프로그램에 의해 저장된 '알 수없는 값(쓰레기값)'이 남아있을 수 있기 때문에 반드시 변수를 초기화 해야한다.

 

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

- 변수의 스코프 (scope)

  • 변수의 대한 접근과 변수가 존재할 수 있는 영역을 뜻함. 변수들의 사용 가능한 범위.
  • 변수의 종류는 클래스변수, 인스턴스변수, 지역변수 모두 세 종류가 있다.
  • 변수의 종류를 결정짓는 중요한 요소는 '변수의 선언된 위치'.
Class Variables
{
     int iv;              //인스턴스 변수(클래스영역)
     static int cv;       //클래스 변수(static변수, 공유변수)
     
     void method()
     {
          int lv = 0;     //지역변수(메서드영역)
     }
}
  1. 인스턴스변수(instance variable)
     - 클래스 영역에 선언되며, 클래스의 인스턴스를 생성할 때 만들어 진다.

     - 인스턴스는 독립적인 저장공간을 가지므로 서로 다른 값을 가질 수 있다.

     - 인스턴스마다 고유한 상태를 유지해야하는 속성의 경우, 인스턴스변수로 선언한다.

  2. 클래스변수(class variable)
     - 클래스 변수를 선언하는 방법은 인스턴스 변수 앞에 static을 붙이기만 하면 된다.

     - 독립적인 저장공간을 갖는 인스턴스변수와는 달리, 클래스변수는 모든 인스턴스가 공통된 저장공간(변수)을 공유 하게 된다.

     - 한 클래스의 모든 인스턴스들이 공통적인 값을 유지해야하는 속성의 경우, 클래스변수로 선언해야 한다.

     - 위 코드를 보면 Variables클래스의 클래스변수 cv를 사용하려면 'Variables.cv'와 같이 하면 된다.

     - 클래스가 메모리에 '로딩(loading)'될 때 생성되어 프로그램이 종료될 때 까지 유지되며, public을 앞에 붙이면 같은 프로그램 내에서 어디서나 접근할 수 있는 '전역변수(global variable)'의 성격을 갖는다.

  3. 지역변수(local variable)
     - 메서드 내에 선언되어 메서드 내에서만 사용 가능하며, 메서드가 종료되면 소멸되어 사용할 수 없다.

     - for문 또는 while문의 블럭 내에 선언된 지역변수는, 지역변수가 선언된 블럭{} 내에서만 사용 가능.

  * 정리 : 인스턴스변수는 인스턴스가 생성될 때 마다 생성되므로 인스턴스 마다 각기 다른 값을 유지할 수 있지만, 클래스 변수는 모든 인스턴스가 하나의 저장공간을 공유하므로, 항상 공통된 값을 갖는다.

변수의 종류와 특징.

*변수의 scope와 static 출처 : programmers.co.kr/learn/courses/5/lessons/231

 

자바 입문 - 변수의 scope와 static

자바 입문 가장 널리 쓰이는 프로그래밍 언어 Java로 프로그래밍의 기초를 다져보세요. 강의를 다 들었는데, 지금 내가 코딩 테스트 준비를 하고 있다면? 15년차 Java 전문 리더가 직접 이끄는 온라

programmers.co.kr

 

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

 - 타입 변환(형변환) Casting 이란?

  • 연산을 수행하기 전에 변수나 리터럴의 타입을 다른 타입으로 변환하는 것을 '형변환(casting)'이라고 한다.
  • (타입)피연산자    ->> 여기에 사용되는 괄호()는 '캐스트 연산자'라 부른다.
  • 형변환은 한 타입(그릇)의 데이터를 다른 데이터 타입(그릇)으로 옮겨 담는 것이다. 형변환에는 개발자가 지정하지 않아도 자동적으로 이루어지는 자동 형변환과 개발자가 명시해야만 이루어지는 강제 형변환이 있다.
  • 기본형(primitive type)에서 boolean을 제외한 나머지 타입들은 서로 형변환이 가능하다.(기본형과 참조형간의 형변환은 불가)
  • 기본적으로 서로 다른 타입간의 대입이나 연산을 할 때 형변환으로 타입을 일치시켜서 하는것이 원칙이다.

 

  • 자동 형변환

    - 작은 데이터 타입에서 큰 데이터 타입으로 형변환하여도 데이터 손실없이 그대로 보존될 수 있기 때문에 자동 형변환이 일어난다. 

    - 프로그래밍 적으로 봤을때, 자바의 컴파일러가 자동으로 형변환(작은 타입->큰 타입)을 해주기 때문에 생략 가능하다.

    - 밑 그림을 보면 왼쪽에서 오른쪽으로의 변환은 자동 형변환이 일어나며 반대 방향으로의 변환은 반드시 강제 형변환을 해주어야 한다.

    - 실수형의 경우 소수점까지 표현하기 때문에 정수형보다 표현 범위는 크다고 할 수 있다. 다만 값의 크기는 정수형이 더 클 수 있으므로 형변환하는 경우 오차가 발생할 수 있다는 것을 주의해야 한다.

사진을 클릭하시오(첨부)

 

  • 강제 형변환

    - 큰 데이터 타입에서 작은 데이터 타입으로 옮길때 데이터의 손실이 있을수도 아닐수도 있다.


    - 데이터 손실의 가능성이 존재하므로 자동으로 타입변화가 일어나지 않으며 개발자가 명시적으로 타입변환을 지정해야 변환이 이루어 진다.

    - 변환하고자 하는 데이터 값이 커서 데이터의 손실이 일어나는 경우
        -ex) long a = 10,000,000,000   ->  int b = a%10        //오류. int의 범위를 넘어선 값이 들어가기 때문
              ->int b = (int)a%10        //값은 잘 돌아가지만 a만 캐스팅 되기 때문에 깨진 long a 값을 나눠서 들어가게 되어 데이터 손실이 일어남.
              ->int b = (int)(a%10)      //정상적으로 출력.

    - 데이터 타입의 특성상 데이터 손실이 일어나는 경우
double d  = 1.9;
int n = (int) d; //n은 1이 된다.

      - 실수 값인 1.9를 정수 타입으로 변환하면 소수점 아래는 버려져서 0.9값은 손실되어 정수 1로 변환된다.

  • 기본 형변환

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

  • 배열(array)이란?

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

  • 배열의 길이와 인덱스

    -인덱스(index)는 배열의 요소마다 붙여진 일련번호로 각 요소를 구별하는데 사용된다.

    - 인덱스(index)의 범위는 0부터 '배열길이-1'까지.

  • 1차원 배열 선언 

배열의 선언방법과 선언 예

 

  • 1차원 배열 생성

    - 배열의 선언은 배열을 다루기 위한 참조변수를 위한 공간이 만들어질 뿐이다.

    - 배열을 생성해야만 비로소 값을 저장할 수 있는 공간이 만들어지는 것이다.
타입[] 변수이름;              // 배열을 선언(배열을 다루기 위한 참조변수 선언)
변수이름 = new 타입[길이];    // 배열을 생성(실제 저장공간을 생성)

타입[] 변수이름 = new 타입[길이];    // 배열의 선언과 생성을 동시에.
int[] score= new int[5];            //길이가 5인 int배열.

 

  • 2차원 배열 선언

2차원 배열의 선언 예

 

  • 2차원 배열 생성

    - 선언 방법은 1차원 배열과 같다. 다만 괄호 [ ]가 하나 더 들어갈 뿐이다.

출처 : 이미지 보기

  • 2차원 배열의 초기화

    - 1차원 배열와 같이 생성과 초기화를 동시에 할 수 있다.
int[][] arr = new int[][]{ {1,2,3}, {4,5,6} };
int[][] arr = { {1,2,3}, {4,5,6} };  //new int[][] 가 생략됨
int[][] arr = {
                   {1,2,3},
                   {4,5,6}
              };

 

 

● 타입 추론, var

  • 타입추론 이란?

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

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

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

[Java] 타입 추론

Java 9 이하 Java 10에서 var라는 Local Variable Type-Inference 가 추가되었다. 그 전에도 Generic 과 Lambda 를 사용할 때 타입 추론이라는 단어를 사용하는 것을 들었다. > 타입 추론이란 코드 작성 당시 타입이

velog.io

    -출처 : futurecreator.github.io/2018/07/20/java-lambda-type-inference-functional-interface/

 

Java Lambda (2) 타입 추론과 함수형 인터페이스

타입 추론 Type Inference 타입 추론이란 타입이 정해지지 않은 변수의 타입을 컴파일러가 유추하는 기능입니다. 자바에서는 일반 변수에 대해 차입 추론을 지원하지 않기 때문에 자바에서의 타입

futurecreator.github.io

// java 9 이하
String message = "data";
// java 10 이상
var message = "the initializer present on the right-hand side";
반응형