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

Jeongmin Yeo (Ethan)·2020년 11월 19일
3

STUDY HALLE

목록 보기
2/13
post-thumbnail

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

백기선님과 함께하는 자바 2주차 스터디 과정입니다.

학습할 내용은 다음과 같습니다.

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

Reference: Java in a Nutshell


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

Java는 8가지의 primitive type이 있습니다.

  • Boolean Type
  • Character Type
  • Four Integer Type
  • Two floating-point types
TypeContainsDefaultSizeRange
booleantrue or falsefalse1 bitNA
charUnicode character\u000016 bits\u0000 to \uFFFF
byteSigned integer08 bits–128 to 127
shortSigned integer016 bits–32768 to 32767
intSigned integer032 bits–2147483648 to 2147483647
longSigned integer064 bits–9223372036854775808 to 9223372036854775807
floatIEEE 754 floating point0.032 bits1.4E–45 to 3.4028235E+38
doubleIEEE 754 floating point0.064 bits4.9E–324 to 1.7976931348623157E+308

1.1 The Boolean Type

  • true와 false 값을 나타내는 타입입니다.

  • Java에서 boolean은 javascript와는 다르게 integer 타입이나 object 타입으로 호환되지 않습니다.


// Wrong Case 
public class JavaTest {

    public static void main(String[] args) {
        Object o = new Object();
		int i = 01; 
        if(o){ 
            System.out.println("test");
            while(i) {
            	System.out.println("test2");
            }
        }
    }
}


// Correct Case 
public class JavaTest {

    public static void main(String[] args) {
        Object o = new Object();
        int i = 1;

        if(o != null){
            System.out.println("test");
            while (i != 0){
                System.out.println("test2");
            }
        }
    }
}

1.2 The Char Type

  • Char 값은 Integer 값으로 바뀔 수 있습니다. 16 bit의 Integer Type 값이라고 생각하시면 됩니다. 차이는 Unsigned Type이라는 점입니다.

  • Character Class는 다양한 Static methods가 있습니다.

    • isDigit()
    • isJavaLetter()
    • isLowerCase()
    • toUpperCase()
  • Char type의 변수는 유니코드를 염두에 두고 설계 되었지만 유니코드가 계속 발전함에 따라 16bit로는 부족한 문자가 등장하면서 표현할 수 없는 경우가 있습니다. 이런 경우에는 int값을 코드 포인트로 잡고 인코딩해야합니다,

    • Han (Chinese) ideograph은 21bit를 필요로 한다고 합니다.

1.3 Integer Types

  • Java의 Integer Type은 byte, short, int, 그리고 long이 있습니다. 이 네가지 타입은 비트 수만 다릅니다.

  • 숫자가 L로 끝난다면 long type을 말합니다 (64-bit Values)

  • Integer 값은 Binary, Hexadecimal, octal로 다양하게 표현 될 수 있습니다.

  • Java에서 Integer 연산은 Type의 range를 벗어나도 overflow나 underflow가 발생하지 않습니다 대신 구체적으로 타입을 감싼다면 overflow나 underflow가 발생할 수 있습니다.

public class JavaTest {

    public static void main(String[] args) {
       byte b1 = 127;
       byte b2 = 2;

        // Expected Output 129
        System.out.println(b1 + b2);

        // Expected Output 127
        System.out.println((byte)(b1 + b2));
    }
}
  • Integer의 경우에도 string을 integer로 변환하는 유용한 static methods가 있습니다.

    • Byte.parseByte()

    • Integer.parseInt()

1.4 Floating-Point Types

  • Java에서 Real numbers를 표현하는 타입은 float과 double type입니다.

  • float은 32bit고 double은 64bit입니다. 두 가지의 타입은 모두 IEEE 754-1985 표준을 따릅니다.

  • Floating point는 exponential과 scientific으로 표현할 수 있습니다. (e와 E)

    • 1.2345E02 // 1.2345 * 10 ^2
    • 1e-6 // 1 * 10^-6
    • 6.02e23 // 6.02 * 10^23
  • Floating Type은 infinity와 NaN(Not a Number)이라는 특별한 값이 있습니다.


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

  • Reference Types은 무엇인가?

    • 대표적인 References Types은 Classes와 array를 말합니다.

    • object는 reference type의 instance 입니다.

  • Primitive Types과 Reference Types은 많이 다릅니다.

    • 8가지의 Primitive Types은 Java Language에 의해 정의됩니다. 프로그래머에 의해 새롭게 정의될 수 없습니다. 하지만 Reference Types은 사용자가 정의할 수 있습니다.

    • Primitive Types은 single vlaues만 가질 수 있는 반면 Reference Types은 더 많은 primitve type이나 objects들의 타입을 가질 수 있습니다.

      • ex) 제가 정의한 Hypothetical Point Class는 double x와 double y를 타입으로 갖습니다.
    • Primitive Types은 1byte 부터 8byte의 메모리를 갖습니다 이러한 Primitive Value는 변수나 메소드에 전달될 때 이 값을 가진 Bytes들을 복사합니다. 하지만 Object의 경우엔 훨씬 더 많은 메모리를 필요로 합니다. Object에 저장된 메모리는 힙에 dynamically하게 할당 될 수 있고 사용되지 않을 때 자동적으로 Garbage Collector에게 회수됩니다.

    • C와는 다르게 Java에는 Pointer가 없어서 referecne를 직접적으로 조작하는건 불가능합니다.


3. 리터럴

  • 자바의 리터럴은 Java Source 코드에서 상수형태로 표현되며 Integer, floating-point numbers, single characters, string, true, false, null을 포함하는 모든 값을 말합니다.

    • ex) 1 1.0 '1' 1L "one" true false null
  • 리터럴을 표현하는 syntax로는 numeric, character and string으로 표현될 수 있습니다.


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

  • Declaration(선언)이란

    • 자바의 변수 선언이란 변수의 식별자 이름을 입력하고 변수의 메모리 공간을 할당하겠다 라는 의미입니다.
      char a; // 변수 선언 예시
  • Initialization(초기화)란?

    • 변수를 초기화 한다는 건 변수를 선언한 후 그 변수에 처음으로 어떠한 값을 저장하는 걸 말합니다.

    • 인스턴스를 생성 할 땐 변수를 초기화 하지 않아도 기본 값이 세팅되지만 지역변수의 경우엔 초기화를 항상 해줘여합니다.

  • 초기화 하는 방법

    • 변수를 초기화 하는 방법은 다양합니다.

    • 명시적 초기화 방법

      • 변수의 생성과 동시에 초기화 하는 방법을 말합니다.
      	int a = 10; // 명시적 초기화 방법
    • 생성자 초기화 방법

      • 생성자를 통해 인스턴스의 변수를 초기화 할 수 있습니다.
    • 초기화 블럭 방법

      • 초기화 블럭은 명시적 초기화 방법으로는 복잡한 경우에 사용됩니다.
      • 초기화 블록안에서는 명시적 초기화 방법에서는 할 수 없는 조건문과 반복문을 통해서 초기화가 가능합니다.

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

  • 변수의 스코프(Scope)와 라이프타임이란 무엇인가?
    • 프로그램 상에서 변수는 사용가능한 범위를 가집니다. 이걸 스코프라고 합니다.
    • 변수가 선언된 블록이 그 변수의 사용범위 입니다.
   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 는 블럭 바깥에 존재하기는 하지만, 메서드 선언부에 존재하므로 사용범위는 해당 메소드 블럭내입니다.
  • 메소드 블럭내에서 선언된 localScope 변수의 사용범위는 메소드 블럭내입니다.

  • 메인 메소드 같은 static한 메소드에서는 좀 다릅니다.
public class VariableScopeExam {
        int globalScope = 10; 
	static int staticVal = 7;
        
        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);        //오류  
            System.out.println(staticVal);    //사용가능 
        }   
    }
  • 같은 클래스 안에 있는데 globalScope 변수를 사용 할 수 없습니다. main은 static한 메소드입니다. static한 메서드에서는 static 하지 않은 필드를 사용 할 수 없습니다.
  • static한 필드(필드 앞에 static 키워드를 붙힘)나, static한 메소드는 Class가 인스턴스화 되지 않아도 사용할 수 있습니다.
  • static한 변수는 공유됩니다.

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

  • 타입 변환(Type Casting)이란 무엇인가?

    • 형변환이란 변수 또는 상수의 타입을 다른 타입으로 변환하는 것을 말합니다. 프로그램에서 값의 대입이나 연산을 수행할 때는 같은 타입끼리만 가능한데 그래서 연산을 수행하기 전에 같은 타입으로 만들어야 하고, 변수나 상수를 다른 타입으로 변환하는 것을 '형변환(casting)' 이라고 합니다.

    • 큰 데이터의 타입에서 작은 데이터의 타입으로 바꿀 때 Type Casting이라고 합니다.

    • 이떄는 명시적으로 보여줘야 합니다.

  • __타입 프로모션(Type Promotion)이란 무엇인가?

    • 타입의 사이즈 크기가 더 작은 타입을 더 큰 타입에 대입할 때, 자동으로 작은 타입이 큰 타입으로 변환되는 현상힙니다.

    • 이때는 자동으로 형변환 됩니다.


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

// 크기 할당과 초기화 없이 배열 참조변수만 선언하는 경우 입니다. 
int arr[];
int [] arr; 

// 선언과 동시에 배열 크기를 선언하는 경우입니다.
int[] arr = new int[5];

// 기존 배열의 참조 변수에 초기화 하는 경우입니다.
int[] arr;
arr = new int[5];

// 선언과 동시에 배열의 크기 지정 및 초기화 하는 경우입니다.
int[] arr = new int[]{1,2,3,4,5}; 

// 2차원 배열 선언입니다.
int[][] arr = new int[4][3]; 
int[][] arr = { {1,2,3}, {2,3,4}, {3,4,5}};

8. 타입 추론, var

  • 타입 추론이란?
    • 타입 추론이란 코드 작성 당시 타입이 정해지지 않았지만, 컴파일러가 그 타입을 유추하는 것입니다.
  • var
    • 자바 10부터 타입 추론을 지원하는 var키워드가 추가되었는데 이 키워드는 local variable이면서 선언과 동시에 initializer가 필수적으로 요구됩니다.
    • 자바 7에서 다이아몬드 연산자라는 방식이 추가되었는데, 자바 10에서 나온 var 와 함께 사용하게 되면 컴파일 에러가 발생합니다.
	// 컴파일러가 타입을 유추할 수 있는 정보가 있습니다.
	var message = "문자열 입니다.";
  
	// 컴파일러가 타입을 유추할 수 있는 정보가 없습니다. 그래서 사용할 수 없습니다.
	var messages = new ArrayList<>();
profile
좋은 습관을 가지고 싶은 평범한 개발자입니다.

0개의 댓글