[Java] CH_02 변수와 타입

한지혜·2025년 1월 11일

변수 선언

변수variable

  • 하나의 값을 저장할 수 있는 메모리 번지에 붙여진 이름

변수 선언

  • 어떤 타입의 데이터를 저장할 것인지, 변수 이름이 무엇인지 결정하는 것

변수 초기화

  • 변수에 최초로 값을 대입하는 행위
  • 이때의 값을 초기값이라고 한다.
  • 컴퓨터 메모리(RAM)은 수많은 번지들로 구성된 데이터 저장 공간이다.

  • 자바의 변수는 다양한 타입의 값을 저장할 수 없다.
    - 정수형 변수에는 정수값만 저장 가능

  • 변수 이름 규칙

    • 첫 번째 글자는 문자
    • 중간부터는 문자, 숫자, $, _를 포함할 수 있다.
    • 첫 문자는 소문자로 시작하되 캐멀 스타일로 작성하는 것이 관례이다.
    • 변수 이름의 길이는 프로그램 실행과는 무관하므로, 길어도 상관없으니 어떤 값을 저장하고 있는지 쉽게 알 수 있도록 작명

캐멀 스타일(camel case)

  • 자바 소스 파일명(클래스명)은 대문자로 시작 ex) MemberGrade.java
  • 변수명은 소문자로 시작 ex) mathScore
  • 변수에 최초로 값이 대입될 때 메모리에 할당되며, 해당 메모리에 값이 저장된다.

    • 변수 선언만으로는 메모리에 할당되지 않는다.

    • 초기화되지 않은 변수는 메모리에 할당되지 않는다.

    • 초기화되지 않은 변수를 연산식에 사용할 경우 컴파일 에러 발생

      int value;
      int result = value + 25; // --> 컴파일 에러 발생 !
  • 변수는 또 다른 변수에 대입되어 메모리 간에 값을 복사할 수 있다.

  • 두 변수의 값을 교환하는 방법

    int x = 5;
    int y = 10;
    int temp = x;
    x = y;
    y = temp;
  • 변수는 선언될 때의 타입에 따라 저장할 수 있는 값의 종류와 허용 범위가 달라진다.


    정수 타입

    byte, char, short, int, long

    자바가 제공하는 기본primitive 타입 8개

  • 정수 타입은 총 5개이다.

  • 허용 범위를 초과한 값을 대입했을 경우 컴파일 오류 발생

  • long타입은 수치가 큰 데이터를 다루는 프로그램에서 사용

    • 기본적으로 컴파일러는 정수 리터럴int 타입 값으로 간주하기 때문에, int 타입의 허용 범위를 초과하는 리터럴은 뒤에 l or L을 붙여 long 타입 값임을 컴파일러에게 알려줘야 한다.
  • byte, short, int, long은 모두 부호 있는(signed) 정수타입
    • 최상위 bit는 부호 bit로 사용되고, 나머지 bit는 값의 범위를 결정

리터럴literal: 코드에서 프로그래머가 직접 입력한 값

  • 변수에 대입할 정수 리터럴은 진수에 따라 작성하는 방법이 다르다.
진수작성법
`2진수0b 또는 0B로 시작, 0과 1로 작성
8진수0으로 시작, 0~7 숫자로 작성
10진수소수점이 없는 0~9숫자로 작성
16진수0x 또는 0X로 시작, 0~9숫자 또는 A~F, a~f로 작성

문자 타입

char (정수 타입에 속함)

문자 리터럴

  • 하나의 문자를 작은따옴표로 감싼 것
  • 유니코드로 변환되어 저장된다.
  • 이러한 유니코드를 저장할 수 있도록 char 타입 제공
  • char 타입 변수에 빈 문자 '' 대입 시 컴파일 에러, 이 경우 공백 하나를 포함해서 초기화해야 한다. -> ' ' or 32

실수 타입

float, double

  • double 타입이 float타입보다 큰 실수를 저장할 수 있고, 정밀도 또한 높다.

  • 두 타입의 값을 부동 소수점 방식으로 메모리에 저장한다.

  • 최상위 1bit는 양수 및 음수를 결정짓는 부호

    • 0 -> 양수, 1-> 음수
  • 컴파일러는 실수 리터럴을 기본적으로 double 타입으로 해석한다.
  • 리터럴 뒤에 f or F를 붙여 컴파일러가 float임을 알 수 있도록 해야 한다.

논리 타입

boolean

  • 논리 리터럴은 truefalse이다.
  • 상태값에 따라 조건문과 제어문의 실행 흐름을 변경하는 데 사용된다.
  • 연산식 중 비교 및 논리 연산의 산출값은 true or false이므로 boolean 타입 변수에 대입할 수 있다.
int x = 10;
boolean result = (x == 20);	// false
boolean result = (x != 20); // true
boolean result = (x > 20);	// false
boolean result = (0 < x && x < 20); // true
boolean result = (x < 0 || x > 200); // false

문자열 타입

String

  • String 타입은 기본 타입이 아닌 참조 타입이다.

문자열

  • 큰따옴표로 감싼 여러 개의 문자들
  • 이는 유니코드로 변환되지 않는다.
  • 문자열을 변수에 저장하고 싶다면 String 타입을 사용해야 한다.

이스케이프 문자

  • 문자열 내부에 역슬래쉬(\)가 붙은 문자
  • 이를 사용하면 문자열에 특정 문자를 포함할 수 있고, 출력에 영향을 미치기도 한다.
System.out.println("나는 \"자바\"를 배웁니다.");

텍스트 블록 문법(java 13부터)

  • 작성된 그대로 문자열로 저장된다.
String str = """
{ 
  "id" : "winter",
  "name" : "눈송이"
}
나는 자바를 \
학습합니다.			// -> 나는 자바를 학습합니다.
""";

자동 타입 변환

  • 자동으로 타입 변환이 일어나는 것
  • 값의 허용 범위가 작은 타입이 허용 범위가 큰 타입으로 대입될 때 발생한다.
  • 기본 타입을 허용 범위 순으로 나열하면 다음과 같다.
byte < short, char < int < long < float < double
  • 자동 타입 변환이 일어나는 경우
byte byteValue = 10;
int intValue = byteValue;

  • 정수 타입이 실수 타입으로 대입될 경우에는 무조건 자동 타입 변환이 된다.
long longValue = 500000000000L;
float floatValue = longValue; // 5.0E9f로 저장됨
double doubleValue = floatValue; // 5.0E9로 저장됨
  • char 타입은 int 타입으로 자동 변환되면 유니코드 값이 int 타입에 대입된다.

자동 타입 변환 예외

  • char 타입보다 허용 범위가 작은 byte 타입은 char 타입으로 자동 변환될 수 없다.
  • char 타입은 음수를 포함하지 않는데, byte 타입은 음수를 포함하기 때문

강제 타입 변환(casting)

  • 큰 허용 범위 타입을 작은 허용 범위 타입으로 쪼개어서 저장하는 것

  • 캐스팅 연산자로 괄호( )를 사용

    • 괄호 안에 들어가는 타입은 쪼개는 단위
  • 강제 타입 변환의 목적은 원래 값이 유지되면서 타입만 바꾸는 것

    • byte 타입으로 변환한다면 -128 ~ 127인 int 값만 원래 값을 보존
    • char 타입의 허용 범위는 0~65535 사이의 int 값만 원래 값은 보존
    • 실수 -> 정수: 소수점 이하 부분은 버려지고, 정수 부분만 저장

연산식에서 자동 타입 변환

  • 자바는 실행 성능을 향상시키기 위해 컴파일 단계에서 연산을 수행한다.
    • 컴파일 단계에서 10+20을 미리 연산해서 30을 만들고, result 변수에 30을 저장하도록 바이트코드를 생성한다.
byte result = 10 + 20 // 컴파일: byte result = 30
  • 하지만 정수 리터럴이 아니라 변수가 피연산자로 사용되면 실행 시 연산을 수행한다.
  • 정수 타입 변수가 산술 연산식에서 피연산자로 사용되면, int 타입보다 작은 byte, short 타입의 변수는 int 타입으로 자동 타입 변환되어 연산을 수행한다.
  • 정수 연산식에서, long 타입이 피연산자로 사용되면 다른 피연산자는 long 타입으로 변환되어 연산을 수행한다.
  • 피연산자 중 하나가 double 타입이면, 연산 결과는 double 타입이 된다.

자바에서 정수 연산의 결과는 항상 정수가 된다.

int x = 1; int y = 2;
double result = x / y; // 0.0
  • 위 코드에서 x/y의 연산 결과는 0.5가 아닌 0이 된다. 0을 double 타입 변수에 저장하므로 결과는 0.0이 된다.

자바에서 + 연산자의 기능

  • 피연산자가 모두 숫자일 경우, 덧셈 연산을 수행
  • 피연산자 중 하나가 문자열일 경우, 나머지 피연산자도 문자열도 자동 변환되어 문자열 결합 연산을 수행

문자열을 기본 타입으로 변환

변환 타입사용 예
String -> byteByte.parseByte(str);
String -> shortShort.parseShort(str);
String -> intInteger.parseInt(str);
String -> longLong.parseLong(str);
String -> floatFloat.parseFloat(str);
String -> doubleDouble.parseDouble(str);
String -> booleanBoolean.parseBoolean(str);
기본 타입 -> StringString.valueOf(primitive);

printf("형식문자열", 값1, 값2, ...);

  • 형식 문자열에 맞추어 뒤의 값을 출력하는 메소드
System.out.printf("name: %s", "han");
System.out.printf("age: %d", 24);

// 형식 문자열에 포함될 값이 두 개 이상일 경우
System.out.printf("name: %1$s, age: %2$d", "han", 24);


키보드 입력 데이터를 변수에 저장

Scanner scanner = new Scanner(System.in);
String str = scanner.nextLine();
profile
공부

0개의 댓글