ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 2주차 과제: 자바 데이터 타입, 변수 그리고 배열
    프로그래밍 언어/Java 2021. 1. 14. 17:53

     

     

    백기선님의 온라인 자바스터디 (https://youtu.be/peEXNN-oob4)

     

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

     

    출처 : https://en.wikibooks.org/wiki/Java_Programming/Primitive_Types#cite_note-CITEREFSEIRuleSTR01J-1

     위 표에서 프리미티브의 종류와 값의 범위를 알 수 있었다. 그 중 생각지도 못한게 void타입이다.. 

    메서드 선언할 때 말곤 사용할 일이 없어서 처음 표를 볼 땐 조금 벙쪘다... 사실 혹시나해서 sout로 찍어도 봤다.. 

    또 생각 해보지 못한게 여러 타입들의 기본값인데 변수를 항상 직접 초기화 해놓고 쓴터라 기본값을 몰라 Java docs를 찾아보았다.

     

    Java primitive Data Types

    만약 직접 결과를 보고 싶다면  인스턴스화해서 출력해본다. (Local Variable에서는 자동으로 초기화 하지 않는다.)

     

    위 표와 동일한 값이 출력되는 것을 볼 수 있다.

     

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

    Primitive Type(원시자료형)은 JVM Memory의 Stack 영역에 저장되는 타입으로 종류는 위 쪽에서 다뤘다.

    다음으로는 Reference Type(참조자료형)으로 Class, String, Array, Interface, Enum이 종류로 있다 특징으로는 원시자료형과 달리

    Heap 영역에는 실제 데이터가 저장되고 객체에는 Heap에 저장된 데이터를 가르키는 '주소값' 만을 Stack 영역에 저장한다. 

     

    3.리터럴

    리터럴(literal)이란 변수 또는 상수에 저장되는 그 값 자체를 얘기한다. 종류에 따라 정수, 실수, 문자 등의 리터럴이 존재한다.

    int decimal = 0;          // 10진법  
    int ocatal = 024;         // 8진법
    int heaxaDecimal = 0x1a;  // 제일 앞 0x가 붙으면 16진법
    int binary = 0b11010; 	  // 0b로 시작하면 2진법
    
    long live = 100L;          // Long Type의 경우 L또는 l을 붙여준다.
    long study = 100l;
    
    char a = 'b';              // 문자는 ''(작은 따옴표)로 묶어준다.
    String b = "hello world"   // 문자열은 '' 또는 ""로 묶어준다. 
    
    boolean a = true;
    boolean b = false;         // boolean 은 true, false 두 가지

     

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

    변수의 선언과 초기화는 따로 할 수도, 한 번에 할 수도 있다.

    int a;     // a 라는 변수를 int(정수)형으로 선언
    a = 10;    // 위에서 선언한 변수에 정수를 넣어준다
    
    int a = 10;// 위 과정을 한 줄로 표현할 수도 있다.  

    위와 같이 할 수 있는데 만약 LocalVariable을 선언만 하면 컴파일오류가 날 수 있다. 초기화도 분명하게 해줄 것...

     

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

    변수의 스코프란 선언된 변수를 사용할 수 있는 범위를 뜻한다.

    public class PmTest {
            byte java;
            int study;
            static short live;   //정적변수 선언
    
        public static void main(String[] args) {
            System.out.println(java); // 인스턴스화 하기전의 변수는 그대로 사용할 수 없다.
            System.out.println("---------------------");
            System.out.println(live); // static 선언 클래스변수를 선언해주면 사용할 수 있다.
            PmTest pm = new PmTest(); //인스턴스 선언
            System.out.println("byte type = " + pm.java); // 정상적으로 출력된다.
        }
    
        public void Test1(int val1){
            int test1val = 0; //지역 변수 선언
            System.out.println(study); //전역 변수는 사용할 수 있다.
            System.out.println(test1val); // 지역변수는 사용할 수 있다.
            System.out.println(val1);// 매개변수도 사용할 수 있다.
        }
    
        public void Test2(int val2){
            int test2val = 0; //지역 변수 선언
            System.out.println(study); //전역 변수는 사용할 수 있다.
            System.out.println(val2); // 매개변수도 사용할 수 있다.
            System.out.println(test2val); // 지역변수도 당연히 사용할 수 있다.
            System.out.println("---------------------");
            System.out.println(test1val); // 다른 메소드의 지역변수는 사용할 수 없다.
            System.out.println(val1); // 다른 메소드의 매개변수 또한 사용할 수 없다.
        }
    }
    

    브라켓 "{}" 안에서 선언된 변수는 그 안에서만 사용할 수 있고, static 선언을 통해 정적변수로 만들면 어디서든 사용할 수 있다.

    라이프타임(생명주기)은 변수가 선언되고 부터 폐기될 때 까지를 뜻한다. 

     

    정적변수는 해당 Application이 종료될 때 소멸되며, 전역변수는 객체의 참조가 끊기면 GC(가비지컬렉터)에 의해  객체가 소멸되고 전역변수 또한

    함께 소멸된다. 지역변수는 브라켓("{ }")의 밖을 나가면 소멸되고 매개변수는 사용된 메소드가 return될 때 함께 소멸된다.

     

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

    변수의 타입은 최초 선언 후에도 변경할 수 있다. 다른 타입의 변수에도 옮겨담을 수 있다는 표현이 더 맞겠다.

        public static void main(String[] args) {
            byte a = 1;  // Type Promotion
            int b = a;   // Type Promotion byte -> int
            System.out.println("----------");
            int c = 10;  // Type Casting
            byte d = (byte) c;  // Type Casting int -> byte
        }

    위와 같이 byte 에서 int 상대적으로 작은 자료형에서 큰 자료형으로 값을 대입할 때를 Type Promotion 이라하며 별다른 제약이 없다.

    하지만 반대로 int에서 byte로 대입할 경우 대입하는 값 앞에 (byte) 와 같이 변환하는 자료형을 명시해줘야 하며 값과 자료형에 따라 데이터가

    바뀔 수 있다. 이를 Type Casting이라 한다. Primitive Type에서만 가능한 것은 아니고 Reference Type에서도 가능하며, 상대적으로 작은 개념의

    부모 클래스에서 자식클래스로의 변환은 Primitive Type과 동일하게 Type Casting이 필요하다.

     

    7.1차 및 2차 배열 선언하기

    배열이란 선형 자료구조 중 하나로 연관된 데이터를 하나의 변수에 묶어서 관리하는 자료 구조이다. 이또한 다른 변수처럼 선언하고 초기화한다.

        public static void main(String[] args) {
            int[] arr1; // 크기 할당과 초기화 없이 변수만 선언
            int[] arr2 = new int[5]; //선언과 동시에 크기도 할당
            int[] arr3;
            arr3 = new int[5]; // 크기할당과 0으로 초기화
            int[] arr4 = {1,2,3,4,5}; // 1~5 의 값을 가진 배열 초기화
    
            int[][] arr5 = new int[4][3]; // 3의 크기 배열을 4개 가지는 2차원 배열 할당
            int[][] arr6 = {{1,2,3},{4,5,6},{7,8,9},{10,11,12}}; // 3의 크기 배열 4개를 가지는 2차원 배열 선언 동시에 초기화
           
        }

    위에서 다룬 다른 변수들과 크게 다르지 않다. 다만 Reference Type이라는 것을 기억하자!

     

    8.타입 추론, var

    파이썬은 자료형을 명시하지 않아도 판단한다 

    타입 추론이란 값을 보고 변수에 담길 타입을 컴파일러가 판단하는 것이다. 본래 자바만 사용하다 최근 회사에서 Python을 사용하기에

    편리함을 충분히 체감할 수 있다. 처음 내가 자바를 배웠을 땐 자바6으로 배워 추론이라는게 아에 불가능 하였으나 자바8로 넘어오면서 lamda에서

    나마 이 타입추론을 사용할 수 있게 되었다고 한다. 또 var의 경우 이번 과제를 하며 알게 되었는데 자바10부터 var type을 지원한다고 한다.

    댓글

Designed by Tistory.