변수와 자료형

홍예석·2023년 1월 18일
0

기초 학습

목록 보기
1/5

변수

  1. 변수의 특징

앞서 선언된 자료형의 종류에 따라 크기가 다른 메모리가 할당된다

byte - 1byte = 8bits
short - 2byte = 16bits
int - 4byte - 32bits
long - 8byte - 64bits
int studentNumber;

-> studentNumber라는 변수명을 가진 공간을 int 자료형에 따라 4byte의 메모리가 할당된다.
-> 이를 선언이라고 한다.

studentNumber = 4;

-> 앞서 studentNumber라는 공간에 메모리가 할당되었고, 그 메모리에 4라는 데이터를 저장하였다.
-> 이를 대입, 혹은 할당이라고 한다. 또한 처음으로 값을 대입하는 경우, 이를 초기화라고 한다.

int studentNumber = 4;

-> 이와 같은 방식으로 선언과 대입을 한 번에 할 수도 있다. 또한 처음으로 값을 대입한 것이기 때문에 초기화로도 볼 수 있다.

  1. 변수 생성의 규칙
  • 대소문자가 구분되며 길이에 제한이 없음
  • 예약어(ex->true) 사용 불가
  • 숫자로 시작 불가
  • 특수문자 _ 와 $ 만 허용
  1. 변수의 종류

변수의 종류에는 전역 변수와 지역 변수가 있고, 전역 변수로는 클래스 변수와 인스턴스 변수가 있다.

3.0 전역 변수
클래스 영역에 선언된 모든 변수를 전역 변수라고 한다. 따라서 클래스 변수와 인스턴스 변수는 모두 클래스 영역에 선언되는 변수다.

3.1 클래스 변수
정적 변수라고도 하며 자료형 앞에 static으로 표현되고, 해당 객체의 모든 인스턴스들이 공유하는 변수다.

3.2 인스턴스 변수
인스턴스 변수는 해당 인스턴스에서만 갖고 있는 변수다.

3.3 지역 변수
클래스 내의 메서드 안에 생성된 변수는 모두 지역 변수다. 생성자와 main도 메서드의 종류이기 때문에 마찬가지로 이 안에 생성된 변수도 지역변수다.

class Variable1_4 {
    static int classVal = 100; // 클래스 변수
    int instanceVal = 200; // 인스턴스 변수

    public static void main(String[] args) {
        int num; // 지역 변수
//        System.out.println("int = " + num); // Error 발생
        num = 300;
        System.out.println("int = " + num); // 100

        // 인스턴스 변수
//        System.out.println("instanceVal = " + instanceVal); // Error 발생
        Variable1_4 instance = new Variable1_4 (); // 인스턴스 변수 사용을 위해 객체 생성
        System.out.println("instanceVal = " + instance.instanceVal); // 100

        // 클래스 변수
        System.out.println("classVal = " + classVal);
        // 같은 크래스 내부는 바로 접근 가능
        System.out.println("Main.classVal = " + Variable1_4.classVal);
        // 클래스 변수 : 클래스명.클래스변수명 으로 접근 or
    }
}

상수와 리터럴

  1. 상수

한 번만 값이 저장이 가능한 변수
선언 방법 : final 변수타입 변수이름;

EX)
final int maxScore = 100;

이처럼 final을 이용해 선언하면 해당 변수는 더 이상 새로운 값을 대입할 수 없게 된다.
연산 역시 값을 새로이 대입하는 과정이기 때문에 연산 역시 불가능하게 된다.
2. 리터럴

저장되는 값 그 자체

int a = 3;

위 코드에서 = 의 우측에 있는 값을 리터럴이라고 한다.

자료형(타입)

  1. 정수 자료형
type	-	byteSize	=	bitSize -
byte -	1byte 		=	8bits 
short - 2byte = 16bits
int - 4byte = 32bits
long - 8byte = 64bits
cf) long 타입에는 예외적으로 대입하는 리터럴의 접미사로 L을 붙여야 한다.
  1. 실수 자료형
float - 4byte = 32bits
double - 8byte = 64bits 
cf) float 타입에는 예외적으로 대입하는 리터럴의 접미사로 f를 붙여야 한다.
  1. 문자 자료형
char - 2byte = 16bits
cf) char 타입은 한 개의 문자만 저장할 수 있다. ab와 같이 두 개의 문자는 저장하지 못 한다.
  1. 논리 자료형
boolean - 1bit
cf) boolean 타입은 true와 false 두 가지 값만을 대입할 수 있다.
  • 자료형 코드 예시
class Variable2_3 {
    public static void main(String[] args) {
        // boolean flag1 = 22; // Error 발생
        boolean flag2 = false; // true, false 만 가능!
        
        // char grade1 = 'AA'; // Error 발생
        // char grade2 = "A"; // Error 발생
        char grade3 = 'A'; // char 타입은 이렇게 하나의 문자만 가능!
        char ch = '\n'; // 개행문자(\n, \t 등) 가능!
        
        // byte val1 = 128; // Error 발생
        byte val2 = 127; // int 와 같은 리터럴로 저장하지만 범위가 지정되어 있음! -128 ~ 127
        
        short sval = 128;
        
        // 리터럴 접두사 예제
        // int의 진수 표현
        int ob = 0b0101; // 2진수, 접두사 0b
        int i = 100; // 10진수
        int oct = 0100; // 8진수, 접두사 0
        int hex = 0x100; // 16진수, 접두사 0x
        
        long price = 2_147_483_648L; // _ 를 사용하여 숫자 표현 가능!
        // long l1 = 2_147_483_648; // Error 발생, int 범위를 넘었으니 L 접미사 필수!
        long l2 = 100; // int의 범위를 넘지 않으면 L 생략 가능! 
        
        // float tax1 = 3.14;
        float tax2 = 3.14f;
        
        double score1 = 3.14159265358979; // d 생략 가능!
        double score2 = 3.14159265358979d;
        
        float f1 = 10f; // 10.0f
        double d1 = 10.; // 10.0
        double d2 = .10; // 0.10
        double d3 = 1e3; // 1000.0 , e3 = 10의 3제곱
        double d4 = -1e3; // -1000.0
    }
}
  • 정수형과 문자형 변환

정수형과 문자형의 변환을 이해하기 위해서는 우선 문자형의 대입 방식을 이해해야 한다.

문자형과 정수형의 형변환의 이해
char a = ?에서 ?에 들어가는 값이 ''로 감싸져 있는 값과 숫자 두 가지만 들어갈 수 있다.
case 1) ''로 감싸져 있는 값일 경우
  ''로 감싸져 있는 값을 그대로 저장한다
case 1 EX)
  char a = 'A';
  System.out.println(a); // 출력 시 A가 그대로 출력된다.
case 2) 숫자값일 경우
  아스키 코드는 숫자가 key, 해당 숫자에 해당하는 값이 value이다.
  여기서 숫자는 10진수 혹은 16진수이고, 값은 문자이다.
  즉 숫자값이 들어온 경우, 이를 key로 인식하여 이에 해당하는 value값인 문자를 저장한다.
case 2 EX)
  char a = 65;
  System.out.println(a); // 출력 시 65라는 key에 해당하는 value값 A가 츌력된다.

다음으로 정수형과 문자형을 변환하는 경우 우선 처음에 int로 선언한 변수를 다시 char로 변환할 수는 없다. 대신 int로 선언한 변수의 값을 받아서 char형 변수에 옮겨 담아야 한다. 반대의 경우도 역시 마찬가지다.
예를 들어, 숫자 0를 문자 0으로 변환하기 위해서는 value값 문자가 0인 key숫자를 찾아야 한다. 아스키 코드표에서 이 숫자는 48이다. 즉 숫자 0에 48을 더해서 char형 변수에 저장하면 된다. 여기서 알 수 있는 점은, 문자 0의 key 숫자값이 48이기 때문에 숫자 0에 문자 '0'을 더하면 문자 0이 된다는 점이다. 아스키 코드에서 문자 0~9 역시 숫자 0~9와 동일하게 연속적으로 배치되어 있기 때문에, 0~9까지의 숫자에 문자 0을 더하면 그 숫자의 '문자 value값'의 'key 숫자'가 반환된다. 이 값을 char형에 다시 담으면, 'key 숫자'에 해당하는 '문자 value값'으로 변환하여 저장할 수 있다.
1. 숫자를 문자로 변환하는 경우

//현재 a에는 숫자 0이 저장되어 있다.
int a = 0;
//이 숫자 0을 문자로 변환하고 싶은 경우, 문자 0을 더한다.
문자 0을 더한다는 것은 문자 0의 key값을 더한다는 뜻이다.
a = a + '0';
//문자 0을 더해 문자 0의 key숫자를 얻었기 때문에, 이 key숫자를 (char)를 통해 다시 문자 value로 변환하여
새로운 변수 ch에 저장하였다.
char ch = (char)a;
//이제 ch에는 문자 0이 들어갔다. 이를 확인하기 위해, 숫자 5를 더해 보면
JVM이 자동으로 ch를 다시 숫자형으로 변환하여 48로 변경한 후 5를 더해 53이 나오는 것을 알 수 있다.
System.out.println(ch + 5);
  1. 문자를 숫자로 변환하는 경우
//현재 ch에는 문자 9가 저장되어 있다.
char ch = '9';
//이 문자 9를 숫자 9로 변환하고 싶은 경우, 문자 0을 뺀다.
//숫자를 문자로 변환하는 경우와 달리, 문자를 숫자로 변환할 때는 처음부터 문자는 key숫자 값을 저장한 것이기 때문에
(int)를 굳이 사용하지 않아도 숫자 간 연산으로 취급되어 형 변환이 필요하지 않다.
int a = ch - '0';
//이제 a에는 숫자 9가 들어갔다. 이를 확인하기 위해 숫자 5를 더해 보면
문자 9의 key숫자가 아닌 숫자 9와 연산이 되어 14가 나오는 것을 알 수 있다.
System.out.println(a + 5);

! 질문 그렇다면 10 이상의 숫자는 어떻게 하나요?

  • 답변 : char형에는 처음부터 두 자리 이상의 숫자는 저장할 수 없기 때문에 아스키 코드에서 다루지 않습니다. 따라서 10 이상의 숫자는 처음부터 char가 아닌 String으로 선언해야 합니다.

연산자

제목내용설명
산술 연산자+ - * / % << >>사칙 연산과 나머지 연산(%)
비교 연산자< > >= <= == !=크고 작음과 같고 다름을 비교
대입 연산자&& || ! & | ^ ~'그리고(AND)' 와 '또는(OR)' 으로 조건을 연결
논리 연산자=우변의 값을 좌변에 저장
기타 연산자(type) ?: instanceof형변환 연산자, 삼항 연산자, instanceof연산자
  • 연산자 활용 중 주의점
    기본적인 연산자 활용법은 어렵지 않지만 그 외에 유의할 점이 몇 가지 있다.
  1. ++연산자의 사용
int a = 5;

//a는 현재 5입니다.
System.out.println(a);

//a++를 할 경우 a를 먼저 참조한 이후 연산을 진행합니다
System.out.println(a++);

//윗 줄에서는 5가 출력되지만 아랫 줄에서 알 수 있듯이 현재 a는 6인 상태입니다.
System.out.println(a);

//++a를 할 경우 연산을 진행한 이후 a를 참조합니다.
System.out.println(++a);
  1. 문자열의 비교
    문자열 비교에는 == 대신 equals()를 사용해야 한다.
    equals : 비교하고자 하는 두 피연산자의 값 자체를 비교한다.
    == : 비교하고자 하는 두 피연산자의 주소값을 비교한다.

  2. 삼항 연산자
    삼항 연산자는 아주 간결한 조건문을 표현할 때 if문을 대체하여 이용하기에 용이하다
    하지만 조건에 따라 두 가지 경우만을 다룰 수 있기 대문에 용도가 상당히 제한적이다
    삼항 연산자 문법 : 조건식 ? 반환값1 : 반환값2

profile
잘 읽어야 쓸 수 있고 잘 들어야 말할 수 있다

0개의 댓글