명품 JAVA Essential 1 2 학습목표 1. 자바의프로그램의기본구조이해 2. 자바의데이터타입이해 3. 자바에서키입력받는방법이해 4. 자바의연산자이해 5. 자바의조건문 (if-else와 switch) 이해 1
예제 2-1 : Hello, 자바프로그램의기본구조 3 /* * 소스파일 : Hello.java */ public class Hello {? Hello 30 public static int sum(int n, int m) { return n + m; 메소드 클래스 // main() 메소드에서실행시작 public static void main(string[] args) { int i = 20; int s; char a; s = sum(i, 10); // sum() 메소드호출 a = '?'; System.out.println(a); // 문자 '?' 화면출력 System.out.println("Hello"); // "Hello" 문자열화면출력 System.out.println(s); // 정수 s 값화면출력 메소드 예제 2-1 설명 4 클래스만들기 Hello 이름의클래스선언 class 키워드로클래스선언 public 으로선언하면다른클래스에서접근가능 주석문 public class Hello { 클래스코드는 { 내에모두작성 // 한라인주석 메소드 C/C++ 에서의함수를메소드로지칭 클래스바깥에작성할수없음 메소드호출 public static int sum(int n, int m) {... sum() 메소드호춯 s = sum(i, 10); /* 여러행주석 */ main() 메소드 자바프로그램은 main() 에서실행시작 public static void main(string[] args) { sum() 호출시변수 i 의값과정수 10 을전달 sum() 의 n, m 에각각 20, 10 값전달 sum() 은 n 과 m 값을더한 30 리턴 변수 s 는정수 30 을전달받음 public static void 으로선언 String[] args 로실행인자를전달받음 2
예제 2-1 설명 ( 계속 ) 5 변수선언 변수타입과변수이름선언 화면출력 표준출력스트림에메시지출력 int i=20; char a; System.out.println("Hello"); // "Hello" 화면출력 문장 메소드내에서선언된변수는지역변수 지역변수는메소드실행이끝나면저장공간반환 ; 로한문장의끝을인식 표준출력스트림 System.out 의 println() 메소드호출 println() 은여러타입의데이터출력가능 println() 은출력후다음행으로커서이동 int i=20; s = sum(i, 20); 식별자 (identifier) 6 식별자란? 클래스, 변수, 상수, 메소드등에붙이는이름 식별자의원칙 @, #,! 와같은특수문자, 공백또는탭은식별자로사용할수없으나 _, $ 는사용가능 유니코드문자사용가능. 한글사용가능 자바언어의키워드는식별자로사용불가 식별자의첫번째문자로숫자는사용불가 _ 또는 $ 를식별자첫번째문자로사용할수있으나일반적으로잘사용하지않는다. 불린리터럴 (true, false) 과널리터럴 (null) 은식별자로사용불가 길이제한없음 대소문자구별 int barchart; 와 int barchart; 는서로다른식별자선언 3
식별자이름사례 7 사용가능한예 int name; char student_id; // '_' 사용가능 void $func() { // '$' 사용가능 class Monster3 { // 숫자사용가능 int whatsyournamemynameiskitae; // 길이제한없음 int barchart; int barchart; // 대소문자구분. barchart와 barchart는다름 int 가격 ; // 한글이름사용가능 잘못된예 int 3Chapter; // 식별자의첫문자로숫자사용불가 class if { // 자바의예약어 if 사용불가 char false; // false 사용불가 void null() { // null 사용불가 class %calc { // '%' 는특수문자 자바의데이터타입 8 자바의데이터타입 기본타입 : 8 개 boolean char byte short int long float double 레퍼런스타입 : 1 개이며용도는다음 3 가지 클래스 (class) 에대한레퍼런스 인터페이스 (interface) 에대한레퍼런스 배열 (array) 에대한레퍼런스 레퍼런스는 C/C++ 의포인터와유사한개념그러나메모리주소는아님 4
자바의기본타입 9 특징 기본타입의크기는 CPU 나운영체제에따라변하지않음 문자열 10 문자열은기본타입이아님 String 클래스로문자열표현 문자열리터럴 JDK, 한글, 계속하세요 String toolname="jdk"; 문자열이섞인 + 연산 -> 문자열연결 toolname + 1.8 -> "JDK1.8" "(" + 3 + "," + 5 + ")" -> "(3,5)" System.out.println(toolName + " 이출시됨 "); // "JDK1.8이출시됨 " 출력 5
변수와선언 11 변수 프로그램실행중에값을임시저장하기위한공간 변수값은프로그램수행중변경될수있음 변수선언 데이터타입에서정한크기의메모리할당 int radius; double weight = 75.56; char c1, c2, c3 = 'c'; 리터럴과정수리터럴 12 리터럴 (literal) 프로그램에서직접표현한값 정수, 실수, 문자, 논리, 문자열리터럴있음 정수리터럴 10 진수, 8 진수, 16 진수, 2 진수리터럴 15 -> 10진수리터럴 15 015 -> 0으로시작하면 8진수. 십진수로 13 0x15 -> 0x로시작하면 16진수. 십진수로 21 0b0101 -> 0b로시작하면 2진수. 십진수로 5 int n = 15; int m = 015; int k = 0x15; int b = 0b0101; 정수리터럴은 int 형으로컴파일 long 타입리터럴은숫자뒤에 L 또는 l 을붙여표시 ex) long g = 24L; 6
실수리터럴 13 소수점형태나지수형태로표현한실수 12. 12.0.1234 0.1234 1234E-4 실수타입리터럴은 double 타입으로컴파일 double d = 0.1234; double e = 1234E-4; // 1234E-4 = 1234x10-4 이므로 0.1234 와동일 숫자뒤에 f(float) 나 d(double) 을명시적으로붙이기도함 float f = 0.1234f; double w =.1234D; //.1234D 와.1234 는동일 문자리터럴 14 단일인용부호 (' ') 로문자표현 'a', 'W', ' 가 ', '*', '3', '7' char a = 'W'; char b = ' 글 '; char c = \uae00; // ' 글 ' 의유니코드값 (ae00) 사용 \u 다음에 4 자리 16 진수로, 2 바이트의유니코드 (Unicode) 특수문자리터럴은백슬래시 (\) 로시작 7
논리타입리터럴 15 논리값표시 true 또는 false 뿐 boolean 타입변수에치환하거나조건문에이용 boolean a = true; boolean b = 10 > 0; // 10>0 가참이므로 b 값은 true boolean c = 1; // 타입불일치오류. C/C++ 와달리자바에서 1,0 을참, 거짓으로사용불가 while(true) { // 무한루프... Tip: 기본타입이외리터럴 16 null 리터럴 레퍼런스에대입사용 int n = null; String str = null; // 기본타입에사용불가 문자열리터럴 ( 스트링리터럴 ) 이중인용부호로묶어표현 "Good", "Morning", " 자바 ", "3.19", "26", "a" 문자열리터럴은 String 객체로자동처리 String str = Good"; 8
상수 17 상수선언 final 키워드사용 선언시초깃값지정 실행중값변경불가 상수선언사례 final int LENGTH = 20; static final double PI = 3.141592; // static 으로선언하는것이바람직 (5 장참조 ) 예제 2-2 : 리터럴, 상수사용하기 18 원의면적을구하는프로그램을작성하라. public class CircleArea { public static void main(string[] args) { final double PI = 3.14; // 원주율을상수로선언 double radius = 10.2; // 원의반지름 double circlearea = radius*radius*pi; // 원의면적계산 // 원의면적을화면에출력한다. System.out.print(" 반지름 " + radius + ", "); System.out.println(" 원의면적 = " + circlearea); 반지름 10.2, 원의면적 = 326.68559999999997 9
타입변환과자동타입변환 19 타입변환 한타입의값을다른타입의값으로변환 자동타입변환 컴파일러에의해원래의타입보다큰타입으로자동변환 치환문 (=) 이나수식내에서타입이일치하지않을때 long m = 25; // 25 는 int 타입 25 가 long 타입으로자동변환 double d = 3.14 * 10; // 실수연산위해 10 이 10.0 으로자동변환 2 5 32 비트 m 0 0 2 5 64 비트 강제타입변환 20 강제타입변환 개발자의의도적타입변환 () 안에개발자가명시적으로타입변환지정 int n = 300; byte b = n; // int 타입이 byte 로자동변환안됨 byte b = (byte)n; 로수정 강제변환은값손실우려 byte b = (byte)n; 에따른손실 double d = 1.9; int n = (int)d; // n = 1 정수 300 n 0x0000012C 32 비트 b 0x2C 8 비트 정수 44 강제타입변환으로소숫점이하 0.9 손실 10
예제 2-3 : 타입변환 21 자동타입변환과강제타입변환이들어있는코드이다. 실행결과는무엇인가? public class TypeConversion { public static void main(string[] args) { byte b = 127; int i = 100; System.out.println(b+i); // b가 int 타입으로자동변환 System.out.println(10/4); System.out.println(10.0/4); // 4가 4.0으로자동변환 System.out.println((char)0x12340041); System.out.println((byte)(b+i)); System.out.println((int)2.9 + 1.8); System.out.println((int)(2.9 + 1.8)); System.out.println((int)2.9 + (int)1.8); 227 2 2.5 A -29 3.8 4 3 자바의키입력과 System.in 22 System.in 키보드와연결된자바의표준입력스트림 입력되는키를바이트 ( 문자아님 ) 로리턴하는저수준스트림 System.in 을직접사용하면바이트를문자나숫자로변환하는많은어려움있음 11
Scanner 와 Scanner 객체생성 23 Scanner 클래스 읽은바이트를문자, 정수, 실수, 불린, 문자열등다양한타입으로변환하여리턴 java.util.scanner 객체생성 import java.util.scanner; // 임포트문필요... Scanner a = new Scanner(System.in); // Scanner 객체생성 키보드에연결된 System.in 에게키를읽게하고, 원하는타입으로변환하여리턴 Scanner 를이용한키입력 24 Scanner 에서키입력받기 Scanner 는입력되는키값을공백으로구분되는토큰단위로읽음 공백문자 : \t, \f, \r,, \n 개발자가원하는타입값으로쉽게읽을수있음 Scanner scanner = new Scanner(System.in); String name = scanner.next(); // "Kim" String city = scanner.next(); // "Seoul" int age = scanner.nextint(); // 20 double weight = scanner.nextdouble(); // 65.1 boolean single = scanner.nextboolean(); // true 12
Scanner 주요메소드 25 예제 2-4 : Scanner 를이용한키입력연습 26 Scanner 를이용하여이름, 도시, 나이, 체중, 독신여부를입력받고다시출력하는프로그램을작성하라. import java.util.scanner; public class ScannerEx { public static void main(string args[]) { System.out.println(" 이름, 도시, 나이, 체중, 독신여부를빈칸으로분리하여입력하세요 "); Scanner scanner = new Scanner(System.in); String name = scanner.next(); System.out.println(" 당신의이름은 " + name + " 입니다."); String city = scanner.next(); System.out.println(" 당신이사는도시는 " + city + " 입니다."); int age = scanner.nextint(); System.out.println(" 당신의나이는 " + age + " 살입니다."); double weight = scanner.nextdouble(); // 실수토큰읽기 System.out.println(" 당신의체중은 " + weight + "kg 입니다."); boolean single = scanner.nextboolean(); System.out.println(" 당신은독신여부는 " + single + " 입니다."); scanner.close(); 이름, 도시, 나이, 체중, 독신여부를빈칸으로분리하여입력하세요. Kim Seoul 20 65.1 true 당신의이름은 Kim 입니다. 당신이사는도시는 Seoul 입니다. 당신의나이는 20 살입니다. 당신의체중은 65.1kg 입니다. 당신은독신여부는 true 입니다. 13
식과연산자 27 연산 주어진식을계산하여 결과를얻어내는과정 산술연산자 28 산술연산자 더하기 (+), 빼기 (-), 곱하기 (*), 나누기 (/), 나머지 (%) / 와 % 응용 10 의자리와 1 의자리분리 69/10 = 6 몫 6 69%10 = 9 나머지 9 x 가홀수인지판단 int r = n % 2; // r 이 1 이면 n 은홀수, 0 이면짝수 n 의값이 3 의배수인지확인 int s = n % 3; // s 가 0 이면 n 은 3 의배수 14
예제 2-5 : / 와 % 산술연산자응용 29 초단위의정수를입력받고, 몇시간, 몇분, 몇초인지구하여출력하는프로그램을작성하라. import java.util.scanner; public class ArithmeticOperator { public static void main(string[] args) { Scanner scanner = new Scanner(System.in); System.out.print(" 정수를입력하세요 :"); int time = scanner.nextint(); // 정수입력 int second = time % 60; // 60 으로나눈나머지는초 int minute = (time / 60) % 60; // 60 으로나눈몫을다시 60 으로나눈나머지는분 int hour = (time / 60) / 60; // 60 으로나눈몫을다시 60 으로나눈몫은시간 System.out.print(time + " 초는 "); System.out.print(hour + " 시간, "); System.out.print(minute + " 분, "); System.out.println(second + " 초입니다."); scanner.close(); 정수를입력하세요 :4000 4000 초는 1 시간, 6 분, 40 초입니다. 비트연산자 30 피연산자의각비트들을대상으로하는연산 15
비트연산응용 ( 옵션 ) 31 냉장고에는 8 개의센서가있고이들은 flag 변수와연결되어있다고할때, 냉장고의온도가 0 도이상으로올라가면비트 3 이 1 이되고, 0 도이하이면비트 3 이 0 을유지한다. flag 7 6 5 4 3 2 1 0 문제 ) 현재냉장고의온도가 0 도이상인지판단하는코드는? byte flag = 0b00001010; // 각비트는 8 개의센서값을가리킴 if(flag & 0b00001000 == 0) System.out.print(" 온도는 0 도이하 "); else System.out.print(" 온도는 0 도이상 "); 온도는 0 도이상 & x x x x Y x x x 0 0 0 0 1 0 0 0 0 0 0 0 Y 0 0 0 Y 비트가 0 이면 & 결과는 0 시프트연산자 32 16
예제 2-6 : 비트연산자와시프트연산자사용하기 33 다음코드의실행결과는무엇인가? public class BitShiftOperator { public static void main(string[] args) { short a = (short)0x55ff; short b = (short)0x00ff; // 비트연산 System.out.println("[ 비트연산결과 ]"); System.out.printf("%04x\n", (short)a & b); // 비트 AND System.out.printf("%04x\n", (short)a b); // 비트 OR System.out.printf("%04x\n", (short)a ^ b); // 비트 XOR System.out.printf("%04x\n", (short)~a); // 비트 NOT printf("%04",...) 메소드는값을 4 자리의 16 진수로출력하고빈곳에는 0 을삽입한다. byte c = 20; // 0x14 byte d = -8; // 0xf8 c 에 4 를곱한결과가나타난다 // 시프트연산 System.out.println("[ 시프트연산결과 ]"); 4로나누기효과 System.out.println(c << 2); // c를 2비트왼쪽시프트 System.out.println(c >> 2); // c를 2비트오른쪽시프트. 양수이므로 0 삽입 System.out.println(d >> 2); // d를 2비트오른쪽시프트. 음수이므로 1 삽입 System.out.printf("%x\n", (d >>> 2)); // d를 2비트오른쪽시프트. 0 삽입 d 가음수이어도 0 삽입. 4 로나누기효과없음 [ 비트연산결과 ] 00ff 55ff 5500 aa00 [ 시프트연산결과 ] 80 5-2 3ffffffe 비교연산자, 논리연산자 34 비교연산자 : 두개의값을비교하여 true/false 결과 논리연산자 : 두개의논리값에논리연산. 논리결과 (age >= 20) && (age < 30) // 나이 (int age) 가 20대인경우 (c >= 'A') && (c <= 'Z') // 문자 (char c) 가대문자인경우 (x>=0) && (y>=0) && (x<=50) && (y<=50) // (x,y) 가 (0,0) 과 (50,50) 의사각형내에있음 20 <= age < 30 // 조건식문법오류 17
예제 2-7 : 비교연산자와논리연산자사용하기 35 다음소스의실행결과는무엇인가? public class LogicalOperator { public static void main (String[] args) { System.out.println('a' > 'b'); System.out.println(3 >= 2); System.out.println(-1 < 0); System.out.println(3.45 <= 2); System.out.println(3 == 2); System.out.println(3!= 2); System.out.println(!(3!= 2)); System.out.println((3 > 2) && (3 > 4)); System.out.println((3!= 2) (-1 > 0)); System.out.println((3!= 2) ^ (-1 > 0)); false true true false false true false false true true 대입연산자, 증감연산자 36 int a, b = 4; a = b++; // b 가 a 에대입된후 b 증가. 결과 a=4, b=5 int a, b = 4; a = ++b; // b 가증가한후, b 값이 a 에대입. 실행결과 a=5, b=5 18
예제 2-8 : 대입연산자와증감연산자사용하기 37 다음코드의실행결과는무엇인가? public class AssignmentIncDecOperator { public static void main(string[] args) { int a=3, b=3, c=3; // 대입연산자사례 a += 3; // a=a+3 = 6 b *= 3; // b=b*3 = 9 c %= 2; // c=c%2 = 1 System.out.println("a=" + a + ", b=" + b + ", c=" + c); int d=3; // 증감연산자사례 a = d++; // a=3, d=4 System.out.println("a=" + a + ", d=" + d); a = ++d; // d=5, a=5 System.out.println("a=" + a + ", d=" + d); a = d--; // a=5, d=4 System.out.println("a=" + a + ", d=" + d); a = --d; // d=3, a=3 System.out.println("a=" + a + ", d=" + d); a=6, b=9, c=1 a=3, d=4 a=5, d=5 a=5, d=4 a=3, d=3 조건연산자?: 38 opr1?opr2:opr3 3 개의피연산자로구성된삼항 (ternary) 연산자 opr1이 true이면, 연산식의결과는 opr2, false이면 opr3 if-else을조건연산자로간결하게표현가능 x 와 y 중에서큰값을 big 에저장 int x = 5; int y = 3; int big; if(x>y) big = x; else big = y; int big = (x>y)?x:y; 19
예제 2-9 : 조건연산자사용하기 39 다음코드의실행결과는무엇인가? public class TernaryOperator { public static void main (String[] args) { int a = 3, b = 5; System.out.println(" 두수의차는 " + ((a>b)?(a-b):(b-a))); 두수의차는 2 조건문 단순 if 문, if-else 문 40 단순 if 문 if 의괄호안에조건식 ( 논리형변수나논리연산 ) 실행문장이단일문장인경우둘러싸는 {, 생략가능 if-else 문 조건식이 true 면실행문장 1, false 이면실행문장 2 실행 if(n%2 == 0) { System.out.print(n); System.out.println(" 은짝수입니다."); if(score >= 80 && score <= 89) System.out.println(" 학점은 B 입니다."); if(score >= 90) System.out.println(" 합격입니다."); else System.out.println(" 불합격입니다."); 20
예제 2-10 : if-else 사용하기 41 나이를입력받아 20 대인지판별하는프로그램을작성하라 import java.util.scanner; public class Twenties { public static void main(string[] args) { Scanner scanner = new Scanner(System.in); System.out.print(" 나이를입력하시오 :"); int age = scanner.nextint(); if((age>=20) && (age<30)) { // age가 20~29 사이인지검사 System.out.print("20대입니다. "); System.out.println("20대라서행복합니다!"); else System.out.println("20대가아닙니다."); scanner.close(); 나이를입력하시오 :23 20 대입니다. 20 대라서행복합니다! 다중 if-else 문 42 다중 if 문 조건문이너무많은경우, switch 문사용권장 if(score >= 90) { // score 가 90 이상 grade = 'A'; else if(score >= 80) { // 80 이상 90 미만 grade = 'B'; else if(score >= 70) { // 70 이상 80 미만 grade = 'C'; else if(score >= 60) { // 60 이상 70 미만 grade = 'D'; else { // 60 미만 grade = 'F'; 21
예제 2-11 : 다중 if-else 를이용하여학점매기기 43 다중 if-else 문을이용하여입력받은성적에대해학점을부여하는프로그램을작성해보자. import java.util.scanner; public class Grading { public static void main(string[] args) { char grade; Scanner scanner = new Scanner(System.in); System.out.print(" 점수를입력하세요 (0~100):"); 점수를입력하세요 (0~100):89 학점은 B 입니다. int score = scanner.nextint(); // 점수읽기 if(score >= 90) // score 가 90 이상 grade = 'A'; else if(score >= 80) // score 가 80 이상 90 미만 grade = 'B'; else if(score >= 70) // score 가 70 이상 80 이만 grade = 'C'; else if(score >= 60) // score 가 60 이상 70 이만 grade = 'D'; else // score 가 60 이만 grade = 'F'; System.out.println(" 학점은 " + grade + " 입니다."); scanner.close(); 중첩 if-else 문, 예제 2-12 중첩 if-else 문사례 44 if 문이나 else 문, 혹은 if-else 문에 if 문이나 if-else 문을내포할수있다. 점수와학년을입력받아 60 점이상이면합격, 미만이면불합격을출력하라. 다만 4 학년은 70 점이상이어야합격이다. 60 점이상인경우 4 학년을구분하여처리해야한다. import java.util.scanner; public class NestedIf { public static void main(string[] args) { Scanner scanner = new Scanner(System.in); System.out.print(" 점수를입력하세요 (0~100):"); int score = scanner.nextint(); System.out.print(" 학년을입력하세요 (1~4):"); int year = scanner.nextint(); if(score >= 60) { // 60 점이상 if(year!= 4) System.out.println(" 합격!"); // 4 학년아니면합격 else if(score >= 70) System.out.println(" 합격!"); // 4 학년이 70 점이상이면합격 else System.out.println(" 불합격!"); // 4 학년이 70 점미만이면불합격 else // 60 점미만불합격 System.out.println(" 불합격!"); 점수를입력하세요 (0~100):65 학년을입력하세요 (1~4):4 불합격! scanner.close(); 22
switch 문 45 switch 문은식과 case 문의값과비교 case의비교값과일치하면해당 case의실행문장수행 break를만나면 switch문을벗어남 case의비교값과일치하는것이없으면 default 문실행 default문은생략가능 char grade='b'; switch(grade) { case 'A': System.out.println(" 축하합니다."); System.out.println(" 잘했습니다."); break; case 'B': System.out.println(" 좋아요."); break; case 'C': System.out.println(" 노력하세요."); break; default: System.out.println(" 탈락입니다!"); switch 문에서 break 문의역할 46 switch 문내의 break 문 break문을만나면 switch문벗어남 case 문에 break문이없다면, 다음 case문으로실행계속 언젠가 break를만날때까지계속내려가면서실행 break; 문을생략한다면 char grade='a'; switch (grade) { case 'A': System.out.println("90 ~ 100 점입니다."); break; case 'B': System.out.println("80 ~ 89 점입니다."); break; case 'C': System.out.println("70 ~ 79 점입니다."); break; 90 ~ 100 점입니다. 80 ~ 89 점입니다. 23
case 문의값 47 case 문의값 문자, 정수, 문자열리터럴 (JDK 1.7부터 ) 만허용실수리터럴은허용되지않음 int b; switch(b%2) { case 1 :...; break; case 2 :...; break; char c; switch(c) { case '+' :...; break; case '-' :...; break; 정수리터럴사용가능 문자리터럴사용가능 switch(a) { case a : // 오류. 변수사용안됨 case a > 3 : // 오류. 수식안됨 case a == 1 : // 오류. 수식안됨 String s = " 예 "; switch(s) { 문자열리터럴 case " 예 " :...; break; 사용가능 case " 아니요 " :...; break; 예제 2-13 : switch 문사용하기 48 1~12 사이의월을입력받아봄, 여름, 가을, 겨울을판단하여출력하라. import java.util.scanner; public class Season { public static void main(string[] args) { Scanner scanner = new Scanner(System.in); System.out.print(" 월 (1~12) 을입력하시오 :"); int month = scanner.nextint(); // 정수로월입력 switch(month) { case 3: case 4: case 5: System.out.println(" 봄입니다."); break; case 6: case 7: case 8: System.out.println(" 여름입니다."); break; case 9: case 10: case 11: System.out.println(" 가을입니다."); break; case 12: case 1: case 2: System.out.println(" 겨울입니다."); break; default: System.out.println(" 잘못된입력입니다."); scanner.close(); 월 (1~12) 을입력하시오 :3 봄입니다. 24