Download presentation
Presentation is loading. Please wait.
1
제 2 장 자바 기본 프로그래밍
2
학습 목표 자바의 프로그램의 기본 구조 이해 자바의 데이터 타입 이해 자바에서 키 입력 받는 방법 이해 자바의 연산자 이해
2 자바의 프로그램의 기본 구조 이해 자바의 데이터 타입 이해 자바에서 키 입력 받는 방법 이해 자바의 연산자 이해 자바의 조건문(if-else와 switch) 이해
3
용어 설명
4
System.out.print?? Java.lang 패키지 Java.io 패키지
5
자바 프로그램 구조 - 맛보기 예제 ? Hello2 30 메소드 클래스 메소드 /* * 맛보기 예제.
* 맛보기 예제. * 소스 파일 : Hello2.java */ public class Hello2 { 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("Hello2"); // "Hello2" 문자열 화면 출력 System.out.println(s); // 정수 s 값 화면 출력 ? Hello2 30 메소드 클래스 메소드
6
맛보기 예제 설명(계속) 클래스 만들기 public class Hello2 { } main() 메소드
클래스 본문은 ‘{’으로 시작하여 ‘}’으로 끝남 main() 메소드 public static void으로 선언되어야 함 자바 프로그램은 main() 메소드부터 실행 시작 String[] args로 실행 인자를 전달 받음(3장 참고) /* * 맛보기 예제. * 소스 파일 : Hello2.java */ public class Hello2 { 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("Hello2"); // "Hello2" 문자열 화면 출력 System.out.println(s); // 정수 s 값 화면 출력 public class Hello2 { } public static void main(String[] args) { }
7
맛보기 예제 설명(계속) 멤버 메소드 public static int sum(int n, int m) { ... }
/* * 맛보기 예제. * 소스 파일 : Hello2.java */ public class Hello2 { 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("Hello2"); // "Hello2" 문자열 화면 출력 System.out.println(s); // 정수 s 값 화면 출력 멤버 메소드 메소드 sum() 정의 - 클래스 에 속한 함수, 클래스 내에서만 선언 - 인자들의 타입과 변수 명을 ‘,’로 분리하여 나열 메소드 코드는 ‘{’과 ‘}’ 사이에 작성 변수 선언 (메소드 내) 개발자가 변수 이름을 붙이고 같이 선언 메소드 내에서 선언된 변수가 지역 변수 지역 변수는 메소드 실행이 끝나면 저장 공간 반환 public static int sum(int n, int m) { ... } int i=20; int s; char a;
8
맛보기 예제 설명(계속) 메소드 호출 s = sum(i,10); // 메소드 sum() 호출 sum() 메소드 호춯
/* * 맛보기 예제. * 소스 파일 : Hello2.java */ public class Hello2 { 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("Hello2"); // "Hello2" 문자열 화면 출력 System.out.println(s); // 정수 s 값 화면 출력 메소드 호출 sum() 메소드 호춯 sum() 메소드의 호출 시 변수 i의 값(20)과 정수 10을 전달 sum() 메소드의 인자인 n, m은 각각 20, 10의 값을 전달 받음(값에 의한 전달) sum() 메소드는 n과 m 값을 더한 30을 리턴 호출한 부분에서 변수 s는 정수 30을 전달받아 저장 s = sum(i,10); // 메소드 sum() 호출
9
sum() 메소드 호출과 리턴 n public static int sum(int n, int m) { 20
return n + m; // 30 리턴 } 20 m 10 int i=20; s = sum(i, 10); sum() 메소드 호출 s 30
10
맛보기 예 설명(계속) // main() 메소드에서 실행 시작 s=sum(1,10); // 메소드 호출 /* * 맛보기 예제
주석문 실행에 영향을 주지 않음. “//”을 만나면 행 끝날 때가지 한 라인을 주석문 처리 “/*”을 만나면 “*/”을 만날 때까지 여러 행을 주석문 처리 화면 출력 표준 출력 스트림에 메시지 출력 표준 출력 스트림 System.out의 println 메소드 호출 println은 여러가지 데이터 타입 출력 println은 주어진 인자를 출력 후 다음 행으로 커서 이동 /* * 맛보기 예제. * 소스 파일 : Hello2.java */ public class Hello2 { 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("Hello2"); // "Hello2" 문자열 화면 출력 System.out.println(s); // 정수 s 값 화면 출력 // main() 메소드에서 실행 시작 s=sum(1,10); // 메소드 호출 /* * 맛보기 예제 * 소스 파일 : Hello2.java */ System.out.println(a); // 문자 ? 화면 출력 System.out.println("Hello2"); // "Hello2" 문자열 화면 출력 System.out.println(s); // 정수 s 값 화면 출력
11
맛보기 예 설명(계속) 문장 int i=20; b = ’?’; s = sum(i, 20); 블록 b = ’?’;
;로 한 문장의 끝을 인식 한 문장을 여러 줄에 작성해도 무방 주석문 끝에는 ‘;’를 붙이지 않음 블록 블록은 {으로 시작하여 }으로 끝남 클래스 선언과 메소드 선언 등은 블록으로 구성 /* * 맛보기 예제. * 소스 파일 : Hello2.java */ public class Hello2 { 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("Hello2"); // "Hello2" 문자열 화면 출력 System.out.println(s); // 정수 s 값 화면 출력 int i=20; b = ’?’; s = sum(i, 20); b = ’?’; public class Hello2 { .... } // Hello2 클래스 선언문 끝 public static void main(String[] args) { ... } // 메소드 main() 선언문 끝
12
식별자 (identifier) 식별자란? 식별자의 원칙 대소문자 구별 클래스, 변수, 상수, 메소드 등에 붙이는 이름
‘#’, ‘!’와 같은 특수 문자, 공백 또는 탭은 식별자로 사용할 수 없으나 ‘_’, ‘$’는 사용 가능 유니코드 문자 사용 가능. 한글 사용 가능 자바 언어의 키워드는 식별자로 사용할 수 없음 식별자의 첫 번째 문자로 숫자는 사용할 수 없음 ‘_’ 또는 ‘$’를 식별자 첫 번째 문자로 사용할 수 있으나, 일반적으 로 잘 사용하지 않는다. 불린 리터럴 (true, false)와 널 리터럴(null)은 식별자로 사용할 수 없음 길이 제한 없음 대소문자 구별 Test와 test는 별개의 식별자
13
식별자 이름 사례 사용 가능한 예 잘못된 예 int name; charstudent_ID; // '_' 사용 가능
void$func() { } // '$' 사용 가능 classMonster3 { } // 숫자 사용 가능 int whatsyournamemynameiskitae; // 길이 제한 없음 int barChart; int barchart; // 대소문자 구분. barChart와 barchart는 다른 이름임 int 가격; // 한글 이름 사용 가능 int 3Chapter; // 숫자로 사용하였기 때문 class if { } // if는 자바의 예약어임 char false; // false는 사용 불가 void null() { } // null 사용 불가 class %calc { } // '%'는 특수문자
14
식별자 관례
15
예제 한글 변수 이름도 가능합니다.
16
자바 키워드 abstract continue for new switch assert default if package
synchronized boolean do goto private this break double implements protected throw byte else import public throws case enum instanceof return transient catch extends int short try char final interface static void class finally long strictfp volatile const float native super while
17
식별자 이름 붙이는 관습 기본 : 헝그리안 이름붙이기 관습 클래스 이름 변수, 메소드 이름 상수 이름
첫 번째 문자는 대문자로 시작 여러 단어가 복합되어 있을 때는 각 단어의 첫 번째 문자만 대문자로 표시 변수, 메소드 이름 첫 단어 이후 각 단어의 첫 번째 문자는 대문자로 시작 상수 이름 모든 문자를 대문자로 표시 public class HelloWorld {} class Vehicle {} class AutoVendingMachine {} int iAge; // iAge의 i는 int의 i를 표시 boolean bIsSingle; // bIsSingle의 처음 b는 boolean의 b를 표시 String strName; //strName의 str은 String의 str을 표시 public int iGetAge() {} //iGetAge의 i는 int의 i를 표시 final static double PI = ;
18
식별자 이름 자신의 이름을 넣을 수 있는 변수명을 정의해 보자. 변수명에 camel case(낙타표기법??) 사용하기
Answer: String myName = "John Q. Public"; CamelCase (also spelled camel case or camel-case) or medial capitals[1] is the practice of writing compound words or phrases in which the elements are joined without spaces, with each element's initial letter capitalized within the compound, and the first letter is either upper or lower case — as in "LaBelle", BackColor, "McDonald's", or "iPod". The name comes from the uppercase "bumps" in the middle of the compound word, suggestive of the humps of a camel. The practice is known by many other names. An early systematic use of medial capitals is the standard notation for chemical formulas, such as NaCl, that has been widely used since the 19th century. In the 1970s, medial capitals became an alternative (and often standard) identifier naming convention for several programming languages. Since the 1980s, following the popularization of computer technology, it has become fashionable in marketing for names of products and companies.
19
레퍼런스는 C/C++의 포인터와 유사한 개념
자바의 데이터 타입 자바의 데이터 타입 기본 타입 : 8 개 boolean char byte short int long float double 레퍼런스 타입 : 1개이며 용도는 3 가지 클래스(class)에 대한 레퍼런스 인터페이스(interface)에 대한 레퍼런스 배열(array)에 대한 레퍼런스 레퍼런스는 C/C++의 포인터와 유사한 개념 그러나 메모리 주소는 아님
20
자바의 기본 데이터 타입 특징 기본 데이타 타입의 크기가 정해져 있음
기본 데이타 타입의 크기는 CPU나 운영체제에 따라 변하지 않음 구현에 독립적임! 논리타입 boolean (1Byte, true 또는 false) 문자타입 char (2Bytes, Unicode) byte (1Byte, -128 ~ 127) short (2Bytes, -32,768 ~ 32,767) 정수타입 int (4Bytes ~ ) long (8Bytes, -263 ~ ) float (4Bytes -3.4E38 ~ 3.4E38) 실수타입 double (8Bytes, -1.7E308 ~ 1.7E308)
21
변수와 선언 int price; 변수 변수 선언 프로그램이 실행 중에 값을 임시 저장하기 위한 공간
변수 값은 프로그램 수행 중 변경될 수 있다. 데이터 타입에 맞는 크기의 메모리 할당 반드시 변수 선언과 값을 초기화 후 사용 변수 선언 변수의 타입 다음에 변수 이름을 적어 변수를 선언 int price; 7 price -25 데이터 타입 변수 이름 3.5
22
변수와 선언 변수 선언 사례 변수 선언과 초기화 변수에 값 대입 선언과 동시에 초기값 지정
대입 연산자인 = 다음에 식(expression) int radius; char c1, c2, c3; // 3 개의 변수를 한 번에 선언한다. double weight; int radius = 10; char c1 = ‘a', c2 = 'b', c3 = 'c'; double weight = 75.56; radius = 10 * 5; c1 = ’r’; weight = weight + 5.0;
23
정수타입 리터럴 정수타입 리터럴 : 소수점이 없는 정수를 직접 표시 8진수 : 0으로 시작하는 숫자는 모두 8진수로 인식
8진수 : 0으로 시작하는 숫자는 모두 8진수로 인식 int n = 015; // 10진수 13 16진수 : 0x로 시작하는 숫자는 16진수를 의미 int n = 0x15; // 10진수 21 10진수 : 0으로 시작하지 않는 숫자는 10진수를 의미 15, 3, 20, 55, 88 모든 정수타입 리터럴은 int형으로 처리 long 타입 리터럴은 숫자 뒤에 L 또는 l을 붙인다. 8바이트 ex) 24L, 3578l
24
정수타입 리터럴:예제
25
실수타입 리터럴 부동 소수점을 갖는 수를 표시 소수점을 찍은 실수, 지수(exponent)식으로 표현한 실수
12. 또는 12.0 .1234 또는 또는 1234E-4 숫자 뒤에 f(float)나 d(double)을 명시적으로 붙여서 표현 또는 D 또는 d → double 타입 0.1234f 또는 F → float 타입 1234D 또는 1234d → 과 같으며 double 타입 1234F 또는 1234f → 과 같으며 float 타입 실수타입 리터럴은 디폴트로 double 타입 처리
26
문자타입 리터럴 문자 한 자를 나타낸다. 단일 인용부호(‘’)로 문자 하나 표현
'a', 'W', '가', '*', '3', '7' \다음에 숫자는 8진수로서 0 ~ 337사이의 8진수만 가능 ‘\102’ -> 문자 ‘B’를 나타내는 8진수 ‘\337’ -> 문자 ‘β’를 나타내는 8진수 \u다음에 4자리 16진수, 2 바이트의 유니코드(Unicode) ‘\u0041’ -> 문자 'A'의 유니코드(0041) ‘\uae00’ -> 한글문자 '글'의 유니코드(ae00) 특수 기호는 \로 시작 ‘\b’ 백스페이스 ‘\t’ 탭 ‘\n’ 라인 피드 ‘\f’ 폼 피드 ‘\r’ 캐리지 리턴 ‘\”’ 이중 인용 부호 ‘\’’ 단일 인용 부호 ‘\\’ 백슬래쉬
27
문자타입 리터럴: 예제
28
논리타입 리터럴 논리값 표시 논리타입과 정수타입 사이의 타입 변환 허용 안 됨 true 또는 false 뿐
(i==1) 또는 (i!=0)과 같은 논리연산으로 변경해야 함 int i; if ((boolean)i) {} // 컴파일 에러 boolean a = true; boolean b = 10 > 0; // 10>0가 참이므로 b 값은 true boolean c = 1; // 타입 불일치 오류. C/C++와 달리 자바에서 1,0을 참, 거짓으로 사용 불가 while(true) { // 무한 루프 ... }
29
Tip: 기본 데이터 타입 이외 리터럴 null 리터럴 문자열 리터럴 어떠한 레퍼런스 타입의 값으로도 사용 가능
int n = null; // 기본 데이터 타입에는 사용 불가 String str = null; 문자열 리터럴 이중 인용부호로 묶어서 표현 "Good", "Morning", "자바", "3.19", "26", "a" 자바에서 문자열은 객체이므로 기본 타입이 아님 문자열 리터럴은 String 객체로 생성됨
30
문자열 문자열은 기본 타입이 아님 String 클래스로 문자열 표현 문자열 리터럴 – “JDK”, “한글”, “계속하세요”
30 문자열은 기본 타입이 아님 String 클래스로 문자열 표현 문자열 리터럴 – “JDK”, “한글”, “계속하세요” 문자열이 섞인 + 연산 -> 문자열 연결 String toolName="JDK"; toolName > "JDK1.8" "(" "," ")" -> "(3,5)" System.out.println(toolName + "이 출시됨"); // "JDK1.8이 출시됨" 출력
31
상수 final int price = 10; 상수 선언 상수 선언 사례 final 키워드 사용 값을 변경 불가
선언 시 반드시 초기값 지정 상수 선언 사례 final int price = 10; 7 price 10 -25 3.5 상수 선언 데이터 타입 상수 이름 초기화 final double PI = ; final int LENGTH = 20;
32
예제 2-1 : 변수, 리터럴, 상수 사용하기 원의 면적을 구하는 프로그램을 작성해보자.
public class CircleArea { public static void main(String[] args) { final double PI = 3.14; // 원주율을 상수로 선언 double radius = 10; // 원의 반지름 double circleArea = 0; // 원의 면적 circleArea = radius*radius*PI; // 원의 면적 계산 // 원의 면적을 화면에 출력한다. System.out.print("원의 면적 = "); System.out.println(circleArea); } 원의 면적 = 314.0
33
자동 타입 변환 byte a; int price; price = a; 자동타입 변환이 발생하는 경우 자동 타입 변환 사례
원래의 타입보다 큰 자료타입으로 바뀔 때 원본 데이터 그대로 보존 치환문(=)이나 수식 내에서 타입이 일치하지 않을 때 자동 타입 변환 사례 byte >> short/char >> int >> long >> float >> double byte a; int price; price = a; 자동타입변환 바이트타입 변수 정수타입 변수 long var; int n = 32555; byte b = 25; var = n; // int 타입에서 long 타입으로 자동 변환. var 값은 32555 var = b; // byte 타입에서 long 타입으로 자동 변환. var 값은 25 long m = 25; // 25는 int 타입 25가 long 타입으로 자동 변환 double d = 3.14 * 10; // 실수 연산 위해 10이 10.0으로 자동 변환
34
강제 타입 변환(type coertion)
강제 타입 변환 : 개발자의 의도적으로 타입 변환 강제 타입 변환 방법 강제 타입 변환 사례 실수타입이 정수타입으로 강제 변환 시 소수점 아래가 버려짐(데이터 의 손실) byte a; int price; a = (byte) price; price 정수 값을 byte 타입으로 강제타입 변환 정수타입 변수 바이트타입 변수 int n = 300; byte b = n; // int 타입이 byte로 자동 변환 안 됨 byte b = (byte)n; 로 수정 short var; int n = ; // n의 16진수 값은 0x var = (short) n; // int 타입에서 short 타입으로 강제 변환. var 값은 1 double d = 1.9; int n = (int)d; // n은 1이 된다.
35
byte 타입이 int 타입으로 자동 변환되는 사례
int i, j; byte a = 64; byte b = -2; i = a; // 자동타입 변환 j = b; // 자동타입 변환 byte a 64 변환 i = a; // 자동타입 변환 int i 64 -2 byte b 변환 int j -2 j = b; // 자동타입 변환
36
int에서 byte 타입으로, double 타입이 int 타입으로 강제 변환되는 사례
int i = 257; byte b; b = (byte)i; // 강제타입 변환 i = (int)22.9; // 강제타입 변환 double 타입을 강제로 int 타입으로 변환 22.9에서 .9가 손실되어 22만 i 에 저장된다. b = (byte)i; // 강제타입변환 int i 257 변환 손실 byte b 1 i = (int)22.9; // 강제타입 변환 int i 22 .9 손실
37
예제 2-2 : 자동 타입 변환, 강제 타입 변환 자동 타입 변환과 강제 타입 변환의 이해를 위한 예제이다.
다음 소스의 실행 결과는 무엇인가? 0x41 ‘A’ public class TypeConversion { public static void main(String[] args) { byte b = 127; int i = 100; System.out.println(b+i); System.out.println(10/4); System.out.println(10.0/4); System.out.println((char)0x ); System.out.println((byte)(b+i)); System.out.println((int) ); System.out.println((int)( )); System.out.println((int)2.9 + (int)1.8); } 227 2 2.5 A -29 3.8 4 3 Why?
38
자바에서 키 입력, System.in System.in 자바의 표준 입력 스트림
java.io의 InputStream 클래스 타입 InputStream이 바이트 스트림이므로 문자 스트림으로 변환하려 면 InputStreamReader 클래스를 이용 입력 동안 IOException이 발생가능, 예외 처리 필요(3장 참조)
39
예제 2-3 : 표준 입력 스트림을 이용한 키 입력 다음 소스의 실행 결과는 무엇인가?
System.in을 InputStreamReader에 연결하여 사용자로부터 키를 입력받는다. 입력받은 문자를 화면에 출력하고 사용자가 ctrl-z를 누르면 읽기가 종료된다. import java.io.*; public class InputExample { public static void main (String args[]) { InputStreamReader rd = new InputStreamReader(System.in); try { while (true) { int a = rd.read(); if (a == -1) // ctrl-z가 입력되면 read()는 -1을 리턴 break; System.out.println((char)a); // 입력된 문자 출력 } catch (IOException e) { System.out.println("입력 에러 발생"); 키 입려부분 자바 실습 자 바 실 습
40
Scanner를 이용한 키 입력 Scanner 클래스 java.util.Scanner 클래스 Scanner 객체 생성
import문 필요 소스 맨 앞줄에 사용 Scanner에서 키 입력 받기 Scanner는 입력되는 키 값을 공백 (‘\t’,‘ \f’,‘ \r’,‘ ’,‘ \n’)으로 구 분되는 아이템 단위로 읽음 Scanner a = new Scanner(System.in); import java.util.Scanner;
41
Scanner를 이용한 키 입력 Kim Seoul 33 65.1 사용자의 키 입력 Scanner Kim Seoul 33
공백 단위로 구분하여 읽는다. 아이템(토큰) Scanner scanner = new Scanner(System.in); String name = scanner.next(); // "Kim" String addr = scanner.next(); // "Seoul" int age = scanner.nextInt(); // 23 double weight = scanner.nextDouble(); // 65.1
42
Scanner 주요 메소드 Scanner a = new Scanner(System.in).useDelimiter("\\s|-"); // 공백 문자나 '-'을 구분자로 사용
43
예제 2-4 : Scanner를 이용한 키 입력 연습
다시 출력하는 프로그램을 작성해보자. import java.util.Scanner; public class ScannerExam { public static void main (String args[]) { Scanner a = new Scanner(System.in); System.out.println("나이, 체중, 신장을 빈칸으로 분리하여 순서대로 입력하세요"); System.out.println("당신의 나이는 " + a.nextInt() + "살입니다."); System.out.println("당신의 체중은 " + a.nextDouble() +"kg입니다."); System.out.println("당신의 신장은 " + a.nextDouble()+ "cm입니다."); } 나이, 체중, 신장을 빈칸으로 분리하여 순서대로 입력하세요 당신의 나이는 35살입니다. 당신의 체중은 75.0kg입니다. 당신의 신장은 175.0cm입니다. 키 입려부분
44
식과 연산자 a + 5 n > 23 a == n 연산 : 주어진 식을 계산하여 결과를 얻어내는 과정 연산자
연산 : 주어진 식을 계산하여 결과를 얻어내는 과정 a n > 23 a == n 연산자 (operator) 피연산자 (operand) 식(expression) 연산자의 종류 연산자 증감 ++ -- 산술 + - * / % 시프트 >> << >>> 비교 > < >= <= == != 비트 & | ^ ~ 논리 && || ! ^ 조건 ? : 대입 = *= /= += -= &= ^= |= <<= >>= >>>=
45
연산자 우선 순위 같은 우선순위의 연산자 괄호는 최우선순위 왼쪽에서 오른쪽으로 처리 높음 예외)오른쪽에서 왼쪽으로
대입 연산자, --, ++, +,-(양수 음수 부호), !, 형 변환은 오른쪽에서 왼쪽 으로 처리 괄호는 최우선순위 괄호가 다시 괄호를 포함한 경 우는 가장 안쪽의 괄호부터 먼 저 처리 ++(postfix) -- (postfix) +(양수 부호) -(양수, 음수 부호) ++(prefix) --(prefix) ~ ! 형 변환(type casting) * / % +(덧셈) –(뺄셈) << >> >>> < > <= >= instanceof == != &(비트 AND) ^( 비트 XOR) |(비트 OR) &&(논리 AND) ||(논리 OR) ? : (조건) = += -= *= /= %= &= ^= |= <<= >>= >>>= 높음 낮음
46
산술 연산자 /와 % 연산자의 특이성 정수 연산 실수 연산 /은 정수 몫. %는 정수 나머지 /는 실수 몫.
5.5/3.3 = < 나머지 없는 실수 몫 값 산술 연산자 의미 예 결과값 + 더하기 29.1 - 빼기 3 - 5 -2 * 곱하기 2.5 * 4 10.0 / 나누기 5/2 2 % 나머지 5%2 1
47
예제 2-5 : 산술 연산 예제 정수의 몫과 나머지를 이용하여 500초는
몇 시간, 몇 분, 몇 초인가를 구하는 프로그램을 작성하시오. public class ArithmeticOperator { public static void main (String[] args) { final int TIME = 500; int second; int minute; int hour second = TIME % 60; minute = (TIME / 60) % 60; hour = (TIME / 60) / 60; System.out.print(TIME + "초는 "); System.out.print(hour +"시간, "); System.out.print(minute +"분, "); System.out.println(second +"초입니다.“); } 500초는 0시간, 8분, 20초입니다.
48
비트 연산자 피 연산자의 각 비트들을 대상으로 하는 연산 비트 연산자 내용 a & b
a와 b의 각 비트들의 AND 연산. 두 비트 모두 1일 때만 1이 되며 나머지는 0 a | b a와 b의 각 비트들의 OR 연산. 두 비트 모두 0일 때만 0이 되며 나머지는 1 a ^ b a와 b의 각 비트들의 XOR 연산. 두 비트가 서로 다르면 1, 같으면 0 ~ a 단항 연산자로서, a의 각 비트들에 NOT 연산. 1을 0으로, 0을 1로 변환
49
비트 연산자의 사례 : &, |, ^, ~ & | 모두 1이므로 결과는 1 둘 중 하나라도 0이 되면 결과는 0 모두 0이므로 결과는 0 둘 중 하나라도 1이 되면 결과는 1 ^ ~ 두 비트가 모두 같으므로 결과는 0 두 비트가 서로 다르므로 결과는 1 0은 1로 변환 1은 0으로 변환
50
시프트 연산자 시프트 연산자 내용 a >> b a의 각 비트를 오른쪽으로 b 번 시프트한다.
최상위 비트의 빈자리는 시프트 전의 최상위 비트로 다시 채운다. 산술적 오른쪽 시프트. a >>> b 그리고 최상위 비트의 빈자리는 0으로 채운다. 논리적 오른쪽 시프트. a << b a의 각 비트를 왼쪽으로 b 번 시프트한다. 그리고 최하위 비트의 빈자리는 0으로 채운다. 산술적 왼쪽 시프트.
51
시프트 연산자의 사례 byte a = 5; // 5 byte b = (byte)(a << 2); // 20
a 항상 0으로 채움 항상 0으로 채움 b b byte a = 20; // 20 byte b = (byte)(a >> 2); // 5 byte a = (byte)0xf8; // -8 byte b = (byte)(a>> 2); // -2 a a 최상위비트로 채움 최상위비트로 채움 b b
52
Tip: 산술적 시프트와 논리적 시프트 산술적 오른쪽 시프트 산술적 왼쪽 시프트 논리적 오른쪽 시프트
>>는 1비트 오른쪽으로 시프트할 때마다 2로 나누기하는 결과 산술적 왼쪽 시프트 << 연산자는 1비트 시프트할 때마다 2로 곱하는 결과 음수(최상위 비트가 1)는 시프트 결과 최상위 비트가 0인 양수가 되는 오버플로 발생 가능 주의 논리적 오른쪽 시프트 >>>는 시프트 시 최상위 비트에 항상 0이 삽입 나누기의 산술적 효과가 나타나지 않음 byte, short, char 타입의 시프트 연산 시 주의 사항 int 타입으로 변환되어 연산이 일어나므로 원하지 않는 결과 발 생 가능
53
예제 2-6 : 비트 연산자와 시프트 연산자 사용 예 다음 소스의 실행 결과는 무엇인가?
public class BitShiftOperator { public static void main (String[] args) { short a = (short)0x55ff; short b = 0x00ff; // 비트 연산 System.out.printf("%x\n", a & b); System.out.printf("%x\n", a | b); System.out.printf("%x\n", a ^ b); System.out.printf("%x\n", ~a); byte c = 20; // 0x14 byte d = -8; // 0xf8 // 시프트 연산 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 삽입 } printf("%x\n", ...)는 16진수 형식으로 출력 최상위 비트에 0 삽입 나누기 효과는 나타나지 않음. ff 55ff 5500 ffffaa00 80 5 -2 3ffffffe
54
비교연산자 비교 연산자 내용 예제 결과 a < b a가 b보다 작으면 true 아니면 false 3 < 5 true
3 > 5 false a <= b a가 b보다 작거나 같으면 true 아니면 false 1 <= 0 a >= b a가 b보다 크거나 같으면 true 아니면 false 10 >= 10 a == b a가 b와 같으면 true 아니면 false 1 == 3 a != b a가 b와 같지 않으면 true 아니면 false 1 != 3
55
논리 연산자 1 a !a 예제 true false !(3 < 5)는 false !(3 > 5)는 true a b
56
논리 연산자 2 a b a || b 예제 true (3<5) || (1==1)은 true false
57
예제 2-7 : 비교 연산자와 논리 연산자 사용하기 다음 소스의 실행 결과는 무엇인가?
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
58
대입 연산자, 증감 연산자 대입 연산자 내용 a = b b의 값을 a에 대입 a += b a = a + b과 동일 a -= b
59
증감 연산자 증감 연산의 순서 연산자가 피연산자 뒤에 붙는 경우 연산자가 피연산자 앞에 붙는 경우 int a, b = 4;
60
예제 2-8 : 대입 연산자와 증감 연산자 사용하기 public class UnaryOperator {
다음 소스의 실행 결과는 무엇인가? public class UnaryOperator { public static void main(String[] args){ int opr = 0; System.out.println(opr++); System.out.println(opr); System.out.println(++opr); System.out.println(opr--); System.out.println(--opr); } 1 2
61
조건 연산자 ?: opr1?opr2:opr3 세 개의 피연산자로 구성되어 삼항(ternary) 연산자
opr1이 true이면 값은 opr2, false이면 opr3. 조건 연산자를 활용하면 변수에 값을 대입 연산 시 조건에 따라 다른 값을 대입할 수가 있다. if-else에 비행 문장이 간결해짐 int x = 5; int y = 3; int s = (x>y)?1:-1; // x가 y보다 크기 때문에 1이 s에 대입된다.
62
예제 2-9 : 조건 연산자 사용하기 public class TernaryOperator {
다음 소스의 실행 결과는 무엇인가? public class TernaryOperator { public static void main (String[] args) { int a = 3, b = 5; System.out.println("두 수의 차는 " + ((a>b)?(a-b):(b-a))); } 두 수의 차는 2
63
조건문 - if 단순 if 문 if (조건식) { 실행문장 } if 다음의 괄호 안에는 조건식(논리형 변수나 논리 연산)
조건식의 값 true인 경우, if문을 벗어나 다음 문장이 실행된다. false의 경우에는 if 다음의 문장이 실행되지 않고 if 문을 빠져 나온다. 실행문장이 단일 문장인 경우 둘러싸는 {, } 생략 가능 조건식 if (조건식) { 실행문장 } true false 실행문장
64
예제 2-10 : if문 사용하기 import java.util.Scanner;
시험 점수가 80점이 이상이면 합격 판별을 하는 프로그램을 작성하시오. import java.util.Scanner; public class SuccessOrFail { public static void main (String[] args) { Scanner in = new Scanner(System.in); System.out.print("점수를 입력하시오: "); int score = in.nextInt(); if (score >= 80) System.out.println("축하합니다! 합격입니다."); } 점수를 입력하시오: 95 축하합니다! 합격입니다.
65
조건문 – if-else if-else 문 조건식이 true면 실행문장1 실행 후 if-else문을 벗어남
false인 경우에 실행문장2 실행후, if-else문을 벗어남 if (조건식) { 실행문장1 } else { 실행문장2 true 조건식 false 실행문장1 실행문장2
66
예제 2-11 : if-else 사용하기 import java.util.Scanner;
입력된 수가 3의 배수인지 판별하는 프로그램을 작성하시오. import java.util.Scanner; public class MultipleOfThree { public static void main (String[] args) { Scanner in = new Scanner(System.in); System.out.print("수를 입력하시오: "); int number = in.nextInt(); if (number % 3 == 0) System.out.println("3의 배수입니다."); else System.out.println("3의 배수가 아닙니다."); } 수를 입력하시오: 129 3의 배수입니다.
67
조건문 – 다중 if 다중 if문 실행문장이 다시 if문 또는 if-else문을 포함
else 문은 바로 전의 if문과 짝을 이룬다. 조건문이 너무 많은 경우에는 switch 문을 사용하는 것이 좋다 참 조건식1 실행문장1 if(조건식1) { 실행문장1; // 조건식1이 참인 경우. } else if(조건식2) { 실행문장2; // 조건식2가 참인 경우. else if(조건식 m) { 실행문장m; // 조건식m이 참인경우. else { 실행문장n; //앞의 모든 조건이 거짓인 경우. 거짓 참 조건식2 실행문장2 거짓 … 참 조건식m 실행문장m 거짓 실행문장n
68
예제 2-12 : 학점 매기기 if-else문을 이용하여 키보드 입력된 성적에 대해 학점을 부여하는 프로그램을 작성해보자.
import java.util.Scanner; public class Grading { public static void main (String[] args) { char grade; Scanner a = new Scanner(System.in); while (a.hasNext()) { int score = a.nextInt(); if(score >= 90.0) // score가 90.0 이상인 경우 grade = 'A'; else if(score >= 80.0) // score가 80.0 이상이면서 90.0 미만인 경우 grade = 'B'; else if(score >= 70.0) // score가 70.0 이상이면서 80.0 이만인 경우 grade = 'C'; else if(score >= 60.0) // score가 60.0 이상이면서 70.0 이만인 경우 grade = 'D'; else // score가 60.0 이만인 경우 grade = 'F'; System.out.println(“학점은 “+grade+"입니다”); } 80 학점은 B입니다 90 학점은 A입니다 76 학점은 C입니다
69
Tip: if문과 조건 연산자 ?: 조건 연산자 ?:는 if-else로 바꿀 수 있다. i = a>b?a-b:b-a;
if (a>b) i = a – b; else i = b – a;
70
switch문 switch (식) { case 값1: 실행문장1 break; case 값2: ... case 값m: 실행문장m
case문의 비교 값은 정수형 또는 enum만이 될 수 있다. 비교값과 일치하면 해당 case문의 실행문장 수행. break를 만나면 switch문을 벗어남 일치하는 비교값이 없으면 default 문 실행. default문은 생략 가능 예 switch (식) { case 값1: 실행문장1 break; case 값2: ... case 값m: 실행문장m default: 실행문장n } 식==값1 실행문장1 아니오 식==값2 예 실행문장2 아니오 … 식==값m 예 실행문장m 아니오 실행문장n
71
switch문에서 벗어나기 switch문 내의 break문 break 문장을 만나면 switch문을 벗어나도록 지시
만일 case 문에 break문이 없다면 다음 case문의 실행문장으로 실행을 계속하게 되며 언젠가 break를 만날 때까지 계속 내려감 char grade='A'; switch (grade) { case 'A': System.out.println("90 ~ 100점입니다.“); break; case 'B': System.out.println("80 ~ 89점입니다.“); case 'C': System.out.println("70 ~ 79점입니다.“); } 90 ~ 100점입니다. 80 ~ 89점입니다.
72
예제 2-13 : switch문의 break 사용하기
학점이 A, B 인 학생에게는 “참 잘하였습니다.", 학점이 C, D인 학생에게는 ”좀 더 노력하세요.“, 학점이 F인 학생에게는 ”다음 학기에 다시 수강하세요.“를 출력하는 프로그램을 switch문의 break를 잘 활용하여 작성하여라. public class GradeSwitch { public static void main(String[] args) { char grade='C'; switch (grade) { case 'A': case 'B': System.out.println("참 잘하였습니다.“); break; case 'C': case 'D': System.out.println("좀 더 노력하세요.“); case 'F': System.out.println("다음 학기에 다시 수강하세요.“); default: System.out.println("잘못된 학점입니다.“); } 좀 더 노력하세요.
73
case문의 값 case문의 값의 특징 switch문은 식의 결과 값을 case 문과 비교
문자열 리터럴(JDK 1.7부터)만 허용 int b; switch(c%2) { case 1 : ...; break; case 2 : ...; break; } char c; switch(c) { case '+' : ...; break; case '-' : ...; break; String s = "예"; switch(s) { case "예" : ...; break; case "아니요" : ...; break; switch(a) { case a > 3 : // 오류 case a == 1 : // 오류 } 정수 리터럴 사용 가능 문자 리터럴 사용 가능 문자열 리터럴 사용 가능
74
예제 2-14 : 성적 분류 앞의 다중 if문을 이용한 성적 분류 프로그램을 switch문으로 바꾸시오. 100
import java.util.Scanner; public class Grading2 { public static void main (String[] args) { char grade; Scanner a = new Scanner(System.in); while (a.hasNext()) { int score = a.nextInt(); switch (score/10) { case 10: case 9: grade = 'A'; break; case 8: grade = 'B'; case 7: grade = 'C'; case 6: grade = 'D'; default: grade = 'F'; } System.out.println("학점은 "+grade+"입니다"); 100 학점은 A입니다 55 학점은 F입니다 76 학점은 C입니다
75
Open Challenge!!! P. 106, 가위바위보
76
import java.util.Scanner;
public class GBBGameApp { public static void main(String[] args) { Scanner s = new Scanner(System.in); // 키보드 입력을 위한 Scanner 객체 생성 System.out.println("가위 바위 보 게임입니다. 가위, 바위, 보 중에서 입력하세요"); System.out.print("철수 >> "); String a = s.next(); // 철수의 가위, 바위, 보, 문자열을 입력받는다. System.out.print("영희 >> "); String b = s.next(); // 영희의 가위, 바위, 보, 문자열을 입력받는다. if(a.equals("가위")) { // 철수가 가위인 경우 if(b.equals("가위")) System.out.println("비겼습니다."); else if(b.equals("바위")) System.out.println("영희가 이겼습니다."); else System.out.println("철수가 이겼습니다."); }
77
else if(a.equals("바위")) { // 철수가 바위인 경우
if(b.equals("가위")) System.out.println("철수가 이겼습니다."); else if(b.equals("바위")) System.out.println("비겼습니다."); else System.out.println("영희가 이겼습니다."); } else { // 철수가 보인 경우
78
연습문제(2장) 2. 다음과 같은 간단한 java 프로그램을 작성 하였다. public class SampleProgram {
int i; int j; i = 10; j = 20; System.out.println(i+j); } 이 java 프로그램의 소스파일 이름은? 명령어 창에서 이 자바 프로그램을 컴파일하기 위한 명령어는? 오류를 찾아 수정하라. 오류 수정 후 명령어 창에서 실행하기 위한 명령어는?
80
실습문제(2장) 1. InputStreamReader 클래스의 read 메소드를 이용하여 키보드에서 영문자 한 문자를 입력받 아 소문자이면 대문자로, 대문자 이면 소문자로 변환하여 출력하는 자바 프로그램을 작성하라. 입력된 문자가 영문자가 아니면 “영문자가 아닙 니다”를 출력하라.
81
import java.io.*; public class CaseChanger { public static void main (String args[]) { InputStreamReader rd = new InputStreamReader(System.in); int a; while (true) { try { a = rd.read(); if (a == -1) // ctrl-z가 입력되면 read()는 -1을 리턴 break; else if (a == '\n' || a == '\r') // enter키는 무시하고 다음으로 반복으로 진행 continue; if (a >= 'a' && a <= 'z') // 소문자 a = a - ('a' - 'A'); // 대문자로 변환 else if (a >= 'A' && a <= 'Z') // 대문자 a = a + ('a' - 'A'); // 소문자 변환 else { System.out.println("영문자가 아닙니다."); } System.out.println((char)a); // 입력된 문자 출력 } catch (IOException e) { System.out.println("입력 에러 발생");
82
실습 : 원의 면적 구하기 사용자로부터 원의 반지름을 입력받고 이 원의 면적을 구한 다음, 화면에 출력한다. 원주율값을 가지는 double 형 상수를 선언하라.
83
실습 : 해당 월(月)의 일수계산 (실습 6) 시행결과 몇 년도 입니까? 2012 일수를 알고 싶은 달을 입력하세요: 3
2012년 3월의 일수는 31일입니다.
84
실습 : 해당 월(月)의 일수계산 Hint : 윤년검사
If (((year%4==0)&&!(year%100==0))|| (year%400==00)) // 윤년
85
실습 : 사칙연산 사칙연산을 입력받아 실행결과를 출력하는 자바 프로그램을 작성하고자 한다. 이미 연산자는 +,- ,*,/의 4가지로 하고 피연산자는 모두 실수이며 다음과 같이 피연산자는 빈칸으로 분리하여 입 력하는 것으로 한다. – * / 3 실행 예: 수식을 입력하세요> 연산결과 : 35.3
86
// Scanner 클래스를 사용하기 위한 import 문
public class Arithmetic { public static void main(String[] args) { Scanner scanner = // Scanner 객체 생성 System.out.print("식을 입력하세요>>"); double op1 = // 첫 번째 피연산자 입력 String operator = // 연산자 스트링 입력 double op2 = // 두 번째 피연산자 입력 double result = 0; switch( ) { case "+" : result = op1 + op2; break; case "-" : result = op1 - op2; break; case "*" : case "/" : { // 나누는 수가 0이면 System.out.println("0으로 나눌 수 없습니다."); return; //프로그램 종료 } result = op1 / op2; break; default: System.out.println("연산 기호가 잘못되었습니다."); // 연산 결과 출력
87
Q & A
Similar presentations