제 2장 어휘구조와 자료형 토 큰 리 터 럴 주 석 자 료 형 배 열 형
어휘구조와 자료형 어휘 자료형 문법적으로 의미 있는 최소의 단위 토큰(token) 컴파일 과정의 첫번째 단계 (어휘분석) 자료 객체가 갖는 형 구조, 개념, 값, 연산
토 큰 문법적으로 의미 있는 최소의 단위 if (i<100) sum+=i; 토큰 특수형태 일반형태 지정어(keyword) : abstract, boolean, ..., while 연산자(operator) : +, -, *, /, ..., >>> 구분자(delimiter) : , ; . ( ) [ ] 명칭(identifier) : sum, stk, ptr, ... 리터럴(literal) : 12, 5.53, 5.97e24, 'c', "string"
지정어 (keyword) 자바 지정어 (47개) abstract double int super boolean else interface switch break extends long synchronized byte final native this case finally new throw catch float package throws char for private transient* class goto* protected try const* if public void continue implements return volatile default import short while do instanceof static
명칭 (identifier) [1/2] 자료의 항목을 식별하기 위하여 붙이는 이름 명칭의 형태 (변수, 상수, 배열, 클래스, 메소드, 레이블) 명칭의 형태 대소문자를 구분, 문자나 밑줄(_) 문자, 혹은 $로 시작 합성 명칭인 경우 : SumOfVector 바른 명칭 : sum, sum1, _sum, $sum, money_sum, MoneySum 틀린 명칭 : 1sum, sum!, #sum, Money Sum, package
명칭 (identifier) [2/2] 자바 문자 집합 유니코드(Unicode):플랫폼,프로그램언어에 관계없이 문자마다 고유한 숫자를 제공 문자 표현 : 16 Bit 세계 모든 언어 표현 대소문자 구별 static final double = 3.1415924 ; int X, x; int MyVar, myvar, myVar, Myvar;
예제2-1 Identifier.java public class Identifier { public static void main(String[] args) { int MyVar=1, myvar=2; int $sum=10, Package=20; System.out.println("MyVar = " + MyVar + ", myvar = " + myvar); System.out.println("$sum = " + $sum + ", Package = " + Package); }
리터럴(literal) [1/4] 자신의 표기법이 곧 자신의 값이 되는 상수 정수형 상수 10진수, 8진수, 16진수 정수형 상수, 실수형 상수, 문자형 상수, 스트링 상수 true, false, null 정수형 상수 10진수, 8진수, 16진수 default : 32 bit 접미어 -L, -l : 64 bit 16, 26l, 45L 10진수 : 15, 255, 65535 8진수 : 017, 0377, 0177777 16진수 : 0xf, 0xff, 0xffff
예제2-2 IntegerConstant.java public class IntegerConstant { public static void main(String[] args) { int i=255, o=0377, h=0Xff; long l=0XffL; System.out.println("i = " + i + ", o = " + o + ", h = " + h); if (h == l) System.out.println("Yes"); else System.out.println("No"); }
리터럴(literal) [2/4] 실수형 상수 : 8진수,16진수 형태로 나타낼 수 없다. 지수(exponent)의 유무에 따라 고정소수점 수 : 1.414, 3.1415924 부동소수점 수: 0.1414e01, 0.1414E1 정밀도(precision)에 따라 float 형 : 접미어 -f, -F 3.14f, 0.526f double 형 : default 3.14, 0.526 예: float f=3.14 double d=3.14f
예제2-3 RealConstant.java public class RealConstant { public static void main(String[] args) { float f1=1.414F, f2=0.1414e01f; double d=0.1414E1; System.out.println("f1 = " + f1 + ", f2 = " + f2 + ", d = " + d); if (f1 == f2) System.out.println("Yes"); else System.out.println("No"); if (f2 == d) System.out.println("Yes"); }
리터럴(literal) [3/4] 논리형 상수 문자 리터럴 binary value true, false 단일 인용부호(single quote) 사이에 표현 특별한 문자 : escape sequence \n newline(\u000A) \t tab(\u0009) \b backspace(\u0008) \r return(\u000D) \f form feed(\u000C)
예제2-4 BooleanConstant.java public class BooleanConstant { public static void main(String[] args) { System.out.println("TRUE AND TRUE = " + (true && true)); System.out.println("TRUE AND FALSE = " + (true && false)); System.out.println("FALSE AND TRUE = " + (false && true)); System.out.println("FALSE AND FALSE = " + (false && false)); }
리터럴(literal) [4/4] 스트링 리터럴 객체 참조 리터럴 이중 인용부호(double quote) 사이에 표현 “I am a string” “\”” java.lang.String 클래스의 객체로 취급 객체 참조 리터럴 null 아무 객체도 가리키지 않는 상태 초기화에 사용 부적당하거나 객체를 생성할 수 없는 경우 사용
예제2-5 CharString.java public class CharString { public static void main(String[] args) { char c = 'A'; // 'A' <=> 65 int i; i = c + 1; System.out.println("c = " + c + "\ni = " + (char)i); System.out.println("\"I am a string.\""); }
주석(comment) 프로그램 설명을 위한 문장 프로그램 유지보수에 중요 주석 종류 Line Comment : // comment //부터 새로운 줄 전까지 주석으로 간주 Text Comment : /* comment */ /*와 다음 */ 사이의 모든 문자들은 주석으로 간주 Documentation Comment : /** comment */ /**와 다음 */ 사이의 모든 문자들은 주석으로 간주 javadoc 도구를 이용하여 API 문서 작성에 사용
자료형(data type) 기본형 문자형 논리형 자료형 배열형 참조형 클래스형 인터페이스형 숫자형 - 정수형, 실수형 기본형 문자형 논리형 자료형 배열형 참조형 클래스형 인터페이스형 자료형은 구조 및 개념, 값의 범위, 연산 등을 정의. 자바는 변수를 사용하기 전에 반드시 자료형을 선언
기본형(primitive type) [1/4] 정수형 int short byte long float double 숫자형 실수형 문자형 논리형 char boolean
기본형(primitive type) [2/4] 정수형(integer type) 유형 크기 최소값 최대값 byte 8bit -128 127 short 16bit -32768 32767 int 32bit -2147483648 2147483647 long 64bit -9223372036854775808 9223372036854775807 C/C++와는 달리 unsigned는 지원하지 않음 자바 언어는 기계 독립적 이기때문에 자료형의 크기가 고정 수식에서 byte와 short형의 값은 항상 연산 되기 전에 int형으로 변환 실수형(real type) float(32비트), double(64비트) 실수의 표현 방법과 실수 연산은 IEEE 754 표준 따름
기본형(primitive type) [3/4] 문자형(character type) Unicode 사용 논리형(boolean type) true와 false 중 하나의 값만을 가지는 자료형 숫자 값 가질 수 없음 다른 자료형으로 변환되지 않음
기본형(primitive type) [4/4] 자료형에 대한 초기값 초기값(initial value)이 명시되지 않으면, 해당하는 field type에 따라 default 초기값을 할당 local variable, static initializer : default초기값을 할당 않음 Field Type Initial value byte (byte)0 short (short)0 int 0 long 0L float 0.0f double 0.0d boolean false char ‘\u0000’
참조형(reference type) 객체를 가리키는 형 배열 클래스형 인터페이스형 같은 형의 여러 값을 저장하는데 이용하는 자료형 C/C++와 달리 객체로 취급 클래스형 클래스 이름 객체를 가리키는 참조형 인터페이스형 인터페이스 이름 인터페이스를 구현한 객체에 대한 참조
배열형 [1/4] 순서가 있고 같은 형의 원소들의 모임 배열 사용 단계 배열 변수 선언 배열 객체 생성 배열 변수 : 배열을 가리키는 변수 배열에 속한 원소의 형과 차원 등을 명시 배열 객체 생성 new 연산자를 통해 동적으로 생성 int[] vector; short matrix[][]; Object[] myArray;
vector[0] vector[1] vector[2] 배열형 [2/4] vector1 = new int[5]; vector2 = {1, 2, 3, 4, 5, 6, 7, 8, 9}; matrix = new short[10][100]; myArray = new Point[3]; 배열 변수 선언과 동시에 배열 할당 참고: 배열 변수 선언과 생성에 따른 메모리 구조 int[] day = new int[31]; int[] vector ; vector = new int[3] ; vector[0] vector[1] vector[2] vector :
배열형 [3/4] 배열에 값 저장 배열의 인덱스는 0부터 시작 length를 통한 배열의 길이 범위 초과 : IndexOutOfBoundException이 발생 [예제 2.7] 테스트 int a[] = new int[50]; for(int i=0; i < a.length; i++) a[i] = i;
배열형 [4/4] 배열의 배열(array of array) 배열의 원소가 다시 배열이 되는 배열 다차원 배열 첫번째 차원의 크기는 반드시 명시 [예제 2.8] 테스트 --- 교과서 58쪽 int[][] matrix = new int[3][3]; int[][] matrix = new int[3][]; for (int i=0; i < matrix.length; i++) matrix[i] = new int[3];
[예제 2.8- ArrayOfArray.java] ______________________________________ public class ArrayOfArray { public static void main(String[] args) { int[][] matrix = new int[3][]; // declaration int i, j; for (i = 0; i < matrix.length; i++) // creation matrix[i] = new int[i+3]; for (i = 0; i < matrix.length; i++) // using for (j = 0; j < matrix[i].length; j++) matrix[i][j] = i*matrix[i].length + j; for (i = 0; i < matrix.length; i++) { for (j = 0; j <matrix[i].length; j++) System.out.print(" " + matrix[i][j]); System.out.println(); } } } ______________________________________________________________ [실행결과 : ] 0 1 2 4 5 6 7 10 11 12 13 14