본문 바로가기
IT/김영한의JAVA입문_inFlearn

2. 변수 - 변수 시작 / 변수 값 변경 / 선언과 초기화 / 변수 타입 / 명명 규칙 / 문제와 풀이

by for-learn 2024. 12. 4.

변수(variable) : 변하는 데이터를 담을 수 있는 그릇(저장소)

 

2-1. 변수 시작

Var1.java

package variable;

public class Var1 {
    public static void main(String[] args) {
        System.out.println(20); // 변경 10 -> 20
        System.out.println(20); // 변경 10 -> 20
        System.out.println(20); // 변경 10 -> 20
    }
}
  • 10에서 20으로 모든 줄을 하나씩 변경해야하는 번거로움이 있다.

 

Var2.java

package variable;

public class Var2 {
    public static void main(String[] args) {
        int a; // 변수 선언
        a = 20; // 변수 초기화값을 변경 10 -> 20

        System.out.println(a);
        System.out.println(a);
        System.out.println(a);
    }
}
  • 숫자를 담을 수 있는 그릇(a)을 선언하고, 10을 a라는 그릇에 (대입)넣는다. 
  • 변수 하나를 변경함으로 간단하게 출력값을 모두 변경할 수 있다. 
  • 변수 초기화 : 선언한 변수에 처음으로 값을 대입하여 저장하는 것.

 

2-2. 변수 값 변경

Var3.java

package variable;

public class Var3 {
    public static void main(String[] args) {
        int a; // 변수 선언
        a = 10; // 변수 초기화
        System.out.println(a); // 10 출력
        a = 50; // 변수 값 변경
        System.out.println(a); // 50 출력
    }
}
  • 변수 a 에 저장된 값을 언제든 바꿀 수 있다. 

 

2-3. 변수 선언과 초기화

변수 선언

변수 선언하면 컴퓨터의 메모리 공간을 확보해 그곳에 데이터를 저장 가능하다.

변수 이름을 통해 메모리 공간에 접근 가능하다.

Var4.java

package variable;

public class Var4 {
    public static void main(String[] args) {
        int a; // 하나씩 선언
        int b;
        int c, d; // 한번에 여러개 선언
    }
}

 

변수 초기화

선언한 변수에 처음으로 값을 저장하는 것

Var5.java

package variable;

public class Var5 {
    public static void main(String[] args) {
        
        // 1. 변수 선언, 초기화 각각 따로
        int a;
        a = 1;
        System.out.println(a);

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

        // 3. 여러 변수 선언, 초기화 동시에
        int c = 3, d = 4;
        System.out.println(c);
        System.out.println(d);
    }
}
  • 변수 선언과 초기화, 각각 따로
  • 변수 선언과 초기화, 동시에
  • 여러 변수 선언과 초기화 동시에

Var6.java (초기화 하지 않은 변수 읽기)

package variable;

public class Var6 {
    public static void main(String[] args) {
        int a;
        System.out.println(a); 
        // 컴퍼일 에러가 난 부분은 주석처리 => 안하면 다른 예제 실행할 때 이 부분에서 컴파일 에러가 발생함
        // 컴파일 에러 => java: variable a might not have been initialized
    }
}
  • 변수가 초기화 되지 않았다는 컴파일 오류 발생
  • 자바는 변수를 초기화 하도록 강제한다. 왜?
    • 컴퓨터에서 메모리여러 시스템이 함께 사용하는 공간 => 어떠한 값들이 계속 저장됨
    • 변수 선언 시 메모리상 어떤 공간을 차지하고 사용하는데, 그 공간에 기존에 어떤 값이 있었는지 아무도 모른다. 
    • => 변수를 초기화하지 않으면 이상한 값이 출력될 수 있다. 
지금 학습하는 변수는 지역 변수(Local Variable)이다. 지역 변수는 개발자가 직접 초기화
클래스 변수인스턴스 변수자바가 자동으로 초기화 진행
컴파일 에러: 자바 문법이 맞지 않을 때 발생하는 에러.
컴파일로 '.class' 파일을 만드려고 하는데 변수 초기화를 안해서 에러남.
오류를 빨리, 명확하게 찾을 수 있기에 좋은 에러 (안 좋은 에러는 런타임 에러)

 

2-4. 변수 타입1

Var7.java

package variable;

public class Var7 {
    public static void main(String[] args) {
        int a = 100; // 정수
        double b = 10.5; // 실수
        boolean c = true; // 불리언(boolean) true, false 입력 가능
        char d = 'A'; // 문자 하나
        String e = "Hello Java"; // 문자열, 문자열을 다루기 위한 특별한 타입

        System.out.println(a);
        System.out.println(b);
        System.out.println(c);
        System.out.println(d);
        System.out.println(e);
    }
}

  • 변수는 데이터를 다루는 종류에 따라 다양한 형식이 존재
  • 이런 형식을 영어로 '타입(type)', 한글로는 '형식' 또는 '' => int 타입, 형식, 형
  • 자신에 타입에 맞는 데이터 사용
type   설명
int 정수   -1, 0, 1, 100, 1000
double 실수   -0.5, 1.5, 100.123
boolean 불리언 참과 거짓을 판단하는 곳에서 사용 true, false
char 문자 하나 작은따옴표( ' ) 사용 'A', '가'
String 문자열 큰따옴표( " ) 사용 "Hello Java", "자바"
String은 첫 글자가 대문자로 시작. 클래스를 배워야 자세히 이해할 수 있다. 

 

리터럴 (literal)

리터럴(literal)이라는 단어의 어원이 문자 또는 글자를 의미
int a = 100; // 정수 리터럴 (100)
double b = 10.5; // 실수 리터럴 (10.5)
boolean c = true; // 불리언 리터럴 (ture)
char d = 'A'; // 문자 하나 리터럴 ('A')
String e = "Hello Java"; // 문자열 리터럴("Hello Java")
  • 코드에서 개발자가 직접 적은 100 , 10.5 , true , 'A' , "Hello Java" 와 같은 고정된 값을 프로그래밍 용어로 리터럴(literal)이라 한다.
  • 변수의 값은 변할 수 있지만 리터럴은 개발자가 직접 입력한 고정된 값이다. 따라서 리터럴 자체는 변하지 않는다.

 

2-5. 변수 타입2

숫자타입

Var8.java

package variable;

public class Var8 {
    public static void main(String[] args) {
        // 정수
        byte b = 127; // -128 ~ 127
        short s = 32767; // -32,768 ~ 32,767
        int i = 2147483647; // -2,147,483,648 ~ 2,147,483,647 (약 21억)
        long l = 9223372036854775807L; // L or l(소문자는 추천안함)
        // -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807
        
        //실수
        float f = 10.0f; // f
        double d = 10.0;
    }
}
  • 변수를 선언하면 표현 범위에 따라 메모리 공간을 차지한다.
  • 메모리를 많이 사용할 수록 큰 숫자 표현이 가능하다.
  • 정수형은 $ 2^8 $, $ 2^{16} $, $ 2^{32} $, $ 2^{64} $ 순으로 메모리 공간 크기를 가진다. 

정수형

  • 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를 기본으로 사용 
  • 실수 리터럴은 doulble이 기본

변수 타입 정리

다음 타입은 실무에서 사용하지 않음

  • byte : 표현 길이가 너무 작다. 또 자바는 기본으로 4byte( int )를 효율적으로 계산하도록 설계되어 있다. int 를 사용하자.
    • byte 타입을 직접 선언하고 여기에 숫자 값을 대입해서 계산하는 일은 거의 없다.
    • 대신에 파일을 바이트 단위로 다루기 때문에 파일 전송, 파일 복사 등에 주로 사용된다.
  • short : 표현 길이가 너무 작다. int 를 사용하자
  • float : 표현 길이와 정밀도가 낮다. 실수형은 double 을 사용하자.
  • char : 문자 하나를 표현하는 일은 거의 없다. 문자 하나를 표현할 때도 문자열을 사용할 수 있다.
    • 예를 들어 String a = "b" 와 같이 사용하면 된다.
메모리 용량은 매우 저렴하기에 용량을 절약하기보다 개발 속도나 효율(컴파일 속도)에 초점을 맞추는게 더 효과적

 

자주 사용하는 타입

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

 

2-6. 변수 명명 규칙

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

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

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

 

규칙

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

관례

  • 소문자로 시작하는 낙타 표기법
    • 변수 이름은 소문자로 시작하는 것이 일반적이다. 여러 단어로 이루어진 변수 이름의 경우, 첫 번째 단어는 소문자로 시작하고 그 이후의 각 단어는 대문자로 시작하는 낙타 표기법(camel case)를 사용한다. (예: orderDetail , myAccount )

자바 언어의 관례 정리

  • 클래스는 대문자로 시작, 나머지는 소문자로 시작 + 낙타 표기법
    • 클래스: Person , OrderDetail
    • 변수를 포함한 나머지: firstName , userAccount
  • 여기에 예외가 딱 2개 있다.
    • 상수는 모두 대문자를 사용하고 언더바로 구분한다. (상수는 뒤에서 학습)
      • USER_LIMIT
    • 패키지는 모두 소문자를 사용한다. (패키지는 뒤에서 학습)
      • org.spring.boot

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

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

 

2-7. 문제와 풀이

VarEx1.java

package variable.ex;

public class VarEx1 {
    public static void main(String[] args) {

        /*
        다음 코드에 반복해서 나오는 숫자 4 , 3 을 다른 숫자로 한번에 변경할 수 있도록
        다음을 변수 num1 , num2 를 사용하도록 변경해보세요.
         */
        System.out.println(4 + 3);
        System.out.println(4 - 3);
        System.out.println(4 * 3);

        int num1 = 4;
        int num2 = 3;
        System.out.println(4 + 3);
        System.out.println(4 - 3);
        System.out.println(4 * 3);
    }
}

VarEx2.java

package variable.ex;

public class VarEx2 {
    public static void main(String[] args) {

        /*
        1. 변수 num1 을 선언하고, 이에 10을 할당하세요.
        2. 변수 num2 를 선언하고, 이에 20을 할당하세요.
        3. 두 변수의 합을 구하고, 그 결과를 새로운 변수 sum 에 저장하세요.
        4. sum 변수의 값을 출력하세요.
         */
        int num1 = 10;
        int num2 = 20;
        int sum = num1 + num2;
        System.out.println(sum);
    }
}

VarEx3.java

package variable.ex;

public class VarEx3 {
    public static void main(String[] args) {

        /*
        long 타입의 변수를 선언하고,
        그 변수를 10000000000(백억)으로 초기화한 후 출력하는 프로그램을 작성하세요.
        boolean 타입의 변수를 선언하고, 그 변수를 true 로 초기화한 후 출력하는 프로그램을 작성하세요.
         */
        long longVar = 10000000000L;
        System.out.println(longVar);

        boolean booleanVar = true;
        System.out.println(booleanVar);
    }
}