이세개발
article thumbnail
Published 2023. 4. 16. 22:02
이것이java다 2.1 변수 legacy

1.변수란?

 

프로그램은 작업을 처리하는 과정에서 필요에 따라 데이터를 메모리에 저장한다. 이때 변수를 사용하는데, 변수(variable)는 값을 저장할 수 있는 메모리의 공간을 의미한다. 변수란 이름을 갖게 된 이유는 프로그램에 의해서 수시로 값이 변동될 수 있기 때문이다. 변수에는 복수 개의 값을 저장할 수 없고, 하나의 값만 저장할 수 있다.

변수에는 한가지 타입의 값만 저장할 수 있다. 예를들어 정수타입 변수에는 정수값만 저장할 수 있고, 실수타입 변수에는 실수값만 저장할 수 있다.

 

2. 변수의 선언

 

변수를 사용하기 위해서는 번저 변수를 선언해야 한다. 변수 선언은 어떤 타입의 데이터를 저장할 것인지 그리고 변수 이름이 무엇인지를 결정한다.

변수선언은 다음과 같다.

 

 

타입     변수이름;

          

int           age;            //정수(int)값을 저장할 수 있는 age 변수 선언

double     value;          //실수(double)값을 저장할 수 있는 value 변수 선언

 

타입은 변수에 저장되는 값의 종류와 범위를 결정짓는 요소이기 때문에 어떤 값을 변수에 저장할지 충분히 생각한다음 결정해야 한다.

예를들어 변수에 정수를 저장하고 싶다면 정수타입(int)를 사용할 수 있고, 실수를 저장하고 싶다면 실수 타입(double)을 사용할 수 있다. 같은 타입의 변수는 콤마(,) 를 이용해서 한꺼번에 선언할 수도 있다. 다음은 정수타입 변수 x, y, z 를 선언한 예를 보여준다

 

------------------

int x, y, z;

-------------------

 

변수 이름은 메모리 주소에 붙여진 이름이다. 프로그램은 변수 이름을 통해서 메모리 주소에 접근하고, 그곳에 값을 저장하거나 그곳에 있는 값을 읽는다.

변수 이름은 자바 언어에서 정한 명명 규칙(naming convention)을 따라야 한다. 변수 명명 규칙은 다음과 같다.

 

 

자바는 다음 표에 언급되어 있는 예약어를 가지고 있다. 이 예약어들로 변수 이름을 지정하면 컴파일 에러를 발생시키기 때문에 주의해야 한다.

지금 모두 외울필요는없고 자바를 학습하면서 저절로 알게되는것을이기때문에 짚고만 넘어간다.

 

 분류  예약어
 기본 데이터 타입 boolean, byte, char, short, int, long 
 접근 지정자  private, protected, public 
 클래스와 관련된 것   class, abstract, interface, extends, implements, enum 
 객체와 관련된 것   new, instanceof, this, super, null 
 메소드와 관련된 것  void, return 
 제어문과 관련된 것   if, else, switch, case, default, for, do, while, break, continue 
 논리값   true, false
 예외 처리와 관련된 것    try, catch, finally, throw, throws
 기타   transient, volatile, package, import, synchronized, native, final, static, strictfp, assert 

 

개발자는 변수 이름을 보고, 이 변수가 어떤 값을 저장하고 있는지 쉽게 알 수 있도록 의미 있는 변수 이름을 지어주는 것이 좋다.

변수 이름의 길이는 프로그램 실행과는 무관하기 때문에 충분히 길어도 상관없다. 필수적인것은 아니지만 명명 규칙과 관련된 자바 개발자들 간에 지켜져오는 관례가 있는데, 관례란 필수적인것은 아니지만 개발자간의 코드 작성 패턴을 공유하고자 하는 약속이기 때문에 가급적 지켜주는 것이 좋다.

변수 이름에 한글도 사용이 가능하지만 가급적이면 한글을 포함하지 않는 것이 좋다. 한국어를 모르는 다른사람도 소스 코드를 볼 수 있기 떄문이다.

 

 

3. 변수의 사용

 

변수를 사용한다는 것은 변수에 값을 저장하고 읽는 행위를 말한다. 변수에 값을 저장하는 방법과 변수에 저장된 값을 읽는 방법에대해 알아보겠다.

 

1) 변수값저장

번수에 값을 저장할 때에는 대입 연산자(=)를 사용한다. 일반 수학에서 =은 같다는 의미지만, 자바 언어에서는 우측의 값을 좌측 변수에 저장한다는 의미를 갖는다.

변수를 선언하고 처음 값을 저장할 경우, 이러한 값을 초기값 이라고 한다. 그리고 변수에 초기값을 주는 행위를 변수의 초기화 라고 한다. 예를들어, 90 이라는 값을 변수 score에 저장하려면 먼저 정수 타입(int) 으로 score 변수를 선언하고 초기값 90을 다음과 같이 기술하면 된다.

 

-------------

int score;      // 변수 선언

score = 90;   // 값저장

----------------

초기값은 변수를 선언함과 동시에 줄 수도 있다.

---------

int score - 90;

---------

 

변수의 초기값은 코드에서 직접 입력하는 경우가 많은데 소스 코드 내에서 직접 입력된 값을 리터럴(literal)이라고 부른다. 리터럴은 값의 종류에 따라 정수 리터럴, 실수 리터럴, 실수 리터럴, 문자 리터럴, 논리 리터럴로 구분된다. 이 리터럴들은 정해진 표기법대로 작성되어야 한다. 사실 리터럴은 상수(constant)와 같은 의미지만, 프로그램에서는 상수를 "값을 한번 저장하면 변경할수 없는 변수" 로 정의하기 때문에 이와 구분하기 위해 "리터럴" 이라는 용어를 사용한다.

 

[정수 리터럴]

소수점이 없는 정수 리터럴은 10진수로 간주

EX) 1, 75, -100

 

0으로 시작하는 리터럴은 8진수로 간주

EX) 02, -04

 

0x 또는 0X 로 시작하고 0~9숫자나 A ,B, C, D, E, F 또는 a, b, c, d, e, f 로 구성된 리터럴은 16진수로 간주한다.

EX) 0x5, 0xB, 0xD3, 0xAE40F

 

[실수 리터럴]

소수점이 있는 리터럴은 10진수 실수로 간주.

EX) 0.45, -3.14

 

대문자 E 또는 소문자e가있는 리터럴은 10진수 지수와 가수로 간주한다.

EX) 5E3      //     5 x 10^3

     0.12E-7 // 0.12 x 10^-7

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

 

[문자 리터럴]

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

EX) 'A', '한', '\t', '\n'

역슬래쉬(\= 키보드\) 가 붙은 문자 리터럴은 이스케이프(escape)문자라고도 하는데, 다음과 같이 특수한 용도로 사용된다.

 이스케이프 문자  용도   유니코드 
 '\t'  수평 탭   0x0009 
 '\n'   줄 바꿈   0x000a
 '\r'   리턴   0x000d 
 '\"'   "(큰따옴표)   0x0022 
 '\''   '(작은따옴표)   0x0027 
 '\\'   \  0x005c 
'\u16진수'   16진수에 해당하는 유니코드   0x0000 ~ 0xffff 

 

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

 

 

[문자열 리터럴]

큰따옴표(") 로 묶은 텍스트는 문자열 리터럴로 간주한다. 큰따옴표 안에는 텍스트가 없어도 문자열 리터럴로 간주된다. 문자열 리터럴 내부에서도 이스케이프 문자를 사용할 수 있다.

EX)  "대한민국"

      "탭 만큼 이동 \t 합니다."

      "한줄 내려 쓰기 \n 합니다."

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

 

 

 

[논리 리터럴]

true와 false는 논리 리터럴로 간주한다.

EX) true, false

논리 리터럴을 저장할 수 있는 타입은 boolean 하나 뿐이다.

 

리터럴들은 변수의 초기값으로 소스 코드에서 많이 나타나기 떄문에 사용하다보면 저절로 외워지게 될 것이다.

 

 

 

2) 변수값 읽기

변수는 초기화가 되어야 읽을 수가 있고, 초기화 되지 않은 변수는 읽을수가 없다.

다음은 잘못된 코딩의 예를 보여준다.

 

변수 value 가 선언되었지만, 초기화가 되지 않았기 떄문에 산술 연산식 value +10 에서 사용할 수 없다. 이런경우 컴파일 에러가 발생한다.

맞게 코드를 변경하면

------------------------------------------------------------------------

[ VariableExample.java ] 변수 선언과 초기화

 

package sec01.exam01_variable;

 

public class VariableExample {

public static void main(String[] args) {

//10을 변수 value의 초기값으로 저장

int value = 10;    

 

//변수 value 값을 읽고 10을 더하는 산술 연산을 수행

//연산의 결과값을 변수 result의 초기값으로 저장

int result = value + 10;

 

//변수 result 값을 읽고 콘솔에 출력

System.out.println(result);

}

}

-------------------------------------------------------------------------

Console

20

-------------------------------------------------------------------------

 

 

4. 변수의 사용 범위

변수는 중괄호 {} 블록 내에서 선언되고 사용된다. 중괄호블록을 사용하는 곳은 클래스, 생성자, 메소드 인데, 클래스와 생성자는 클래스를 학습할 떄 살펴보도록하고, 지금은 모든 변수는 메소드 블록 내에 존재한다고 생각하고서 연습을 해보겠다.

메소드 블록 내에서 선언된 변수를 특히 로컬 변수(local variable) 라고 부른다. 로컬 변수는 메소드 실행이 끝나면 메모리에서 자동으로 없어진다. 다음은 main() 메소드 블록에서 변수가 선언된 모습을 보여준다.

----------------------------------------------------------------------------------------------------------

public class VariableExample {                                                           //////// 클래스 블록

                                                                                                   //////// 클래스 블록

public static void main(String[] args) {              ///// 메소드블록          //////// 클래스 블록

int value = 10;                                        /////메소드블록          //////// 클래스 블록

int sum = value + 20;                               /////메소드블록          //////// 클래스 블록

System.out.printIn(sum);                            /////메소드블록           //////// 클래스 블록

}                                                             /////메소드블록            //////// 클래스 블록

                                                                                                      //////// 클래스 블록

}                                                                                                      //////// 클래스 블록

--------------------------------------------------------------------------------------------------------------

 

 

변수는 메소드 블록 내 어디에서든 선언할 수 있지만, 변수 사용은 제한이 따른다. 기본적으로 변수는 다음과 같은 사용 규칙이 있다.

" 변수는 선언된 블록 내에서만 사용이가능하다. "

 

메소드 블록 내에서도 여러가지 중괄호 {} 블록들이 있을 수 있다. 조건문에 해당하는 if() {} , 반복문에 해당하는 for() {} , while () {} 등이 중괄호를 가질 수 있다. 이러한 if, for, while을 제어문이라고 하는데, 제어문 블록에서 선언된 변수는 해당 제어문 블록 내에서만 사용이 가능하고 블록 밖에서는 사용할 수 없다.

 

따라서 변수를 선언할 때는 변수가 어떤 범위에서 사용될 것인지를 생각하고, 선언 위치를 결정해야 한다.

메소드 블록에서 어떤 위치에서건 사용할수 있도록 한다면 메소드 블록 첫머리에 선언하는 것이 찾기편해서 좋을것이다. 만약 제어문 내에서만 잠깐 사용되는 변수라면 제어문 내에서 선언하는것이 좋다.

----------------[ VariableScopeExample.java ] 변수의 사용 범위---------------------------------

package sec01.exam01_variable;

 

public class VariableScopeExample2 {

public static void main(String[] args) {

int v1 = 15;

if(v1>10) {

int v2;

v2 = v1 - 10;

}

//int v3 = v1 + v2 + 5;  //v2 변수를 사용할 수 없기 때문에 컴파일 에러가 생김

}

------------------------------------------------------------------------------------------------------
"v2 cannot be resolved to a variable" 이라고 출력되면서 컴파일 에러가 생기는데
컴파일 에러가 생기는 이유는 int v2; 변수 선언을 if 조건문 {} 내에 선언했기 때문에 변수 v2를 해석할 수 없다고 출력이 되는것이다.
반면 v1, v3 변수는 컴파일에러가 발생하지 않는데, 그이유는 main() 메소드 내부에서 선언되었기 때문에 main()메소드 어디서든 사용가능하기 때문이다.
profile

이세개발

@print(name)

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!