똑같은 삽질은 2번 하지 말자

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

STUDY HALLE/과제

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

곽빵 2020. 12. 30. 15:11

TodoList

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

 

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

https://en.wikibooks.org/wiki/Java_Programming/Primitive_Types

 

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

프리미티브 타입(Primitive type)

Java 언어 내에서 사용할 수 있는 가장 기본적인 데이터 유형으로써 boolean, byte, char, short, int, long, float and double이 있다. 프리미티브 타입은 Java에서 데이터 조작의 기본 블록 역할을 하며, 한 가지 목적으로만 사용됩니다. 즉, 순수하고 단순한 유형의 값을 저장하는데 쓰이는 것이다.

Java 프리미티브 타입에는 세 가지 기본 카테고리가 있다. (Numeric, Textual, Boolean and null)

 

  • Numeric primitives: short, int, long, float, double 등이 있으며 숫자 데이터만 포함된다. 이러한 데이터 유형과 관련된 연산은 사칙연산과 비교 등이 있다.
  • Textual primitives: byte, char 등이 있으며 문자(유니코드 문자 또는 숫자일 수 있다)가 있으며 관련된 작업은 문자 조작, 비교,등등이 있으며 바이트로 구성된 문자일시 산술 연산도 할 수 있다.
  • Boolean and null primitives

 

레퍼런스 타입(Reference type)

Reference type 이란 객체의 주소를 참조하는 타입으로 배열, 열거, 클래스, 인터페이스등이 있다.

프리미티브 타입과 참조 타입의 차이는 저장되는 값이 주소값이냐 실제 값이냐에 따라 갈리는데, 기본 타입으로 선언된 변수는 실제 값을 변수에 저장하지만 참조 타입은 배열, 열거, 클래스, 인터페이스를 이용해서 선언된 변수는 메모리에 주소를 값으로 갖게 된다. 즉 주소를 통해 해당 객체를 참조한다는 뜻으로 참조 타입이라고 부릅니다.

리터럴(Literal)

리터럴은 데이터 그 자체를 뜻 한다. 변수에 넣는 변하지 않는 데이터를 의미하는 것이다.

int num = 10;

num은 변수이고, 10은 리터럴이다.
즉, 10과 같이 변하지 않는 데이터(boolean, char, double, long, int, etc...)를 리터럴(literal)이라고 부른다.

 

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

int num = 10 // 즉시값(immediate value), literal

int num2;
num2 = 20;

float f1 = 3.1F // float형 리터럴 3.1F 리터럴 값이 3.1
double d1 = 3.1

 

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

scope(유효범위)

 말 그대로 선언한 변수를 사용할 수 있는 범위

public class ScopeExample {
	public static int globalNum = 10; // 클래스 변수, 정적 변수
    public int instanceNum = 11; // 멤버, 인스턴스 변수
	
	public static void localScope() {
		int localScopeNum = 20; // 로컬 변수
		System.out.println(localScopeNum); // 20
		System.out.println(globalNum); // 10
        System.out.println(localNum); // error 참조할 수 없는 지역변수
        System.out.println(instanceNum); // error 해당객체 생성없이 참조 불가
	}
	
	public static void main(String[] args) {
		int localNum = 10; // 로컬 변수
		int globalNum = 55;
		
		System.out.println(localNum); // 10
		System.out.println(localScopeNum); // error 참조할 수 없는 지역변수
		System.out.println(globalNum); // 55 (우선순위: 지역변수 > 전역변수)
		
		localScope();
	}
}

 

Life Time(라이프 타임)

로컬변수

  로컬변수는 처리 블록 내 { } 사용할 수 있는 변수이다.

  변수를 선언한 곳에서 블록이 종료되면 같이 사라진다.

 

인스턴스 변수

  클래스의 필드로 선언하는 변수

  객체가 생성될 때 생성되어 객체가 폐기될 때 같이 폐기된다.

 

클래스 변수

  클래스의  static 필드로 선언한 변수

  자바의 변수 중 가장 긴 라이프사이클을 가지고 있으며,

  프로세스 시작시 생성되어 프로세스 종료시 사라진다.

 

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

타입 프로모션(자동 형 변환)

  • 자신의 표현 범위를 모두 포함한 데이터 타입으로 변환
  • 일반적으론 큰 범위에서 작은 범위로 가는 경우

 

타입 캐스팅(명시적 형 변환)

  • 자신의 표현 범위를 모두 표함하지 못한 데이터 타입으로 변환
  • 일반적으로 작은 범위에서 큰 범위를 가는 경우

 

1차 및 2차 배열 선언하기

public static void main(String[] args) {
	int []arr;
	int [][]arr2;
	
	arr = new int[2];
	arr2 = new int[2][];
		
	System.out.println(arr.length); // 2
	System.out.println(arr2.length); // 행의 길이
	System.out.println(arr2[0].length); // NullPointerException 아직 할당이 안됬으니
		
	arr2[0] = new int[3];
		
	System.out.println(arr2[0].length); // 3
		
	arr2 = new int[2][4];
		
	System.out.println(arr2[1].length); // 4
}

 

 

타입 추론, var

타입 추론이란?

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

 

특징

var는 키워드가 아니다.

(타입) (변수명) = (초기화 값);

위의 방식으로 변수를 선언하는데, 키워드가 아닌 var는 변수명으로 사용될 수 있다는 말이다.

public static void main(String[] args) {
	int var = 10; // 가능
	int double = 10 // 불가능 double은 키워드이기 떄문
}

 

 

변수할당이 된 다음 var가 키워드 표식으로 바뀌고 타입추론이 되면 레퍼런스 메소드 확인이 가능하다

var 키워드를 사용해서 선언하면 Object고 int고 String이고 뭐든 다 들어간다. 단, Object로 선언한 변수에 값을 넣으면 자동완성에서 표시되는 사용가능한 메소드가 Object 기준의 레퍼런스 메소드만 나오는 것에 비해 var로 변수 선언 후 초기화까지 스캔이 완료되면 해당 타입을 추론해 얼마든지 유동적인 레퍼런스 메소드를 출력해준다.

String 객체의 메소드 멤버들이 나열되어있다.

 

전역변수에서 var를 사용할 수 없다. 

사용 시 참고해야하는 부분이다. 반드시 지역변수 레벨에서만 사용이 가능하며 생성자 혹은 메소드에 포함되어있지 않는 영역에서의 사용은 철저하게 금지된다. 'var' is not allowed here 메세지가 나타난다. 

 

타입파라미터 위치에 들어갈 수 없다.

이 역시 마찬가지로, 'var' is not allowed here 메세지가 나타나 컴파일 에러가 나타난다. 

 

람다 익스프레션은 사용할 수 없지만 함수형 인터페이스는 들어간다

 

일단 보통 가독성 때문에 대부분 개발자들은 아래와 같은 심플한 var 사용을 지양하려고 한다. 왜냐면 IDE라면 모를까 임시로 자동완성을 지원하지 않는 에디터로 편집할 때 사람이 타입 추론이 어려워서이다.

var intVal = 20; 
var strVal = "string"; 
var list = new ArrayList<Integer>();

함수형 인터페이스 적용

var supply = new Supplier<String>() { 
    @Override 
    public String get() { 
    	// TODO 
    } 
}

함수형 인터페이스는 정의가 거대하고, 유추가 쉽다. 그리고 선언한 다음에 변수가 바뀌는 일도 없다.

 

하지만 람다는 안 된다. (컴파일 오류)

var supply = () => { 
    // TODO
};

왜냐면 람다를 등록할 인터페이스가 모호하기 때문이다. 같은 람다라도 예를 들어 Supplier<T> 클래스가 있고 Callable<T> 클래스가 있다. 물론 미묘한 차이점이라면 throws Exception 유무지만, 만약 Supplier<T> 와 같은 람다를 가진 인터페이스가 있다면 무슨 수로 유추할 것인가? 

'STUDY HALLE > 과제' 카테고리의 다른 글

연산자  (0) 2021.01.10
JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가  (0) 2020.12.29
Comments