Java - (Chapter-2)

hoegon kim·2023년 1월 6일
0

JAVA

목록 보기
22/26
post-thumbnail

1.변수(variable)

값(data)을 잘 다루는 것

1.1 변수란?

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

1.2 변수의 선언과 초기화

변수타입 : 정수형, 실수형, 문자형 등등

변수의 초기화

반드시 변수를 초기화해야한다.

메모리는 여러 프로그램이 공유하는 자원이므로 전에 다른 프로그램에 의해 저장된 알 수 없는 값이 남아 있을수 있기 때문이다.

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

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

※ 참고 지역변수는 사용되기 전에 초기화를 반드시 해야 하지만 클래스변수와 인스턴스변수는 초기화를 생략할 수 있다.

변수의 초기화에 대해서는 6장에서 자세히 배운다.

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

예제 2-1/ch2/VarEx1.java


class VarEx1 {
	public static void main(String[] args){
		int year = 0;    
    	int age = 14;
        
        System.out.printIn(year);
        System.out.printIn(age);
        
        year = age + 2000; 
        age = age + 1;
        
        System.out.printIn(year);
        System.out.printIn(age);
    }

}

year = age + 2000;
→ year = 14 + 2000;
→ year = 2014;

age = age + 1;
→ age = 14 + 1; // 변수 age에 저장된 값을 읽어온다.
→ age = 15; // 변수 age에 15를 저장한다.

두 변수의 값 교환하기

다음과 같이 변수 x,y가 있을 때, 두 변수에 담긴 값을 서로 바꾸려면 어떻게 해야 할까 ?

int x = 10;
int y = 20;

단순하게 변수 x의 값을 y에 저장하고, y의 값을 x에 저장하면 될 것 같지만 그렇게 해서는 원하는 결과를 얻을 수 없다.

  1. 변수 y에 저장된 값을 변수 x에 저장

x = y;

  1. 변수 x에 저장된 값을 변수 y에 저장

첫 번째 단계에서 y의 값을 x에 저장할 때, 이미 x의 값이 없어졌기 때문에 x의 값을 y에 저장해도 소용이 없을 것이다. 그러면 어떻게 해야 할까? 다음과 같이 변수를 하나 더 선언해서 x의 값을 위한 임시 저장소로 사용하면 된다.

int x =  10;
int y =  20;
int tmp; 		// x값을 임시로 저장할 변수를 선언

두 변수의 값을 교환하는 것은 마치 두 컵에 담긴 내용물을 바꾸려면 컵이 하나 더 필요한것과 같다. 아직도 위의 과정이 잘 이해되지 않는다면, 한 컵에는 우유를 다른 한 컵에는 물을 남은 다음에 빈컵을 이용해서 두 컵의 내용물을 바꾸는 일을 직접 해보자.

class VarEx2{
	public static void main(String[] args){
    	int x =10, y = 20
    	int tmp = 0;
        
        System.out.printIn("x:" + x + "y : " + y);
        tmp = x;
        x = y;
        y = tmp;
        
        System.out.printIn("x :" + x + "y : " + y);
    }

}

1.3 변수의 명명 규칙

'변수의 이름'처럼 프로그래밍에서 사용하는 모든 이름을 '식별자'라고 하며, 식별자는 같은 영역 내에서 서로 구분(식별)될 수 있어야한다. 그리고 식별자를 만들 때는 다음과 같은 규칙을 지켜야 한다.

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

예약어는 키워드(keyword) 또는 '리져브드 워드(reseved word)'라고 하는데, 프로그래밍언어의 구문에 사용되는 단어를 뜻한다. 그래서 예약어는 클래스나 변수, 메서드의 이름(identifier)으로 사용할 수 없다. 아래의 표 2-1은 자바에서 사용되는 예약어이다. 예약어는 앞으로 차차 배워 나가게 될 것이므로 지금은 간단히 훒어보기만 하자.

※ 참고 goto와 const는 실제로 사용되지 않으며, assert는 JDK1.4부터 enum은 JDK1.5부터 새로 추가되었다.

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

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

위의 규칙들은 반드시 지켜야 하는 것은 아니지만, 코드를 보다 이해하기 쉽게 하기 위한 자바 개발자들 사이의 암묵적인 약속이다.

이 규칙을 따르지 않는다고 해서 문제가 되는 것은 아니지만 가능하면 지키도록 노력하자.

만일 특별한 방식으로 식별자를 작성해야 한다면 미리 규칙(coding convention)을 정해놓고 프로그램 전체에 일관되게 적용하는 것이 필요하다.

※ 자바에서는 모든 이름에 유니코드에 포함된 문자들을 사용할 수 있지만, 적어도 클래스 이름은 ASCII 코드(영문자)로 하는 것이 좋다.

유니코드를 인식하지못하는 운영체제(OS)도 있기 때문이다.

변수의 이름은 짧을수록 좋지만, 약간 길더라도 용도를 알기 쉽게 '의미있는 이름'으로 하는것이 바람직하다. 변수의 선언문에 주석으로 변수에 대한 정보를 주는 것도 좋은 생각이다.

int curPos = 0;			// 현재위치(current positon)
int lastPos = -1;		// 마지막 위치(last position)

2. 변수의 타입

값(data)의 종류(type)은 문자와 숫자로 나눌수 있다.

기본형과 참조형
기본형 변수는 실제 값을 저장하는 반면, 참조형변수는 어떤 값이 저장되어 있는 주소를 값으로 갖는다.

※ 참고 : 메모리에는 1byte 단위로 일련번호가 붙어 있는데, 이 번호를 '메모리 주소(memory address)'또는 간단히 '주소'라고 한다. 객체가 저장된 메모리 주소를 뜻한다.

기본형(primitive type)

  • 논리형(boolean), 문자형(char), 정수형(byte, short, int, long), 실수형(float, double) 계산을 위한 실제 값을 저장한다. 모두 8개의 기본형을 제외한 나머지 타입.

참조형(reference type)

  • 객체의 주소를 저장한다. 8개의 기본형을 제외한 나머지 타입.

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

다음은 참조변수를 선언하는 방법이다. 기본형 변수와 같이 변수 이름 앞에 타입을 적어 주는데 참조 변수의 타입은 클래스의 이름이다.

다음은 Date 클래스 타입의 참조변수 today를 선언한 것이다. 참조변수는 null 또는 객체의 주소를 값으로 갖으며 참조변수의 초기화는 다음과 같이 한다.

Date today = new Date(); // Date객체를 생성해서, 그 주소를 today에 저장

객체를 생성하는 연산자 new의 결과는 생성된 객체의 주소이다. 이 주소가 대입연산자 "="에 의해서 참조변수 today에 저장되는 것이다.

이제 참조변수 today를 통해서 생성된 객체를 사용할 수 있게 된다.

자료형(data type)과 타입(type)의 차이가 뭔가요?

기본형은 저장할 값(data)의 종류에 따라 구분되므로 기본형의 종류를 얘기할 때는 '자료형(data type)'이라는 용어를 씁니다. 그러나 참조형은 항상 '객체의 주소'를 저장하므로 값(data)이 아닌, 객체의 종류에 의해 구분되므로 참조형 변수의 종류를 구분할 때는 '타입(type)'이라는 용어를 사용합니다. '타입(type)'이 자료형(data type)을 포함하는 보다 넓은 의미의 용어이므로 굳이 구분하지 않아도 됩니다.

2.1 기본형(primitive type)

기본형에는 모두 8개의 타입(자료형)이 있으며, 크게 논리형, 문자형, 정수형, 실수형으로 구분된다.

문자형인 char는 문자를 내부적으로 정수(유니코드)로 저장하기 때문에 정수형과 별반 다르지 않으며, 정수형 또는 실수형과 연산도 가능하다.
반면에 boolean은 다른 기본형과의 연산이 불가능하다. 즉, boolean을 제외한 나머지 7개의 기본형은 서로 연산과 변환이 가능하다.

정수는 가장 많이 사용되므로 타입을 4가지나 제공한다. 각 타입마다 저장할 수 있는 값의 범위가 다르므로 저장할 값의 범위에 맞는 타입을 선택하면 되지만, 일반적으로 int를 많이 사용한다.

왜냐하면, int는 CPU가 가장 효율적으로 처리할 수 있는 타입이기 때문이다. 효율적인 실행보다 메모리를 절약하려면, byte나 short을 선택하자

4개의 정수형(byte, short, int, long) 중에서 int형이 기본 자료형(default data type)이며, 실수형(float, double)중에서 double이 기본 자료형이다.

기본 자료형의 종류와 크기는 반드시 외워야 하며, 아래의 문장들이 도움이 될 것이다.

  • boolean은 true와 fales 두 가지 값만 표현할 수 있으면 되므로 가장 작은크기인 1byte.

  • char은 자바에서 유니코드(2 byte 문자체계)를 사용하므로 2 byte.

  • byte는 크기가 1byte라서 byte

  • int(4 byte)를 기준으로 짧아서 short(2 byte), 길어서 long(8byte), (short ↔ long)

  • float는 실수값을 부동소수점(floating-point)방식으로 저장하기 때문에 float.

  • double은 float보다 두배의 크기(8byte)를 갖기 때문에 double

※ 참고 : float와 double은 양의 범위만 적은 것이다. 음의 범위는 양의 범위에 음수 부호(-)를 붙이면 된다.

각 자료형이 가질 수 있는 값의 범위를 정확히 외울 필요는 없고, 정수형(byte, short, int, long)의 경우 (n은 bit수)이라는 정도만 기억하고 있으면 된다.

예를 들어 int형의 경우 32bit(4byte)이므로

따라서 int타입의 변수는 대략 10자리 수(약 20억, 2,000,000,000)의 값을 저장할 수 있다는 것을 알 수 있다.

7 ~ 9 자리의 수를 계산할 때는 넉넉하게 long 타입(약 19자리)으로 변수를 선언하는 것이 좋다. 연산중에 저장범위를 넘어서게 되면 원하지 않는 값을 결과로 얻게 될 것이기 때문이다.

0개의 댓글