스터디할래 - 2주차 과제

나승학·2020년 11월 20일
1

스터디할래

목록 보기
2/3
post-thumbnail

스터디 할래 - 깃헙 페이지
이미지 작성 - draw.io

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


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

기본(원시:Primitive) 타입이란 정수, 실수, 문자, 논리 리터럴을 직접 저장하는 타입을 말한다.
정수 타입에는 byte, short, int, long 등이 있고, 문자 타입에는 char, 실수 타입에는 float, double이 있으며 논리 타입에는 boolean이 있다.

값의 범위는 아래의 표와 같다.
프리미티브 타입

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

자바의 자료형은 프리미티브(기본형) 뿐만 아니라 래퍼런스(참조) 타입이 존재하며 프리미티브 타입을 제외한 타입을 레퍼런스 타입이라 볼 수 있다.

  • Primitive Type
    프리미티브 타입은 정수, 실수, 문자, 논리 타입 데이터를 직접 저장하는 타입을 말한다.
  • Reference Type
    프리미티브 타입은 데이터를 저장하는 반면, 레퍼런스 타입은 객체의 주소를 참조한다. 레퍼런스 타입의 특징으로는

1) 모든 레퍼런스 타입의 조상은 Object이며, Object 타입을 상속 받는다고 할 수 있다.
2) null 참조가 가능하다.

리터럴

int a = 1; //  a는 변수, 1이 리터럴

리터럴이란 소스 코드의 고정된 값으로 변하지 않는 데이터를 말한다. 변수에 저장 되는 값 자체를 리터럴이라고 보면 된다. 위의 예제 코드에서 a가 변수라면, a에 저장되는 1 값 자체를 리터럴이라고 할 수 있다.

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

  • 변수 선언 방법
    자바에서 변수를 선언하는 방법은 "'자료형' '변수';" 순으로 작성하면 된다.
    ex)
    char c; 
    String name;
    Person person;
  • 초기화 방법
    초기화 방법에는 "변수명 = 값", "자료형 변수명 = 값;"으로 하는 2가지 방법이 존재한다.
 ex)
  int a;

  a = 1; // 초기화 방법1
  
  String name = null; // 초기화 방법2

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

스코프란 범위란 뜻으로 클래스, 메소드에서 선언된 변수들은 사용 가능한 범위를 가진다.

public class Foo {
	int a = 1; // a : 전역 변수 -> 클래스 내에서 모두 접근 가능하다.
    public void func() { 
    	int b = 3; // b : 지역 변수 -> func() 내에서 사용 가능한 변수
        for (int i = 0; i < 5; i++) {
        	int c = 0; // c : 지역 변수 -> for문 내에서만 사용 가능한 변수
        	b += i;
        }
    }
    public static void main(String[] args) {
    	
    }
}

라이프타임(Life time)

  • 전역변수
    클래스 내의 모든 영역에서 사용 가능한 변수로 클래스 변수와 인스턴스 변수로 나뉜다.

    • 클래스 변수
      클래스 변수는 정적 변수라고 부르며, 프로그램이 실행될 때 클래스와 함께 메모리에 로드되는 변수로 프로그램 종료시 삭제 된다.

    • 인스턴스 변수
      객체를 생성함에 따라 각각의 인스턴스마다 변수의 복사본을 가질 수 있는 변수이며, 객체가 소멸되기 전까지 존재한다.

  • 지역 변수
    메소드, 반복문, 생성자 등에서 선언된 변수로 해당 영역 내에서 사용이 가능한 변수로, 해당 범위를 벗어날 경우 사용 불가능하다.

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

  • 타입 변환(캐스팅, 형 변환)

    • 묵시적 형변환
      묵시적 형변환이란 자동으로 형 변환 해주는 경우를 의미한다. 아래의 코드 출력 예시를 보면 char 타입의 변수 a를 int 타입 변수 b에 대입하면 형변환이 발생하여 'a'의 아스키 코드 값인 97이 b에 저장되는 것을 확인 할 수 있다.

    • 명시적 형변환
      명시적 형변환이란 데이터 앞에 변환할 타입으로 명시해주는 경우를 의미한다. 주로 큰 데이터 타입을 작은 데이터 타입으로 변환할 때 사용되며, 데이터 손실의 가능성이 있어 명시적으로 형 변환을 해주지 않을 경우 에러가 발생한다.

	// 묵시적 형변환
        char a = 'a';
        int b = a;
    
	//명시적 형변환
	long a = 10;
	int b = (int)a;

묵시적 형변환

  • 타입 프로모션
    타입 프로모션이란 크기가 더 작은 자료형을 더 큰 자료형에 대입할 때, 자동으로 작은 자료형이 큰 자료형으로 변환되는 현상이다. 예를 들어, 다음과 같은 코드가 있을 때
      int a = 1;    (4byte 정수 타입)
      double b = a; (8byte 실수 타입)

프로모션
b는 a의 값인 1을 받지만 코드를 출력 해보면,b는 1.0의 double형으로 형 변환 된 것을 확인 할 수 있다

1차 및 2차 배열 선언하기

배열은 같은 타입의 변수들의 집합으로, 배열을 구성하는 값을 배열 요소(element)라 하며, 각 element의 위치를 index라고한다.

  • 1차 배열
int[] arr = new int[4];
int[] arr2 = {1,2,3,4};
arr2[0] = 6; // 첫번째 인덱스(0번 인덱스)를 0 -> 6으로 바꾼다.

배열

  • 2차 배열
int[][] arr = new int[2][2];
int[][] arr2 = {{1,1},{2,2}};

번외로 C, C++은 배열 선언시 괄호의 위치가 배열명 뒤에 위치한다

ex)
int arr[3];
int arr2[2][2];

타입 추론, var

타입 추론이란 타입이 정해지지 않은 변수의 타입을 컴파일러가 유추하는 기능이다. 자바10 이전에서는 일반 변수에 대해 타입 추론을 지원하지 않기 때문에 자바에서의 타입 추론은 제네릭과 람다에 대한 타입 추론을 말한다.
예를 들어,

List<Integer> numbers; 
위와 같이 선언된 변수를 컴파일러가 Type Erasure 를 사용하여 타입 정보를 제거하면, 
List<Object> numbers;
로 변환된다.

실행 시간에는 모든 것들이 Object 의 인스턴스로 넘어가고 이면에서 적절한 타입으로 캐스팅 된다. 이러한 특성 때문에 런타임에 타입을 체크하는 것이 어렵다는 특징이 있다.


자바의 var은 Java10에서 추가되었다. 자바10 이전에는 자바 변수에 타입을 명시 했어야 했지만, 자바10부터 추가된 var은 선언된 변수의 타입을 컴파일러가 추론하여 사용 가능하다.

  • 올바른 사용 및 잘못된 사용 방법 예시
var a = 1;            // 적합
var b = 2, c = 3.0;   // 부적절: 다중 선언(multiple declarators)
var d[] = new int[4]; // 부적절: 추가(여분?) 중괄호 쌍(extra bracket pairs)
var e;                // 부적절: 초기화 없음(no initializer)
var f = { 6 };        // 부적절: 배열 초기화(array initializer)
var g = (g = 7);      // 부적절: 초기화 내 자기참조 (self reference in initializer)

References

이것이 자바다(신용권 저, 한빛미디어)
primitive default value
리터럴 - 위키피디아
변수 scope
변수 lifetime
자바var
타입 추론

profile
자바와 스프링으로 개발하는 것을 좋아합니다.

0개의 댓글