변수

Brogod97·2022년 12월 7일
0

KH TIL

목록 보기
4/37
post-thumbnail

3. 변수 (Variable)

  • 메모리(RAM)에 값을 기록하는 공간
    → 공간에 기록되는 값(Date)이 변할 수 있어서 변수라고 함

  • 변수는 여러 종류 존재함 (저장되는 값의 형태, 크기가 각각 다름)

  • 메모리(RAM)에 값을 기록하기 위한 공간

  • 변수에 기록된 값은 지속적으로 사용 가능


변수 사용의 장점

  1. 가독성이 좋아짐

  2. 재사용성 증가

  3. 코드량 감소

  4. 유지보수 용이함


변수를 사용하지 않는 경우 예시

package edu.kh.variable.ex1;

public class VariableExample1 {
	public static void main(String[] args) {
		System.out.println(2 * 3.141592653589793 * 5);
		System.out.println(3.141592653589793 * 5 * 5);
		System.out.println(3.141592653589793 * 5 * 5 * 20);
		System.out.println(4 * 3.141592653589793 * 5 * 5);
	}
}

/* 출력 결과
31.41592653589793
78.53981633974483
1570.7963267948967
314.1592653589793
*/

중복되는 값(데이터) 자체를 일일히 입력해야 하는 번거로움이 있음

연산 사이사이 공백을 두는 이유는 가독성을 위해서 삽입한 것

→ 가독성 있는 작성


변수를 사용하는 경우 예시

package edu.kh.variable.ex1;

public class VariableExample1 {
	public static void main(String[] args) {
		double pi = 3.141592653589793; // 실수형은 double 자료형 이용
		int r = 5; // 반지름(radius)
		int h = 20; // 높이(height)
		
		System.out.println("==============="); // 변수 사용 전, 후 구분선

		System.out.println(2 * pi * r); // 원의 둘레
		System.out.println(pi * r * r); // 원의 넓이 
		System.out.println(pi * r * r * h); // 원기둥의 부피
		System.out.println(4 * pi * r * r); // 구의 겉넓이
	}
}
/* 출력결과 (동일)
31.41592653589793
78.53981633974483
1570.7963267948967
314.1592653589793
*/

반복적으로 사용되는 값을 변수로 선언하여 간편하게 이용할 수 있음


변수의 선언

  • 변수 선언: 메모리 공간에 값(데이터)을 저장할 수 있는 공간을 할당하는 것
  • 변수 대입: 변수에 값을 집어 넣는 것
// 변수 선언과 초기화를 각각 진행하는 경우
	double pi; // 변수 선언
	pi = 3.141592; // 변수에 값 대입

// 선언과 초기화를 동시에 진행한 경우
	double pi = 3.141592; 

변수 작성 문법

  • 기본 작성 문법
    자료형 변수명;
  1. 논리형 변수 선언

    boolean isTrue;
  2. 정수형 변수 선언

    byte bNum; // 1byte
    short sNum;
    int iNum; // 4byte
    long lNum; // 'l' 또는 'L'을 표기하여 long형임을 명시

    short 형과 long형의 기준은 int

    • short: int보다 짧다

    • long: int보다 길다

  3. 실수형 변수 선언

    float fNum;
    double dNum;

    float (8개) < double (16개)

    float fNum = 3.14f; // 'f' 또는 'F'를 표기해서 float형임을 명시
    
    double dNum = 3.14; // 실수 기본형이 double이기 때문에 따로 명시하지 않음

    float형에 double 형을 대입하는 건 오류 발생하지만, 반대의 경우 double(큰 것)에 float(작은 것)을 대입하는건 오류 발생하지 않음

  4. 문자형 변수 선언: 문자 하나만 저장 가능

    char ch;
  5. 문자열 변수 선언

    String str;

변수의 명명 규칙

  1. 대소문자가 구분되며 길이 제한이 없다.

    Bus ≠ bus (동일한 이름이 아님)

    int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa; // 길이제한 없음
    int Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa; // 대소문자 구문, 위 변수와 다른 변수
  2. 예약어를 사용하면 안 된다.

    ex) true, final, String

    float double; // Error
  3. 숫자로 시작하면 안 된다.

    ex) age1은 가능하지만 1age는 불가능

    int 1abc = 4; // Error
    int abc1 = 4; // 가능
  4. 특수문자는 _$만을 허용한다.

    • $는 내부 클래스에서 사용

    • _ 사용 시 컴파일 에러는 없지만 관례상 사용하지 않는 것이 좋음

    ex) sh@rp는 불가능하지만 $harp는 가능

    int $intNumber; 
    int int_number; 

    변수명에 일부 특수문자 사용이 가능하긴 하나 권장하지 않음

    _ 의 경우 DB에서 사용

  5. 여러 단어 이름은 단어의 첫 글자를 대문자로 한다.

    단, 첫 시작 글자는 소문자로 하는 것이 관례이다.

    카멜 케이스: 변수명 작성시 여러 단어를 이어서 작성하는 경우, 띄어쓰지 않고 후속 단어의 첫 글자를 대문자로 작성

    ex) ageOfVampire, userName

    char appleBananaCarrot;
  6. 변수명은 언어를 가리지 않는다

    → 영어 이외엔 마찬가지로 권장하지 않음

    int 정수; // 사용 가능

변수 저장 가능 범위

컴퓨터는 2진수로 인지하기 때문에 2n(n = 비트 크기)로 범위 할당


Data(값) 처리 과정

프로그램 실행 시 사용할 값(Data)이 있다면 그 값은 먼저 메모리에 기록 되어야 함

HDD, SSD → RAM → CPU 순서로 실행

  • CPU: 연산 담당
  • RAM (메모리): 주기억장치, 지속적 기억을 못함
  • HDD, SSD: 보조기억장치, 지속적 기억을 담당

데이터 저장 단위

저장 공간이 제한적이기 때문에 저장 크기에 대한 기준과 CPU가 데이터를 처리할 때 일정한 기준 필요

1byte = 8bit

비트(bit)

  • 컴퓨터가 나타내는 데이터의 최소 저장 단위로서 2진수 값 하나(0 또는 1)를 저장할 수 있는 메모리 공간을 의미

  • 8bit = 256개 수 표현 가능

바이트(byte)

데이터 처리 또는 문자의 최소 단위로서 8개의 비트가 모여 하나의 바이트가 구성됨


💡 이클립스의 에러 표시
  1. 전구 모양에 X 표시 있는 경우: 수정 가능한 코드 제안해줄 수 있는 경우
  2. X 모양만 있는 경우: 컴파일러가 제시할 만한 방안이 없는 경우

자료형(Type)

논리형

// 메모리에 논리 값 (T, F)을 저장할 공간 1byte를 할당하고
// 할당된 공간은 booleanData라는 이름으로 부르겠다는 뜻
boolean booleanData

// = : 대입 연산자 => 우항의 값을 좌항에 대입
booleanData = true;

System.out.println("booleanData = " + booleanData); // booleanData = true
  • boolean (1 byte)

  • 논리형은 True / False 값만을 가짐
    따라서 1byte로 표현 가능
    → True = 1 / False = 0 이기 때문

정수형

// 1. 메모리에 정수값을 저장할 공간 1 byte를 할당하고 할당된 공간을 byteNumber라고 부름
// 2. 선언된 byteNumber 변수에 처음으로 127을 넣음
// --> 초기화 : 처음 변수에 값을 대입
byte byteNumber = 127;

short shortNumber = 32767; // 변수 선언 및 초기화

int intNumber = 2147483647; // 변수 선언 및 초기화

long longNumber = 1234567891238956L; // 변수 선언 및 초기화
  1. byte (1 byte)

  2. short (2 byte)

  3. int (4 byte): 정수 기본형

  4. long (8 byte): long을 사용할 땐 뒤에 l 또는 L을 표기해줘야 함
    → 참고로 short, byte는 옛날 코드의 잔재라고 생각하면 됨

실수형

float floatNumber = 1.2345F;

double doubleNumber = 3.141592;
  1. float (4 byte): float의 경우 숫자 끝에 f 또는 F를 명시해줘야 함

  2. double (8byte): 실수 기본형

문자형 char

char ch = 'A'; // 65
char ch2 = 66; // B

System.out.println("ch: " + ch); // ch: A
System.out.println("ch2: " + ch2); // ch2: B
  • char (2 byte)

  • 영어권 언어의 경우 1byte로 표현할 수 있는데, 영어권 외의 언어는 2byte가 필요함
    → 유니코드 개념과 연결

  • char 자료형에 숫자가 대입될 수 있는 이유
    컴퓨터에는 문자표가 존재하고 있는데, 숫자에 따라 지정된 문자가 매핑되어있음

    'B' 문자 그대로가 대입되면 변수에 숫자 66으로 변환되어 저장됨
    반대로 생각해보면, 변수에 애초에 66이란 숫자를 저장하는 것이 가능함

문자열 String

  • 문자열 타입은 참조형 변수임
  • 단어나 문장을 문자열이라고 표현
String str = "기차";
String str = new String("기차");

String str = "기차" + "칙칙폭폭";
String str = new String("기차" + "칙칙폭폭");

// "문자열" + 다른 자료형 → 문자열
String str = "기차" + 123 + 45 + "출발";
// 다른 자료형 + "문자열" → 문자열  
String str = 123 + 45 + "기차" + "출발";

리터럴이란?

//자료형 변수명 = 리터럴;	
short s = 32767;		
int i = 100;			
long l = 10000L;		
float f = 0.123f;
double d = 3.14;
char c =A;
String str = “ABC”;
  • 변수에 대입되거나 작성되는 값 자체를 리터럴이라고도 함

  • 자료형에 따라 리터럴 표기법이 다름

  • 문자형 리터럴 표기법: ' '(홑따옴표) -> 문자 하나만 나타낼 때 사용
    char는 홑따옴표로 표기, String은 쌍따옴표로 표기하는 것 구분해줘야 함
    → c.f. JavaScript는 구분하지 않고 문자열로 인식


상수

  • 수학에서는 변하지 않는 값 의미

  • 컴퓨터(Java)에서는 한 번만 저장(기록)할 수 있는 메모리 의미

  • 변수의 한 종류임

  • 상수 (= 항상 같은 수)
    한번 값이 대입되면 다른 값 불가능함


상수를 사용하는 경우

  1. 변하면 안되는, 고정된 값을 저장할 때

  2. 특정한 값에 의미를 부여할 때


상수 선언 방법

final int AGE;
  • final 키워드 이용

  • 상수의 경우 컨벤션으로, 대문자만으로 이름을 지음
    띄어쓰기가 필요한 경우 _ 사용하여 연결


상수 초기화 방법

  1. 선언과 동시에 초기화

    final int NUM = 100;
  2. 선언 후 초기화

    final int NUM;
    NUM = 100;

상수 초기화 이후 다른 데이터(값) 대입 불가능

  1. 변수에 값을 다시 대입하는 경우

    int number = 10;
    System.out.println("number: " + number);
    number = 20;
    System.out.println("number: " + number);
    
    /*
    number: 10
    number: 20
    */
  2. 상수에 값을 다시 대입하는 경우

    final double PI_VALUE = 3.14;
    PI_VALUE = 2.3; // Error

String 은 참조형임

String의 쌍따옴표 안에 몇글자가 올 지 크기를 특정할 수 없음

참조형은 클래스 배우면서 추가로 더 학습할 예정


형변환(casting)

형변환(casting) : 값의 자료형을 변환하는 것 (boolean 제외)

컴퓨터의 값 처리 원칙

  • 같은 종류 자료형만 대입 가능

  • 같은 종류 자료형만 계산 가능

  • 계산의 결과도 같은 종류의 값이 나와야 함
    → 이러한 원칙이 지켜지지 않은 경우에 형변환이 필요함


형변환 예시

123456789(int)123456789.0(double)

'A'(char)65(int)

3.14f(float)3(int)

형변환 하고자 하는 값과 자료형의 표현 범위 차이에 따라 형변환 방법이 나뉨
→ 자동 형변환, 강제 형변환


자동 형변환

값의 범위가 큰 자료형과 값의 범위가 작은 자료형의 연산 시

컴파일러가 자동으로 값의 범위가 작은 자료형을 값의 범위가 큰 자료형으로 변환

  1. 정수형과 실수형

    int num1 = 10;
    double num2 = 3.5;
    
    // 원칙적으로는 에러가 발생해야 하지만, 자동형변환 덕분에 에러 X
    System.out.println(num1 + num2); // 13.5
    int i1 = 3;
    double d1 = i1; // double은 실수만 저장될 수 있는 자료형
    								// 정수가 대입되는 연산이 수행되면
    System.out.println("i1: " + i1); 	// i1: 3
    System.out.println("d1: " + d1); // d1: 3.0
    
    System.out.println(d1 + num2); // 6.5 (double + double)
  2. char 문자형 자료형
    char 자료형은 문자형이지만 실제 저장하는 값은 0 부터 6만 5천번 사이에 있는 숫자임

    // 알파벳
    char ch = 'V';
    int i3 = ch; // int 변수 = char 값 => int로 자동형변환
    System.out.print("i3 :" + i3); // i3 :86
    
    // 한글
    char ch1 = '각';
    int i4 = ch1;
    System.out.print("i4 :" + i4); // i4 :44033

강제 형변환

  • 값의 범위가 큰 자료형을 값의 범위가 작은 자료형으로 변환

  • 강제 형변환 시 데이터 손실이 발생할 수 있음
    → 데이터의 변형, 손실을 감수하고 강제 변환

intdouble
charint

(double)1 / 2 = 0.5
연산 결과를 큰 값의 범위로 표현하고자 할때

강제 형변환 사용 시기

  1. 값의 범위가 큰 자료형을 작은 자료형으로 변환할 때 사용

  2. 출력되는 데이터의 표기법을 변화시키고 싶을 때 사용

강제 형변환 방법

자료형을 변환시키고 싶은 값 또는 변수 앞에 (자료형)을 작성

double temp = 3.14;
int num = (int)temp; // double 자료형을 int 자료형으로 강제 형변환

System.out.println("temp :" + temp); // temp :3.14
System.out.println("num :" + num); // num :3

데이터 오버플로우

127+1을 하면 범위를 초과한 128이 되고 허용된 범위 이상의 비트를 침범하게 되는데 이를 오버플로우라고 함

반대의 경우를 언더플로우라고 함

0개의 댓글