본문 바로가기
Java/이것이 자바다

자바 시작하기, 변수와 타입

by k-mozzi 2022. 9. 28.
반응형
Preface

 

어제부터 본격적으로 '이것이 자바다' 책 공부를 시작했다.

 

한 달 전쯤 책을 미리 구매했지만, 얼마 전 개정판이 나온 것을 보고 별 생각 없이 개정판을 구매했다.

 

결제를 마친 후에야 책의 구성을 살펴봤는데 자세히 보니 구판에 비해 크게 변경된 부분이 없는 것 같아 주문한 책이 도착하면 바로 반품할 생각이다.

 

분명 자바 기본서를 고를 땐 한 시간 넘게 하나하나 비교한 후 결정했는데, 이번엔 개정판이라는 단어만 보고 혹해서 충동적으로 구매한 것 같다.

 

그래도 확실히 유명한 책이라 그런지 내용도 이해하기 쉽고 재미있다.

 

이번 장에선 변수의 사용 방법과 다양한 데이터 타입, 데이터 타입의 변환 등을 공부했다.

 

자바에서 채택한 기본형 데이터 타입 개념과 연산에서의 자동 타입 변환, 강제 타입 변환을 연결하여 생각하는 것이 조금 헷갈리긴 했지만, 책을 몇 번 읽어보니 금방 이해할 수 있었다.

 


 

1. 자바 시작하기

 

 

- 자바의 특징

1. 이식성이 높은 언어이다.

1) 자바 실행 환경(JRE: Java Runtime Environment)이 설치되어 있는 모든 운영체제에서 실행 가능하다.

 

2. 객체 지향 언어이다.

1) 객체 지향 프로그래밍(OOP): 부품에 해당하는 객체들을 먼저 만든 후 이것들을 조립 및 연결하여 전체 프로그램을 개발하는 기법

 

3. 함수적 스타일 코딩을 지원한다.

1) 함수적 프로그래밍: 자료 처리를 수학적 함수의 계산으로 취급하고 상태와 가변 데이터를 멀리하는 프로그래밍 패러다임의 하나이다.

 

4. 메모리를 자동으로 관리한다.

 

5. 다양한 애플리케이션을 개발할 수 있다.

1) Java SE(Standard Edition): 자바 프로그램이 공통적으로 사용하는 자바 가상 기계(JVM: Java Virtual Machine)를 비롯하여 자바 프로그램 개발에 필수적인 도구와 라이브러리 API를 정의한다.

2) 자바 프로그램을 개발하고 실행하기 위해선 반드시 Java SE 구현체인 자바 개발 키트(JDK: Java Development Kit)를 설치해야 한다.

 

6. 멀티 스레드를 쉽게 구현할 수 있다.

 

7. 동적 로딩을 지원한다.

1) 동적 로딩: 애플리케이션이 실행될 때 모든 객체가 생성되지 않고, 객체가 필요한 시점에 클래스를 동적 로딩해서 객체를 생성하는 것

 

8. 막강한 오픈소스 라이브러리가 풍부하다.

 

 

- 자바 가상 기계(JVM: Java Virtual Machine): 실 운영체제를 대신해서 자바 프로그램을 실행하는 가상의 운영체제

1) 자바 프로그램은 완전한 기계어가 아닌, 중간 단계의 바이트 코드이다.

2) 바이트 코드는 모든 JVM에서 동일한 실행 결과를 보장하지만, JVM은 운영체제에 종속적이다.

→ JVM은 운영체제에 맞게 설치되어야 한다.

3) 바이트 코드는 하나지만, JVM에 의해 번역되는 기계어는 운영체제에 따라 달라진다.

 

 

- 자바 프로그램의 실행 단계

1) 소스 코드: 컴파일러로 번역

2) 바이트 코드: JVM으로 번역

3) 기계어

 

 

- 메소드 블록은 단독으로 작성될 수 없고 항상 클래스 블록 내부에서 작성되어야 한다.

 

 

- 클래스 이름 설정 시 주의사항

1) 소스 파일명과 대소문자가 일치해야 한다. (public 클래스)

2) 숫자로 시작할 수 없다.

3) 공백을 포함할 수 없다.

 

 

- main( ) 메소드는 다른 이름으로 바꾸면 안 된다.

→ main( ) 메소드를 프로그램 실행 진입점이라고 한다.

 

 

- 주석 기호

1) // : 행 주석

2) /* ~ */ : 범위 주석

3) /** ~ */ : 자바 API 도큐먼트 문서에 포함되는 도큐먼트 주석

→ 소스코드에서 API 문서를 HTML 태그 형태로 작성하게 해주는 도구

 

 

- 퍼스펙티브(Perspective): 이클립스에서 프로젝트를 개발할 때 유용하게 사용하는 뷰들을 묶어 놓은 것

→ 뷰(view): 이클립스 내부에서 사용되는 작은 창

 


 

2. 변수

 

 

- 변수(variable) 하나의 값을 저장할 수 있는 메모리 공간

→ 같은 타입의 변수는 콤마를 이용해서 한번에 선언할 수도 있다.

 

 

- 변수 명명 규칙

1) 첫 번째 글자는 문자이거나 '$', '_'이어야 하고 숫자로 시작할 수없다.

2) 영어 대소문자가 구분된다.

3) 첫 문자는 영어 소문자로 시작하되, 다른 단어가 붙을 경우 첫 문자를 대문자로 한다.

4) 문자 수(길이)의 제한은 없다.

5) 자바 예약어는 사용할 수 없다.

 

 

- 초기값: 변수를 선언하고 처음 값을 지정했을 때의 값

 

 

- 변수의 초기화: 변수에 초기값을 주는 행위

 

 

- 리터럴(literal): 소스 코드 내에서 직접 입력된 값

1) 정수 리터럴을 저정할 수 있는 타입: byte, char, short, int, long

2) 실수 리터럴을 저정할 수 있는 타입: float, double

3) 문자 리터럴을 저정할 수 있는 타입: char

4) 문자열 리터럴을 저정할 수 있는 타입: String

→ 문자열 리터럴 내부에서도 이스케이프 문자를 사용할 수 있다.

5) 논리 리터럴을 저장할 수 있는 타입: boolean

 

 

- 이스케이프 문자의 종류

1) \t: tab 크기만큼 칸을 띄움

2) \n: 줄 바꿈

3) \r: 리턴

4) \": 큰따옴표

5) \': 작은따옴표

6) \\: 역슬래시

7) \u16진수: 16진수에 해당하는 유니코드

 

 

- 변수 선언과 초기화

package ch2;

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);
		
	}

}

 

 

- 지역(로컬) 변수: 메소드 블록 내에서 선언된 변수로, 실행이 끝나면 메모리에서 자동으로 없어진다.

→ 선언된 블록 내에서만 사용이 가능하다.

 

 

- 제어문 블록에서 선언된 변수는 해당 제어문 블록 내에서만 사용이 가능하고 블록 밖에서는 사용할 수 없다.

package ch2;

public class variableScope {

	public static void main(String[] args) {

		int v1 = 15;
		if (v1 > 10) {
			int v2 = v1 - 10;
		}
		int v3 = v1 + v2 + 5;
        // v2 변수를 사용할 수 없기 때문에 컴파일 에러 발생

		System.out.println(v3);

	}

}

1) v2를 전역변수로 선언하면 에러가 발생하지 않는다.

2) v2를 지역변수로 선언하되, 초기화까지 시키면 가능하다.

→ 제어문 내부에서 초기화하면 외부에서 사용이 불가능하기 때문이다.

    → 이미 초기화한 값을 재할당하는 것은 가능하다.

 


 

3. 데이터 타입

 

 

- 기본(원시: primitive) 타입: 정수, 실수, 문자, 논리 리터럴을 직접 저장하는 타입

1) 정수: byte, char, short, int, long

2) 실수: float, double

3) 논리: boolean

 

 

- byte 타입: 색상 정보 및 파일 또는 이미지 등의 이진(바이너리) 데이터를 처리할 때 주로 사용

→ 실행 중에 저장할 수 있는 값의 범위를 초과하면 최소값부터(쓰레기값) 다시 반복 저장된다.

 

 

- char 타입: 단 하나의 문자를 저장할 때 사용

1) char 변수에 작은 따옴표로 감싼 문자이다.

2) 자바는 모든 문자를 유니코드로 처리한다.

3) 유니코드: 세계 각국의 문자들을 코드값으로 매핑한 국제 표준 규약

→ 2byte 크기를 가진 정수값(int)

4) 작음 따옴표로 감싼 문자 대신 직접 유니코드 정수값을 지정할 수도 있다.

5) char 변수에 저장된 유니코드를 알고 싶다면 char 타입 변수를 int 타입 변수에 저장하면 된다.

package ch2;

public class charExample {

	public static void main(String[] args) {

		char c1 = 'A'; // 문자를 직접 저장
		char c2 = 65; // 10진수로 저장
		char c3 = '\u0041'; // 16진수로 저장

		char c4 = '가'; // 문자를 직접 저장
		char c5 = 44032; // 10진수로 저장
		char c6 = '\uac00'; // 16진수로 저장

		int uniCode = c1; // 유니코드 얻기

		System.out.println(c1);
		System.out.println(c2);
		System.out.println(c3);
		System.out.println(c4);
		System.out.println(c5);
		System.out.println(c6);
		System.out.println(uniCode);

	}

}

 

 

- 문자열을 저장하고 싶다면 큰따옴표로 감싼 문자열 리터럴을 대입하는 String 타입을 사용하면 된다.

1) String은 클래스 타입이다.

2) String 변수는 참조 변수이다.

→ 문자열을 대입하면 문자열이 변수에 직접 저장되는 것이 아닌, String 객체를 생성한 후 객체의 번지를 참조한다.

 

 

- char 타입의 변수에는 작은 따옴표 두 개를 연달아 붙인 빈 문자를 대입하면 컴파일 에러가 발생하지만, String 변수는 큰 따옴표 두 개를 연달아 붙인 빈 문자를 대입해도 괜찮다.

 

 

- int 타입: 자바에서 정수 연산을 하기 위한 기본 타입

 

 

- 수치가 큰 데이터를 다루는 프로그램에서는 long 타입을 사용한다.

→ int 타입의 저장 범위를 넘어서는 큰 정수는 반드시 소문자 'l'이나 대문자 'L'을 붙여야 한다.

 

 

- float보다 double이 더 정밀한 값을 저장할 수 있다.

1) 자바는 실수 리터럴의 기본 타입을 double로 간주한다.

2) 실수 리터럴을 float 타입 변수에 저장하려면 리터럴 뒤에 소문자 'f'나 대문자 'F'를 붙여야 한다.

→ 정수 리터럴을 저장할 땐 안 붙여도 된다.

3) 정수 리터럴에 10의 지수를 나타내는 E 또는 e를 포함하고 있으면 정수 타입 변수에 저장할 수 없고 실수 타입 변수에 저장해야 한다.

 

 

- boolean 타입: 1byte로 표현되는 논리값을 저장할 수 있는 데이터 타입

 

 

- 타입 변환: 데이터 타입을 다른 데이터 타입으로 변환하는 것

1) 자동 타입 변환

2) 강제 타입 변환

 

 

- 자동 타입 변환: 프로그램 실행 도중에 자동적으로 타입 변환이 일어나는 것

1) 작은 크기를 가지는 타입이 큰 크기를 가지는 타입에 저장될 때 발생한다.

2) 변환 이전의 값과 변환 이후의 값이 동일하다.

3) 정수 타입이 실수 타입으로 변환하는 것은 무조건 자동 타입 변환이 된다.

4) 홀수가 저장될 수 있는 데이터 타입을 char 타입으로 자동 변환시킬 수 없다.

 

 

- 강제 타입 변환(캐스팅: casting): 강제적으로 큰 데이터 타입을 작은 데이터 타입으로 쪼개어 저장하는 것

1) 캐스팅 연산자 '( )'를 사용하는데, 괄호 안에 들어가는 것은 타입을 쪼개는 단위이다.

package ch2;

public class castingExample {

	public static void main(String[] args) {

		int intValue = 44032;
		char charvalue = (char) intValue;
		System.out.println(charvalue);

		long longValue = 500;
		intValue = (int) longValue;
		System.out.println(intValue);

		double doubleValue = 3.14;
		intValue = (int) doubleValue;
		System.out.println(intValue);

	}

}

 

 

- 변환으로 인한 데이터 손실 발생 유무를 확인하는 코드

package ch2;

public class chaekValueBeforeCasting {

	public static void main(String[] args) {

		int i = 128;

		if ((i < Byte.MIN_VALUE) || (i > Byte.MAX_VALUE)) {
			System.out.println("byte 타입으로 변환할 수 없습니다.");
			System.out.println("값을 다시 확인해 주세요.");
		} else {
			byte b = (byte) i;
			System.out.println(b);
		}

	}

}

 

 

- 자바는 코드에서 데이터 값을 검사하기 위해 boolean과 char 타입을 제외하고 모든 기본 타입에 대해 최대,최소값을 상수로 제공한다.

1) 최대값 상수: 데이터타입.MAX_VALUE

2) 최소값 상수: 데이터타입.MIN_VALUE

→ 두 값 모두 데이터 타입의 첫 글자를 대문자로 입력해야 한다.

 

 

- 연산은 기본적으로 같은 타입의 피연산자 간에만 수행되므로 서로 다른 타입의 피연산자가 있을 경우 두 피연산자 중 크기가 큰 타입으로 자동 변환된 후 연산을 수행한다.

 

 

- 연산식에서의 자동 타입 변환 코드

package ch2;

public class operationExample {

	public static void main(String[] args) {

		byte bytevalue1 = 10;
		byte bytevalue2 = 20;
//		byte bytevalue3 = bytevalue1 + bytevalue2;
// 		int형이 기본이므로 연산을 수행할 때 자동으로 int 타입으로 변환되 컴파일 오류 발생 
		int intvalue1 = bytevalue1 + bytevalue2;
		System.out.println(intvalue1);

		char charvalue1 = 'A';
		char charvalue2 = 1;
//		char charValue3 = charvalue1 + charvalue2;
//		char 타입을 연산할 땐 int형으로 변환되므로 컴파일 오류 발생 
		int intValue2 = charvalue1 + charvalue2;
		System.out.println("유니코드= " + intValue2);
		System.out.println("출력문자= " + (char) intValue2);

	}

}

 

728x90
반응형

'Java > 이것이 자바다' 카테고리의 다른 글

타입 변환 메소드  (2) 2022.10.07
참조 타입  (0) 2022.10.07
조건문과 반복문  (0) 2022.10.02
연산자  (0) 2022.09.30
이것이 자바다 출처  (0) 2022.09.26

댓글