2013년 8월 7일 수요일

08.07 4일차 expression, statement, block

식,문,블럭
  1. 식(expression) - 변수,연산자,메서드 호출로 구성되며 단일값으로 평가된다.
  2. 문(statement) - 실행이 완료되는 프로그램의 단위
    1. (expression 문, 선언문, 흐름제어문 등)
  3. 블럭(block) - {}안에서 0개이상의 그룹을 이루는 것.
문(statement)
조건문,반복문,그리고 변수선언문,대입문,호출문 등
프로그램을 구성하는 실행이 완료되는 가장 작은 단위의 코드.
프로그램은 한개 이상의 일련의 문(statement)들로 구성되어 있음.

- statement 의 종류
  1. 실행문
    1. 선언문 - 변수를 선언하는 문
    2. expression문
      1. 대입식,단일항연산자,메서드 호출,객체생성식 등,
      2. 실행이 완료가능한 식으로 구성됨.
    3. 제어문 - 프로그램의 실행흐름을 제어하는 문
  2. 비실행문
    1. 주석문,프로그램의 설명을 기술한  statement
      1. Doc-comment : /** ..*/ javadoc 에서 사용
      2. Block-comment : /* .. */ 
      3. End-Of-line comment : //
  3. 제어문
    1. 프로그램의 실행순서를 제어하는 문
      1. 의사결정문(조건문) - 조건에 따라서 실행할 문들을 결정.
        1. if, switch
      2. 반복문 - 반복해서 실행하게 하는 문
        1. for, while, do-while
      3. 분기문 - 진행순서를 바꾸는 문.
        1. break, continue, return 문
[제어문]
  1. 의사결정문(조건문), 조건에 따라서 실행할 문들을 결정.
    1. if문
      1. 단순if문 - if (조건식) {}
      2. if else문 - if (조건식) {} else {}
      3. 다중 if문 - 조건이 여러개인 경우 
        1. if (조건식1) {} else if (조건식2) {} else if(조건식3) {} else {}
      4. 중첩 if문 - if 문 안에 if 문
      5. dangling else 처리 - brace 없는 if문
        중첩 if문에서 사용된 else는 가장 안쪽에 있는 if문에 속한 것으로 약속한다.
        예) if ( a<10 )
        if ( b<10 ){...}
        else { ...} //else 는 안쪽 if문에 속한다.
    2. switch문
      1. 식의 결과에 따라 수행되는 실행경로를 가질수 있는 문 (# 아래 참조)
  2. 반복문 - 반복해서 실행하게 하는 문
    1. for, while, do-while
  3. 분기문 - 진행순서를 바꾸는 문.(break, continue, return 문)
    1. break 
      1. 반복문(for,while,do-while)의 block을 벗어나기 위해 사용
      2. if, switch 블럭을 빠져나오기 위해 사용.
      3. 실행중인 statement의 블록이 종료되고,블록 바로 다음의 문이 실행.
      4. 실행중인 문의 블록이 if 문인 경우, 상위 반복문의 블럭까지 빠져나옴.
    2. continue
      1. 반복문의 블럭내에서 다음 문들을 수행하지 않고 조건식으로 돌아가기 위해서 사용
      2. while(조건식) {
      3.    문장1; 
      4.    if(조건식) { // if 조건식이 만족된 경우 문장2를 건너뜀.
      5.       continue;
      6.    }
      7.    문장2;
      8. }
    3. return
      1. 프로그램의 제어가, 호출된 메서드에서 호출한 메서드로 이동.
      2. 반환값이 있는 경우 값이 전달됨.
      3. 메서드의 일부를 실행하지 않고 빠져나오기 위해 사용.
====================================================
문자열의 비교(String 클래스의 사용)
1. 값의 비교
String a= args[0]; //args "나철수"
if(a.equals("나철수")) {...} // true
2. 인스턴스의 비교
String a= new String("나");//객체의생성
String b= new String("나");//또다른 객체의생성
String res = "다르다";
if (a==b) res = "같다";
System.out.println(" == 비교결과 :  " + res + "입니다.");
if (a.equals(b)) res = "같다";
System.out.println(" equals 비교결과 :  " + res + "입니다.");
==================================
 == 비교결과 :  다르다입니다.
 equals 비교결과 :  같다입니다.

* java는 문자열을 class로 생성한 객체처리
== 는 주소값 비교
equals는 값 value 비교



# switch
식의 결과에 따라 수행되는 실행경로를 많이 가질 수 있는 문
switch식의 결과와 일치하는 case label문들을 실행
- 조건으로 사용할 수 있는 자료형으로 4가지 정수형(byte,short,int,char) enum타입, Wrapper클래스가 사용됨.
(jdk1.7 에서는 String형도 허용함.)
- case lable 은 literal만 가능.- (식이 아닌 데이터)

- 일단 switch블럭 내에서 실행되면 
  일치되는 case  label이 아니더라도 계속해서 끝까지 실행됨.
- 중간에 빠져나오기 위해9서, break문을 사용
- break와 default는 필요에 따라 삭제 가능.


# if문과 switch문의 비교
  1. if문은 조건식의 결과값이  true/false 이고,
  2. switch문의 조건식의 데이터 타입으로 4가지 정수 enum,Wrapper,그리고 String형을 허용
  3. if 문은 값 또는 범위를 표현 가능
  4. switch문은 값을 표현하는 식만 test 가능
  5. 실행 경로가 많은 경우에는 switch문이 가독성이 좋음.
# 반복문
- 조건식의 결과에 따랄서 실행문(들)의 반복수행을 가능하게 하는 문
- 반복횟수의 지정 및 무한루프도 가능
  1. for
    1. 조건식이 만족되는 동안 블럭내의 문들을 실행
    2. *단일 for (초기화식; 조건식; 증감식) { }
    3. 실행순서 
      1. 초기화식
      2. 조건식<---ㄱ
      3. 증감식  ____」
    4. *중첩 for문도 가능
    5. *향상된 for문 : Collection이나 배열과 함께 사용
      1. for (변수선언 : Collection또는 배열명) {}
        1. collection 또는 배열의 각 item이 그 변수에 대입되며 블록내에서 그 변수를 활용
        2. 집합체로부터 원소를 얻어서 반복수행가능.
  2. while
    1. 조건식만 지정되 있고,초기식과 증감식은 별도 위치에 지정.
    2. 초기식;
    3. while(조건식) {
      1. 증감식;
    4. }
  3. do while
    1. 루프의 맨 아래에서 조건식을 평가
    2. 반복되는 문장을 반드시 한번은 실행하고 조건을 검사
    3. while문 마지막에는 반드시 ; 을 붙여야 함
    4. 초기식;
    5. do {...
    6. }(조건식)

# for 와 while문의 비교
    1. for - 반복횟수가 정해져 있거나,예측하기 쉬운경우
    2. while 이나 do-while문은 반복횟수가 정해져 있지 않은 경우.

# 교재실습 test17~20
# test21 => Scanner 등장.

  1. Scanner class - 사용자로부터의 입력
    1. java.util.Scanner 를 import 한다.
      1. import java.util.Scanner;
    2. 표준입력으로부터 입력값을 전달받도록 객체생성
      1. Scanner sc = new Scanner(System.in);
    3. 생성된 Scanner로부터, 하나의 입력된 문자열을 얻기
      1. String s = sc.next();
    4. 입력된 문자열이 정수형태의 문자열이면, next() 사용해서 변환된 정수로 얻을수 있다.
      1. int i = sc.nextInt(); //"100" → 10
    5. Enter Key를 치기전까지 한 라인의 모든 문자열을 입력받음
      1. String s = sc.nextLine();

  1. 분기문
    1. break 
      1. 반복문(for,while,do-while)의 block을 벗어나기 위해 사용
      2. if, switch 블럭을 빠져나오기 위해 사용.
      3. 실행중인 statement의 블록이 종료되고,블록 바로 다음의 문이 실행.
      4. 실행중인 문의 블록이 if 문인 경우, 상위 반복문의 블럭까지 빠져나옴.
    2. continue
      1. 반복문의 블럭내에서 다음 문들을 수행하지 않고 조건식으로 돌아가기 위해서 사용
        1. while(조건식) {
        2.    문장1; 
        3.    if(조건식) { // if 조건식이 만족된 경우 문장2를 건너뜀.
        4.       continue;
        5.    }
        6.    문장2;
        7. }
    3. return
      1. 프로그램의 제어가, 호출된 메서드에서 호출한 메서드로 이동.
      2. 반환값이 있는 경우 값이 전달됨.
      3. 메서드의 일부를 실행하지 않고 빠져나오기 위해 사용.
  2. Lable문
    1. 어떤 문들은 label을 가질수도 있다.
    2. - for, while, do-while, switch, if문, 블럭
    3. labeled break문은 중첩된 labeled-반복문 또는 labeled-if문, labeled-블럭을 벗어나기 위해 사용.
    4. labeled continue 문은 실행을 건너뛰고,labeled-반복문으로 가기위해 사용된다.
    5. label은 scope내에 sub문장의 label명과 일치해서는 안된다.


--------------------------------------------------------------------

[문제1] dangling else 문제
number=3, 아래 코드의결과?
int n = 3;
if (n >= 0)
if (n == 0)
System.out.println("A");

else
System.out.println("B");
System.out.println("C");
==> 결과
B
C
[문제2] mm=22 일때 결과?
int mm=22;
switch (mm/2) {
default: System.out.println("@1"); //break;
case 10: System.out.println("@2"); //break;
case 20: System.out.println("@3"); //break;
case 30: System.out.println("@4"); //break;
}
==>
@1 ---- 이거지만 break가 없어서 아래있는 모든 경우가 다 실행됨.
@2
@3
@4
[문제3] 실행문1은 각각 몇번 실행되는가?
public static void main(String[] args) {
int cnt = 0;
int i = 0;

//1 -- 100
for (i = 1; i <= 10; i++) {
for (int j = 1; j <=10; j++) {
cnt++;
}
}
System.out.println("@1_"+cnt);
//2 -- 1~10 합계  -- 55
cnt = 0;
for (i = 1; i <= 10; i++) {
for (int j = i; j <=10; j++) {
cnt++;
}
}
System.out.println("@2_"+cnt);

//3 --10*(5+4+3+2+1) / 5  ==> 30
cnt = 0;
for (i = 1; i <= 10; i++) {
for (int j = i; j <=10; j+=2) {
cnt++;
}
}
System.out.println("@3_"+cnt);

//4 -- 18
cnt = 0;
for (i = 1; i <= 10; i++) {
for (int j = i; j <=10; j*=2) {
cnt++;
}
}
System.out.println("@4_"+cnt);
}
==========================
@1_100
@2_55
@3_30
(i,j)=(1,1)
(i,j)=(1,2)
(i,j)=(1,4)
(i,j)=(1,8) ==> 1,10 이 안걸리는 이유? *2 이므로 1,2,4,8, (16)
(i,j)=(2,2)
(i,j)=(2,4)
(i,j)=(2,8)
(i,j)=(3,3)
(i,j)=(3,6)
(i,j)=(4,4)
(i,j)=(4,8)
(i,j)=(5,5)
(i,j)=(5,10)
(i,j)=(6,6)
(i,j)=(7,7)
(i,j)=(8,8)
(i,j)=(9,9)
(i,j)=(10,10)
@4_18







댓글 없음:

댓글 쓰기