-
java 기본 문법대학/객체지향프로그래밍 2022. 10. 7. 16:01
- 변수(식별자)
<키워드> <식별자>; 으로 선언할 수 있으며, 선언과 동시에 초기화도 가능하다 (정적 초기화).
단, 키워드와 식별자 사이에는 whitespace(스페이스, 탭, 개행문자)가 들어와야 하고, 식별자는 다음의 규칙을 만족해야 한다.
1. 문자, _, $ 로 시작
2. 대소문자 구분됨
3. 연산자 포함 금지
4. java 예약어(키워드) 사용 금지
5. 길이는 무제한
또한 실행 도중에 연산의 결과로 초기화도 가능하다 (동적 초기화)
double twelve = Math.sqrt(12 * 12);
- 타입(type)
java는 컴파일 타임에 타입검사를 엄격히 검사한다.
크게 기초타입과 오브젝트로 구분되는데, 오브젝트의 경우 리소스를 많이 잡아먹기 때문에,
기초타입으로 나타낼 수 있는 경우에는 기초타입으로 선언하는게 낫다.
int n1; // Good! Integer n2 = new Integer(); // Bad...
4개의 정수 타입 (byte(8), short(16), int(32), long(64))을 지원하고, c계열 언어와 달리 unsigned 키워드를 지원하지 않는다.
2개의 부동소수점 타입 (float(32), double(64))을 지원한다. IEEE-754 비트 표현법 표준을 따른다.
1개의 문자 타입 (char(16))을 지원하고, Unicode를 사용하기 때문에 모든 언어 및 특수문자를 표현할 수 있다.
1개의 논리 타입 (bool(1))을 지원한다.
- 리터럴(literal)
고정 값을 표현하는 방식으로, 접두어(prefix)를 사용해 진법을 나타내고, 접미어를 사용해 명시적으로 타입을 정할 수 있다.
int octa = 010; // int: data type // octa: variable // 0: prefix // 10: real data
10진수(15), 2진수(0b0000_1111), 8진수(017), 16진수(0xf) 의 정수 리터럴 지원 (int 15 기준).
100L과 같이 명시적으로 long type을 나타낼 수 있다.
표준 표기법(3.14159), 과학적 표기법(314159e-5)과 같은 부동 소수점 리터럴 지원.
3.14f, 3.14d와 같이 명시적으로 float, double type을 나타낼 수 있다.
'a'와 같이 작은 따옴표로 문자 리터럴 지원.
'\\' 와 같은 이스케이프 문자(\)를 통해 특수한 문자를 나타낼 수 있고, \u0061과 같이 Unicode를 직접 입력할 수도 있다.
"hello, world!"와 같이 큰 따옴표로 문자열 리터럴 지원.
(문자열 리터럴은 문자의 배열(기초타입의 배열)이 아닌, String 객체 이다)
- 스코프, 생명 주기 (scope, lifetime)
변수의 lifetime은 scope에 따라 결정되는데, scope의 범위는 {} 내부의 범위로 정의된다.
int globalVar; void func() { int localVar1; { int localVar2; } // 1 }
globalVar가 존재하는 스코프에선 프로그램 종료 시 까지가 생명 주기이다. localVar1, 2는 접근할 수 없다.
localVar1가 존재하는 스코프에선 func 종료 시 까지가 생명 주기이다. localVar 2는 접근할 수 없다.
localVar2가 존재하는 스코프에선 (1) 까지가 생명 주기이다. 모든 변수에 접근할 수 있다.
- 타입 변환, 타입 캐스팅 (type conversion, type casting)
타입 변환은 아래의 경우를 만족할 때 자동으로 수행될 수 있다.
1. 두 타입이 호환될 때 (같은 정수 타입끼리, 같은 부동 소수점 타입끼리)
2. 변환 대상 타입이 현재 타입보다 클 때 (byte -> short -> int -> long, float -> double)
그 외의 경우에는 타입 캐스팅을 해줘야 한다.
int i; byte b = (byte)i;
단, 타입 캐스팅은 바이트 레벨에서 계산(하위 비트를 취함)되기 때문에, 아래와 같은 논리적 예외가 발생할 수 있다.
byte b; int i = 257; // 1_0000_0001 double d = 323.142 // 소수점 제외하고 323 = 1_0100_0011 b = (byte)i // b: 1 b = (byte)d // b: 67 i = (int)d // i: 323
- 타입 승격(type promotion)
연산시 자동으로 타입이 변하는 현상이다.
byte b; short s; int i; long l; float f; long l; byte result = (f + b) * (i / c) - (d * s);
f + b 연산에서 float로 승격
i / c 연산에서 int로 승격
d * s 연산에서 double로 승격
(f + b) * (i / c) 연산에서 float로 승격
(f + b) * (i / c) - (d * s) 연산에서 double로 승격
이 때, result에 대입하는 순간 에러가 발생한다. (부동 소수점 - 정수 타입이 맞지 않기 때문)
타입이 같아도, 대입하려는 변수의 타입이 작다면 에러가 발생한다. (127 초과의 값을 byte에 넣으려고 하는 경우)
- 배열(array)
1차원 배열
int[] d1 = new int[12]; 또는 int d1[] = new int[12];와 같이 선언 가능.
int[] d1 = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };와 같이 선언과 동시에 초기화 가능.
2차원 배열
int[][] d2 = new int[3][5]; 또는 int d2[][] = new int[3][5]와 같이 선언 가능. (3행 5열의 2차원 배열)
아래와 같이 동적 할당 가능.
int[][] d2 = new int[4][]; d2[0] = new int[1]; d2[1] = new int[2]; d2[2] = new int[3]; d2[3] = new int[4]; // 비대칭 2차원 배열 동적 할당!
아래와 같이 선언과 동시에 초기화 가능.
int[][] d2 = { {0, 1, 2}, {3, 4, 5}, {6, 7, 8} }
'대학 > 객체지향프로그래밍' 카테고리의 다른 글
java 인터페이스 (0) 2022.10.09 java 패키지 (0) 2022.10.09 java 클래스 (0) 2022.10.09 java 연산 및 제어 (0) 2022.10.07 java 특징 (0) 2022.10.07