프로그래머를 위한 Java 2 제2장 자바 언어 기초
2.1 자바 식별자와 키워드 자바 식별자 (identifier) 작성규칙 클래스 이름, 메소드 이름, 변수 이름 등 유니코드를 사용한다 작성규칙 문자와 숫자의 연속이다 문자로 시작한다 키워드, true, false, null과 같은 철자를 사용할 수 없다 ‘_’, ‘$’ 등으로 시작할 수 있다 대·소문자를 구별한다 길이에 제한이 없다
2.1 자바 식별자와 키워드 올바른 식별자의 예 id userName user_name _userName $userName 틀린 식별자의 예 user name 3d_studio this #arg
2.1 자바 식별자와 키워드 자바의 키워드 주의 abstract default if private throw boolean do implements protected throws break double import public transient byte else instanceof return try case extends int short void catch final interface static volatile char finally long super while class float native switch const for new synchronized continue goto package this 주의 1) const와 goto는 예약어로 지정됐지만 현재 자바에서는 사용되지 않는다. 2) "true", "false", "null" 은 boolean/null 상수로서 예약어처럼 사용할 수 있다. 3) 문자가 자바 문자나 숫자인가를 알아보기 위해서는 Character.isJavaLetterOrDigit() 메소드를 이용할 수 있다. 4) 유니코드에 관한 정보는 http://www.unicode.org/에서 얻을 수 있다.
2.1 자바 식별자와 키워드 예제 : id.java 결 과 1 class id { 2 public static void main(String args[]) { 3 String 이름 = "홍길동"; 4 System.out.println("안녕하세요. " + 이름 +" 님!"); 5 } 6 } 결 과 % javac id.java % java id 안녕하세요. 홍길동 님!
2.1 자바 식별자와 키워드 예제 : NameTest.java ( ) 따라서 클래스, 메소드, 멤버필드의 이름이 동일해도 됨 예제 : NameTest.java ( ) 1 class SameNamePoint int x, y; 2 3 class NameTest { 4 5 static SameNamePoint SameNamePoint(int x, int y) { 6 SameNamePoint p = new SameNamePoint(); …………. 11 public static void main(String[] args) { 12 int SameNamePoint; 13 SameNamePoint[] pa = new SameNamePoint[2]; 14 for (SameNamePoint = 0; SameNamePoint < 2; SameNamePoint++) { 15 pa[SameNamePoint] = new SameNamePoint(); ………….. ………...
2.1 자바 식별자와 키워드 예제 : BreakLabel.java ( ) break/continue에서 사용되는 라벨은 변수와 다른 네임 스페이스를 갖는다. 따라서 라벨과 변수의 이름이 동일해도 무방 예제 : BreakLabel.java ( ) 1 class BreakLabel { 2 public static void main(String args[ ]) { 3 i: 4 for (int i = 0; i <= 100; i++) { 5 int j = 0; 6 while (j < 10) { 7 j++; …………...
2.2 자료 타입 자바 자료 타입
2.2.1 기본 자료 타입 기본 자료 타입 주 의 1) 자바에서는 C언어의 기본 자료 타입에 boolean과 byte라는 타입을 추가 2) 각 자료타입은 클래스의 멤버필드/배열의 컴포넌트는 처음에 생성될 때 디폴트 값으로 초기화된다. 지역 변수인 경우에는 초기화되지 않는다
2.2.1 기본 자료 타입 1. int 타입 예제 : Int.java 1 class Int { 2 3 public static void main(String ard[]) { 4 int int1 = 5, int2 = 28; 5 int int3, int4, int5 ; 6 7 int3 = int2 * int1; 8 int4 = int2 / int1; 9 int5 = 25 / int1; 10 11 System.out.println("28 * 5 = "+ int3); 12 System.out.println("28 / 5 = "+ int4); 13 System.out.println("25 / 5 = "+ int5); 14 } 15 }
2.2.1 기본 자료 타입 2. byte, short 타입 예제 : Byte.java byte와 short도 int와 마찬가지로 정수 타입이다. byte는 -27 ~ 27-1 사이의 값 short은 -215 ~ 215-1 사이의 값 예제 : Byte.java 1 class Byte { 2 public static void main(String args[]) { 3 byte byte1; 4 5 byte1 = 256; 6 System.out.println("byte1 = "+byte1); 7 } 8 }
2.2.1 기본 자료 타입 3. float, double 타입 두 실수 x, y를 이용해서 연산할 수 있는 예 플로팅포인트 타입은 IEEE 754-1985 표준에 따라 표현된다. 이 표준에 따르면 플로팅 포인트 타입은 -0.0과 +0.0, 2개의 0.0을 가진다. 또한 오버플로우(overflow)와 언더플로우(underflow)가 발생할 수 있다. 표준에는 유효하지 않은 연산 ( * 0.0, 0.0 / 0.0 등) 결과를 위해 NaN (Not a Number)을 가지고 있다. NaN은 숫자가 아니다. 두 실수 x, y를 이용해서 연산할 수 있는 예
2.2.1 기본 자료 타입 예제 : FloatingOne.java 결 과 1 class FloatingOne { 2 public static void main(String args[]) { 3 float float1; 4 5 float1 = 3.14; 6 } 7 } 결 과 % javac FloatingOne.java FloatingOne.java:5: Incompatible type for =. Explicit cast needed to convert double to float. float1 = 3.14; ^ 1 error
2.2.1 기본 자료 타입 예제 : FloatingFour.java 결 과 1 class FloatingFour { 2 public static void main(String args[]) { 3 int int1; 4 float float1 = 28.0f, float2 = 5; 5 6 int1 = (int)(float1 / float2); 7 System.out.println("(int)(28.0 / 5.0) = "+int1); ………….. 결 과 % java FloatingFour (int)(28.0 / 5.0) = 5
2.2.1 기본 자료 타입 4. char 타입 예제: CharOne.java 예제: CharTwo.java 1 class CharOne { 2 public static void main(String args[]) { 3 char c = 'a'; 4 int int1 ; 5 6 int1 = c; 7 System.out.println("int1 = "+ int1); 8 9 int1 = int1 + 1; 10 System.out.println("int1 = "+ int1); 11 System.out.println("(char)"+ int1 +" = "+ (char)int1); ……… 예제: CharTwo.java 1 class CharTwo { 3 char han = '\ud55c'; 4 char gul = '\uae00’; ……..
2.2.1 기본 자료 타입 5. boolean 타입 boolean 타입은 true나 false 값만을 가질 수 있고, 다른 타입(예, int)이 boolean 타입으로 변환은 불가능하다. 따라서 C 언어에서처럼 .... while( 1 ) { ...... } 형태의 프로그램은 작성할 수 없고, 아래와 같은 형식으로 작성해야 한다 예: ..... while(true) { ...…
2.2.1 기본 자료 타입 6. 리터럴 (Literal) 주 의 - 자바에서는 지원하지 않는 C 언어 자료 유형 프로그램의 소스에서 직접 값으로 표현된 것 기본 자료형과 문자열은 리터럴로 직접 값을 표현할 수 있는 방법을 제공 예: a = 2; // 2는 int형 리터럴 x = 0xA; // A는 16진수로 표현된 int형 리터럴 o = 055; // 55는 8진수로 표현된 int형 리터럴 b = 5L; // 5는 long형 리터럴 f = 2.0f; // 2.0f는 float형 리터럴 d = 2.0; // 2.0은 double형 리터럴 e = 2.0E4; // double형 리터럴, 2.0 * 104을 의미한다. t = true; // true는 boolean형 리터럴 c = 'd'; // d는 문자형 리터럴 s = "Hello"; // Hello는 문자열 리터럴 주 의 - 자바에서는 지원하지 않는 C 언어 자료 유형 1) 포인터 : 자바에서는 포인터를 지원하지 않는다. 2) struct / union : 자바에서는 struct와 union을 지원하지 않는다. 사용자는 필요한 경우에 클래스를 정의해서 struct처럼 사용할 수 있다.
2.2.2 레퍼런스 타입 1. 레퍼런스 타입 C++과 자바에서 객체를 생성하는 방법 1 int a = 100 ; 2 Car mycar, yourcar; 3 mycar = new Car(); 4 yourcar = mycar;
2.2.2 레퍼런스 타입 2. ==과 equals() == 연산자와 equals() 메소드의 차이점 == 연산자는 두 변수의 값이 같은가를 물어본다 equals() 메소드는 객체의 내용이 같은가를 물어본다. == 연산자는 기본 자료형이나 레퍼런스에 사용 equals() 메소드는 레퍼런스 타입에서만 사용 두 연산자의 차이점의 예
2.2.2 레퍼런스 타입 예제: Equal.java 1 public class Equal { 2 public static void main(String args[]) { 3 String a = new String("abc"); 4 String b = "abc"; 5 String c = b; 6 String d = a; 7 8 StringBuffer e = new StringBuffer("abc"); 9 StringBuffer g = e; 10 11 if(a = = b) { 12 System.out.println("a= =b"); 13 } 14 // if(a = = e) { // 컴파일 에러 15 // System.out.println("a= =e"); 16 // } …………...
2.2.2 레퍼런스 타입 결 과 20 if(b.equals(a)) { 21 System.out.println("b.equals(a)"); 22 } 23 if(b.equals(e)) { 24 System.out.println("b.equals(e)"); ……………... 결 과 % java Equal c==b b.equals(a)
2.2.3 문자열과 배열 문자열과 배열은 String 클래스로 제공 1. 문자열: String 클래스 예: 기본 자료 유형이 아님 1. 문자열: String 클래스 String은 문자열을 표현하기 위해 자바 언어에서 제공하는 클래스 String 클래스는 내용을 변경할 수 없다 Stirng 클래스의 '+' 연산자는 두 개의 문자열을 결합하는 연산자이다. '+' 연산자를 이용해서 문자열을 결합하는 경우에, String 클래스의 내용이 변경되는 것이 아니라 새로운 객체가 생성 예: String message; //변수 message를 문자열 클래스 유형의 변수로 선언. ..... message = "hello "; // message에 "hello "라는 값을 할당. message += "world !"; // "hello "와 "world !"를 결합해서 message 변수에 할당
2.2.3 문자열과 배열 2. 배열 예 자바에서 배열은 동적으로 생성할 수 있는 클래스 C 언어에서와 유사하게 사용 int k[ ]; // int 배열을 선언. int[ ] k 와 동일 배열은 선언한 후에 new 연산자를 사용해서 allocate 하여야 한다. 위에서처럼 선언만 한 경우에는 사용할 수 없다. 사용하기 전에 반드시 new 연산자를 이용해서 배열 클래스를 생성 "int k[10];" 형태로는 사용할 수 없다. 배열의 인덱스는 0 ~ length - 1까지 사용될 수 있고, C 언어와는 달리 배열의 크기를 벗어나는 인덱스는 사용할 수 없다.
2.2.3 문자열과 배열 예: 배열의 초기화 int[] k = {1, 2, 3}; 아래와 동일한 의미 int k[ ]; k = new int[3]; // k[ ] = new int[3]은 사용할 수 없다. k[0] = 1; k[1] = 2; k[2] = 3; 배열은 기본 자료 유형뿐만 아니라 클래스의 객체도 포함할 수 있다 문자열의 배열을 사용하는 경우이다. String[] names = new String[50];
2.2.3 문자열과 배열 예제: Gauss.java 1 class Gauss { 2 public static void main(String[] args) { 3 int[] ia = new int[101]; 4 for (int i = 0; i < ia.length; i++) 5 ia[i] = i; 6 7 int sum = 0; 8 for (int i = 0; i < ia.length; i++) 9 sum += ia[i]; 10 ………...
2.2.3 문자열과 배열 3. 다차원 배열 예: 자바에서는 다음과 같은 형태로 다차원 배열을 선언할 수 있다. int twoDarray[][]; String threeDarray[][][]; 다차원 배열을 선언한 뒤에 new 연산자를 이용해서 배열을 생성시켜 준다. 다차원 배열에서 C 언어와 다른 점 (2차원 배열을 예) C 언어에서는 배열이 격자 모양으로 가로 세로의 크기가 고정 자바에서는 다양한 형태의 배열을 가질 수 있다.
2.2.3 문자열과 배열 예: twoDarray = new int[4][5]; 이것은 4 x 5의 격자 모양의 배열을 만든 것이다. twoDarray = new int[4][]; 이것은 전체 배열의 크기는 4로 만들고, 배열의 각 컴포넌트는 필요한 경우에 동적으로 크기를 결정
2.2.3 문자열과 배열 예제: MultiDarray.java 1 class MultiDarray { 2 public static void main(String args[]) { 3 char stars[][]; 4 5 stars = new char[6][]; 6 for(int i=0; i < stars.length; i++) { 7 stars[i] = new char[i+1]; 8 for(int j=0; j < stars[i].length; j++) { 9 stars[i][j] = '*'; 10 } ………….
2.3 연산자 1. 연산자 우선 순위
2.3 연산자 2. ++, -- 연산자 변수의 값을 하나 증가시키거나 감소시키는 작업은 자주 발생하기 때문에 i = i + 1과 같이 길게 쓰는 대신에 i++ 라는 짧은 형태로 사용 예: i = 0; System.out.println("++i = " + ++i); 위와 같은 경우에 ++i = 1이 출력. 즉, i의 값이 1만큼 증가 i의 값이 증가하고, println() 함수가 수행 System.out.println("i++ = " + i++); i++ = 0이 출력될 것이다. println() 함수가 수행되고 i의 값이 증가
2.3 연산자 3. 형 변환과 캐스트 연산자 예: 형 변환은 자동적으로 발생, 또는 프로그래머가 명시적으로 형 변환을 지정 자동적인 형 변환은 할당문(=), 함수 호출, 문자열로 형 변환, 프로모션(promotion)에서 발생 문자열로 형 변환은 다른 자료형이 문자열과 '+' 연산을 하는 경우에 문자열로 형 변환이 발생 예: int j = 10; System.out.println("j = " + j); int 타입의 j가 문자열로 변환
2.3 연산자 예: 프로모션 숫자 자료형이 다른 오퍼랜드에 따라 더 큰 타입으로 자동적으로 형 변환 int j = 5; double f = 16.0 + j; 정수 j의 5는 플로팅 포인트형 16.0과 덧셈을 수행하기 위해 5.0으로 형 변환 일반적으로 작은 타입에서 큰 타입으로 형 변환은 자동적으로 이루어짐 정보를 잃어버리지 않기 때문에 큰 타입에서 작은 타입으로의 형 변환은 자동적으로 이루어지지 않음 정보를 잃어버릴 수 있기 때문에 프로그래머가 명시적으로 캐스트 연산자를 사용
2.3 연산자 레퍼런스형에서의 형 변환 작은 형에서 큰 형으로 형 변환은 자동적으로 큰 형에서 작은 형으로의 형 변환은 본래 형이 작은 형인 경우에만 캐스트 연산자를 사용해서 가능 오른편 그림처럼 Animal 클래스에서 Mammal 클래스로 상속 관계가 있고, Ape 클래스는 Mammal 클래스로부터 상속받는다. Human 클래스는 Mammal 클래스로부터 상속받는다.
2.3 연산자 4. 쉬프트 연산자 (>>, >>>, <<) >> 비트 연산자는 원하는 비트만큼 오른쪽으로 쉬프트(shift)하는 연산자 123 >> 2라고 하면 123을 오른쪽으로 2비트 쉬프트 >> 연산을 하는 경우에는 부호 확장(sign extension)이 발생 123(10) = 00000000000000000000000001111011(2)이고 오른쪽으로 2비트 이동하는 경우에 왼쪽 2비트는 부호 값인 0으로 -123(10) = 11111111111111111111111110000101(2)이다. 오른쪽으로 2비트 이동하는 경우에 맨 왼쪽 2비트는 부호 값인 1로 >>> 비트 연산자는 >>과는 달리 부호 확장이 없고 항상 맨 왼쪽을 항상 0으로 << 비트 연산자는 왼쪽으로 쉬프트하고, 맨 오른쪽 비트는 항상 0으로
2.3 연산자 결 과 주 의 % java Shift 123 >> 2 = 30 -123 >> 2 = -31 -123 >>> 2 = 1073741793 123 << 2 = 492 -123 << 2 = -492 -123 << 32 = -123 주 의 쉬프트 연산자는 정수형(byte, short, char, int, long)에만 적용되고, 연산이 수행되기 전에 int와 long 타입으로 형 변환이 된 후 연산이 이루어짐 주의할 점은 int 형은 32 비트이고, long 형은 64 비트이기 때문에 int 타입을 32 비트 (long은 64 비트) 이상 쉬프트시킨다는 것은 의미가 없다. 따라서 int 타입에서 32 비트 (long은 64 비트) 이상의 쉬프트는 32로 모듈라(%) 연산하여 나머지만 이용된다. Shift 예제에서 -123 >>> 32는 32%32 = 0이므로 쉬프트가 되지 않는다.
2.3 연산자 5. 논리 연산자 (&&, ||) &&는 논리 연산자 AND이고, ||는 논리 연산자 OR이다. &&과 ||는 모두 숏써킷(short circuit) 로직(logic)을 사용한다. 숏써킷 로직 if ( 참 || ??) if ( 거짓 && ??) 에서 각 if 문의 ?? 부분은 값이 어떻든 간에 전체 결과에 영향을 미치지않음. 뒷부분은 계산할 필요가 없는 경우에 계산하지 않는 것을 숏써킷 로직이라 함 예 String msg = null; if((msg != null) && (msg.equals("hello")) ... msg가 null일 때, 숏써킷 로직를 사용하기 때문에 msg.equals() 함수를 수행하지 않는다.
2.3 연산자 6. instanceof 연산자 7. 비트 연산자 (&, | , ^) 연산자의 왼쪽에 있는 객체가 연산자의 오른쪽에 있는 클래스의 인스턴스이면 true를 아니면 false를 리턴하는 연산자이다. if( b1 instanceof Button) ... 7. 비트 연산자 (&, | , ^) &, |, ^ 연산자는 모두 정수형 (byte, short, char, int, long)에 적용되면 bitwise AND, bitwise OR, bitwise XOR 연산이 수행된다 boolean 형에 적용되면 논리 연산자 AND, 논리 연산자 OR, 논리 연산자 XOR 연산이 수행된다 &과 |는 숏써킷 로직을 사용하지 않기 때문에 논리 연산에서 숏써킷 로직을 사용하는 것을 원하지 않는 경우에는 &&, || 대신에 &, |를 사용할 수 있다
2.4 제어구조 1. if 문 자바의 제어 구조는 C나 C++와 거의 동일 형태 1: if (boolean) { statements; } else { } 형태 2: } else if(boolean) {
2.4 제어구조 예제: HelloSomebody.java 결 과 1 class HelloSomebody { 2 3 public static void main (String args[]) { 4 5 System.out.print("Hello "); 6 if (args.length > 0) { 7 System.out.println(args[0]); 8 } 9 else { 10 System.out.println("?????"); 11 } …………. 결 과 % javac HelloSomebody.java % java HelloSomebody CHOI Hello CHOI --> 실행 결과 % java HelloSomebody Hello ????? --> 실행 결과
2.4 제어구조 args[3] java HelloSomebody CHOI KIM T args[0] args[1]
2.4 제어구조 2. for 문 예제: HelloFriends.java 결 과 형태: for(init_expr; test_expr2; increment_expr3) { statements; } 예제: HelloFriends.java 1 class HelloFriends { 3 public static void main (String args[]) { 5 int i; 7 System.out.print("Hello "); 8 for (i=0; i < args.length; i++) { 9 System.out.print(args[i]); 10 System.out.print(" "); 11 } 12 System.out.println(); ………. 결 과 % javac HelloFriends.java % java HelloFriends CHOI LEE KIM SONG PARK YANG Hello CHOI LEE KIM SONG PARK YANG --> 실행 결과
2.4 제어구조 3. while 문 예제: HelloFriendsWhile.java 결 과 형태: while(boolean) { statements; } 예제: HelloFriendsWhile.java 1 class HelloFriendsWhile { 3 public static void main (String args[]) { 5 int i = 0; 7 System.out.print("Hello "); 8 while(i < args.length) { 9 System.out.print(args[i]); 10 System.out.print(" "); 11 i++; 12 } ………….. 결 과 % javac HelloFriendsWhile.java % java HelloFriendsWhile CHOI LEE KIM SONG PARK YANG Hello CHOI LEE KIM SONG PARK YANG --> 실행 결과
2.4 제어구조 4. do-while 문 do-while 문은 while문과 동일 하지만, do-while 문은 최소 한번은 수행됨 형태: do { statements; } while(boolean);
2.4 제어구조 예제: HelloFriendsDoWhile.java 결 과 1 class HelloFriendsDoWhile { 3 public static void main (String args[]) { 5 int i = 0; 7 System.out.print("Hello "); 8 do { 9 System.out.print(args[i]); 10 System.out.print(" "); 11 i++; 12 } while(i < args.length); …………. 결 과 % javac HelloFriendsDoWhile.java % java HelloFriendsDoWhile CHOI LEE KIM SONG PARK YANG Hello CHOI LEE KIM SONG PARK YANG --> 실행 결과
2.4 제어구조 5. switch 문 스위치문의 expr 부분에는 long을 제외한 정수형 타입 (byte, short, char, int)이 들어갈 수 있다. 문자열이나 실수형 및 long 등은 expr 부분에 들어갈 수 없다. 형태: switch(expr) { case expr1: statements; break; case expr2: default: }
2.4 제어구조 예제: YesOrNo.java 1 import java.io.*; 3 class YesOrNo { 4 public static void main(String args[]) { 6 System.out.println("Yes/No ?"); 7 try { 8 char c = (char)System.in.read(); 9 10 switch(c) { 11 case 'y': 12 case 'Y': 13 System.out.println("Yes"); 14 break; 15 case 'n': 16 case 'N': 17 System.out.println("No"); 18 break; 19 default: 20 System.out.println("Wrong answer"); 21 break; 22 } 23 }catch(IOException e) { } ………..
2.4 제어구조 6. try - catch - finally 문 형태: try { ..... // 예외 상황이 발생할 수 있는 코드들 } catch(ExceptionName ex) { .... // 예외 상황이 발생하였을 때 처리하는 루틴 } finally { // 항상 수행되는 부분 }
2.4 제어구조 예제: NoTry.java 결 과 1 class NoTry { 2 public static void main(String args[]) { 3 String msg[] = {"hello", "world", "?”}; 4 int n = msg.length; 6 for(int i =0; i <= n; i++) { 7 System.out.println(msg[i]); 8 } 9 System.out.println("Every thing is done."); ………... 결 과 % java NoTry hello world ? java.lang.ArrayIndexOutOfBoundsException: 3 at NoTry.main(NoTry.java:7)
2.4 제어구조 예제: TryTest.java 결 과 1 class TryTest { 2 public static void main(String args[]) { 3 String msg[] = {"hello", "world", "?”}; 4 int n = msg.length; 6 for(int i =0; i <= n; i++) { 7 try { 8 System.out.println(msg[i]); 9 } catch (ArrayIndexOutOfBoundsException ex) { 10 System.out.println("Oops, sorry. There is an exception."); 11 } 12 } 13 System.out.println("Every thing is done."); ………... 결 과 % java TryTest hello world ? Oops, sorry. There is an exception. Every thing is done.
2.4 제어구조 7. break 문 예제: Break.java break 문은 가장 가까운 for, while, do, switch 문에서 빠져나갈 때 사용 예제: Break.java 1 import java.io.IOException; 3 class Break { 4 public static void main(String args[]) { 6 System.out.println("Enter 'q' to exit."); 7 quit: 8 for(int i=0; i < 10; i++) { 9 for(int j=0; j < 10; j++) { 10 if(j%7 == 4) { 11 try { 12 int b = System.in.read(); 13 if(b == 'q') 14 break quit; 15 }catch(IOException ioe) {} 16 } else if(j%7 == 6) 17 break; 18 else 19 System.out.print("(" + i +","+j+")"); ……...
2.4 제어구조 8. continue 문 예제: Continue.java while, do, for 문에서 continue문 다음은 수행하지 않고, 반복문의 조건 부분을 실행한다. 예제: Continue.java 1 class Continue { 2 public static void main(String args[]) { 3 int sum =0; 4 System.out.println("continue 테스트."); 5 6 quit: 7 for(int i=0; i < 10; i++) { 8 for(int j=i; j < 2*i; j++) { 9 System.out.print("("+i+","+j+","+sum+")"); 10 if(j%3 == 0) 11 continue; 12 if(sum > i*10) 13 continue quit; 14 else 15 sum += j; ……...
2.4 제어구조 9. 함수 호출 자바에서 함수 호출은 call-by-value 방식을 사용한다. 레퍼런스 타입의 아규먼트(클래스, 인터페이스, 배열)인 경우 레퍼런스(포인터)를 사용하기 때문에 call-by-reference의 효과가 발생