Chapter 2 변수

Jun-hee Cho·2023년 3월 21일
0

Java

목록 보기
3/13

1. 변수와 상수

1.1 변수란?

변수란, 단 하나의 값을 저장할 수 있는 메모리 공간.

1.2 변수의 선언과 초기화


'변수타입': 변수에 저장될 값이 어떤 '타입(type)'인지를 지정하는 것
'변수이름': 말 그대로 변수에 붙인 이름
변수의 초기화
변수를 선언한 이후부터는 변수를 사용할 수 있으나, 그 전에 반드시 변수를 '초기화(initialization)'해야 한다. why? '알 수 없는 값(쓰레기값, garbage value)'이 남아있을 수 있기 때문이다.

변수에 값을 저장할 때는 대입 연산자 '='를 이용한다.

변수의 종류에 따라 변수의 초기화를 생략할 수 있는 경우도 있지만, 변수는 사용되기 전에 적절한 값으로 초기화 하는 것이 좋다.

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

1.3 변수의 명명규칙

  1. 대소문자가 구분되며 길이에 제한이 없다.
    True와 true는 서로 다른 것으로 간주된다.
  2. 예약어를 사용해서는 안 된다.
    true는 예약어라 사용할 수 없지만, True는 가능하다.
  3. 숫자로 시작해서는 안 된다.
    top10은 허용하지만, 7up은 허용되지 않는다.
  4. 특수문자는 '_'와 '만을허용한다.'만을 허용한다.harp은 허용되지만, S#arp은 허용되지 않는다.


자바에서 사용되는 예약어

그 외에 필수적인 것은 아니지만 자바 프로그래머들에게 권장하는 규칙

  1. 클래스 이름의 첫 글자는 항상 대문자로 한다.
    변수와 메서드의 이름의 첫 글자는 항상 소문자로 한다.
  2. 여러 단어로 이루어진 이름은 단어의 첫 글자를 대문자로 한다.
    ex) lastIndexOf, StringBuffer
  3. 상수의 이름은 모두 대문자로 한다. 여러 단어로 이루어진 경우 ''로 구분한다.
    ex)
    PI, MAX_NUMBER

2. 변수의 타입

우리가 주로 사용하는 값(data)의 종류(type)는 크게 '문자와 숫자'로 나눌 수 있으며, 숫자는 다시 '정수와 실수'로 나눌 수 있다.

이러한 값의 종류에 따라 값이 저장될 공간의 크기와 저장형식을 정의한 것이 자료형이다. 자료형에는 문자형(char), 정수형(byte, short, int, long), 실수형(float, double) 등이 있으며, 변수를 선언할 때는 저장하려는 값의 특성을 고려하여 가장 알맞은 자료형을 변수의 타입으로 선택하면 된다.

기본형과 참조형
자료형은 크게 '기본형'과 '참조형' 두 가지로 나눌 수 있는데, 기본형 변수는 실제 값을 저장하는 반면, 참조형 변수는 어떤 값이 저장되어 있는 주소(memory address)를 값으로 갖는다. 자바는 C언어와 달리 참조형 변수 간의 연산을 할 수 없으므로 실제 연산에 사용되는 것은 모두 기본형 변수이다.

▶︎ 기본형(primitive type)
논리형(boolean), 문자형(char), 정수형(byte, short, int, long), 실수형(float, double)계싼을 위한 실제 값을 저장한다. 모두 8개
▶︎ 참조형(reference type)
객체의 주소를 저장한다. 8개의 기본형을 제외한 나머지 타입.

참조형 변수(또는 참조변수)를 선언할 때는 변수의 타입으로 클래스의 이름을 사용하므로 클래스의 이름이 참조변수의 타입이 된다. 그래서 새로운 클래스를 작성한다는 것은 새로운 참조형을 추가하는 셈이다.

참조변수를 선언하는 방법

클래스이름 변수이름; // 변수의 타입이 클래스 이름인 것들은 모두 참조변수이다.

2.1 기본형(primitive type)

분류타입
논리형boolean: true와 false 중 하나를 값으로 갖으며, 조건식과 논리적 계산에 사용된다.
문자형char: 문자를 저장하는데 사용되며, 변수 당 하나의 문자만 저장할 수 있다.
정수형byte, short, int, long: 정수 값을 저장하는 데 사용된다. 주로 사용되는 것은 int와 long이다. byte는 이진 데이터를 다루는데 주로 사용되며, short는 C언어와의 호환을 위해서 추가하였다.
실수형float, double: 실수를 저장하는데 사용되며, 주로 double이 사용된다.

각 타입의 크기를 표로 나타내면 다음과 같다.

2.2 상수와 리터럴(constant & literal)

'상수(constant)'는 변수와 마찬가지로 '값을 저장할 수 있는 공간'이지만, 변수와 달리 한 번 값을 저장하면 다른 값으로 변경할 수 없다.

상수를 선언하는 방법은 변수와 동일하면, 단지 변수의 타입 앞에 키워드 'final'을 붙여주기만 하면 된다.

final int MAX_SPEED = 10; // 상수 MAX_SPEED를 선언 & 초기화

그리고 상수는 반드시 선언과 동시에 초기화해야 하며, 그 후 부터는 상수의 값을 변경하는 것이 허용되지 않는다.

final int MAX_SPEED; // 에러. 상수는 선언과 동시에 초기화해야함
final int MAX_VALUE = 100; // OK. 선언과 동시에 초기화했음
MAX_VALUE = 200; // 에러. 상수의 값은 변경될 수 없음.

상수의 이름은 모두 대문자로 하는 것이 암묵적인 관례이며, 여러 단어로 이루어져있는 경우 '_'로 구분

리터럴(literal)
리터럴은 단지 우리가 기존에 알고 있던 '상수'의 다른 이름

변수(variable): 하나의 값을 저장하기 위한 공간
상수(constant): 값을 한 번만 저장할 수 있는 공간
리터럴(literal): 그 자체로 값을 의미하는 것


상수가 필요한 이유
상수는 리터럴에 '의미있는 이름'을 붙여서 코드의 이해와 수정을 쉽게 만든다.
리터럴의 타입과 접미사

종류리터럴접미사
논리형false, true없음
정수형123, 0b0101, 077, 0xFF, 100LL
실수형3.14, 3.0e8, 1.4f, 0x1.0p-1f, d
문자형'A', '1', '\n'없음
문자열"ABC", "123"없음


실수형 리터럴의 예

타입의 불일치
리터럴의 타입은 저장될 변수의 타입과 일치하는 것이 보통이지만, 타입이 달라도 저장범위가 넓은 타입에 좁은 타입의 값을 저장하는 것은 허용된다.

문자 리터럴과 문자열 리터럴
'A'와 같이 작은따옴표로 문자 하나를 감싼 것을 '문자 리터럴'이라고 한다. 두 문자 이상은 큰 따옴표로 감싸야 하며 '문자열 리터럴'이라고 한다.

char ch = 'J' // char ch = 'Java'; 이렇게 할 수 없다.
String name = "Java"' // 변수 name에 문자열 리터럴 "Java"를 저장

char타입의 변수는 단 하나의 문자만 저장할 수 있으므로, 여러 문자(문자열)를 저장하기 위해서는 String타입을 사용해야 한다.

2.3 형식화된 출력 - printf()

System.out.printf("age: %d", age);
->System.out.printf("age: %d", 14);
->System.out.printf("age: 14");

모두 같은 결과가 나온다. 지시자 '%d'를 사용하면, 변수의 값을 지정된 형식으로 변환해서 지시자대신 넣는다.



2.4 화면에서 입력받기 - Scanner

Scanner: 화면으로부터 데이터를 입력받는 기능을 제공하는 클래스

먼저 Scanner클래스를 사용하려면, 아래의 한 문장을 추가해줘야 한다.

import java.util.* // Scanner클래스를 사용하기 위해 추가

그 다음엔 Scanner클래스의 객체를 생성한다.

Scanner scanner = new Scanner(System.in); // Scanner클래스의 객체를 생성

그리고, nextLine()이라는 메서드를 호출하면, 입력대기 상태에 있다가 입력을 마치고 '엔터'키를 누르면 입력한 내용이 문자열로 반환된다.

String input = sc.nextLine(); // 입력받은 내용을 input에 저장
int num = Integer.parseInt(input); // 입력받은 내용을 int타입의 값으로 변환

만일 입력받은 문자열을 숫자로 변환하려면, Integer.parseInt()라는 메서드를 이용해야만 한다. 이 메서드는 문자열을 int타입의 정수로 변환한다.

3. 진법(생략; Computer Architecture에서 자세히 다뤘음)

4. 기본형(primitive type)

4.1 논리형 - boolean

논리형에는 'boolean' 한 가지 밖에 없다. boolean형 변수에는 true와 false 중 하나를 저장할 수 있으며 기본값(default)는 false이다.
boolean형 변수는 대답(yes/no), 스위치(on/off) 등의 논리구현에 주로 사용된다. 그리고 boolean 형은 true와 false, 두 가지의 값만을 표현하면 되므로 1 bit만으로도 충분하지만, 자바에서는 데이터를 다루는 최소단위가 byte이기 때문에, boolean의 크기가 1 byte이다. 아래 문장은 power라는 boolean형 변수를 선언하고 true로 변수를 초기화 했다.

boolean power = true;
bolean checked = False; // 에러. 대소문자가 구분됨. true 또는 false만 가능

자바에서는 대소문자가 구별되기 때문에 TRUE와 true는 다른 것으로 간주된다는 것에 주의.

4.2 문자형 - char

문자형 역시 'char' 한 가지 자료형밖에 없다. 문자를 저장하기 위한 변수를 선언할 때 사용되며, char타입의 변수는 단 하나의 문자만을 저장할 수 있다. 아래의 문장은 char타입의 변수 ch를 선언하고, 문자 'A'로 초기화한다.

char ch = 'A'; // 문자 'A'를 char타입의 변수 ch에 저장.

위의 문장은 변수에 '문자'가 저장되는 것 같지만, 사실은 문자가 아닌 '문자의 유니코드(정수)'가 저장된다. 컴퓨터는 숫자밖에 모르기 때문에 모든 데이터를 숫자로 변환하여 저장하는 것이다. 문자'A'의 유니코드는 65이므로, 변수 ch에는 65가 저장된다.

그래서 문자 리터럴 대신 문자의 유니코드를 직접 저장할 수도 있다. 문자 'A'의 유니코드는 10진수로 65이며, 아래의 두 문장은 동일한 결과를 얻는다.

char ch = 'A'; // 문자 'A'를 char타입의 변수 ch에 저장.
char ch = 65; // 문자의 코드를 직접 변수 ch에 저장.

만일 어떤 문자의 유니코드를 알고 싶으면, char형 변수에 저장된 값을 정수형(int)으로 변환하면 된다.

int code = (int)ch; // ch에 저장된 값을 int 타입으로 변환하여 저장한다.

특수 문자 다루기
영문자 이외에 tab이나 backspace 등의 특수문자를 저장하려면, 아래와 같이 조금 특별한 방법을 사용한다.

char tab = '\t'; // 변수 tab에 탭 문자를 저장


특수문자를 표현하는 방법

char타입의 표현형식

문자 'A'를 2진수로 표현

4.3 정수형 - byte, short, int, long

byte 1 < short 2 < int 4 < long 8

Sn-1비트

S: 부호 비트(양수는 0, 음수는 1)
n: 타입의 크기(단위: bit)

정수형의 표현범위

4.4 실수형 - float, double

실수형의 범위와 정밀도

int: 1 + 31 = 32(4 byte)

S(1)31 bits

float: 1 + 8 + 23 = 32(4 byte)

S(1)31 bits

실수형 타입을 선택할 때는 값의 범위뿐만 아니라 '정밀도'도 고려해야한다.

5. 형변환

5.1 형변환(캐스팅, casting)이란?

형변환이란, 변수 또는 상수의 타입을 다른 타입으로 변환하는 것

5.2 형변환 방법

(타입)피연산자

ex)

double d = 85.4;
int score = (int)d; // double타입의 변수 d를 int타입으로 형변환

두 번째 줄의 연산과정

int score = (int)d;
->int score = (int)85.4 // 변수 d의 값을 읽어 와서 형변환한다.
->int score = 85; // 형변환의 결과인 85를 변수 score에 저장한다.

-> 피연산자인 변수 d의 값은 형변환 후에도 아무런 변화가 없다.

기본형간의 형변화

5.3 정수형 간의 형변환


정수형간의 형변환

5.4 실수형 간의 형변환(생략)

5.5 정수형과 실수형간의 형변환(생략)

5.6 자동 형변환

float f = 1234; // 형변환의 생략. float f = (float)1234;와 같음.
byte b = 1000; // 에러. byte의 범위(-128 ~ 127)를 넘는 값을 저장.
char ch = (char)1000; // 명시적 형변환. 에러가 발생하지 않는다.
int i = 3;
double d = 1.0 + i; // double d = 1.0 + (double)i;에서 형변환이 생략됨
double d = 1.0 + i;
->double d = 1.0 + (double)i;
->double d = 1.0 + (double)3; // 3을 double타입으로 형변환하면 3.0이 된다.
->double d = 1.0 + 3.0; // double과 double의 덧셈결과 타입은 double.
->double d = 4.0; // double + double = double

자동 형변환의 규칙

기존의 값을 최대한 보존할 수 있는 타입으로 자동 형변환한다.


기본형의 자동 형변환이 가능한 방향

  1. boolean을 제외한 나머지 7개의 기본형은 서로 형변환이 가능하다.
  2. 기본형과 참조형은 서로 형변환할 수 없다.
  3. 서로 다른 타입의 변수간의 연산은 형변환을 하는 것이 원칙이지만, 값의 범위가 작은 타입에서 큰 타입으로의 형변환은 생략할 수 있다.
profile
최고가 되기 위해 최선을...

0개의 댓글