변수, 상수, 리터럴

TIL·2022년 12월 9일
0

Java (최은빈)

목록 보기
1/27

package me.day01.overview;

// /***/ : 코드 기술 문서, 나중에 문서 만들때 포함됨 (클래스/메소드 이름, 파라미터, 설명, ..)
/**
 * @class: MainClass
 * This is MainClass for overview
 * */
public class MainClass { // 클래스 이름 Camel Upper Case == Pascal Case
    // 클래스 변수 - 클래스 내부에서 어떤 {} 블록이든 사용 가능
    // static 변수 - 외부 모든 클래스에서 사용 가능
    public static int a = 0;

    /**
     * @method: main
     * @param: String[] args
     * This is main method for overview
     * */

    // 자바 실행을 위한 클래스들이 모두 로딩 된 후, main 메서드 호출됨 (프로파일러)
    public static void main(String[] args) { // 메소드 이름 Camel Lower Case (calculateAverage)
        System.out.println("한국어"); // 콘솔 출력 + \n
        System.out.print("한국어"); // 콘솔 출력
        System.out.println("한국어");


        // 변수 = 변할 수 있는 수 자체가 아닌 하나의 값을 저장할 수 있는 저장공간, 변수에 담긴 리터럴 수정 가능
        // literal = 변수에 담기는 데이터 (int, double, char, String, boolean)
        String str1 = "Hello Java!"; // 처음 선언할때만 변수의 데이터타입 작성
        str1 = "Hello Python!";
        System.out.println(str1);


        // 상수 = final = 수정 불가 (마지막) -> 상수는 대문자, 언더바
        final String CONST_STRING;
        CONST_STRING = "Hello Java!";
//      CONST_STRING = "Hello Python!"; // 컴파일 오류 by final (cannot assign)


        // 초기화
        String STR1;
//        System.out.println(STR1); // 컴파일 에러, 변수에 할당된 값이 없으므로


        // 변수 사용 scope (생성과 소멸)
        if (true) {
            int a = 10; // a 생성
            System.out.println(a); // a 사용 가능
        } // a 소멸
        System.out.println(a); // 클래스 변수 이므로 사용 가능

        for (int i = 0; i < 10; i++) {
            int b = 10;
            System.out.println(b);
        }
//        System.out.println(b); // b 사용 불가

        int c = 10;
//        int c = 10; // 같은 scpoe에 동일한 변수 이름이 생겼기 때문에 컴파일 에러

        for (int i = 0; i < 10; i++) {
            int a = 10; // 같은 a 라도 if, for 별도의 블록이므로 컴파일 에러X / 중복 사용 가능
            System.out.println(a);
        }


        /*
        일반 주석
        ㅁㄴㅇㅁㄴ
        ㅁㄴㅇㅁㄴㅇ
        ㅁㄴㅇㅁㄴㅇ
        ㅁㄴㅇㅁㄴㅇ
        */

    }

}
  • 변수 : 수정 가능
  • literal : int, double, char, String, boolean
  • 상수 : 수정 불가 (final)



변수명 정하는 법

  • c/c++ 과 다르게 자바는 가독성을 중요시함 (cnt vs. count)
  • 대소문자 구분
  • 숫자로 시작X (컴파일러가 리터럴인지 변수인지 구분하라고)
  • _$ 만 특수문자 가능
  • 예약어 불가
  • 변수이름 길어지는건 카멜케이스, 상수값 길어지는건 대문자+언더바



변수 scope

  • 함수 내부에서 생성 → 메서드 종료 시 소멸, 메서드 밖에서 사용 불가
  • 변수는 중괄호 {} 블록 내(클래스, 생성자, 메소드, 제어문(if, for,while))에서 선언되고 사용함
    • 글로벌 변수 : 해당 클래스 내에서 다 사용 가능, 메소드 외부
    • static : 모든 클래스에서 다 사용 가능 (클래스 로드 될때 같이 생성됨, 프로그램 끝나지 않는 한 계속 살아있음)
    • 로컬 변수 : 메소드 내부



상수 처리

  • 에러코드, 에러메시지, DB 정보, IP 주소 정보 등 저장 할때 사용
  • 코드에 숫자 리터럴을 작성하는 것은 좋지 않음 → 나중에 하나하나 수정해야하기 때문
  • 3.14를 상수로 저장하면 코드 유지보수 + 가독성 에 좋음
// bad
double area = 3.14 * r * r; // 넓이
double circum = 2 * 3.14 * r; // 둘레

double area = 3.141592 * r * r;
double circum = 2 * 3.141592 * r;

// good
final double PI = 3.14; // PI 값만 3.141592 로 바꾸면 됨
PI = 3.141592; // error
double r = 8.5; // radius (반지름)
double area = PI * r * r;
double circum = 2 * PI * r;



리터럴의 종류

  1. 정수 리터럴 (소수점이 없는 값)
  • 0.75, -100 (10진수)
  • 02, -04 (8진수)
  • 0x5, 0xA, 0xB3, 0xAC08, 0X5, 0XA, 0XB3, 0XAC08 (16진수)

  1. 실수 (소수점 있는 값) → 고정소수점, 부동소수점
  • 0.25, -3.14 (10진수)
  • 5E7 = 5 x 10^7, 0.12E-5 = 0.12 x 10^-5 (대문자 E 또는 소문자 e가 있는 리터럴은 10진수 지수와 가수로 간주)

  1. 문자 (’ 로 묶은 데이터)

  1. 문자열 (” 로 묶은 데이터)
  • “대한민국”, “탭마큼 이동 \t 합니다.”, “한줄 내려쓰기 \n 합니다.”

  1. 논리 (true, false)
  • true, false



컴퓨터는 데이터를 어떻게 저장할까?

  1. 정수 (4byte)

  1. 실수 (4byte)
  • 정수.실수 (고정소수점)
    • 소수점의 위치 고정됨
    • 실수 저장할때 총 4byte (32bit) 사용 = 16bit(정수부분) + 16bit(소수부분)
    • 점 기준으로 앞에 8비트, 뒤에 8비트 → 실수 저장하는데 너무 큰 공간 사용
      2.12334234243 → 소수점 뒤 자리가 너무 부족
  • (-1)^부호 X 가수 X 밑^지수 (부동소수점)
    • 소수점의 위치 고정X (floating-point)
    • 부호, 지수를 표현하는 작은 공간(2) 제외한 나머지는 다 유효부분(1.23456)이 사용
      123.4561.23456x10^2 로 표현 후 1.234562 만 저장
    • 유효부분에 더 많은 비트를 할당시켜서 데이터의 유효성을 더 많이 판단할 수 있도록
      = 표현 할 수 있는 데이터의 범위가 넗어짐 (16bit → 32bit)
      32bit(실수) = 1bit(부호) + 8bit(10의 몇승) + 23bit(유효부분)


  1. 문자 (2byte)
  • 문자에 대응되는 숫자값으로 저장 (자바에서는 유니코드 이용)
    • 아스키코드
      • 7비트 사용해서 문자 저장
      • 마지막 1비트는 통신 에러 검출을 위해 사용
      • 문자 하나 = 1byte 정도 사용
    • 유니코드
      • 아스키코드의 확장판 (한국어 중국어도 정의)
      • 16비트 사용해서 문자 저장
      • 한 으로 저장하면 2byte 사용 (완성형)
      • ㅎ + ㅏ + ㄴ 으로 나눠서 저장하면 3byte 사용 (조합형)



부동 소수점의 오차 (실수의 비교)

  • 1 == 1 → 같다
  • 1.0 == 1.00001 → 같지 않을 수도 있다 → 실수와 실수가 같다라는 표현은 없음
    • 유효부분 공간이 부족할 수도 있고
    • 실수에 딱 떨어지는 이진수 값이 없으면 뒤에 이상한 값이 붙음 (1.000010001)
  • 1.0 - 1.000010001 ≤ 0.01 → 0.01 보다 작거나 같으면 두개의 수는 같다고 표현함
  • BicDecimal, BicInteger
    클래스 이용하면 배열 이용하여 저장하기 때문에 실수간 정확히 같은지 체크할 수 있다.



whitespace 종류

0개의 댓글