자바 스터디 2주차

기석·2022년 5월 4일
0
post-thumbnail

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

목표


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

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

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


프리미티브 타입과 레퍼런스 타입 ( 기본형 타입과 참조형 타입 )

  • 자바의 데이터 타입은 프리미티브 타입, 레퍼런스 타입으로 구성되어있다.
  • 프리미티브 타입 ( 기본형 타입 )
    • 프리미티브는 원시, 초기라는 의미를 가지고 있다.
    • 기본값이 있기 때문에 NULL이 존재하지 않는다.
      • 만약 기본형 타입안에 NULL을 넣고 싶다면 래퍼 클래스를 활용한다.
    • 실제 값을 저장하는 공간으로 Stack 메모리에 저장된다.
    • 컴파일 시점에 담을 수 있는 크기를 벗어나면 에러를 발생시키는 컴파일 에러가 발생한다.
      • byte error = 128; // byte의 범위는 -128~127
      • 위와 같은 경우 컴파일러가 오류를 표시한다.
      • 만약 런타임 시점에서 error에 128가 들어가면 가장 작은 값인 -128이 된다.
    • 총 8가지의 기본형 타입을 미리 정의하여 제공한다.
      • boolean, byte, short, int, long, float, double, char
  • 레퍼런스 타입 ( 참조형 타입 )
    • 기본형 타입을 제외한 모든 타입들이 참조형 타입이다.
    • 빈 객체를 의미하는 Null이 존재한다.
    • 값이 저장되어 있는 곳의 주소값을 저장하는 공간으로 힙 메모리에 저장된다.
    • 문법상으로는 에러가 없지만 실행시켰을 때 에러가 나는 런타임 에러가 발생한다.
      • 예) NullPointException
    • Array, Enumeration, Class, Interface 등

리터럴


프로그램에서 직접 표현한 값. 소스 코드의 고정된 값
long 타입이나 float타입은 각 숫자 뒤에 L, f 를 꼭 붙여주어야 한다.

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


  • 변수 선언 방법
    long name1; //[type] [name] 형식이다.
    • 네이밍 컨벤션
      • 자바에서 변수 이름을 붙일 때 몇 가지 규칙이 있다
      • 첫 번째 문자는 문자이거나 '$', '_'이어야 하고 숫자로 시작할 수 없다.
      • 영어 대소문자가 구분된다.
      • 예약어를 변수로 사용할 수 없다.
      • lowerCamelCase를 사용한다.
      • 그 외 자바의 네이밍 컨벤션
        • 클래스: upper camel 명사
        • 인터페이스: upper camel 명사, 형용사
        • 메소드: lower camel 동사
        • 변수: lower camel
        • 패키지: 모두 소문자
        • 상수: 모두 대문자 & '_'

- 명시적 초기화

long name1 = 10L;

- 생성자를 이용한 초기화

- 초기화 블록

클래스 필드의 초기화만을 담당하는 중괄호로 둘러싸인 블록
복잡한 초기화를 해야 할 경우 유용하게 사용된다.
초기화 블록은 생성자보다 먼저 호출되며, static 유무에 따라 구분할 수 있다.
1. 인스턴스 초기화 블록

  • 생성자와 마찬가지로 인스턴스가 생성될 때마다 실행된다.
  • 생성자와 인스턴스 초기화 블록의 차이가 별로 없어서 거의 사용되지 않는다.
  1. 클래스 초기화 블록
  • static 키워드를 추가하여 정의할 수 있다.
  • 클래스가 처음으로 메모리에 로딩될 때 한번만 실행된다.
  • 생성자나 인스턴스 초기화 블록으로는 수행할 수 없는 클래스 변수의 초기화를 할 때 사용된다.

초기화 순서

  1. 클래스 변수: 기본값 -> 명시적 초기화 -> 클래스 초기화 블록
  2. 인스턴스 변수: 기본값 -> 명시적 초기화 -> 인스턴스 초기화 블록 -> 생성자
    여러번 초기화될 가능성이 있다.

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


스코프: 변수의 사용 범위

변수는 선언된 범위의 중괄호 내에서 사용가능하다.

이는 변수가 라이프타임을 가지고 있기 때문이다.

변수의 라이프 타임

모든 변수는 생명주기라는 것을 가진다.
인스턴스 변수: 클래스 내에서 선언하는 변수

  • 인스턴스 변수는 객체가 생성될 때 변수가 생성된다.
  • 그리고 참조가 없을 때 가비지 컬렉터가 객체를 지워버리는데, 이 때 인스턴스 변수도 소멸한다.
    지역 변수: 메소드 내에서 선언하는 변수
  • 메소드가 호출 될 때 생성되고
  • 메소드 종료 시점에 소멸한다.
  • local 변수는 시작: '{' 소멸: '}'

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


타입 변환

하나의 타입을 다른 타입으로 바꾸는 것.
자바에서는 boolean을 제외한 다른 기본 타입 간의 타입 변환을 자유롭게 수행할 수 있다.

메모리에 할당받은 바이트의 크기를 기준으로
작은 타입 -> 큰 타입 변환은 생략할 수 있지만
큰 타입 -> 작은 타입 변환은 생략할 수 없고 컴파일 오류를 발생시킨다.

타입 변환의 종류

  1. 묵시적 타입 변환 (자동 타입 변환)
  • 자바 컴파일러가 자동으로 수행하는 타입 변환은 언제나 데이터의 손실이 최소화되는 방향으로 이루어진다.

  • 따라서 자바에서는 타입의 표현 범위에 따라 다음과 같은 방향으로 자동 타입 변환이 이루어진다. 반대는 컴파일 오류가 발생한다.

    byte형 → short형 → int형 → long형 → float형 → double형

  1. 명시적 타입 변환 (강제 타입 변환)
// (변환할 타입) 변환할 데이터
double result = (double) num1/num2

1차 및 2차 배열 선언


  1. 크기나 초기화 없이 배열 참조변수만 선언
int[] arr;
int arr[];
  1. 선언과 동시에 배열 크기 할당
int[] arr = new int[5];
String[] arr = new String[5];
  1. 기존 배열의 참조 변수에 초기화 할당
int[] arr;
arr = new int[5];
  1. 선언과 동시에 배열의 크기 지정 및 값 초기화
int[] arr = new int[] {1,2,3,4,5};
int[] arr = {1,2,3,4};
String[] weeks = {"일","월","화","수","목","금","토"};
  1. 2차원 배열 선언
    int[][] arr = new int[4][3];
    int[][] arr = {{1,2,3},{3,3,3},{4,4,4}}

타입 추론, var


타입 추론은 개발자가 변수의 타입을 명시적으로 적어주지 않고도 컴파일러가 알아서 이 변수의 타입을 대입된 리터럴로 추론하는 것이다.

var message = "문자열"; //message instanceOf String = true
  • Var는 초기화 값이 있는 지역변수로만 선언이 가능하다.

    • 또한 멤버 변수, 또는 메소드의 파라미터, 리턴 타입으로는 사용이 불가능하다.
  • Var는 키워드가 아니다.

    • 예약어가 아니기 때문에 변수명으로 사용할 수 있다.
    • 컴파일 후에 var는 자동으로 변환되기 때문이다. 같은 맥락에서 런타임 오버헤드도 없다.
profile
블로그 이사갔어요 https://kiseoky.tistory.com

0개의 댓글