Java - 리터럴, 변수

제훈·2024년 7월 10일

Java

목록 보기
3/34

리터럴

리터럴 (literal) : 변하지 않는 데이터 그 자체

상수와 혼동할 수 있지만,

  • 상수는 데이터가 저장되는 메모리 상의 공간을 의미
  • 리터럴은 고정된 값 자체
int age = 20;                // 20은 리터럴이다.
final int MAX_AGE = 100;     // 100은 리터럴이다. (MAX_AGE는 상수이다.)
String str = "java"          // "text"는 리터럴이다.

리터럴의 종류

종류예시접두사, 접미사
논리형false, true-
정수형100, 0b0011, 077, 0xFF, 12LL (long 타입은 L을 접미사로 사용한다. / l은 1과 헷갈릴 수 있어서 대문자로 쓴다)0 (8진수는 리터럴 앞에 접두사 0을 쓴다) / 0x (16진수는 리터럴 앞에 접두사 ‘0x’ 또는 ‘0X’를 쓴다)
실수형3.14, 12.0e8, 7.7ff (float는 접미사 ‘f’, ‘F’를 쓴다) / d (double 타입은 ‘d’, ‘D’를 쓴다. 실수형은 double이 기본 자료형이므로 생략도 가능하다.)
문자형‘O’, ‘1’, ‘\n’-
문자열“OHGIRAFFERS”, “100”, “false”-

리터럴의 활용은 이전 게시글에서 다뤘기 때문에 변수에 대해 알아보자.


변수

변수 : 데이터를 저장하기 위해 할당 받은 메모리 공간을 의미한다.

전역 변수, 지역 변수 중 일단은 지역 변수에 대해 다뤄본다.

변수 사용 방법

  1. 변수 선언 후 변수에 값을 대입하는 방법 -> 선언 후 초기화
  2. 동시에 작성하는 방법 -> 선언과 동시에 초기화
// 변수의 선언 예시
int age;

// 선언한 변수에 값 대입 예시
age = 20;
age = age;

// 선언과 동시에 초기화 예시
int point = 100;

변수의 명명규칙

  1. 컴파일 에러를 발생시킬 수 있는 규칙
    1. 동일한 범위 내에서 동일한 변수명을 가질 수 없다.
    2. 변수의 이름에는 자바에서 사용중인 키워드(keyword)를 사용할 수 없다.
      ex) int, float, while, continue, 등등
    3. 변수의 이름은 영문자 대소문자를 구분한다.
      ex)** age와 Age는 다르다.
    4. 변수의 이름은 숫자로 시작할 수 없다.
      ex) 123abc - 사용불가
    5. 특수기호는 '-'와 '$'만 사용 가능하다.
      ex) abc_zxc, abc$123, _abc123, 등등
/* 1-1. 동일한 범위 내에서 동일한 변수명을 가질 수 없다. */
int age = 20;
//int age = 20; 		   //동일한 변수명을 가지므로 에러 발생함

/* 1-2. 예약어는 사용이 불가능하다. */
//int true = 1;			//예약어 사용 불가
//int for = 20;			//예약어 사용 불가

/* 1-3. 변수명은 대소문자를 구분한다. */
int Age = 20;			//위에서 만든 age와 다른 것으로 취급한다.
int True = 10;     //예약어 True와 다른 것으로 취급한다.

/* 1-4. 변수명은 숫자로 시작할 수 없다. */
//int 1age = 20;		//숫자로 시작해서 에러 발생
int age1 = 20;			//숫자가 처음에 시작하지 않으면 섞어서 사용도 가능함

/* 1-5. 특수기호는 '-'와 '$'만 사용 가능하다. */
//int sh@rp = 20;		//사용 가능한 특수문자 외에는 사용 불가능
int _age = 20;				//언더스코어는 사용 가능함. 처음도 가능하고 중간이나 끝에도 가능함
int $harp = 20;			//$도 사용 가능함. 처음도 가능하고 중간이나 끝에도 가능함
  1. 컴파일 에러 발생은 X 지만, 개발자끼리의 암묵적인 규칙1. 변수명의 길이 제한은 없다. (하지만 적당히 해야 한다.)
    1. 변수명이 합성어로 이루어진 경우 첫 단어는 소문자, 두 번째 시작 단어는 대문자로 시작한다. (camel-case)
      ex) int memberAddress;
    2. 단어와 단어 사이의 연결을 언더스코어( _ )로 하지 않는다. (타 언어 네이밍 규칙이다.)
    3. 한글로 변수명을 짓는 것이 가능하지만, 권장하지 않는다. (한글을 취급하는 다양한 방식들이 존재하기 때문에 에러를 유발할 수 있다.)
    4. 변수 안에 저장된 값이 어떤 의미를 가지는지 명확하게 표현하도록 한다.
    5. 전형적인 변수 이름이 있다면 가급적 사용하도록 한다.
    6. 명사형으로 작성할 수 있도록 한다.
    7. boolean 형은 의문문으로 가급적 긍정 형태로 네이밍한다.
 /* 2-1. 변수명의 길이 제한은 없다. */
int sadjfsadkjhfkjsadhfkjhsafkjhsdfjkhsafkjhsdjkfhsdajkfhdsakjfhsdakjfhasdjkfhsdafkjhfsdakj;

/* 2-2. 변수명이 합성어로 이루어진 경우 첫 단어는 소문자, 두 번째 시작 단어는 대문자로 시작한다. */
/* 자바에서는 클래스명만 유일하게 대문자로 시작한다. */
int maxAge = 20;
int minAge = 10;

/* 2-3. 단어와 단어 사이의 연결을 언더스코어(_)로 하지 않는다. */
String user_name;			//에러가 발생하지 않지만 이렇게 하면 안된다.
String userName;			  //이게 올바른 표현이다.

/* 2-4. 한글로 변수명을 짓는 것이 가능하지만, 권장하지 않는다. */
int 나이;						  //가능하지만 권장하지 않음

/* 2-5. 변수 안에 저장된 값이 어떤 의미를 가지는지 명확하게 표현하도록 한다. */
String s;					    //변수가 어떤 의미인지 파악하기 힘들다.
String name;				    //문자열 형태의 이름이 저장되겠구나 하는 의도가 파악이 된다.

/* 2-6. 전형적인 변수 이름이 있다면 가급적 사용하도록 한다. */
int sum = 0;
int max = 10;
int min = 0;
int count = 1;

/* 2-7. 명사형으로 작성할 수 있도록 한다. */
String goHome;				    //가능하긴 하지만 가급적 명사형으로 짓는다.
String home;

/* 2-8. boolean 형은 의문문으로 가급적 긍정형태로 네이밍한다. */
boolean isAlive = true;
boolean isDead = false;	//부정형보다는 긍정형이 더 나은 방식이다.

변수를 사용하는 목적

1. 값에 의미를 부여하기 위한 목적 (가독성)

		/* 목차 1. 값에 의미를 부여하기 위한 목적 (가독성) */
        /* 아래 처럼 작성하면 어느 값이 급여인지 어느 값이 보너스 금액인지 알 수 없다. */
        System.out.println("== 값에 의미 부여 테스트 ==");
        System.out.println("보너스를 포함한 급여 : " + (1000000 + 200000) + "원");

        /* 아래 처럼 의미를 부여하게 되면 어느 값이 급여인지, 보너스인지를 명확하게 알 수 있게 한다. */
        int salary = 1000000;
        int bonus = 200000;
        System.out.println("보너스를 포함한 급여 : " + (salary + bonus) + "원");
그냥 숫자보다 훨씬 의미가 부각돼 다른 사람이 봐도 알 수 있다.

2. 한 번 저장해둔 값을 재사용하기 위한 목적

		/* 목차 2. 한 번 저장해둔 값을 재사용하기 위한 목적 */
        System.out.println("== 변수에 저장한 값 재사용 테스트 ==");
        System.out.println("1번 고객에게 포인트를 100포인트 지급하였습니다.");
        System.out.println("2번 고객에게 포인트를 100포인트 지급하였습니다.");
        System.out.println("3번 고객에게 포인트를 100포인트 지급하였습니다.");
        System.out.println("4번 고객에게 포인트를 100포인트 지급하였습니다.");
        System.out.println("5번 고객에게 포인트를 100포인트 지급하였습니다.");
        System.out.println("6번 고객에게 포인트를 100포인트 지급하였습니다.");
        System.out.println("7번 고객에게 포인트를 100포인트 지급하였습니다.");
        System.out.println("8번 고객에게 포인트를 100포인트 지급하였습니다.");
        System.out.println("9번 고객에게 포인트를 100포인트 지급하였습니다.");
        System.out.println("10번 고객에게 포인트를 100포인트 지급하였습니다.");

        System.out.println();

        int point = 100;
        System.out.println("1번 고객에게 포인트를 " + point + "포인트 지급하였습니다.");
        System.out.println("2번 고객에게 포인트를 " + point + "포인트 지급하였습니다.");
        System.out.println("3번 고객에게 포인트를 " + point + "포인트 지급하였습니다.");
        System.out.println("4번 고객에게 포인트를 " + point + "포인트 지급하였습니다.");
        System.out.println("5번 고객에게 포인트를 " + point + "포인트 지급하였습니다.");
        System.out.println("6번 고객에게 포인트를 " + point + "포인트 지급하였습니다.");
        System.out.println("7번 고객에게 포인트를 " + point + "포인트 지급하였습니다.");
        System.out.println("8번 고객에게 포인트를 " + point + "포인트 지급하였습니다.");
        System.out.println("9번 고객에게 포인트를 " + point + "포인트 지급하였습니다.");
        System.out.println("10번 고객에게 포인트를 " + point + "포인트 지급하였습니다.");
똑같이 출력되지만 변수로 재사용 가능하다.

3. 시간에 따라 변하는 값을 저장하고 사용할 목적

		/* 목차 3. 시간에 따라 변하는 값을 저장하고 사용할 목적 */
        System.out.println("=== 변수에 저장된 값 변경 테스트 ===");
        int sum = 0;

        sum = sum + 10;
        System.out.println("sum에 10을 더하면 현재 sum의 값은? : " + sum);

        sum = sum + 10;
        System.out.println("sum에 10이 있었으니 10을 추가로 더하면? " + sum);

        sum = sum + 10;
        System.out.println("sum에 20이 있었는데 추가로 10을 더 더하면? " + sum);
0
10
20
30

변하는 값을 저장하고 사용할 수 있다.


변수의 자료형

  • 자료형이란?

    다양한 값의 형태별로 어느 정도의 크기를 하나의 값으로 취급할 것인지 미리 Compiler와 약속한 키워드이다.

char형의 변수를 cNum -> ch 로 변경

기본자료형(Primary type)과 참조자료형(Reference type)으로 나누어진다.

  • 기본자료형 (Primary type)
  1. 정수형
타입할당되는 메모리 크기데이터 표현 범위
byte1 바이트128-128 ~ 127127
short2 바이트215-2^{15} ~ (2151)(2^{15} -1)
int4 바이트231-2^{31} ~ (2311)(2^{31} -1)
long8 바이트263-2^{63} ~ (2631)(2^{63} -1)

int를 대표자료형으로 여기고, 특수한 경우가 아닌 이상 byte, short는 잘 사용하지 않는다.

  1. 실수형
타입할당되는 메모리 크기데이터 표현 범위
float4 바이트(3.41038)(3.4 * 10^{-38}) ~ (3.41038)(3.4 * 10^{38})
double8 바이트(1.710308)(1.7 * 10^{-308}) ~ (1.710308)(1.7 * 10^{308})

double을 대표 자료형으로 여기고, float는 특수한 목적이 있는 경우에만 사용하게 된다.

정수형과 실수형 둘 다 맨 앞 비트를 부호비트로 둔다.

  1. 문자형
타입할당되는 메모리 크기데이터 표현 범위
char2 바이트00 ~ 2162^{16}

short와 동일하게 2바이트지만, 부호 비트 없이 16개의 비트를 모두 값 비트로 활용

  1. 논리형
타입할당되는 메모리 크기데이터 표현 범위
boolean1 바이트true 혹은 false

실제 사용하는 비트가 8비트 중 가장 오른쪽 1비트만 이용을 하지만 실제 할당되는 크기는 1바이트를 할당한다.


  • 참조 자료형
  • 문자열
    문자열을 저장하기 위한 자료형이라고 생각하고 사용하고 나중에 정리한다.

값 대입해보기

정수형

		bNum = 1;
        sNum = 2;
        iNum = 4;
        lNum = 6;   // lNum은 long 자료형이지만, 자바는 6을 보고 int로 본다.
                    // long 형이지만, lNum = 2200000000 (22억) 으로 실행하면 에러가 생긴다. -> int로 보는데 넘어가니까.

        // lNum = 2200000000; <- 오류 생김
        lNum = 2200000000L; // 이것처럼 꼭 붙여야 한다.

실수형

		fNum = 3.14f;   // double형으로 인식되는 실수를 float에 담을 때는 f를 붙여야 한다.
        dNum = 3.555;

문자형

		ch = 'a';
        ch = 97;

논리형

		isTrue = true;

변수를 활용한 합계 (sum), 평균 (avg) 출력

		/*  
        ## 설명. 변수를 활용한 합계 (sum), 평균 (avg) 출력*/
        int kor = 90;
        int math = 80;
        int eng = 75;

        int sum = kor + math + eng;
        System.out.println("합계 : " + sum);

        // int avg = sum / 3; // 정수 나누기 정수를 하면 소수점이 날아가기 때문에
        double avg = sum / 3.0f; // 나눗셈은 일반적으로 실수 결과가 나오기에 double형
        System.out.println("평균 = " + avg);

profile
백엔드 개발자 꿈나무

0개의 댓글