티스토리 뷰

목표

자바의 프리미티브 타입, 변수 그리고 배열을 사용하는 방법 습득

 

학습할 것

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

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

  • 리터럴

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

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

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

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

  • 타입 추론, var

 

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

프리미티브(원시) 타입이란 정수, 실수, 문자, 논리 리터럴을 직접 저장하는 타입을 말한다.
타입의 종류는 정수 타입, 실수 타입, 논리 타입으로 나뉘며, char의 경우 문자 리터럴을 저장한다.

정수 타입 (byte, chart, short, int, log)

정수 타입에는 다섯 개의 타입이 있으며 저장할 수 있는 값의 범위가 서로 다르다.

정수 타입 byte char short int long
바이트 수 1 2 2 4 8

각 타입의 값의 범위를 나타내면 다음과 같다. 양수에서 -1을 하는 이유는 0이 포함되기 때문이다.

  • byte - 1byte (8bit) : -27 ~ 27-1 (-128 ~ 127)

  • char - 2byte (16bit) : 0 ~ 216-1 (0 ~ 65535)

  • short - 2byte (16bit) : -215 ~ 215-1 (-32,768 ~ 32,767)

  • int - 4byte (32bit) : -231 ~ 231-1 (-2,147,483,648 ~ 2,147,483,647)

  • long - 8byte (64bit) : -263 ~ 263-1

값의 범위를 나타낼 때 bit 중 최상위 비트(MSB: Most Significant Bit)는 정수값의 부호를 결정하기 때문에 실제 정수값은

나머지 비트로 결정되며 각 타입의 값의 범위를 초과하는 값이 변수에 저장될 경우 컴파일 에러가 발생하게 된다.

 

자바는 모든 문자를 유니코드로 처리하며 유니코드는 세계 각국의 문자들을 코드값으로 매핑한 국제 표준 규약이다.

유니코드는 2byte 크기를 가진 정수값이며 유니코드를 저장하기 위해 char 타입을 사용한다.

유니코드의 경우 음수가 없기 때문에 char 타입의 변수에는 음수를 저장할 수 없으며, 작은 따옴표로 감싼 문자를 대입하면

해당 문자의 유니코드가 char 타입의 변수에 저장된다.

 

실수 타입 (float, double)

실수 타입은 소수점이 있는 실수 데이터를 저장할 수 있는 타입이다.

실수 타입 float double
바이트 수 4 8

float와 double의 바이트 수는 각각 int와 long의 크기와 같지만 정수타입과는 다른 저장 방식으로 훨씬 큰 범위의 값을 저장한다.

부동 소수점(floating-point) 방식으로 저장되며 부동 소수점 방식(±m(가수) x 10n(지수))은 실수를 다음과 같은 형태로 표현한다.

 

 

  • float - 4byte (32bit) : 부호(1bit) + 지수(8bit) + 가수(23bit) = 32bit = 4byte

  • double - 8byte (64bit) : 부호(1bit) + 지수(11bit) + 가수(52bit) = 64bit = 8byte

논리 타입 (boolean)

논리타입 boolean은 1byte로 표현되는 논리값 true/false를 저장할 수 있는 데이터 타입이다.

 

 

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

자바의 데이터 타입은 크게 프리미티브 타입과 레퍼런스 타입으로 분류된다.

프리미티브 타입으로 선언된 변수와 레퍼런스 타입으로 선언된 변수의 차이점은 변수에 저장되는 값이 무엇인가이다.

 

프리미티브 타입인 byte, char, short, int, long, float, double, boolean 타입으로 선언된 변수는 변수 안에 실제 값을 저장한다.

레퍼런스 타입으로 선언된 변수의 경우 실제 값을 변수에 저장하지 않고 메모리의 번지를 값으로 저장한다.

즉, 레퍼런스 타입은 번지를 통해 객체를 참조하게 된다.

 

3. 리터럴

리터럴이란 소스 코드의 고정된 값을 대표하는 용어로 변수나 상수를 의미하는 것이 아니라 저장되는 값을 의미한다.

 

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

변수 선언

변수를 사용하기 위해서는 먼저 변수를 선언해야 하며 어떤 타입의 데이터를 저장할지와 변수 이름을 결정해야 한다.

 

변수를 선언할 때 따라야하는 5가지 명명 규칙은 다음과 같다.

 

  1. 첫 번째 글자는 문자이거나 '$', '_'이어야 하고 숫자로 시작할 수 없다.
  2. 영어 대소문자가 구분된다.
  3. 첫 문자는 영어 소문자로 시작하되, 다른 단어가 붙을 경우 첫 문자를 대문자로 한다. (관례)
  4. 문자 길이의 제한은 없다.
  5. 자바 예약어는 사용할 수 없다.

변수의 선언은 다음과 같이 하나씩 선언하거나 같은 타입인 경우 한꺼번에 선언이 가능하다.

int value;
double weight;

int x, y, z;

 

변수 초기화

변수를 초기화하는 방법은 선언과 동시에 초기화 하는 방법과 선언한 후 초기화하는 방법이 있다.

int value;
value = 10;

int value = 10;

자바 코드 작성시 변수를 선언할 때 클래스 영역에 선언하는 것과 메소드 영역에 선언하는 것으로 나눌 수 있다.

 

클래스 영역에 선언하는 변수의 경우 초기화가 되어있지 않아도 컴파일러가 자동으로 0이나 null과 같은 값들로 초기화 해준다.

하지만 메소드 영역에 선언된 변수의 경우 초기화가 되어있지 않으면 사용이 불가능하다.

 

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

변수는 중괄호 {} 블록 내에서 선언되고 사용되며 중괄호 블록을 사용하는 곳은 클래스, 생성자, 메소드이다.

변수는 블록 내 어디에서든 선언할 수 있지만, 기본적으로 선언된 블록 내에서만 사용이 가능하다. 

 

변수의 타입은 크게 3가지로 나눌 수 있으며 ① 인스턴스 변수 ② 클래스 변수 ③ 지역 변수이다.

 

변수의 스코프란 유효 범위를 의미하며 중괄호 {} 블록으로 한 영역이 생성되면 그 영역에 관한 스코프를 생성하게 된다.

변수의 라이프타임이란 변수가 메모리에 할당된 시점부터 반환되기까지의 시간을 의미한다.

 

 인스턴스 변수 :

클래스 내에 선언되지만 메소드나 블럭의 바깥 쪽에 선언되는 변수Scope : 정적 메소드를 제외한 클래스 전체Lifetime : 클래스 객체가 메모리에 머무르는 동안

 

② 클래스 변수 : 클래스 내에 선언되며, static으로 선언된 메소드나 블럭 바깥 쪽에 존재하는 변수Scope : 클래스 전체Lifetime : 프로그램이 끝날 때까지

 

③ 지역 변수 : 인스턴스 변수나 클래스 변수가 아닌 모든 변수Scope : 변수가 선언된 블럭 내Lifetime : 변수가 선언된 블럭 내 동작이 끝날 때까지

public class scope_and_lifetime {
	int num1, num2; // Instance Variables
    static int result; // Class Variable
    int add(int a, int b) { // Local Variables
    	num1 = a;
        num2 = b;
        return a+b;
    }
    public static void main(String args[]) {
    	scope_and_lifetime ob = new scope_and_lifetime();
        result = ob.add(10, 20);
        System.out.println("Sum = " + result);
    }
}
Learning Journal, Scope and Lifetime of a Variable in Java,
www.learningjournal.guru/article/programming-in-java/scope-and-lifetime-of-a-variable/

 

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

타입 변환

자바에는 두 종류의 타입 변환이 있으며 ① 자동 타입 변환(묵시적 타입변환) ② 강제 타입 변환(명시적 타입 변환)이다.

 

① 자동 타입 변환(묵시적 타입변환)

자동 타입 변환은 프로그램 실행 중 자동으로 타입이 변환되며 크기가 작은 타입이 크기가 큰 타입에 저장될 때 발생한다.

더보기

byte → short → char → int → long → float → double 

public class Main {
	public static void main(String[] args) {
    	int myInt = 9;
        double myDouble = myInt // Automatic casting : int to double
        
        System.out.println(myInt); // Outputs : 9
        System.out.println(myDouble); // Outputs : 9.0
    }
}

② 강제 타입 변환(명시적 타입 변환)

강제 타입 변환은 프로그램 실행 중 크기가 큰 타입이 크기가 작은 타입에 저장될 때 발생하며 데이터 손실 가능성이 있다.

강제 타입 변환을 수행할 때는 변경되는 타입을 꼭 명시해주어야 한다.

더보기

double → float → long → int → char → short → byte

public class Main {
	public static void main(String[] args) {
    	double myDouble = 9.78;
        int myInt = (int) myDouble; // Manual casting: double to int
        
        System.out.println(myDouble); // Outputs : 9.78
        System.out.println(myInt); // Outputs : 9
    }
}
W3schools, Java Type Casting,  
www.w3schools.com/java/java_type_casting.asp

 

캐스팅

위에서 살펴본 것과 같이 타입을 변환하는 것을 형변환, 캐스팅이라고 하며 프리미티브 타입, 레퍼런스 타입에서 모두 사용 가능하다.

같은 종류의 변수일 경우에만 캐스팅이 가능하며 프리미티브 타입과 레퍼런스 타입 간의 캐스팅은 불가능하다.

 

타입 프로모션

자바에서는 정수 타입에 대해 int형으로 연산을 수행하기 때문에 자동으로 byte, short, char를 int로 타입 프로모션한다.

또한 변수 a, b에 대해 연산을 수행할 때 하나의 타입이 long, float, double에 해당하는 경우 피연산자의 타입을 long, float, double로 변환하여 연산을 수행하게 된다. 이러한 동작을 타입 프로모션이라고 부른다. 

 

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

배열

동일한 타입을 가진 데이터들을 연속된 공간에 저장하기 위한 자료구조이다.

레퍼런스 타입에 해당하므로 변수 내에 값이 아닌 변수가 할당된 메모리 주소가 들어간다.

 

배열의 선언

더보기

1. 타입[] 변수명 = {데이터1, 데이터2, 데이터3, ...}

2. 타입[] 변수명 = new 타입[배열의크기]

변수[0] = 데이터1;

변수[1] = 데이터2;

 

1차원 배열

public class Main {
	public static void main(String[] args) {
		int[] score = { 90, 75, 95, 76, 70 };
		int sum = 0;
		for (int i = 0; i < score.length; i++) { // score.length = 5
			sum += score[i]; // sum = sum + score[i];
		}
		double avg = (double) sum / score.length; // Casting
		System.out.println("Score (sum) : " + sum); // Output : 406
		System.out.println("Score (avg) : " + avg); // Output : 81.2
	}
}

2차원 배열

public class Main() {
	public static void main(String[] args) {
    	int[][] arr = new int[2][3];
		for (int i = 0; i < arr.length; i++) {
			for (int j = 0; j < arr[i].length; j++) {
				arr[i][j] = j;
				System.out.print(arr[i][j] + " ");
			}
			System.out.println("");
		}
	}
}
public class Main() {
	public static void main(String[] args) {
    	String[][] arrStr = new String[2][4];
		for (int i = 0; i < arrStr.length; i++) {
			for (int j = 0; j < arrStr[i].length; j++) {
				arrStr[i][j] = "Str" + j;
				System.out.print(arrStr[i][j] + " ");
			}
			System.out.println("");
		}
	}
}

 

8. 타입 추론, var

타입 추론

타입 추론이란 코드 작성 시 타입이 정해지지 않은 변수를 컴파일러가 유추하는 기능이다.

 

var

Java 10에서부터 타입 추론을 지원하는 var라는 키워드가 추가되었다.

var a = 1;            // Legal
var b = 2, c = 3.0;   // Illegal: multiple declarators
var d[] = new int[4]; // Illegal: extra bracket pairs
var e;                // Illegal: no initializer
var f = { 6 };        // Illegal: array initializer
var g = (g = 7);      // Illegal: self reference in initializer
var a = 1;                // a has type 'int'
var b = java.util.List.of(1, 2);  // b has type 'List<Integer>'
var c = "x".getClass();   // c has type 'Class<? extends String>' 
                          // (see JLS 15.12.2.6)
var d = new Object() {};  // d has the type of the anonymous class
var e = (CharSequence & Comparable<String>) "x";
                          // e has type CharSequence & Comparable<String>
var f = () -> "hello";    // Illegal: lambda not in an assignment context
var g = null;             // Illegal: null type
ORACLE, Chapter 14. Blocks and Statements,
docs.oracle.com/javase/specs/jls/se10/html/jls-14.html#jls-14.4
 

Chapter 14. Blocks and Statements

In the following example, a mathematical graph is represented by an array of arrays. A graph consists of a set of nodes and a set of edges; each edge is an arrow that points from some node to some other node, or from a node to itself. In this example it is

docs.oracle.com

 

위 코드는 Java 10에서의 var 키워드 사용 예시이며, Java 10이후 출시된 LTS Java 11에서는 람다식 내 인자에도 var 키워드를

사용할 수 있도록 허용하고 있다고 한다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG more
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함