본문 바로가기

항해 99/Java

Java 기초 - Java, 변수

자바(Java)?

자바표준 스펙

자바 표준 스펙과 구현

자바는 표준 스펙과 구현으로 나눌 수 있음

  • 자바 표준 스펙
    • 자바는 이렇게 만들어야 한다는 설계도이며, 문서이다
    • 이 표준 스펙을 기반으로 여러 회사에서 실제 작동하는 자바를 만듬
    • 자바 표준 스펙은 자바 커뮤니티 프로세스(JCP)를 통해 관리됨
  • 다양한 자바 구현
    • 여러 회사에서 자바 표준 스펙에 맞춰 실제 작동하는 자바 프로그램을 개발함'
    • 각각 장단점이 있다. 예를 들어 Amazon Corretto는 AWS에 최적화 되어 있다
    • 각 회사들은 대부분 윈도우, MAC, 리눅스 같이 다양한 OS에서 작동하는 버전의 자바도 함께 제공한다.

자바의 구현 참고 사이트 : https://whichjdk.com/ko/

 

어떤 JDK 버전을 사용해야할까요?

Which Version of JDK Should I Use?

whichjdk.com

 

 

변경의 용이

  • 자바 구현들은 모두 표준 스펙에 맞도록 개발되어 있다. 따라서 Oracle Open JDK를 사용하다가 Amazon Corretto 자바로 변경해도 대부분 문제 없이 작동함

 

컴파일과 실행

자바 프로그램은 컴파일과 실행 단계를 거친다

  • Hello.java와 같은 자바 소스 코드를 개발자가 작성한다.
  • 자바 컴파일러를 사용해서 소스 코드를 컴파일 한다.
    • 자바가 제공하는 javac라는 프로그램을 사용한다.
    • .java → .class 파일이 생성된다.
    • 자바 소스 코드를 바이트코드로 변환하며 자바 가상 머신에서 더 빠르게 실행될 수 있게 최적화하고 문법 오류도 검출한다.
  • 자바 프로그램을 실행한다.
    • 자바가 제공하는 java라는 프로그램을 사용한다.
    • 자바 가상 머신(JVM)이 실행되면서 프로그램이 작동한다.

 

IDE와 자바

인텔리제이를 통한 자바 설치 관리

  • 인텔리제이는 내부에 자바를 편리하게 설치하고 관리할 수 있는 기능을 제공함.
  • 이 기능을 사용하면 인텔리제이를 통해 자바를 편리하게 다운로드 받고 실행할 수 있다.

 

인텔리제이를 통한 자바 컴파일, 실행과정

  • 컴파일
    • 자바 코드를 컴파일 하려면 javac라는 프로그램을 직접 사용해야 하는데, 인텔리제이는 자바 코드를 실행할 때 이 과정을 자동으로 처리함
      • 예) javac Hello.java
    • 인텔리제이 화면에서 프로젝트에 있는 out 폴더에 가보면 컴파일 된 .class 파일이 있는 것을 확인할 수있음.
  • 실행
    • 자바를 실행하려면 java 라는 프로그램을 사용해야 한다. 이때 컴파일 된 .class 파일을 지정해주면 된다.
    • 예) java Hello, 참고로 확장자는 제외함.
  • 인텔리제이에서 자바 코드를 실행하면 컴파일과 실행을 모두 한 번에 처리한다.
  • 인텔리제이 덕분에 매우 편리하게 자바 프로그램을 개발하고, 학습할 수 있다.

 

자바와 운영체제 독립성

일반적인 프로그램

  • 일반적으로 프로그램은 다른 운영체제에서 실행할 수 없다.
  • 예를 들어서 윈도우 프로그램은 MAC이나 리눅스에서 작동하지 않음.
  • 윈도우 프로그램은 윈도우 OS가 사용하는 명령어로 구성되어 있고, 해당 명령어는 다른 OS와는 호환되지 않음.

 

자바 프로그램

  • 자바 프로그램은 자바가 설치된 모든 OS에서 실행할 수 있다.
  • 자바 개발자는 특정 OS에 맞추어 개발을 하지 않아도 됨, 자바 개발자는 자바에 맞추어 개발하면 됨. OS 호환성 문제는 자바가 해결한다. Hello.class와 같이 컴파일된 자바 파일은 모든 자바 환경에서 실행할 수있다.
  • 윈도우 자바는 윈도우 OS가 사용하는 명령어들로 구성되어 있음, MAC이나 리눅스 자바도 본인의 OS가 사용하는 명령어들로 구성되어 있다, 개발자는 각 OS에 맞도록 자바를 설치하기만 하면 됨.

 

자바 개발과 운영 환경

  • 개발할 때 자바와 서버에서 실행할 때 다른 자바를 사용할 수 있다.
  • 개발자들은 개발의 편의를 위해서 윈도우나 MAC OS를 주로 사용한다.
  • 서버는 주로 리눅스를 사용한다. AWS를 사용하는 경우 Amazon Corretto 자바를 AWS 리눅스 서버에 설치하면 된다.
  • 자바의 운영체제 독립성 덕분에 각각의 환경에 맞추어 자바를 설치하는 것이 가능함.

 

변수(Variable)

패키지

  • 패키지 자바 파일을 구분하기 위한 폴더
  • variable 패키지를 만들었을 경우, 해당 패키지에 들어가는 자바 파일 첫 줄에 package variable; 와 같이 소속된 패키지를 선언해야 함.
  • 자바 파일이 위치하는 패키지와 package variable 선언 위치가 같아야 한다.

변수(variable)

  • 어딘가에 값을 보관해두고 필요할 때 값을 꺼내서 읽을 수 있도록 하는 저장소, 데이터를 담을 수 있는 그릇

변수 선언

int a

  • 숫자 정수(integer)를 보관할 수 있는 이름이 a라는 데이터 저장소를 만든다, 이것을 변수라 함.
  • 이렇게 변수를 만드는 것을 변수 선언이라 한다.
  • 이제 변수 a에는 숫자 정수를 보관할 수 있다.
  • 숫자 정수 뿐만 아니라 문자, 소수와 같이 다양한 종류 값을 저장할 수 있는 변수들이 있다.

변수에 값 대입

a = 10

  • 자바에서  = 은 오른쪽에 있는 값을 왼쪽에 저장한다는 뜻. 수학에서 elquals와 다른 뜻으로 사용됨.
  • 숫자를 보관할 수 있는 데이터 저장소인 변수 a에 값 10을 저장한다.
  • 이처럼 선언한 변수에 처음으로 값을 대입해서 저장하는 것을 변수 초기화라 한다.

변수 값 읽기

System.out.println(a)

  • 변수에 저장되어 있는 값을 읽어서 사용하는 방법은 간단함. 변수 이름을 적어주기만 하면 됨.
  • 자바는 실행 시점에 변수의 값을 읽어서 사용한다.
    • System.out.println(a) → System.out.println(10) // 변수 a 의 값을 읽어서 a 의 값인 10으로 변경, 숫자 10을 출력
  • 변수의 값은 반복해서 읽을 수 있다. 변수의 값을 읽어도 값이 없어지지 않는다.

변수 값 변경

변수는 이름 그래도 변할 수 있는 수, a에 저장된 값을 언제든지 바꿀 수 있음.

a = 10; //변수 초기화: a(10) //1. 변수 a에 10을 저장한다.
System.out.println(a); //2. 변수 a의 값을 읽는다. a에는 10이 들어있다. 10을 출력한다.
a = 50; //변수 값 변경: //3. 변수 a의 값을 50으로 변경한다. a(10 -> 50)
System.out.println(a); //4. 변수 a의 값을 읽는다. a에는 50이 들어있다. 50을 출력한다.
  • 변수의 값을 변경하면 변수에 들어있던 기존 값은 삭제 됨.

 

 

변수의 선언과 초기화

변수 선언

변수를 선언하면 컴퓨터의 메모리 공간을 확보해서 그곳에 데이터를 저장할 수 있음, 그리고 변수의 이름을 통해서 해당 메모리 공간에 접근할 수 있다. (데이터를 보관할 수 있는 공간을 만들고, 그곳에 이름을 부여한다)

package variable;

public class Var4 {
    public static void main(String[] args) {
        int a;
        int b; // 변수를 1개 씩 선언 

        int c, d; // 변수 여러 개를 한 번에 선언
    }
}
  • 변수는 한 번에 1개 씩  또는 한 번에 여러 개를 선언할 수 있다.

변수 초기화

변수를 선언하고, 선언한 변수에 처음으로 값을 지정하는 것을 변수 초기화라 함.

package variable;

public class Var5 {
    public static void main(String[] args) {
        int a;
        a = 1;
        System.out.println(a);

        int b = 2; // 변수의 선언과 초기화 한 번에
        System.out.println(b);

        int c = 4, d = 3; // 여러 변수의 선언과 초기화 한 번에
        System.out.println(c);
        System.out.println(d);
    }
}
  1. 변수의 선언과 초기화를 각각 따로 할 수 있다
  2. 변수를 선언하면서 동시에 초기화 할 수 있다
  3. 여러 변수를 선언하면서 초기화도 동시에 진행할 수 있다.

변수는 초기화 해야 함.

변수를 초기화 하지 않고 사용할 경우 컴파일 에러가 발생한다.

package variable;

public class Var6 {
    public static void main(String[] args) {
        int a;
        System.out.println(a); // 컴파일 에러 발생
    }
}
  • 컴퓨터에서 메모리는 여러 시스템이 함께 사용하는 공간이다. 그래서 어떠한 값들이 계속 저장됨. 변수를 선언하면 메모리상의 어떤 공간을 차지하고 사용함, 그런데 그 공간에 기존에 어떤 값이 있었는지 알 수 없기 때문에 초기화하지 않을 경우 이상한 값이 출력될 수 있다. 이런 문제 예방을 위해 자바는 변수 초기화를 강제한다.
  • 지역변수(Local Variable)은 개발자가 직접 초기화해야 한다. 클래스 변수(Class Variable)과 인스턴스 변수(Instance Variable)는 자바가 자동으로 초기화를 진행함
  • 컴파일 에러는 자바 문법에 맞지 않았을 때 발생하는 에러, 컴파일 에러는 오류를 빨리, 명확하게 찾을 수 있기 때문에 좋은 에러임(빠르게 버그를 찾아서 고칠 수 있다).

 

변수 타입

변수는 데이터를 다루는 종류에 따라 다양한 형식(type)이 존재한다.

 

변수 타입의 예

  • int : 정수를 다룸. 예) 1, 100, 1000
  • double : 실수를 다룬다. 예) 1.1, 0.5, 100.1
  • boolean : 불리언 타입이라 한다. true, false 값만 사용할 수 있다, 주로 참과 거짓을 판단하는 곳에 사용
  • char : 문자 하나를 다룰 때 사용함. (' ')를 사용해서 감싼다. 예) 'a'
  • String : 문자열을 다룬다. (" ")를 사용한다. 예) "Hello java"

자신의 타입에 맞는 데이터 사용

  • int a = "백원" : 정수 타입에 문자열(x)
  • int a = "100" : 정수 타입에 문자열(x), "로 감싸진 값은 문자열로 처리함
  • int a = 100 : 정수 타입에 정수 100(O)

리터럴

코드에서 개발자가 직접 적은 100, 'a', 100.5, "Hello java"와 같은 고정된 값을 프로그래밍 용어로 리터럴(literal)이라 한다.

int a = 100; // 정수 리터럴
double b = 10.5; // 실수 리터럴
boolean c = true; // 불리언 리터럴
char d = 'a'; // 문자 하나 리터럴
String e = "Hello Java"; // 문자열 리터럴

 

변수의 값은 변할 수 있지만 리터럴은 개발자가 직접 입력한 고정된 값이다. 따라서 리터럴 자체는 변하지 않는다.

  • 리터럴(literal): 단어의 어원이 문자 또는 글자를 의미함

숫자타입

package variable;

public class Var8 {
    public static void main(String[] args) {
        // 정수
        byte b = 127; // -128 ~ 127
        short s = 32767; // -32767 ~ 32,767
        int i = 2147483647; //-2,147,483,647 ~ 2,147,483,647 약 20억

        // -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807
        long l = 9223372036854775807L;

        //실수
        float f = 10.0f;
        double d = 10.0;
    }
}

 

메모리를 적게 사용하면 작은 숫자를 표현할 수 있고, 메모리를 많이 사용하면 큰 숫자를 표현할 수 있다.

변수를 선언하면 표현 범위에 따라 메모리 공간을 차지한다. 그래서 필요에 맞도록 다양한 타입을 제공한다.

 

 

표현할 수 있는 숫자의 범위와 차지하는 메모리 공간은 다음과 같음.

  • 정수형
    • byte : -128 ~ 127 (1byte, 2⁸)
    • short : -32,768 ~ 32,767 (2byte, 2¹⁶)
    • int : -2,147,483,648 ~ 2,147,483,647 (약 20억) (4byte, 2³²)
    • long : -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 (8byte, 2⁶⁴)
  • 실수형
    • float : 대략 -3.4E38 ~ 3.4E38, 7자리 정밀도 (4byte, 2³²)
    • double : 대략 -1.7E308 ~ 1.7E308, 15자리 정밀도 (8byte, 2⁶⁴)
  • 기타
    • boolean : true , false (1byte)
    • char : 문자 하나(2byte)
    • String : 문자열을 표현한다. 메모리 사용량은 문자 길이에 따라 동적으로 달라진다.(특별한 타입)

리터럴 타입 지정

  • 정수 리터럴은 int 를 기본으로 사용함, 따라서 int 범위까지 표현할 수 있다. 숫자가 int 범위인 약 20억을 넘어가면 L을 붙여서 정수 리터럴을 long으로  변경해야 한다.(소문자 l은 숫자 1과 혼동될 수 있어서 비권장)
  • 실수 리터럴은 기본이 double형을 사용함, float형을 사용하려면 f를 붙여서 float형으로 지정해야 한다.

자주 사용하는 변수 타입

  • 정수 - int , long : 자바는 정수에 기본으로 int를 사용함, 만약 20억을 넘을 것 같으면 long을 사용
    • 파일을 다룰 때는 byte를 사용
  • 실수 - double : 실수는 double을 쓰면 됨
  • 불린형 - boolean : 참 거짓을 표현한다, 조건문에서 자주 사용됨
  • 문자열 - String : 문자를 다룰 때는 문자 하나든 문자열이든 모두 String을 사용하는 것이 편리하다.

변수 명명 규칙

자바에서 변수의 이름을 짓는데는 규칙과 관례가 있다.

규칙은 필수이다. 규칙을 지키지 않으면 컴파일 오류가 발생한다.

관례는 필수는 아니지만 전세계 개발자가 해당 관례를 따르기 때문에 사실상 규칙이라고 생각해도 된다.

 

규칙

  • 변수 이름은 숫자로 시작할 수 없다. (예: 1num, 1st)
    • 숫자가 이름에 포함되는 것은 가능 (예: myVar1, num1)
  • 이름에는 공백이 들어갈 수 없다.
  • 자바의 예약어를 변수 이름으로 사용할 수 없다. (예: int, class, public)
  • 변수 이름에는 영문자(a-z, A-Z), 숫자(0-9), 달러 기호($) 또는 밑줄(_)만 사용할 수 있다.

관례

  • 소문자로 시작하는 낙타 표기법
    • 변수 이름은 소문자로 시작하는 것이 일반적, 여러 단어로 이루어진 변수명은 첫 단어는 소문자로 시작하고 그 이후의 단어는 대문자로 시작하는 낙타 표기접(camel case)를 사용 (예: orderDetail)
  • 클래스는 대문자로 시작, 나머지는 소문자로 시작
    • 자바에서 클래스 이름의 첫 글자는 대문자로 시작한다. 그리고 나머지는 모두 첫 글자를 소문자로 시작한다. 여기
      에 낙타 표기법을 적용하면 된다.
      • 클래스: `Person` , `OrderDetail`
      • 변수를 포함한 나머지: `firstName` , `userAccount
    • 예외
      • 상수는 모두 대문자를 사용하고 언더바로 구분 (USER_LIMIT)
      • 패키지는 모두 소문자를 사용한다 (org.spring.boot)

참고: 변수 이름은 의미있고, 그 용도를 명확하게 설명해야 한다.

  • `a` , `b` : 이런 변수는 용도를 설명하지 않는다. 단순한 예제에서만 사용하는 것이 좋다.
  • `studentCount` , `maxScore` , `userAccount` , `orderCount` : 용도를 명확하게 설명한다

'항해 99 > Java' 카테고리의 다른 글

Java 문법 종합 2주차-2  (0) 2024.01.17
Java 문법 종합 2주차-1  (0) 2024.01.16
Java 문법 종합 1주차  (1) 2024.01.16
Java 기초 3 - 반복문, 스코프, 형변환  (0) 2024.01.15
Java 기초 2 - 연산자, 조건문  (0) 2024.01.11