본문 바로가기

공부/JAVA

자바 데이터 타입, 변수 그리고 배열

반응형

백기선님 자바 기초 스터디 follow up

깃허브 :https://github.com/whiteship/live-study

 

GitHub - whiteship/live-study: 온라인 스터디

온라인 스터디. Contribute to whiteship/live-study development by creating an account on GitHub.

github.com

목차

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

참고: https://velog.io/@dion/%EB%B0%B1%EA%B8%B0%EC%84%A0%EB%8B%98-%EC%98%A8%EB%9D%BC%EC%9D%B8-%EC%8A%A4%ED%84%B0%EB%94%94-2%EC%A3%BC%EC%B0%A8-%EC%9E%90%EB%B0%94-%EB%8D%B0%EC%9D%B4%ED%84%B0-%ED%83%80%EC%9E%85-%EB%B3%80%EC%88%98-%EA%B7%B8%EB%A6%AC%EA%B3%A0-%EB%B0%B0%EC%97%B4

 

 

백기선님 온라인 스터디 2주차 - 자바 데이터 타입, 변수 그리고 배열

2주차!

velog.io

https://drinkcoldbrew.tistory.com/2

https://www.notion.so/2-38b5d67c7f5a48238529bb8f1617ea0d

 

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

목표

www.notion.so

 

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

  • 총 8가지의 기본형 타입이 있음
  • 자바에서 기본 자료형은 사용전에 반드시 Declared 되어야함
  • C에서와 다르게 OS에 따라 자료형의 길이가 변하지 않음
  • 실제값이 저장되는 공간으로 Stack 메모리 공간에 저장됨
  • 객체가 타입이 아니고, 기본값이 있어서 Null이 존재하지 않음
  Type Default Value(기본값) Size (할당크기) Range of Values (표현 가능 범위)
Integer byte 0 1 byte  -128 ~ 127
short 0 2 byte -32,768 ~ 32,767
int (default) 0 4 byte  -2,147,483,648 ~ 2,147,483,647
long 0 8 byte -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807
Floating-Point float 0.0 4 byte 소수점 7 자리까지
double (default) 0.0 8 byte 소수점 16 자리까지
Char char \u0000 2 byte (유니코드)  0 ~ 65,535
Bool boolean false 1 byte true, false

 

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

  • Primitive type
    • byte, short, signed/unsigned int, signed/unsigned long, float, double, boolean, char
    • not object
    • 값 저장
  • Reference type
    • class, interface, enum, array, String type
    • 주소 저장

 

3.  리터럴

  • 데이터 그 자체를 의미한다. 변수에 넣는 변하지 않는 데이터를 의미한다.
  • 프로그램에서 직접 표현한 값이다.
  • 소스 코드의 고정된 값을 대표하는 용어이다.
  • 정수, 실수, 문자, 논리, 문자열 리터럴이 존재한다.
int trueNum = 1;
  • 여기서 trueNum은 변수고 1이 리터럴이다.

null 도 리터럴이며 특수 리터럴로 분류된다.

Class 리터럴이라는 특수한 리터럴도 존재한다. 이는 <type의 이름>.class의 형태로 표현한다. 이는 Class 타입 자체를 나타내는 객체의 참조를 반환하며, reflection을 사용할 때, 많이 이용한다.

 

상수와의 차이

상수는 변하지 않는 변수를 의미하며(메모리 위치) 메모리 값을 변경할 수 없다.

단, 상수 내의 멤버 변수는 변환이 가능하다.

 

리터럴은 변수의 값이 변하지 않는 데이터(메모리 위치안의 값)를 의미한다. 

 

 

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

 

변수: 값을 저장할 수 있는 메모리 공간에 붙여진 이름이다. 변수라는 것을 선언하면 메모리 공간이 할당되고 할당된 메모리 공간에 이름이 붙는다.

 

변수선언

int num; // 변수형식 변수이름
int num = 20; // 변수형식 변수이름 = 초기화값
int num1, num2, num3, num4; // 변수형식 변수이름1, 변수이름2, 변수이름3, 변수이름4
int num1 = 10, num2 = 20, num3 = 30, num4 = 40; // 변수형식 변수이름1 = 초기화값, 변수이름2 = 초기화값, 변수이름3 = 초기화값, 변수이름4 = 초기화값;

 

 

변수의 초기화

변수를 선언하고 값을 저장하는 것을 변수 초기화라고 한다. 변수의 초기화의 경우에 따라 필수적일수도 선택적일수도있지만 가능하면 선언과 동시에 적절값으로 초기화하는게 좋다. 

멤버 변수는 초기화 하지 않아도 변수의 타입에 맞는 기본값으로 초기화가 이루어지지만, 지역변수는 사용하기 전에 반드시 초기화가 이루어져야한다.

 

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

 

자바의 변수는 4가지로 구분.

  • 인스턴스 변수: 클래스 선언시 static 키워드 없이 선언된 필드. 이 필드는 인스턴스 별로 다른 값을 가질 수 있기 때문에, 인스턴스 변수라고도 불린다.
  • 클래스 변수: 클래스 선언시 static 키워드와 함께 선언된 필드. 이 필드는 모든 인스턴스들이 공유하는 값이다. 클래스 명으로 접근이 가능하고, 클래스 하나에 한 값이기 때문에 클래스 변수라고 불린다.
  • 로컬 변수: 메서드 선언 사이에 등장하는 변수로 다른 클래스에서 접근할 수 없는 변수. 메서드 영역에서만 임시로 사용되는 변수.
  • 매개 변수: 매개 변수는 메서드의 인자로 전달되는 변수를 의미한다.

 

변수 스코프: 변수를 사용할수있는 범위를 이야기한다. {중괄호} 안에서 변수를 선언했을 경우 영역이 끝나기 전까지는 어디서든 사용이 가능하다.(지역 변수)

 

라이프타임: 변수가 메모리에 할당된 시점부터 반환되는 시점까지의 시간. 프로그램이 함수 내에 진입할 때 메모리에 할당되고, 빠져나갈 때 해제가 일어난다. 

 

자바의 변수: 변수의 선언 위치에따라서 종류가 달라진다.

public class test {

	int instVar; // 인스턴스 변수    
    static int classVar; // 클래스 변수
    
    void method() {
    	int localVar; // 지역 변수
    }
}
변수의 종류 선언위치 생성시기 (메모리 활당 시기)
클래스 변수 클래스 영역 클래스가 메모리에 올라갈때
인스턴스 변수 인스턴스가 생성될때
지역 변수 클래스 이외의 영역 (메서드, 생성자, 초기화 블럭) 변수 선언문이 수행 되었을때

 

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

 

타입변환: 특정 자료형을 다른 자료형으로 변환. 예를들면, int형과 float형은 자료형을 저장하는 방식이 다르다. 또, int와 long도 자료를 저장하는 방식이 다르다. 특정 자료형을 다른 자료형과 호환되게 변경하는 방법을 타입변환, 타입케스팅, 형변환이라고 한다.

 

자동 형변환(프로모션): 두 데이터 타입이 서로 호환이 되고, 더 작은 데이터 타입의 값을 더 큰 범위의 타입에 할당할 때만 동작. (바이트 크기가 아닌 표현 가능한 값의 범위)

자바: byte -> short -> int -> long -> float -> double 순으로 자동 형변환

 

명시적 형변환(캐스팅)

더 작은 범위의 타입에 더 큰 범위의 타입의 값을 할당하기 위해선 형변환을 명시해야한다.

또, 호환되지 않는 데이터 타입에도 사용할 수 있다.

ex) int -> char

 

오토박싱 / 언박싱:

Java에서는 primitive 타입에 대한 Wrapper 클래스가 존재. Java 1.5 이후로는 Java 컴파일러가 형변환을 자동으로 수행.

 

오토박싱: primitive 타입에서 Wrapper 클래스로 자동 형변환. (int - Integer)

Integer integer = 1; --> Integer integer = Integer.valueOf(1);

 

언박싱: Wrapper 타입에서 primitive 타입 추출.

1. 메소드에서 primitive 타입으로 매개변수를 받을 때, Wrapper가 매개변수로 전달된 경우

2. 해당 primitive 타입의 변수에 Wrapper가 할당되는 경우 

 

클래스에서도 타입 변환(캐스팅)이 존재한다.

하지만, 기본적으로 클래스 타입들은 타입 캐스팅이 불가능하지만, 다형성이라는 성질을 통해서 두 클래스가 상속 관계일 경우에 타입 변환이 가능하다.

  • 부모클래스는 명시적인 타입캐스팅 없이 자식과 연결 할 수 있다. 이를 업캐스팅(Up-casting)이라 한다. 
  • 자식클래스는 명시적인 타입캐스팅이 있다면 부모와 연결 할 수 있다. 이를 다운캐스팅(Donw-Casting)이라 한다.
  • 상속관계가 아니면 타입캐스팅은 불가능하다. 

7. 1차 및 2차 배열 선언하기

그림 참고 ( 출처 : https://www.notion.so/2-38b5d67c7f5a48238529bb8f1617ea0d )

 

8. 타입 추론, var

 

타입추론: 타입이 정해지지 않은 변수에 대해서 컴파일러가 변수의 타입을 스스로 찾아낼 수 있도록 하는 기능.

 

var: Java 10부터 지원. 지역변수를 선언할 때 초기값을 통하여 데이터 타입을 추론한다.

코드 양을 줄일 수 있고, 가독성을 높인다.

선언시에 초기화를 해줘야한다.

익명 클래스를 만들때, 익명 클래스의 타입 표시를 var로 해줄수 있다.

 

var i = 1; // int 추론
var str = "Hello World" // String으로 추론
var list = new ArrayList<String>(); // ArrayList<String>으로 추론

var는 초기화한 클래스의 타입을 사용하기 때문에 다형성을 활용한 코드에서는 어울리지 않는다.

ex) Animal을 부모로하는 Cat, Dog

var v = Cat(); : 타입을 Cat으로 추론

v = Dog(); : 타입을 Dog로 추론하기 때문에 불가능.

반응형