Java/기초문법

[Java 기본 문법] 1. 변수와 타입

robinjoon98 2021. 8. 13. 11:52

변수

변수 : 프로그램이 작업을 처리하는 과정에서 필요에따라 데이터를 메모리에 저장하는데, 이 때 값을 저장할 수 있는 메모리 공간을 의미한다. 

 

타입 : 변수에 어떤 종류의 데이터를 저장할것인지 결정하는 것. 자바에서는 변수를 만들 때(선언할 때) 타입이 정해지고, 변수의 타입은 변경되지 않는다(변경할 수 없다). 변수의 타입은 한번 정해지면 변경할 수 없기 때문에 신중하게 지정해야 한다.

 

변수선언은 다음과같이 한다.

int x, y;
double z;

여기서 "int"와 "double"은 각각 정수와 실수타입이다. "x", "y", "z" 는 변수의 이름이다. 이 이름을 통해 변수에 저장된 값을 읽거나, 변수에 어떤 값을 저장할 수 있다. 같은 타입의 변수를 여러개 선언한다면, 위 코드의 첫번째 줄 처럼 변수이름을 ","로 구분하면 된다. 

변수를 선언할 때, 지켜야하는 규칙이 있다. 기본적으로 변수의 이름은 알파벳 대소문자, 숫자, 몇몇의 특수문자만을 사용한다.

  • 첫번째 글짜는 문자(숫자제외)이거나 '$', '_' 이어야 하고 숫자로 시작할 수 없다.  
  • 영어 대소문자가 구별된다. 즉, apple과 Apple는 서로 다른 변수이다.
  • 변수의 길이(문자 수)는 제한이 없다.
  • 자바 예약어(문법요소에서 사용하는 단어들)은 사용할 수 없다.

위 규칙은 안 지키면 코드가 실행이 되지 않는 필수적인 규칙이다. 자바 예약어는 아주 많지만, 문법을 익히면서 자연히 알게되므로 따로 언급하지 않는다.

 

아래는 지키지않아도 코드가 실행은 되나, 가독성을 위해 사람들끼리 암묵적으로 약속한 규칙이다.

  • 첫 문자는 소문자로 시작하며, 두 개 이상의 단어를 사용한 경우 두번째 이후의 단어의 첫문자를 대문자로 한다. 예를들면 phoneNumber, accountNumber 처럼 선언한다. 

변수에 값을 저장하는 것은 "=" 연산자를 사용한다.

int score; // 변수 선언
score = 90; // 값 저장

변수 선언과 동시에 값을 지정할 수도 있다.

int score = 90;

변수에 최초로 저장되는 값을 초기값이라고 한다. 이런 초기값들은 대부분 코드에서 직접 입력되는 경우가 많다. 이 때, 직접 입력된 값을 리터럴이라고 한다. 리터럴에는 정수, 실수, 문자, 문자열, 논리 리터럴이 있다.

정수 리터럴

  • 소수점이 없는 정수 리터럴은 10진수로 간주한다. ex) 0, -1, 43 등
  • 0으로 시작하는 정수 리터럴은 8진수로 간주한다. ex) 02, -013 등
  • 0x 혹은 0X로 시작하고 숫자나 a(A)~f(F) 로 구성된 리터럴은 16진수로 간주한다. ex) 0x5

이런 정수리터럴을 저장하는 타입은 byte, char, short, int, long 이 있다. 

실수 리터럴

  • 소수점이 있는 리터럴은 10진수 실수로 간주한다.
  • E(e) 가 있는 리터럴은 10진수 지수와 가수로 간주한다. ex) 5E7 ==> 5 * 10^7, 0.12e-5 ==> 0.12 * 10 ^-5

실수 리터럴을 저장할 수 있는 타입은 float, double이 있다.

 

문자 리터럴

작은 따옴표(') 로 묶은 텍스트는 하나의 문자 리터럴로 간주한다.

문자 리터럴을 저장할 수 있는 타입은 char 뿐이다.

 

문자열 리터럴

큰따옴표(")로 묶은 텍스트는 문자열리터럴로 간주된다. "" 도 문자열 리터럴로 사용된다.

문자열 리터럴을 저장할 수 있는 타입은 String 뿐이다.

 

논리 리터럴

true 와 false는 논리 리터럴로 간주된다. 논리리터럴을 저장할 수 있는 타입은 boolean 뿐이다.

변수의 사용방법과, 변수의 범위

변수의 값을 읽으려면, 변수에 값이 지정되어있어야 한다. 이 코드는 잘못된 코드다.

int value; // 변수 value가 선언되었지만 초기값 할당(초기화)이 안되었다.
int result = value + 10; // value의 값을 읽고 거기에 10을 더해 result에 저장한다는 의미다

뒤에 더 자세히 설명되지만, 변수는 변수가 선언된 블록 내부에서만 사용 가능하다. 블록은 중괄호 "{", "}"로 감싸진 구역을 의미한다. 다음 코드를 보자.

public class Test{
	static int a = 30; // a 선언 및 초기화.
	public static void main(String[] args){
    	int value = 10; // value 선언및 초기화
    	value = value + a; // value 에 저장된 값을 읽고, 거기에 a의 값을 더해 다시 value에 저장.
    	System.out.println(value); // 콘솔에 value의 값을 읽어 출력
    }
    public static void method1(){
    	int value2 = 10;
        System.out.println(a);
        System.out.println(value); // 컴파일 에러. value 라는 변수는 이 블록에 없으니 사용할 수 없음
    	System.out.println(value2);
    }
}

변수 a는 가장 바깥 블록인 클래스 블록에서 선언되었다. 따라서, 클래스 블록 내부의 모든 곳에서 사용할 수 있다.

변수 value는 main 이라 이름붙인 매서드 블록에서 선언되었다. 따라서 method1 이라는 매서드 블록에서는 사용할 수없다. 위 코드에선 나타나있지 않지만, 매서드블록 내부에도 블록이 있을 수 있다. 뒤에서 나올 if, for, while 같은 제어문도 블록을 가질 수 있다. 따라서 이들 내부에서 선언된 변수도 이들 내부에서만 사용이 가능하다.

따라서, 변수를 선언할 때에는 변수를 어떤 범위에서 사용할 것인지 생각해 알맞은 블록에서 선언해야 한다. 

 

타입의 종류 

타입은 크게 기본타입(원시타입이라고도 한다)과 참조타입으로 나뉜다. 참조타입은 아주 중요한 개념이지만, 지금다루기에는 어렵고 방대하니 다음에 따로 다루고, 여기선 기본타입만 다룬다.

자바의 기본 타입. 출처 : https://zamezzz.tistory.com/110

각 타입에서 데이터를 어떻게 표기하는지 아는것이 아주 의미가 없는건 아니지만, 비트단위의 연산(암호화 등)등에서만 사용되는 지식이니 크게 필요가 없다 판단해 생략했다. 궁금하면 이 링크를 참조하자.

 

타입 변환

타입변환이란 데이터 타입을 다른 데이터타입으로 변환하는 것을 말한다. 이때, 변수의 타입을 변환하는게 아니라, 어떤 변수에 저장된 데이터를 다른 타입의 변수에 대입할때 값을 그 데이터 타입으로 변환하는것을 의미한다. 변수의 타입은 절대 변경되지 않는다.

타입의 변환에는 자동 타입변환강제 타입변환이 있다.

자동 타입변환은 저장할 수 있는 값의 범위가 작은 타입에서 큰 타입으로의 변환에서 발생한다. 자동 타입변환은 말 그대로 자동이므로 추가코드를 작성하지 않는다.

 

강제 타입변환은 자동과는 반대로 큰 타입을 작은 타입으로 변환할 때 발생한다. 강제 타입변환은 이렇게 한다.

작은 타입의 변수 = (작은 타입) 큰타입 변수;

큰걸 작은것으로 옮기는 것이니, 강제 타입변경시 비트단위의 손실이 발생하고 값이 변형될 수 있다.

간단히 말하면, 크기가 8바이트인 long 을 4바이트인 int로 변환하면, 8바이트중 앞의 4바이트는 소실되고 뒤의 4바이트만 전달된다. 만약 long 타입 변수에 저장된 값이 작아서 앞의 4바이트에 정보를 저장할 수 있다면 값이 유지된다. 강제 타입변환은 바로 이런 경우에만 사용해야 한다. 사실, 이상적인 상황에선 기본타입간의 강제 타입변환은 하면 안된다. 안전한 타입변환을 위해선 값을 확인하는 로직이 추가되어야하고, 안전하지 않은 경우의 로직도 추가되어야 하기 때문에 애초에 강제 타입변환을 할 일이 최대한 없게 해야한다.   

 

다음 글

2021.08.13 - [Java] - [Java 기본문법] 2. 연산자

 

[Java 기본문법] 2. 연산자

2021.08.13 - [Java] - [Java 기본 문법] 1. 변수와 타입 [Java 기본 문법] 1. 변수와 타입 변수 변수 : 프로그램이 작업을 처리하는 과정에서 필요에따라 데이터를 메모리에 저장하는데, 이 때 값을 저장할

blog.robinjoon.space

 

'Java > 기초문법' 카테고리의 다른 글

[Java 기본 문법] 3. 제어문  (0) 2021.08.13
[Java 기본문법] 2. 연산자  (0) 2021.08.13
제네릭(Generic)  (0) 2021.04.27
중첩클래스 2  (0) 2021.03.09
중첩클래스  (0) 2021.02.28