Java

Java 기초 - 2

RangA 2023. 4. 16. 15:30

변수와 타입

변수

값을 저장할 수 있는 메모리상의 공간
: 변수는 단 하나의 값을 저장할 수 있으며, 새로운 값을 저장하면 기존의 값은 사라짐

변수의 선언 방법

변수를 사용하려면 먼저 변수를 선언해야 함

class Exam {
    public static void main(String[] args) {
        int num;    // num이란 이름의 변수를 선언
                    // 변수타입 + 변수이름
    }
}

변수의 초기화

변수의 초기화(할당)란 변수를 사용하기 전에 처음으로 값을 저장하는 것

class Exam {
    public static void main(String[] args) {
        int num;    // 변수를 선언
        num = 1;    // 변수의 초기화
    }
}

변수 네이밍 룰

  1. 대소문자가 구분되며 길이의 제한이 없다
    • Num과 num은 서로 다른 것으로 간주됨
  2. 예약어를 사용해서는 안된다
    • byte는 프로그래밍 언어의 구문에 사용되는 예약어로 사용할 수 없음
  3. 숫자로 시작해서는 안된다
    • nine1은 허용하지만 8num은 허용하지 않음
  4. 특수문자는 '_'와 '$'만을 허용한다
    • dollar$는 허용되지만 sarp#은 허용되지 않음

상수 : 변하지 말아야 할 데이터를 저장하는 공간
: 변수와 같이 선언과 초기화하여 사용할 수 있지만 값은 변경할 수 없음]

상수의 선언과 초기화

상수를 선언하는 방법은 변수와 동일하며 변수의 타입 앞에 'final'을 붙여주면 된다. 이름은 모두 대문자로 하는 것이 암묵적인 관례이며 여러 단어로 이루어져 있는 경우 '_'로 구분한다

final int MAX_AGE = 134;

타입

어떤 값의 유형 및 종류를 의미하고, 타입에 따라 값이 차지하는 메모리 공간의 크기와 값이 저장되는 방식이 결정된다

자바의 타입은 기본 타입과 참조 타입으로 나눌 수 있다

  • 기본 타입 (Primitive Type)
    • 값을 저장할 때, 데이터의 실제 값을 저장
    • 정수형(byte, short, int, long)
    • 실수형(float, double)
    • 문자형(char)
    • 논리형(boolean)
  • 참조 타입 (Reference Type)
    • 객체의 주소를 저장하며 8개의 기본형을 제외한 나머지 타입
  • 리터럴 (Literal) : '문자 그대로의'라는 뜻으로 프로그래밍에선 문자가 가리키는 값 그 자체를 의미하며, 리터럴을 사용할 때는 두 가지 사항을 주의해야 함
    1. float 타입의 변수에 실수형 리터럴을 할당할 때, 리터럴 뒤에 접미사 f를 붙여야 한다
    2. long 타입의 변수에 정수형 리터럴을 할당할 때, 리터럴 튀에 접미사 L을 붙여야 한다

정수타입의 크기와 범위

정수타입은 숫자를 나타내는 타입으로 btye, short, int, long까지 총 4개의 타입으로 분류된다

일반적으로 int 타입을 사용하며 타입별로 차지하는 메모리 공간의 크기와 표현할 수 있는 범위가 다르다

각 타입의 표현 범위를 넘어설 경우 오버플로우와 언더플로우가 발생한다

  타입     메모리     표현 범위  
  byte     1byte     -128(-27) ~ 127(27 - 1)  
  short     2byte     -32,768(-215) ~ 32,767(215 - 1)  
  int     4byte     -2,147,483,648(-231) ~ 2,147,483,647(231 - 1)  
  long     8byte     -9,223,372,036,854,775,808(-263) ~ 9,223,372,036,854,775,807(263 - 1)  
  • 정수형의 오버클로우
    • 자료형이 표현할 수 있는 범위 중 최대값 이상의 값을 표현할 경우 발생
    • 최대값을 넘어가면 해당 데이터 타입의 최소값으로 값이 순환
    • Ex) byte형의 최대값인 127에 1을 더하면 최소값인 -127이 됨
  • 정수형의 언더플로우
    • 자료형이 표현할 수 있는 범위 중 최소값 이하의 값을 표현할 경우 발생
    • 최소값을 넘어가면 해당 데이터 타입의 최대값으로 값이 순환
    • Ex) byte형의 최소값인 -128에 1을 빼면 최대값인 127이 됨

실수타입의 크기와 범위

실수타입은 소수점을 가지는 값을 의미하며 float, double으로 분류된다

  타입     메모리     표현 범위     정밀도  
  float     4byte     음수 : -3.4 x 1038 ~ -1.4 x 10-45 양수 : 1.4 x 10-45 ~ 3.4 x 1038     7자리  
  double     8byte     음수 : -1.8 x 10308 ~ -4.9 x 10-324 양수 : 4.9 x 10-324 ~ 1.8 x 10308     15자리  
  • 실수형의 오버플로우
    • 값이 음의 최소 범위 또는 양의 최대 범위를 넘어서면 값은 무한대가 됨
  • 실수형의 언저플로우
    • 값이 음의 최대 범위 또는 양의 최소 범위를 넘어서면 값은 0이 됨

논리타입의 종류와 크기

논리타입의 종류는 boolean형 한가지로 참(true) 또는 거짓(false)을 저장할 수 있는 데이터 타입이다

단순히 참과 거짓을 표현하기 위해선 1bit가 필요하지만 JVM이 다룰 수 있는 데이터의 최소 단위가 1byte이기 떄문에 boolean형은 1byte의 크기를 가진다

문자타입의 종류와 크기

문자타입은 2byte 크기의 char형 하나만 존재하며 문자타입 변수를 선언하면 해당 변수에 오직 하나의 문자형 리터럴을 저장할 수 있다

문자형 리터럴을 작성할 떄는 반드시 작은 따옴표를 사용해야한다

자바의 문자타입과 유니코드

자바는 유니코드로 문자를 저장한다. 유니코드는 전 세계의 모든 문자를 컴퓨터에서 일관되게 다루기 위한 국제 표준으로 각 문자에 숫자 코드 번호를 부여한 것이다. 따라서 문자형 리터럴을 문자형 변수에 할당하면 유니코드 숫자값이 저장된다

이를 응용하여 숫자를 문자형 변수에 할당할 수 있다. 숫자가 저장된 변수를 참조할 때 해당 변수가 저장하고 있는 숫자값을 유니코드로 인식하여 해당 숫자와 일치하는 코드를 가진 문자로 변환해준다

char exam = 65;
Syetem.out.println(exam); // 출력 결과 : A

변수의 타입 변환

변수는 타입을 변환할 수 있으며 자동 또는 수동으로 변환하는 경우가 다르다

  • 자동 타입 변환
    • 바이트 크기가 작은 타입에서 큰 타입으로 변환할 때 (Ex. int -> long)
    • 덜 정밀한 타입에서 더 정밀한 타입으로 변환할 떄 (Ex. 정수 -> 실수)
  • 수동 타입 변환
    • 수동으로 타입을 변환할 때는 캐스팅 연산자 () 를 사용
    • 캐스팅 연산자의 괄호 안에 변환할 타입을 적어줌
// int 타입으로 선언된 변수 intNum을 더 작은 단위인 byte로 변환한다
int intNum = 128;
byte byteNum = (byte)intNum;

System.out.println(byteNum); // -128  
// 타입이 변환되며 byte형의 표현 범위를 벗어나게 되어 오버플로우가 발생

문자열

자바는 String 클래스 타입을 사용하여 문자열을 다루며 문자열과 관련된 메서드들을 가지고 있다

String 타입은 기본적으로 큰따옴표로 감싸진 문자열을 의미한다

// 문자열 리터럴을 String 타입의 변수에 할당하는 방법
String myName = "Mason";

// String 클래스의 인스턴스를 생성하는 방법
String myName2 = new String("Mason");