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

케이·2022년 7월 31일
0

JAVA

목록 보기
6/17
post-thumbnail

학습한 내용을 정리한 포스팅입니다. 직역된 부분이 있어 어색할 수 있습니다. 틀린 부분이 있다면 언제든 지적 해주시면 감사하겠습니다. 🙇🏻‍♀️

Primitive Type & Reference Type

간단요약: The basic difference is that primitive variables store the actual values, whereas reference variables store the addresses of the objects they refer to.

  • 프리미티브 타입에는 앞에서 본 것 처럼 boolean, byte, char, short, int, long, float, double이 있다. 이 외 타입은 모두 레퍼런스 타입이다.

  • 프리미티브 타입 변수는 선언될 때 하나의 밸류만 저장되고 디폴트 값으로 초기화 된다.
    레퍼런스 타입은 컴퓨터 메모리 안의 객체의 위치를 저장한다.


Primitive Type 종류와 값의 범위 그리고 기본 값

TypeSize(byte)Size(bits)MinimumMaximumetcdefault value
byte18-128127-0
short216-3276832767-0
int432-21474836482147483647-0
long864-2⁶³2⁶³-1-0
float432-2⁻¹⁴⁹(2-2⁻²³)*2¹⁰²³-0.0f
double864-2⁻¹⁰⁷⁴(2-2⁻⁵²)*2¹⁰²³-0.0d
char41602¹⁶-1-'\u0000'
booleanNot precisely defined1--true/falsefalse

리터럴

변수에 할당 될 수 있는 변하지 않는 값을 리터럴이라고 부른다.
예시)

int x = 100;
여기에서 100이 리터럴이다.

리터럴의 종류

1. Integral literals

byte, short, int, long 같은 데이터 타입을 4가지로 나눠 볼 수 있다.

//Decimal literals
	int x = 101;
    
//Octal literals: 0으로 시작해야 한다(prefix)
	int x = 0146;
    
//Hexa-decimal literals: hexa-decimal number가 prefix로 있어야 한다. 
	int x = 0X123Face;
    
//Binary literals
	int x = 0b1111;

2. Floating-Point literal

Floating-point 데이터 타입을 위해 10진법의 형태로 특정할 수 있지만 8진법이나 16진법의 형태로는 특정할 수 없다.

- Decimal literals
double d = 123.456;

3. Char literals

char 타입은 아래 예시와 같이 4가지 방법으로 리터럴을 특정 할 수 있다.

char ch1 = 'a';
char ch2 = 062;
char ch3 = '\u0061'; //여기서 \u0061는 'a'를 나타낸다.
char ch4 = '\n';

4. String literals

쌍따옴표("")로 묶임 문자들을 String 리터럴로 본다.

String s = "Hello World!";

5. Boolean literals

true, false만 boolean 리터럴이 있다.


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

변수 선언 방법


(출처 - geeks for geeks)
위의 그림처럼 변수를 선언하기 위해서는 데이터 타입(예시: int)과 데이터 이름(예시: count)이 필요하다.
이렇게 변수를 선언했을 때는 메모리의 위치만 주어지게 된다. 할당을 하기 위해서는 두 가지 방법이 있는데 1. Variable Initialization(변수 초기화) 2. Assigning value by taking input(인풋을 통한 값 할당) 이 그 두가지 방법이다.

변수 초기화 방법

이어서 변수를 초기화 하기 위해서는 3가지 요소가 필요하다.

  • 데이터 타입(Data Type), 변수이름(Variable_name), 값(Value)
    (출처 - geeks for geeks)

변수가 선언됨에 지정되는 기본 값은 위의 Primitive Type 종류와 값의 범위 그리고 기본 값 - default Value 부분을 확인하자


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

멤버 변수 (클래스 레벨 스코프)

클래스 안에서 선언되는 변수(하지만 메소드 밖이어야 한다)이며 클래스 안에서 어디서든 접근할 수 있다.
아래의 예에서 클래스 안에서 선언된 모든 변수들은 멤버 변수이다.(count와 name)

public class Test {
	
    int count;
    private String name;
    
    void method1(){
       ...
    }

}

클래스 내에서 멤버 변수에 접근하는 건 스코프의 영향을 받지 않는다.
클래스 밖에서 멤버 변수에 대한 접근은 아래의 규칙에 따른다.

ModifierPackageSubclassworld
publicYesYesYes
protectedYesYesNo
Default(no modifier)YesNoNo
privateNoNoNo

지역 변수 (메소드 레벨 스코프)

지역변수는 메소드 안에서 선언되며 메소드 밖에서는 접근할 수 없다(메소드 레벨 스코프를 갖는다).
아래의 예에서 x,y는 지역변수이다.

public class Test {
	void method1(){
    	int x;
        int y;
    }
}

지역변수는 메소드 실행이 끝나면 더이상 존재하지 않는다.


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

데이터 타입에 대한 비트 크기는 아래와 같다.

1. Widening or Automatic Type Conversion (확장변환)

두 데이터 타입을 자동으로 변환하는 것으로

  • 두 데이터 타입이 호환될 수 있을 때 (Compatible)
  • 큰 데이터 타입에 작은 데이터 타입의 값을 할당 할 때

자바에서는 숫자 타입들은 서로 Compatible하지만 숫자 타입에서 char나 boolean 타입으로 자동 변환되지는 않는다. char, boolean은 서로 compatible하지 않다.

2. Narrrowing or Explicit Conversion (축소변환)

큰 데이터 타입의 값을 작은 데이터 값을 할당할 때 축소변환이나 캐스팅.

  • 호환되지 않는 두 타입을 변환할 때

3. Type Promotion in Expressions

  • Evaluating expressions 할 때 자바가 자동으로 byte, short, char를 int로 변환

4. Explicit Type Casting in Expressions

Evaluating expressions 할 때, 결과는 큰 데이터 타입으로 자동으로 업데이트된다. 하지만 그 결과를 작은 데이터 타입에 저장하려고 하면 컴파일 에러가 발생한다.(타입 캐스팅이 필요하기 때문에)


1차 및 2차 배열 선언하기

배열이란?

같은 타입의 여러 변수들을 하나의 묶음으로 다루는 것.
배열의 인덱스는 0부터 시작하기 때문에 마지막 인덱스는 '배열의 길이 - 1' 이다.
배열은 아래와 같이 선언한다.

type var-name[];
or
type[] var-name;

ex)
int[] count;
or 
int count[];

2차원 배열

다차원 배열은 배열의 배열 이라고 정의할 수 있다. 다차원 배열 중 2차원 배열은 다차원 배열 중에 가장 간단한 배열이라고 할 수 있다.

선언하는 방법

int[][] arr = new int[10][10];

초기화 하는 방법

arr[0][0] = 1;

타입 추론, var

타입 추론(Type Inference)

타입 추론은 일반적으로 컴파일 될 때 자동으로 변수의 데이터 타입을 추론 하는 것을 말한다.
지역변수의 타입 추론은 자바 10의 기능으로 개발자가 지역변수와 관계된 타입 선언을 스킵하는 것을 가능하게 하고 컴파일러는 변수의 데이터 타입을 알아 낸다.

var

var는 자바 10에서 등장했다. var 키워드에서 타입 추론이 사용되어 콘텍스트에 따라 변수의 데이터 타입을 자동으로 알아낸다.

class VarExample {
	public static void main (String[] args) {
    	var x = 100; //int
        var y = 1.98; //double
        var z = 'a'; //char
        var a = "abc"; //string
        var b = false; //boolean
    }
} 
  • 어떤 데이터 타입이든 var 키워드로 선언할 수 있다.
  • 지역 변수 선언에 var가 쓰일 수 있다.
  • 인스턴스나 전역 변수 선언에 var가 쓰일 수는 없다.
  • 제네릭 타입으로는 쓰일 수 없다.
  • 제네릭 타입과 함께 쓰일 수 없다.

참고

https://www.baeldung.com/java-primitives
https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
https://stackoverflow.com/questions/8790809/whats-the-difference-between-primitive-and-reference-types
https://www.oreilly.com/library/view/javatm-how-to/9780133813036/ch03lev2sec25.html
https://www.geeksforgeeks.org/literals-in-java/
https://www.geeksforgeeks.org/variables-in-java/
https://www.geeksforgeeks.org/type-conversion-java-examples/
https://www.geeksforgeeks.org/var-keyword-in-java/?ref=gcse

profile
삽질하며 깨닫고 배웁니다. (a.k.a 프로삽질러) + 이 구역의 회고왕

0개의 댓글