Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

6 Weeks - [지역 변수형 추론 var 의 등장] #88

Open
devjy39 opened this issue Oct 9, 2023 · 1 comment
Open

6 Weeks - [지역 변수형 추론 var 의 등장] #88

devjy39 opened this issue Oct 9, 2023 · 1 comment

Comments

@devjy39
Copy link
Member

devjy39 commented Oct 9, 2023

문제

  • 우리는 타입을 지정하지 않는 Javascript에서 안정성을 추구하기 위해 typescript로 갈아타고 동적 언어보다 타입 언어를 추구하는 추세라고 생각했는데 자바는 어떤 이유로 var를 추가한 것 일까요?
  • 그렇다면 var 키워드를 "어떤 상황"에서 "어떻게" 써야 좋을지 논의해 봤으면 좋겠습니다.

contents - 세부 내용

  • 자바 10부터 지역 변수형 추론 키워드 var가 등장하였습니다.

참고

@devjy39 devjy39 changed the title 6 Weeks - 지역 변수형 추론 var 의 등장 6 Weeks - [지역 변수형 추론 var 의 등장] Oct 9, 2023
@wlwlwon
Copy link
Collaborator

wlwlwon commented Oct 10, 2023

타입스크립트

2012년 마이크로소프트가 발표한 타입스크립트(TypeScript)는 자바스크립트(JavaScript)를 기반으로 정적 타입 문법을 추가한 프로그래밍 언어입니다.

타입스크립트의 특징

컴파일 언어, 정적 타입 언어

자바스크립트는 동적 타입의 인터프리터 언어로 런타임에서 오류를 발견할 수 있습니다. 이에 반해 타입스크립트는 정적 타입의 컴파일 언어이며 타입스크립트 컴파일러 또는 바벨(Babel)을 통해 자바스크립트 코드로 변환됩니다. 코드 작성 단계에서 타입을 체크해 오류를 확인할 수 있고 미리 타입을 결정하기 때문에 실행 속도가 매우 빠르다는 장점이 있습니다.

높은 수준의 코드 탐색과 디버깅

타입스크립트는 코드에 목적을 명시하고 목적에 맞지 않는 타입의 변수나 함수들에서 에러를 발생시켜 버그를 사전에 제거합니다. 또한 코드 자동완성이나 실행 전 피드백을 제공하여 작업과 동시에 디버깅이 가능해 생산성을 높일 수 있습니다. 실제로 한 연구에 따르면 모든 자바스크립트 버그의 15%가 사전에 타입스크립트로 감지할 수 있다고 합니다.

Java 10 지역 변수형 추론 var 의 등장

var 추가 이유

java 10에서는 개발자가 종종 불필요한 로컬 변수 유형의 매니페스트 선언을 제거할 수 있도록 함으로써 정적 유형 안전성에 대한 Java의 약속을 유지하고 Java 코드 작성과 관련된 의식을 줄여 개발자 경험을 개선하려고 합니다.

Java 10에서 도입된 var는 변수를 선언할 때 타입을 생략할 수 있으며, 컴파일러가 타입을 추론합니다. 컴파일 시점에 var 변수에 초기화된 ‘값’을 보고 추론해서 바이트코드에 명시적으로 타입이 결정이 되있는 상태라, 타입추론 변수를 읽을 때 마다 타입을 알아내기 위한 연산을 하지 않기 때문에 런타임 오버헤드가 없습니다. 또한 var로 선언된 변수는 중간에 타입이 절대 변경되지 않습니다.

var 변수 선언 가능

이니셜라이저가 포함된 지역 변수 선언, 향상된 for루프 인덱스 및 기존 for 루프에서 선언된 인덱스 변수의 var경우 매니페스트 유형 대신 예약된 유형 이름이 허용되도록 허용합니다. 식별자는 var키워드가 아닌 예약된 유형 이름이다*.*

//java 10 전
String str = "hi jaeyeol";
//java 10 후
var str = "hi jaeyeol";

//ArrayList 예시
ArrayList<String list = new ArrayList<String>(); // before
var list = new ArrayList<String>();  // infers ArrayList<String>

//반복문
int[] arr = {1, 2, 3};
for(int n : arr) {//before
    System.out.println("n : " + n);
}
for (var n : arr) {//after
    System.out.println("n : " + n);
}

var 주의사항

  • var는 지역 변수를 선언할 때만 사용할 수 있습니다. 클래스의 멤버 변수를 선언할 때 사용할 수 없습니다.

    class Var {
    
        public var str = "aaa";    // compile error
    
        public var list = new ArrayList<String>();    //compile error
    }
  • 초기화 필요

    var n;    // (cannot use 'val' on variable without initializer)
  • null 초기화 X

    var map = null;    // (variable initializer is 'null')
  • lambda X

    	var f = () -> { }; //(lambda expression needs an explicit target-type)
  • array X

    var k = { 1 , 2 }; // (array initializer needs an explicit target-type)

결론

  • 정적 타입의 컴파일 언어를 유지하며 var을 사용함으로써 변수형 추론의 장점을 활용할 수 있다.

@devjy39 devjy39 closed this as completed Oct 11, 2023
@devjy39 devjy39 reopened this Dec 26, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants