Call by Reference C 2012. 3. 19. 23:59
Call by Value 로의 함수 호출은 일반적으로 많이 사용해 왔고
그닥 설명이랍시고 달지 않아도 어떤 개념인지 알 듯 하여

주소값(포인터)을 가르키고 그 주소값에 인자를 전달하여 함수를 호출하고
값을 가지고 도는 Call by Reference 프로그램을 작성하여 연습해 본다.

  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. int Menu(int *j, char (*emp_no)[7], char (*name)[20], char (*gender)[10], char (*jik)[20])
  5. /* int값을 바라보는 포인터로써 *을 써주고, 배열의 인자크기를 선언함으로 2차원 배열임을
    기술하는 의미로
    형선언 후 행을 가르키는 의미로 *와 인자의 크기를 뒤에 기재
    : (*emp_no)=emp_no[] */
  6. {
  7.     int num; /* 지역변수 */
  8.  
  9.     while(1)
  10.     {
  11.         printf(" 메뉴를 선택하세요 ");
  12.         printf("1.리스트 2.검색 3.등록 4.수정 5.삭제 0.종료 : ");
  13.         scanf("%d", &num);       
  14.        
  15.         switch(num)
  16.         {
  17.             case 1:
  18.                 List(j, emp_no, name, gender, jik);
    /* j의 포인터형을 Menu에서 값을 받아와서 j 로 선언 무방 */
  19.                 break;
  20.             case 2:
  21.                 Src(emp_no, name, gender, jik);
  22.                 break;
  23.             case 3:
  24.                 Add(j, emp_no, name, gender, jik);
  25.                 break;
  26.             case 4:
  27.                 Edit(emp_no, name, gender, jik);
  28.                 break;
  29.             case 5:
  30.                 Del(j, emp_no, name, gender, jik);
  31.                 break;
  32.             case 0:
  33.                 system("pause");
  34.                 return 0;
  35.             default:
  36.                 printf("잘못된 번호! ");
  37.         }
  38.     }
  39. }
  40. int ClearEnter(void) /* 엔터버림 */
  41. {
  42.     while(getchar()!='\n');
  43. }
  44. int Add(int *j, char (*emp_no)[7], char (*name)[20], char (*gender)[10], char (*jik)[20])
  45. {
  46.     char ans; /* Yes or No */
  47.     int i; /* 중복체크용 변수 선언 */
  48.     int p; /* 기존 지역변수로 j값을 썼던 것을 대체 */
  49.    
  50.     /* j값을 지역변수로 쓰면 안됨.. */
  51.     for(p=0; p<5; p++) /* 배열의 행값 증가 */
  52.     {
  53.         if(p>4) /* 5개 이상 등록되지 않도록 막음 */
  54.             printf("더이상 입력불가!! ");
  55.         /* emp_no[p]의 값이 NULL과 같다면 0 */
  56.         /* strcmp(s1, s2); : 0(s1=s2), -(s1>s2), +(s1<s2) */
  57.         /* 아래는 !0 : 0이 아니라면, 즉 같지 않다면, emp_no[p]가 빈값이 아니라면 */
  58.         else if(!strcmp("", emp_no[p]))
  59.         {
  60.             while(1)
  61.             { 
  62.                 if(p>4 || strcmp("", emp_no[p]))
    /* emp_no[p]가 빈값이 아니거나 p가 4보다 크다면 */
  63.                     break;
  64.                 printf(" 사번 : ");
  65.                 scanf("%s", emp_no[p]); /* 문자열은 엔퍼센트 연산자를 붙이지 않음 */
  66.                
  67.                 ClearEnter();
  68.                
  69.                 for(i=1; i<5; i++) /* 사번 중복체크 구간 시작 */
  70.                    if(!strcmp(emp_no[p], emp_no[p-i]))
  71.                     {
  72.                         printf("이미 등록된 사번입니다!!");
  73.             /* 이미등록된 사번임을 체크했지만 65행에서 그 값을 입력받았으므로 초기화 함 */
  74.                         memset(emp_no[p],0x00,sizeof(emp_no[p]));
  75.                         return 1;
  76.                     } /* 사번중복체크 구간 끝 */
  77.                 printf("이름 : ");
  78.                 scanf("%20s", name[p]);
  79.                 printf("성별 : ");
  80.                 scanf("%10s", gender[p]);
  81.                 printf("직위 : ");
  82.                 scanf("%20s", jik[p]);
  83.                
  84.                 ClearEnter();
  85.  
  86.                 while(1)
  87.                 {
  88.                     printf("위와같이 등록, 계속 등록하시겠습니까? (Y/N) ");
  89.                     scanf("%c", &ans);
  90.                     if(ans=='y'||ans=='Y'||ans=='\n') /* y or Y or Enter */
  91.                         {
  92.                             (*j)++; /* *j++ : 주소값(e.g.> 0x02...)을 1증가함 */                           
  93.                             break; /* 현재 while문을 빠져나가므로 61행의 while문으로 이동 */
  94.                         }
  95.                     else if(ans=='n'||ans=='N')
  96.                         {
  97.                             (*j)++; /* (*j)++ : j의 주소를 가르키는 값을 1증가함 */
  98.                             return 1;
    /* 현재 함수를 빠져나가고 (현재는)의미없는 1값을 호출한 함수에 반환 */
  99.                         }
  100.                     else
  101.                         printf("잘못된 선택입니다 "); /* 예외 처리 */
  102.                 }
  103.             }
  104.         }
  105.     }
  106.     if(p>4)
  107.         printf("더이상 입력불가!! ");
    /* 5개이상 등록 완료 후 Add()함수 호출시 메시지 출력 */
  108. }
  109.  
  110. int List(int *j, char (*emp_no)[7], char (*name)[20], char (*gender)[10], char (*jik)[20])
  111. /* char (*name)[20] : 2차원 배열의 포인터형 */
  112. {
  113.     int mm; /* 배열의 포인터값 증가 변수 */
  114.     printf(" --- 리스트보기 --- ");
  115.    
  116.     for(mm=0; mm<5; mm++)
    /* 배열의 주소에 값이 없을 때 리스트가 출력되지 않도록 하기 위함 */
  117.     {
  118.         if(strcmp("", emp_no[mm])) /* emp_no[mm]의 값이 NULL이 아닐 때 */
  119.         {
  120.             printf("사번: %-7s >> 이름: %-14s 성별: %-10s 직위: %-10s ", emp_no[mm], name[mm], gender[mm], jik[mm]);
  121.             /* emp_no[mm] : 주소값을 가르킴 */
  122.         }
  123.         else /* emp_no[mm]의 값이 NULL일 때 */
  124.         {
  125.             printf("");
  126.         }
  127.     }
  128.  
  129.     if(*j<=0) /* j 주소의 값이 0이거나 0보다 작을 때 이면 추가되지 않았거나 삭제되어
    데이터가 없을 때 */
  130.     {
  131.         printf("등록된 자료가 없습니다! ");
  132.     }
  133.     printf(" ");
  134.     system("pause");
  135. }
  136.  
  137. int Src(char (*emp_no)[7], char (*name)[20], char (*gender)[10], char (*jik)[20])
  138. {
  139.     char no_src[20]; /* 검색할 사번을 입력받을 1차원 배열의 변수 선언 */
  140.     int k=0, g=0;
    /* k:배열의 주소값을 가르키는 행값 증가용 변수, g:strcmp의 값을 담을 변수 */
  141.  
  142.     printf("검색할 사번을 입력하세요 : ");
  143.     scanf("%s", no_src)
  144.     ClearEnter();
  145.  
  146.     for(k=0; k<5; k++)
  147.     {
  148.        g=strcmp(no_src, emp_no[k]);
  149.  
  150.         if(g==0)
  151.             break;
  152.     }
  153.     if(g>0 || g<0)
  154.     {
  155.         printf("사번을 확인해주세요 ");
  156.         return 1;
  157.     }
  158.     printf(" 해당 사원 찾음 (사원번호: %s) ", no_src);
  159.     printf("조회하신 사원의 정보 입니다 ");
  160.     printf("이름: %-14s 성별: %-14s 직위: %-14s ", name[k], gender[k], jik[k]);
  161. }
  162.  
  163. int Edit(char (*emp_no)[7], char (*name)[20], char (*gender)[10], char (*jik)[20])
  164. {
  165.     char no_edit[20];
  166.     int k=0, g=0, e_num;
  167.  
  168.     printf("수정할 사번을 입력하세요 : ");
  169.     scanf("%s", no_edit);
  170.     ClearEnter();
  171.  
  172.     for(k=0; k<5; k++)
  173.     {
  174.         g=strcmp(no_edit, emp_no[k]);
  175.  
  176.         if(g==0)
    /* g값이 0이라는 것은 입력한 사번과 emp_no[k]의 값이 같다는 것을 의미하므로 */
  177.             break; /* 현재 반복문을 빠져 나가면 아래 while 문으로 이동 */
  178.     }
  179.     if(g>0 || g<0)
  180.     {
  181.         printf("사번을 확인해주세요 ");
  182.         return 1;
  183.     }
  184.     while(1)
  185.     {
  186.         printf(" 해당 사원 찾음 (사원번호: %s) ", no_edit);
                                            /* 입력받은 값과 같은 내용이 있는 */
  187.         printf("조회하신 사원의 정보 입니다 "); /* k행의 배열값을 출력함 */
  188.         printf("이름: %-14s 성별: %-14s 직위: %-14s ", name[k], gender[k], jik[k]);
  189.         printf(" 선택 : 1.이름  2.성별  3.직위  4.모두수정  5.취소 : ");
  190.         scanf("%d", &e_num);
  191.  
  192.         switch(e_num)
  193.         {
  194.             case 1:
  195.                 printf("수정하실 이름을 입력하세요 : ");
  196.                 scanf("%20s", name[k])
  197.                 printf("수정완료! ");
  198.                 printf("수정된 이름 : %s ", name[k]);
  199.                 return 1;
  200.             case 2:
  201.                 printf("수정하실 성별을 입력하세요 : ");
  202.                 scanf("%20s", gender[k]);
  203.                 printf("수정완료! ");
  204.                 printf("수정된 성별 : %s ", gender[k]);
  205.                 return 1;
  206.             case 3:
  207.                 printf("수정하실 직위를 입력하세요 : ");
  208.                 scanf("%20s", jik[k]);
  209.                 printf("수정완료! ");
  210.                 printf("수정된 직위 : %s ", jik[k]);
  211.                 return 1;
  212.             case 4:
  213.                 printf("수정하실 이름을 입력하세요 : ");
  214.                 scanf("%20s", name[k]);
  215.                 printf("수정하실 성별을 입력하세요 : ");
  216.                 scanf("%20s", gender[k]);
  217.                 printf("수정하실 직위를 입력하세요 : ");
  218.                 scanf("%20s", jik[k]);
  219.                 printf(" 수정완료! ");
  220.                 printf("수정된 내용 : 이름(%s), 성별(%s), 직위(%s) 입니다. ", name[k], gender[k], jik[k]);
  221.                 return 1;
  222.             case 5:
  223.                 return 1;
  224.             default:
  225.                 printf("잘못된 번호입니다 ");
  226.         }
  227.     }
  228. }
  229. int Del(int *j, char (*emp_no)[7], char (*name)[20], char (*gender)[10], char (*jik)[20])
  230. {
  231.     char no_del[20]; /* 사번을 입력 받는 1차원 배열 변수 */
  232.     int k=0, g=0;
  233.     char d_ans;
  234.  
  235.     printf("삭제할 사번을 입력하세요 : ");
  236.     scanf("%s", no_del);
  237.     ClearEnter();
  238.  
  239.     for(k=0; k<5; k++)
  240.     {
  241.         g=strcmp(no_del, emp_no[k]);
  242.  
  243.         if(g==0)
  244.         {
  245.             break;
  246.         }
  247.     }
  248.     if(g>0 || g<0)
  249.     {
  250.         printf(" 사번을 확인해주세요!! ");
  251.         return 1;
  252.     }
  253.     while(1)
  254.     {
  255.         printf(" 사원번호: %s ", no_del);
  256.         printf("이름(%s), 성별(%s), 직위(%s) ", &name[k], &gender[k], &jik[k]);
  257.         printf(" 위 자료를 삭제하시겠습니까? (Y/N) : ");
  258.         scanf("%c", &d_ans);
  259.  
  260.         if(d_ans=='y'||d_ans=='Y'||d_ans=='\n')
  261.             {
  262.                 printf("사번(%s)의 %s의 자료가 삭제 되었습니다 ", no_del, &name[k]);
  263.  
  264.                 memset(&emp_no[k],0x00,sizeof(emp_no[k]));
                    /* 0x00 으로 초기화 하여 데이터 삭제 */
  265.                 memset(&name[k],0x00,sizeof(name[k]));
  266.                 memset(&gender[k],0x00,sizeof(gender[k]));
  267.                 memset(&jik[k],0x00,sizeof(jik[k]));
  268.                 (*j)--;
  269.                 break;
  270.             }
  271.         else if(d_ans=='n'||d_ans=='N')
  272.             {
  273.                 return 1;
  274.             }
  275.         else
  276.             {
  277.                 printf("잘못된 선택입니다 ");
  278.             }
  279.     }
  280. }
  281. void HowTo(void)
  282. {
  283.     printf("--- 사원관리 프로그램 --- ");
  284.     printf("사원 관리 프로그램 입니다 ");
  285. }
  286. int main(void)
  287. {
  288.     /* 전역변수로 사용하던 것을 메인에 선언 */
  289.     char emp_no[5][7]; /* 2차원 배열 선언 */
  290.     char name  [5][20];
  291.     char gender[5][10];
  292.     char jik   [5][20];
  293.     int j=0,m=0;
  294.    
  295.     /* 변수값 초기화, 메모리를 지정한 문자열로 채움: memset */
  296.     /* memset(채울메모리주소, 채울문자, 채울문자의개수) */
  297.     for(j=0; j<5; j++)
  298.     {
  299.         memset(emp_no[j],0x00,sizeof(emp_no[j])); /* NULL 값 초기화 */
  300.         memset(name[j],0x00,sizeof(name[j]));
  301.         memset(gender[j],0x00,sizeof(gender[j]));
  302.         memset(jik[j],0x00,sizeof(jik[j]));
  303.     }
  304.    
  305.     j=0; /* j값 = 열의 행번호를 증감시킬 변수 */
  306.     /* 함수 호출. 프로그램 시작 */
  307.     HowTo(); /* 프로그램 소개글 호출 */
  308.     Menu(&j, emp_no, name, gender, jik); /* j의 주소값을 참조함 : &j */
  309.     /* 2차원 배열은 상단에 선언으로 이미 주소값을 가짐. 변수명만 기입해도 무방 */
  310.     return 0;
  311. }


'C' 카테고리의 다른 글

c 표준 라이브러리 함수  (0) 2012.03.30
Call by Reference  (0) 2012.03.19
\n  (0) 2012.03.19
Java_06 Java 2011. 10. 31. 22:50

                                        >> 자바 테스트 <<

※ 주의 : 프로그램 실행 결과가 오류가 발생할 경우 컴파일 오류인지, 런 타임 오류인지를 기술할 것

이름 :

1. 자바의 기본 자료 형(primitive Type) 8가지와 각 자료형의 byte 수를 쓰시오.

  boolean(1byte) : true값과 false값만 출력
  byte(1byte) 
  char(2byte) : 유니코드 문자 한글자당 2byte
  short(2byte)
  int(4byte) : 정수형
  long(8byte) : 정수형
  float(4byte) : 실수형
  double(8byte) : 실수형

2. 다음중 식별자(Identifier)로 사용 할 수 있는 것을 모두 고르시오.
   name, #name, _tel, 주소, float, $age, ~age

name : O 첫글자 유니코드자바레터(알파벳,_,$)
#name : X 특수문자 불가능
_tel : O 언더바 가능
주소 : O 각국 언어 가능
float : O 실수형태의 기본자료형
$age : O 첫글자 유니코드자바레터(알파벳,_,$)
~age : X 특수문자 불가능

3. 다음 프로그램은 하나의 문자를 입력 받아 ASCII 코드를 출력 하는 프로그램이다.
잘못된 부분을 수정하시오.
public class Test {
 public static void main(String[] args) throws java.io.IOException {
  char ch;

  System.out.print("한문자 ? ");
  ch = System.in.read();

  System.out.println("%c : %d\n", ch, ch);
 }
}

public class Test {
 public static void main(String[] args) throws java.io.IOException {
  int ch; // 정수형태로 입력받으므로 int형 변수 선언

  System.out.print("한문자 ? ");
  ch = System.in.read(); // 한문자를 입력받아 아스키코드(정수)로 입력받으므로..

  System.out.printf("%c : %d\n", ch, ch);
  // %c, %d 같은 서식문자를 출력하기 위해 printf로 변경
 }
}

4. 다음 프로그램의 실행 결과는 ?
public class Test {
 public static void main(String[] args) {
     byte a=10, b=5, c;

     c=a+b;
     System.out.println(c);
 }
}

byte형으로 정수 선언시 overflow(값이 넘침)를 미리 감지하여
컴파일 error

아래와 같이 int형으로 변수 선언시 정상 출력되어 값은 15 가 출력됨

public class Test {
 public static void main(String[] args) {
     int a=10, b=5, c;

     c=a+b;
     System.out.println(c);
 }
}

5. 다음 코드의 출력 결과는 ?
 int []x= {1, 2, 3, 4, 5};
 int y[] =x;
 System.out.println(y[2]);

결과는 3이다.
배열은 첫번째 인자가 0부터 시작되므로 y[2]는 3번째 값을 가르킨다.

6.  다음 실행 결과는 ?
String str="420";
str+=42;
System.out.println(str);

"420"은 Stirng으로 문자열으로 입력되었고
str+=42는 str에 저장된 값에 정수 42를 더한 것이므로 둘은 그냥 이어져 붙을 뿐
연산이 이루어 지지 않는다. 결과는 42042 이다.

7. 다음 실행 결과는 ?
public class Test {
   public static void main(String[] args) {
     for (int i=0; i<=10; i++){
        if( i>6) break;
     }
     System.out.println(i);
   }
}
컴파일 에러 : for문 안에서 선언된 변수는 외부에서 사용 불가하다.
i값이 6보다 클 때 for문을 빠져나와 i값은 사용할 수 없는 변수가 된다.

8. 다음 실행 결과는 ?
int a=0, s=0;
while(a++ <= 9) {
    s+=a;
}
System.out.println("a:"+a+", s:"+s);

결과는 a:11, s:55 이다.
a++ <= 9 일때 관계연산자보다 증감연산자가 우선순위가 높아
a가 반복문에 의해 1씩 증가되어 돌아올 때 a가 9일때 비교하고 참이므로
10이 되어 내려가서 그 값을 s에 누적하고 다시 올라와서 증가되어 11이 되고
비교하면 거짓이므로 while반복문을 빠져나와 a는 11을 출력하게 되고
b는 1부터 a가 10일 때까지의 값을 합하여 누적하고 a가 11일 땐 이미 a가
반복문을 빠져나간 뒤 이므로 55가 된다.

9. 다음의 실행 결과는 ?
System.out.printf("%.2f\n", 123.236);

답은 : 123.24
%.2f 실수형태의 서식문자 이며 소수점 둘째짜리까지만 표시하고 그 뒷자리는
반올림

10. 다음은 이름, 국어, 영어 점수를 입력 받아 총점을 구하는 프로그램입니다.
[   ]를 채우세요.
import java.io.*;

public class BufferedReaderTest {
    public static void main(String[] args) throws IOException {
        String name;
        int kor, eng, tot;

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        System.out.print("이름 ? ");
        name = br.readLine(); // 엔터치기 전까지 한줄 입력받기

        System.out.print("국어 ? ");
        kor = Integer.parseInt(br.readLine()); // parseInt:문자열을 정수형태로 변환
        System.out.print("영어 ? ");
        eng = Integer.parseInt(br.readLine());
        tot = kor + eng;

        System.out.printf("이름: %s, 총점: %d\n", name, tot);
    }
}

11. 다음의 실행 결과는 ?
int a = 12 & 6;
System.out.println(a);

12는 2진수로 1100 이고 6은 0110 이다.
논리곱은 값이 서로 참(1)일 때만 참..
1100
0110    → 0100 으로 결과는 4


12. 다음의 실행 결과는 ?
int a = 12 ^ 6;
System.out.println(a);

XOR : ^ 는 각 항의 값이 0과 1일 때 (즉 서로 다른 값일 때 참)
1100
0110    → 1010 으로 결과는 10

13. 다음의 실행 결과는 ?
int a = 32 >> 3;
System.out.println(a);

>> 는 오른쪽으로 이동하고 남은 자리는 부호로 채우므로
32 = 2진수로 100000 이고 오른쪽으로 3칸 이동하고 양수 이므로
부호는 0이고 000100 이 된다. 이것을 10진수로 바꾸면 4 다. 

14. 1~100까지의 3의 배수의 합를 구하는 프로그램입니다. [   ]를 채우세요.
int s=0, n=0; // 변수 선언 및 초기화
for(n=0; n<100; n+=3) { // 1~100까지 n은 3씩 증가하고
   s+=n;  // 그 증가값을 s에 누적
}
System.out.println("결과 : " + s);

15. 1~100까지의 홀수의 합를 구하는 프로그램을 작성 하시오.

 public class Test {
  public static void main(String[] args) {
   
 int s=0, n=0;
 for(n=1; n<100; n+=2) { // 1에서 2씩 증가하므로 1,3,5,7...
    s+=n;  // 그 증가값을 s에 누적
 }
 System.out.println("결과 : " + s);
  }
 }

16. 다음 실행 결과는 ?
int x =5;
boolean b1 = true;
boolean b2 = false;

if((x==4) && !b2) // false의 값이므로
  System.out.print("1 "); //1은 출력하지 않고 if문을 빠져나와
System.out.print("2 "); // 2를 출력하고
if ((b2 = true) && b1) // b2값을 무조건 참이 되도록 만들고 b1값도 참이므로
  System.out.print("3 "); // 3을 출력한다.

답은 2 3

17. 다음 실행 결과는 ?
int x = 0;
int y = 10;
do {  // 무조건 한번은 반복하므로
   y--;  // y값은 9가 되고 (후위 감소)
   ++x;  // x값은 1이 되고 (전위 증가)
}while(x < 5); // x가 5보다 작을 때까지 반복이니 총 4회 반복하고 5회때 반복문을 빠져나온다. 
System.out.print(x + "," + y); // y값은 4회 반복으로 5가 되고 x값은 전위 증가로 5가 되고
// 5가 된 값이 5보다 작다는 말은 거짓이므로 반복문을 빠져나와
x=5, y=5 가 되어 결과는 5,5

18. 다음 실행 결과는 ?
int x=12;
while (x < 10) { // 조건이 false 이므로 반복문을 빠져나와
    x--;
}
System.out.print(x); // 초기값인 12를 출력한다.
답은 12

19. 다음의 출력 결과를 출력 하는 프로그램을 작성하시오.
       *
     ***
   *****
 *******
public class Test{
public static void main(String[] args){
int i,j;
for(i=1; i<=4; i++){ // 4행 출력
    for(j=1; j<=4-i; j++){ // 공백 출력 3,2,1,0
        System.out.print(" "); // 공백 한칸 
    }
    for(j=1; j<=i*2-1; j++){ // j<=i 일때 오른쪽이 직선, *이 삼각형 모양으로 되기 위해
        // 1, 3, 5, 7, 9.. 식으로 가려면 i값은 1,2,3,4,5.. 식이므로 1,3,5,7,9..가 되기 위한
        // 조건식을 찾으라는 말, 1*2-1=1, 2*2-1=3....
       System.out.print("*");
    }
    System.out.println();
}
}
}

20. 콘솔창에서 Test.java 파일을 컴파일하고 실행하는 방법은 ?
컴파일 : cmd> javac Test.java
실행 : cmd> java Test

설명은 아마도, 필요 없을듯?! 

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

* 객체 지향이란??

현실 세계는 객체(존재하는 모든 것)들의 집합이며 그 모든 것은 상태와 행동의
객체로 표현된다.

그 객체들을 인간이 이해하는 방식으로 프로그래밍화 시켜 시스템에 적용시키고자
하는 것을 객체 지향이라 한다.

객체(object)/클래스(class)/메시지(message)를 기본모형으로 하며
하나의 대상에 대해 일반적인 구성, 상태, 동작 등에 대해 기술하는 작업을 추상화
하는 그 대상을 객체라고 하고 객체라는 개념은 그 객체의 성질이나 특징을 나타내는
데이터로 이루어진 부분과 동작, 행동을 나타내는 부분으로 기술되어 진 것이다.

클래스란??
객체라는 개념을 일반화 시킨 것.
비슷한 부류의 객체를 분류한 것
그런 객체 부류의 추상화된 관념

클래스를 왜 쓰나?
재사용성이 가장 큰 이유?

클래스는 어떻게 작성하는가?
1. 추상화
   상태
   행동
2. 클래스 작성
3. 객체 생성 및 호출

......도통 무슨 말인지 이해가 가지 않지만 일단 정리해두고 추후 수정..;;

'Java' 카테고리의 다른 글

Java_08  (0) 2011.11.02
Java_07  (0) 2011.11.01
Java_06  (0) 2011.10.31
Java_05  (0) 2011.10.29
Java_04  (0) 2011.10.27
Java_03  (0) 2011.10.26
Java_04 Java 2011. 10. 27. 18:20

* 전일 연산자 복습 : 관계연산자 유의할 부분 (자주 사용될만한 문구인진 모르겠지만..)
while (n++<10){
s+=n;
}System.out.printf(n+", "+s);
에서 n값을 10과 비교를 먼저 하고 값을 1증가한다.
n값이 10이 되어도 비교하고 값 1증가 후 빠져나와 n의 출력값은 11이 된다.
- 반복횟수가 명확하지 않을 땐 while문이 일반적이다.

* switch ~ case 문
- switch문으로 작성하는 모든 것은 if로 구현이 가능하다.
- 다중선택문 이라고도 하며 switch(수식)의 수식값에 따라 case의 상수값에 해당되는
  문장을 실행한다.
- break; 로 멈춰주지 않으면 switch문의 case가 끝날 때 까지 계속 실행 된다.
- case에 swith문의 수식을 만족하는 값이 없을 경우 default 내의 문장을 실행한다.
  (default값은 불필요시 빼도 관계 없고 위치 또한 각 문장끝 break; 가 기재되어 있다면 위치도 상관 없다)
- switch(n) : n에는 수식과 숫자, 문자 입력 가능
- case n : n에는 숫자, 문자 입력 가능(문자열은 입력할 수 없다)


- 예제: break문의 활용

  1. public class Test1
  2. {   public static void main(String[] args){
  3.     int a=3;
  4.     a=5;
  5.     switch(a){
  6.         case 3 : System.out.print("***");
  7.         break;
  8.         //break가 없을 때 break가 나오거나 switch문이 끝날 때 까지 계속 실행됨.
  9.         default:System.out.print("1~3이외의 수"); //default 위치는 어디에 있건 상관 없다.
  10.         break;   
  11.         case 2 : System.out.print("**");
  12.         break;
  13.         case 1 : System.out.print("*");
  14.         break;
  15.  
  16.     }System.out.println();

- 결과





- 예제 : 점수를 입력받아 학점 출력하기

  1. import java.io.IOException;
  2. import java.io.BufferedReader;
  3. import java.io.InputStreamReader;
  4.  
  5. public class Test2{
  6.     public static void main(String[] args)throws
  7.         IOException{
  8.             BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
  9.         int score;
  10.         char pan;
  11.  
  12.         System.out.print("점수? ");
  13.         score=Integer.parseInt(br.readLine());
  14.  
  15.         if (score>=0 && score<=100){ // 점수 범위 설정하려 한것..
  16.             switch(score/10){ // 점수를 10으로 나눈 몫, switch(조건식)가능
  17.             //조건식 없이 그냥 score쓰고 100,99,98.. 하려 했다니.. 잠이 덜깼나..
  18.                 case 10:
  19.                 case 9: pan='A'; break;
  20.                 case 8: pan='B'; break;
  21.                 case 7: pan='C'; break;
  22.                 case 6: pan='D'; break;
  23.                 default: pan='F';        
  24.             }
  25.             System.out.printf("%d : %c ",score,pan);
  26.         }
  27.     }
  28. }

- 결과






* do while 문
- 형식
: do{}안의 실행문을 선실행 1회 후 while(조건식)의 조건식을 나중에 비교하여 반복여부를 결정
do {
       // 실행문;
} while(조건식);

- 예제 : 1~10까지의 합 구하기 / while문의 실행순서 / do while문의 실행순서

  1. public class Test3
  2. {   public static void main(String[] args){
  3.         int s=0, n=0;
  4.        
  5.         do{
  6.         n++;
  7.         s+=n;
  8.         }while (n<10);
  9.         System.out.println("결과 : "+s);
  10.        
  11.         n=10;
  12.         while (n<10){ // 조건을 만족하지 않으면 한번도 실행되지 않는다.
  13.             n++;
  14.         }
  15.         System.out.println("while n: "+n);
  16.  
  17.         n=10;
  18.         do { // 적어도 한번은 실행한다.
  19.             n++;
  20.         }while(n<10);
  21.         System.out.println("do~while n: "+n);
  22. }   
  23. }

- 결과






- 예제 : 한 수를 입력하여 1부터 그 수까지의 합을 구하라는연예인

  1. import java.io.IOException;
  2. import java.io.BufferedReader;
  3. import java.io.InputStreamReader;
  4.  
  5. public class Test4
  6. {   public static void main(String[] args)throws
  7.  
  8.         int num, s, n;
  9.         // 수 입력 받기
  10.         do
  11.         {System.out.print("수? ");
  12.         num=Integer.parseInt(br.readLine());
  13.         }
  14.         while (num<1 || num>100); // 범위를 벗어났을 때 → do{@_@}의 @_@ 실행
  15.         // 반복횟수가 명확하지 않을땐 while을, 명확할땐 for문을 주로 쓴다.
  16.    
  17.         // 합 구하기
  18.         s=0; n=0;
  19.         while(n<num){
  20.             n++;
  21.             s+=n;
  22.         }
  23.         System.out.printf("1~%d까지의 합 %d ", num,s);
  24.     }
  25. }

- 결과






* for 문

- 반복횟수가 정해진 반복문일 경우 유용하게 사용된다.(수학적 계산에 유리)

- 형식
for (n=1; n<=100; n++){
       s+=n;
     }
for (초기값; 조건값; 증감값)

- 예제 : 초기값과 증감값에는 콤마(,)로 구분하여 두개의 값이 입력이 가능하나 일반적이지 않다.

  1. int n,s;
  2. // 아래의 형식이 아닌경우 for다음에 ;이 붙으면 결과가 나오지
  3. // 않으므로 주의해야 함
  4. for (n=1,s=0; n<10; s+=n,n++); // 조건식에만 ,이 들어가지 못한다
  5. System.out.println("합 : "+s); // 이형식은 권장하지 않음..그냥 알아두라고



- 예제 : for문 안에서 선언된 변수는 외부에서 사용불가하다.

  1. int s=0;
  2. for(int n=1; n<=100; n++){ // for문 안에서도 초기값으로 변수값 형선언 가능
  3.     s+=n;
  4. }
  5. // System.out.println("n:"+n+",합 : "+s); // 오류
  6. // for에서 선언된 변수는 외부에서 사용불가!!
  7. // for 안에서만 사용 가능
  8. System.out.println("합 : "+s);


- 예제 : for문 안에서 선언된 변수의 초기값이 반복문의 조건에 항상 참일 때 무한루프에 빠진다. 

  1. int i,j;
  2. for(i=1; i<=5; i++){
  3.     // i=3; // 무한루프∞에 빠짐
  4.     for(j=1; j<=4; j++){
  5.         System.out.println("*");
  6.     }
  7. }
  8. System.out.println(i);


- 예제 : * 로 삼각형 모양 만들기.

  1. int i,j;
  2. for(i=1; i<=5; i++){
  3.     for(j=1; j<=5-i; j++){
  4.         System.out.print(" ");
  5.     }
  6.     for(j=1; j<=i*2-1; j++){ // j<=i 일때 오른쪽이 직선, *이 삼각형 모양으로 되기 위해
  7.         // 1, 3, 5, 7, 9.. 식으로 가려면 i값은 1,2,3,4,5.. 식이므로 1,3,5,7,9..가 되기 위한
  8.         // 조건식을 찾으라는 말, 1*2-1=1, 2*2-1=3....
  9.         System.out.print("*");
  10.     }
  11.     System.out.println();
  12. }

- 결과



- 예제 : 역삼각형 만들기

  1. int i,j;
  2. for(i=5; i>=1; i--){
  3.     for(j=1; j<=5-i; j++){
  4.         System.out.print(" ");
  5.         }
  6.     for(j=1; j<=i*2-1; j++){ //
  7.         System.out.print("*");
  8.     }
  9.     System.out.println();   
  10. }


- 예제 : while문 for문 if문 활용

  1. import java.io.*;
  2.  
  3. public class Test7{
  4.     public static void main(String[] args)throws
  5.  
  6.         int num, s;
  7.         char ch;
  8.  
  9.         while(true){ // 무한루프
  10.             do{
  11.                 System.out.print("원하는 수? ");
  12.                 num=Integer.parseInt(br.readLine());
  13.             }while(num<1 || num>1000);
  14.            
  15.             // 1에서 입력받은 수까지의 합을 구한다.
  16.             s=0;
  17.             for(int i=1; i<=num; i++)
  18.                 s+=i;
  19.             System.out.printf("1~%d 합 : %d ",num,s);
  20.  
  21.             // 합을 계속 구할지 물어본다.
  22.             System.out.print("계속 하시겠습니까?[Y/N] ");
  23.             ch=(char)System.in.read();
  24.             System.in.skip(2); // 엔터를 버림
  25.  
  26.             if(ch!='y' && ch!='Y')
  27.                 break; // while(true) 문을 빠져나간다.
  28.         }
  29.     }
  30. }

- 결과






* break : 속해있는 brace(중괄호)의 while, do~while, for, switch 문을 빠져나감

* continue : 속해있는 brace의 while, do~while, for 문을 빠져나감

* 네이블

  1. int a=0,b=0;
  2.  
  3.     jump: // 네이블이름은 엿장수 마음대로
  4.     while(true){
  5.         a++;
  6.         b=0;
  7.         while(b<3){
  8.             if(a>3)
  9.                 break jump; // 네이블 밑에 있는 문장을 빠져나가라
  10.             b++;
  11.             System.out.println(b);
  12.         }
  13.     } // while(ture)_end



* 문제1) : 1*2*3*....*10의 결과 구하기

  1. public class Test9{
  2.     public static void main(String[] args){
  3.    
  4.     int i=0,n=1,a=0;
  5.  
  6.     for (i=1; i<=10; i++)
  7.     {
  8.         n*=i;   
  9.     }
  10.     System.out.print(n);
  11.     }
  12. }


(소스 보고 공부하기..)

* 문제2) : 어떤 수를 입력받아 그 수가 소수인지 판별하기
소수 : 자기자신으로만 나누어지는 수(단, 1은 소수가 아님)

(소스 보고 공부하기..)

* 문제3) : 두 수를 입력 받은 후 작은수에서 큰수까지의 합 구하기

(소스 보고 공부하기..)

* 문제4) : 정수를 입력받아 입력받은 정수의 자릿수 구하기

(소스 보고..)

* 문제 5) 1~100까지 수중 3,6,9가 들어있는 수는 *를 출력하고
그렇지 않으면 수를 출력한다. 단 한줄에 10개씩 출력

(소스 보고..)

* 문제 6) 구구단을 다음과 같이 출력한다.
2*1=2 3*1=3 4*1=4 5*1=5
2*2=4 3*2=6 4*2=8 5*2=10
    :
2*9=18 3*9=27 4*9=36 5*9=45

6*1=6 7*1=7 8*1=8 9*1=9
  :

(소스 보고..)


* 과제) 자판기 만들기

(공부)

 

 

 

 

 

 

 


 

'Java' 카테고리의 다른 글

Java_06  (0) 2011.10.31
Java_05  (0) 2011.10.29
Java_04  (0) 2011.10.27
Java_03  (0) 2011.10.26
Java_02  (0) 2011.10.25
Java_01  (0) 2011.10.24