2020.12.10 (목)

개인사정이 있어서 이제서야 작성하는 백기선의 자바 스터디 늦게 제출하게 되서 죄송합니다 ㅠ0ㅜ

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

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

기본형(primitive type)

  • 기본형 변수는 실제 값을 저장한다.
  • 논리형(boolean), 문자형(char), 정수형(byte, short, int, long), 실수형(float, double)계산을 위한 실제 값을 저장한다. 총 8개이다.

논리형(boolean)

  • true 와 false 중 하나를 값으로 갖으며, 조건식과 논리적 계산에 사용된다.
  • 크기는 1byte 입니다.

문자형(char)

  • 문자를 저장하는데 사용되며, 변수에 하나의 문자만 저장할 수 있다.
  • 크기는 2byte이며, (0 ~ 65535)의 저장 범위를 갖는다.

정수형(byte, short, int, long)

  • 정수를 저장하는데 사용되며, 주로 int가 사용된다, byte는 이진 데이터를 다룰 때 사용되며, short은
    C언어와의 호환을 위해서 추가되었다.

byte

  • 크기는 1byte이며, -128 ~ 127의 범위를 갖는다.
    short
  • 크기는 2byte이며, -32,768 ~ 32,767의 저장 범위를 갖는다.
    int
  • 크기는 4byte이며, -2,147,483,648 ~ 2,147,483,647의 저장 범위를 갖는다.
    long
  • 크기는 8byte이며, -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807의 범위를 갖는다.

실수형(float, double)

  • 실수를 저장하는데 사용되며, 주로 double이 사용된다.

float

  • 크기는 4byte이며, 1.4 x 10^-45 ~ 3.4 x 10^38의 저장 범위를 갖는다.
    double
  • 크기는 8byte이며 4.9 x 10^-324 ~ 1.8 x 10^308의 저장 범위를 갖는다.

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

기본형(primitive type)이라고 하며 기본형 변수는 실제 값(data)을 저장한다.

참조형(reference type)은 어떤 값이 저장되어 있는 주소를 값으로 갖는다. 참조형 변수는 8개의 기본형 자료형을 제외하고 모두 참조 타입을 갖는다.

리터럴

원래 12, 123, 3.14, 'A'같은 값들이 '상수'인데 프로그래밍에서는 상수를 '값을 한 번 저장하면 변경할 수 없는 저장공간'으로 정의 하였기 때문에 이와 구분하기 위해 상수를 다른 이름인 리터럴 정의하였다.

리터럴 타입의 접미사

  • 실수형 f, d가 있음.
  • 정수형 L 있음.

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

변수의 선언 방법은 다음과 같다.

int age;

변수 타입 변수이름 순으로 적으면 변수의 선언을 할 수 있다.
'변수 타입'은 변수에 저장될 값이 어떤 '타입(type)'인지를 지정하는 것이다. 저장하고자 하는 값의 종류에 맞게 변수의 타입을 선택해서 적어주면 된다.
'변수 이름'은 말 그대로 변수에 붙인 이름이다.

변수의 초기화

"변수의 초기화란 변수를 사용하기 전에 처음으로 값을 저장하는 것"

변수를 선언한 이후부터는 변수를 사용할 수 있으나, 그 전에 반드시 변수를 '초기화'해야한다. 메모리는 여러 프로그램이 공유하는 자원이므로 전에 다른 프로그램에 의해 저장된 '알 수 없는값'이 남아 있을 수 있다.
변수에 값을 저장할 때는 대입 연산자 '='를 이용한다. C언어에서는 오른쪽의 값을 왼쪽에 저장하라는 뜻이다. 그래서 대입연산자의 왼쪽에는 반드시 변수가 와야 한다.

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

변수의 스코프

  • 프로그램상에서 사용되는 변수들은 사용 가능한 범위를 가진다. 그 범위를 변수의스코프라고 한다.
    public class ValableScopeExam{

        int globalScope = 10;   // 인스턴스 변수 

        public void scopeTest(int value){   
            int localScope = 10;
            System.out.println(globalScope);
            System.out.println(localScpe);
            System.out.println(value);
        }
    }

클래스의 속성으로 선언된 변수는 globalScope의 사용 범위는 클래스 전체이다.
매개 변수로 선언된 int value는 블럭 바깥에 존재하기는 하지만, 메서드 선언부에 존재하므로 사용범위는 해당 메소드 블럭내이다.
메소드 블럭내에서 선언된 localScopre의 변수의 사용범위는 메소드 블럭내이다.

main메소드 사용하기

  • 같은 클래스 안에 있는데 globalScope 변수를 사용 할 수 없다.
  • main은 static한 메소드이다. static한 메서드에서는 static 하지 않은 필드를 사용 할 수 없다.
    public class VariableScopeExam {
        int globalScope = 10; 

        public void scopeTest(int value){
            int localScope = 20;            
            System.out.println(globalScope);
            System.out.println(localScope);
            System.out.println(value);
        }   
        public static void main(String[] args) {
            System.out.println(globalScope);  //오류
            System.out.println(localScope);   //오류
            System.out.println(value);        //오류  
        }   
    }

static

  • 같은 클래스 내에 있음에도 해당 변수들을 사용할 수 없다.
  • main 메소드는 static이라는 키워드로 메소드가 정의되어 있다.
  • static한 필드 (필드 앞에 static 키워드를 붙임)나, static한 메소드는 class가 인스턴스화 되지 않아도 사용 할 수 있다.
    public class VariableScopeExam {
        int globalScope = 10; 
        static int staticVal = 7;

        public void scopeTest(int value){
            int localScope = 20;        
        }

        public static void main(String[] args) {
            System.out.println(staticVal);      //사용가능 
        }

    }

static한 변수는 공유된다.

  • static하게 선언된 변수는 값을 저장 할 수 있는 공간이 하나만 생성된다. 그러므로, 인스턴스가 여러개 생성되도 static한 변수는 하나다.
    ValableScopeExam v1 = new ValableScopeExam();
    ValableScopeExam v2 = new ValableScopeExam();
    v1.golbalScope = 20;
    v2.golbalScope = 30; 

    System.out.println(v1.golbalScope);  //20 이 출력된다. 
    System.out.println(v2.golbalScope);  //30이 출력된다. 

    v1.staticVal = 10;
    v2.staticVal = 20; 

    System.out.println(v1.statVal);  //20 이 출력된다. 
    System.out.println(v2.statVal);  //20 이 출력된다. 

golbalscopre같은 변수는 인스턴스가 생성될때 생성되기 대문에 인스턴스 변수라고한다.
staticVal같은 static한 필드를 클래스 변수라고 한다.
클래스 변수는 래퍼런스.변수명 하고 사용하기 보다는 클래스명.변수명으로 사용하는 것이 더 바람직하다고 한다.

출처: 프로그래머스

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

형 변환이란, 변수 또는 상수의 타입을 다른 타입으로 변환하는 것이다.
형 변환 방법은 간단하다.

(타입)피연산자

괄호 ()는 '캐스트 연산자'또는 '형변환 연산자'라고 하며 형변환을 '캐스팅'이라고 한다.
기본형(primitive type)에서 boolean을 제외한 나머지 타입들은 서로 형변환이 가능하다.
그리고 기본형 참조형간의 형변환은 불가능하다.

정수형간의 형변환

  • 큰 타입에서 작은 타입으로의 변환, 예를 들어서 int타입(4byte)의 값을 byte타입(1 byte)으로 변환하는 경우는 크기의 차이만큼 잘려 나가게 된다.
  • 반대로 작은 타입에서 큰 타입으로의 변환 byte타입(1 byte)의 값을 int타입(4 byte)으로 변환하는 경우는 나머지 빈 공간을 0 또는 1로 채워진다.
    변환하려는 값이 음수인 경우에는 빈 공간을 1로 채운다. 그 이유는 형 변환 후에도 부호를 유지 할 수 있도록 하기 위해서이다.

실수형 간의 형변환

실수형에서도 정수형처럼 작은 타입에서 큰 타입으로 변환하는 경우, 빈 공간을 0으로 채운다.

자동 형변환 (promotion)

기존의 값을 최대한 보존할 수 있는 타입으로 자동 형변환한다.
표준 범위가 좁은 타입에서 넓은 타입으로 형변환하는 경우에는 값 손실이 없으므로 표현범위가 더 넓은 쪽으로 형변환한다.

byte - > short, char - > int - > long - > float - > double

화살표 방향은 타입을 써주지 않아도 자동으로 형변환이 되며 반대의 경우 형변환 연산자를 써줘야 한다.
보통 자료형의 크기가 큰 것 일 수록 값의 표현범위가 크기 마련이지만, 실수형은 정수형과 값을 표현하는 방식이 다르기 때문에 같은 크기일지라도 실수형이 정수형보다 휠씬 더 큰 표현 범위를 갖기 때문에 float, double형이 더 오른쪽에 위치한다.

정수형을 시루형으로 형 변환하는 경우, 정밀도의 한계로 인한 오차 차이가 발생 할 수 있다.

1차 및 2차 배열 선언하기

같은 타입의 여려 변수를 하나의 묶음으로 다루는 것을 '배열(array)'이라고 한다.

배열의 선언과 생성

타입[] 변수이름;
int[] score;
String[] name;

타입 변수이름[];
int score[];
String name[];

둘다 가능한데 대괄호를 타입의 일부로 붙이는게 더 많다고 한다.

배열의 생성

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

2차원 배열 선언

int score[][];

타입 추론, var

타입추론이란 정적 타이핑을 지원하는 언어에서, 타입이 정해지지 않은 변수에 대해서 컴파일러가 변수의 타입을 스스로 찾아낼 수 있도록 하는 기능으로 타입을 명시하지 않아도 된다.

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

좋은 웹페이지 즐겨찾기