language/java

2. 변수(variable)

wooweee 2023. 3. 2. 15:57
728x90

 

1. 변수의 선언과 저장

  • 변수
    • 하나의 값을 저장할 수 있는 저장공간, 단지 값이 들어갈 수 있는 공간일 뿐이다.
    • 값을 메모리주소(저장 공간 및 저장 공간 이름)에 저장을 하는데 메모리주소를 기억하기 힘들기 때문에 변수(이름)를 선언한다.
    • 변수는 선언, 저장 2가지 과정을 거친다.
    • (용어) 변수의 초기화: 변수에 값을 저장하는 것
  1. 선언
    • 변수타입 변수이름;   ex) int x;
      • 변수타입: 변수에 저장할 값이 어떤 종류인가 지정을 한다. ex) String, int, Boolean, 등등
      • 변수이름: 값을 저장하는 공간이 서로 구별될 수 있어야 하기 때문에 필요
  2. 저장
    • 우변에 원하는 값을 넣으면 된다. x = 5;
    • 동일 변수명에 새로운 값을 넣으면 기존의 값을 지우고 새로 저장된 값을 남긴다.
// 선언
변수타입 변수이름; 
int x;

// 저장
int x;
x = 5;
x = 3;

// 한줄 요약
int x = 5; 

// 같은 타입 한줄 작성
int a = 1, b = 2;

 

2. 변수의 타입

  • 변수의 타입
    • 기본형(8개)
      • 실제 값 저장
      • char, boolean, byte, short, int, long, float, double
      •  참고
        • 기본형 종류별 크기 및 범위 - 기본형 범위에 따른 형변환은 연산자 포스팅에 기재 - 2022.12.02 - [backEnd/java] - 연산자(operator) 
        • 크기와 범위를 알아야 하는 이유:  오버플로우 때문 
        • 오버플로우: 타입이 표현할 수 있는 값의 범위를 넘어서는 것, 자동차 계기판에 9999 넘어가면 0으로 가는 것
    • 참조형
      • [ 어떤 값이 저장되어 있는 주소 ]를 값으로 가지는 변수 
      • 객체주소 저장 = 객체가 저장된 메모리 주소 저장
      • 메모리에는 1byte 단위로 일련번호가 있는데 이를 메모리 주소라고 한다.
      • 예시-설명
        • Home이란 class (== 설계도)를 생성했고 값으로 int x와 y를 가진다. 이때 실제 객체를 생성할 때 각각의 home1과 home2는 다른 주소를 가진다. 이는 각각 메모리주소 공간을 의미하고 이 안(메모리 주소 공간 안)에는 값으로 int x, int y의 값이 들어가는 공간의 주소를 가진다. - 만약 설계도인 Home의 자료형 변수에 값이 있으면 이 값으로 초기화 하고 없으면 기본값으로 초기화 된다.
public class Main {
    public static void main(String[] args) {
        Home home1 = new Home();
        Home home2 = new Home();
        System.out.println("home :" + home1); // Home@129a8472
        System.out.println("home2 : " + home2); // Home@1b0375b3
    }
}

class Home{
    int x;
    int y;
}

 

기본형 범위 표

  1byte 2byte 4byte 8byte
논리형 boolean (true,false)      
문자형   char (0~2e16=65535)    
정수형 byte (-128~127) short (-32768~32767) int(+- 20억 정도) long(+- 800경 정도)
실수형     float(+-1.4e-45~3.4e38) double(+- 4.9e-324~1.8e308)

 

3. 상수와 리터럴

  • 상수(Constant)
    • 값을 저장할 수 있는 공간이지만 한 번 값을 저장하면 다른 값으로 변경 불가
      • 타입은 Constant Pool이라는 상수 저장 공간에 따로 저장이 된다.
    • final 변수타입 변수이름  ex) final int MAX_VALUE;
    • 변수이름은 모두 대문자로 하는 것이 관례이고 뛰어쓰기 대신 _ 사용
  • 리터럴
    • 모든 변수들의 값(final 포함)을 literal이라고 부른다. 큰 의미 X
  • 참고 - 타입인 int, final 등을 키워드라고 하고 보통 소문자로 시작한다.

 

4. 리터럴의 타입과 접미사

 

변수타입이 존재하는 것 처럼 리터럴 타입도 존재한다.

  • 변수와 리터럴 type의 불일치 및 주의점
    1. 변수의 범위가 literal보다 큰 경우
    2. 실수형은 무조건 정수형 보다 크다
    3. 실수형에서만 e(10의 제곱) 사용 가능 1e3 == 1000.0
    4. method형식의 값에는 literal type을 못 넣고 형변환 형식으로 나타내야 한다.

 

리터럴 타입

정수
long L
int, byte, short 없음
실수
float f
double d or 생략
논리형
false, true 없음
문자형
'a', '1', '\n' 없음

 

변수와 리터럴 type의 불일치 및 주의점

long big = 1234567898765L;
float pi = 3.14f;
double rate = 1.2323d;

// literal이 값이 아닐 때
float num = Math.random()f; // error. method에는 f를 못붙임
float num =(float)(Math.random()); // 형변환 형식으로 나타냄

// 변수와 literal type의 불일치가 허용되는 경우
1) 변수 type의 범위가 literal 보다 클 경우
int a = 'a'; // ok
2) 실수(float, double)은 정수(byte, short, int, long)보다 항상 큼
long b = 3.14f; // error 실수가 정수보다 항상 큼. 소수점 때문 
8 byte   4byte

 

 

5. 문자 리터럴과 문자열 리터럴

  • char 리터럴: 'A';   -  문자나 숫자 하나를 감싼 것
  • String 리터럴: "Java";   -   두 문자 이상일 때 사용
  • 주의
    • Stirng은 내용 없는 빈 문자열 가능, char은 불가능
    • String은 char의 나열된 class 이지만 기본형 type처럼 사용, 하지만 기본형 type이 아님
    • char: 해당 문자와 연결된 숫자들이 있다.
      • char =123; 같이 ''을 없앤 숫자 사용이 가능 -> 해당 수와 연결된 문자가 나옴
      • 문자와 연결된 수는 char의 기본형 범위 수치 만큼 존재한다. 이외의 수 넣을 때 error 발생

 

기초 - 참고

더보기
print()   // ()안 내용 출력, 줄바꿈 하지 않음
println() // ()안 내용 출력, 줄바꿈 함
printf("age:%d year:%d", 14, 2018) // , 쓸수 있음 %d 값에 14, 2018 순서대로 들어감


class print {
	Systhem.out.println("123");
	Systhem.out.print("123");
}

* 사칙연산
class print {
	Systhem.out.println(5+3);
	Systhem.out.println(5-3);
	Systhem.out.println(5*3);
	Systhem.out.println(5/3); // 1 이유: 정수타입이기 때문
}

* 용어
	변수(variable) 하나의 값을 저장하기 위한 공간
	상수(constant) 값을 한번만 저장할 수 있는 공간
    * 상수: 관습적으로 대문자로 작성, 변수와 달리 변경할 수 없는 값이여서 final이란 keyword를 붙임
	리터럴(literal) 그 자체로 값을 의미 // 프로그래밍에서 상수의 의미가 정해져 있어서 리터럴이라고 부름
	키워드 final, int, if 같은 것
	
	int   year =  2041;
	키워드  변수     리터럴
	final  int   Max_VALUE =   100;
	키워드  키워드      상수       리터럴

두 변수의 값 바꾸기
	int x = 1;
	int y = 2;
	System.out.println("x="+ x + "y=" + y);
	int tmp = x;
	x = y;
	y = tmp;
	System.out.println("x="+ x + "y=" + y);

 

 

6. 문자열의 결합

  • 문자열 + any type -> 문자열  - compiler가 any type을 문자열로 변환
System.out.println(1 + 1 + ""); // String 2
System.out.println("" + 1 + 1); // String 11

 

7. 두 변수의 값 바꾸기

  • x, y 값을 서로 바꾸려면 이 중 한가지 값을 임시로 저장할 저장소를 가져야 한다.
public class Main {
    public static void main(String[] args) {
    
        int x = 1;
        int y = 2;
        System.out.println("x = " + x);
        System.out.println("y = " + y);
        
        int tmp;
        tmp = x;
        x=y;
        y=tmp;
        System.out.println("x = " + x);
        System.out.println("y = " + y);
        
    }
}

 

8. 타입 간의 변환 방법

 

조건
String + any type = String
char + char = int
char + int = int

System.out.println((char) ( 1 + '0') ); //(char)는 연산자이다
// 다른 type의 연산에서 범위가 큰 연산자를 따라간다. '0' -> 48
// 1 + '0' = int + char = int(1) + int(48) -> 연산자 (char)로 인해서 다시 int(49)가 char(1)로 변경
System.out.println('3' + '0'); 				// 문자를 숫자로 변환 

System.out.println(3 + "");  				// 숫자를 문자열로 변환
System.out.println('3' + "");				// 문자를 문자열로 변환
System.out.println(Integer.toString(3));	// 숫자를 문자열로 변환

System.out.println(Integer.parseInt("3"));    // 문자열을 숫자로 변환
System.out.println(Double.parseInt("3"));     // 문자열을 숫자로 변환

System.out.println("3".charAt(0));    		//문자열을 문자로 변환

 

 

다음 발행글

 

2022.12.02 - [java] - 연산자(operator)

 


출처 - 자바의 정석 기초편