CHAPTER5 예습(1)

시험 범위는 4장까지인데...
5장을 예습 해가야하나 말아야 하나 라는 고민을 잠시 했었다.
기말고사부터 들어갈 5장을 지금 예습해 버리면
막상 5장 들어갈때는 또 백지가 되어 버릴게 분명하기 때문이다.
하지만 교수님께서는 아무 말씀도 없으셨던 관계로 5장을 예습 한다.

5장에서는 상속에 대해 좀더 자세히 배우는 시간인것같다.

상속 - 객체지향 언어의 장점인 모듈의 재사용과 코드의 간결성을 제공하는 중요한 특성

상속을 간단한 개념으로 빨리 이해하자면...
예를 들어 케잌 이라는 상위 클래스가 있다. 또 그 케잌은 크림케잌과 아이스크림 케잌 등으로 나뉠수 있고
크림 케잌은 올려지는 토핑에 따라 새롭게 분류 될수 있다. 하지만 아무리 재료를 다르게 올리고 모양을
바꾼다고 해서 근본인 케잌이 아니어지지 않는다.

상속의 개념을 이용하여 클래스들의 계층 구조를 구성할 수 있다.
일반적인 클래스 정의 -> 클래스로부터 상속된 새로운 클래스 생성 -> 상속되어 생성된 클래스는
이미 작성된 일반적인 모든 요소에 자동 상속 -> 특정한 일을 위해 필요로 되는 새로운 요소 추가하여 생성

자바에서의 모든 클래스들은 상위 클래스를 가진다.
클래스 선언 시 상위 클래스를 지정하기 위해 extends라는 예약어를 사용한다.

               [public/final/abstract] class 클래스 이름 extends
                                                      상위클래스 이름 {
                              ..............  // 멤버변수 선언
                              .............. // 생성자 선언
                              .............. // 메소드 선언
                     }     

오버라이딩 - 상속 관계에 있는 클래스들 간에 같은 이름의 메소드를 정의하는 경우

이와 비슷한 내용으로 4장에서 오버로딩을 배운적이 있다.
오버로딩은 같은 클래스 내에서 같은 이름의 메소드를 정의하여 다형성을 지원하는 것이고
오버라이딩은 상속관계에 있는 상위 클래스와 하위 클래스에서 같은 이름의 메소드를 정의하여 다형성 제공

결국 이 두 기능은 객체지향 언어의 주요 개념인 다형성을 제공하기 위해 쓰인다.
자바를 프로그래밍 할때 자주보게 될 기능 같으니까 알아두는 편이 좋을 것같다. 


Think...
교수님께서 많이 바쁘신가 보다...검사를 안하신 글이 있는걸 보면 말이다.
아무 말씀이 없으셔서 예습을 하긴 했지만...
왠지 이제는 예습보단 처음부터 4장까지를 다시 보는 시간을 가지는게
어떨지 하는 생각을 해본다.

by Alchemist | 2008/10/12 22:49 | 트랙백 | 덧글(2)

CHAPTER4 복습(1)

class Test{
    public static void main(String a()){
        SampleClass sc =  new SampleClass()       // 객체 지역변수
                  ↓                                                        new 객체생성연산자 -> 생성자를 피연산자로 갖는다.
         (reference 형)
                                                        // sc 라는 것은 SampleClass 형의 객체를 지시하는 이름으로 쓰겠다
         int i;                                             ' = ' 이라는 것은 "실체" 할당/대입?                 ↓
            i=sc.sum();                                실제로 존재하는 실체!(값/객체)                  (변수)
              System.out.println(i);                 실제로 의미가 있는 실체
       }
  }                                          

                ※ Box b=new Box();     //Box() 는 기본 생성자!
                                                      정의 되어 있지 않을 경우는 자바가 만들어 준다.
class Fruit{
    int ap=3;
    int str=5;
    int grp=7;
       }
      class Buy{
          public static void main(String args[]){
              int q1,q2;
              
                 Fruit f1=new Fruit();                 //객체 참조 변수
                 Fruit f2=f1;                                  그 값을 가지는 것이 아니라 그 객체의 주소를 가지고 있다.

                 q1=f1.ap+f1.str+f1.grp;
                 q2=f2.ap+f2.str+f2.grp;

                      System.out.println("f1의 초기 과일 수 : " + q1);
                      System.out.println("f2의 초기 과일 수 : " + q2);

               
                  f1.ap=4;                              // 객체 참조 변수를 사용하기 때문에 f1의 객체의 속성값이 변환되면
                  f2.str=8;                                  f2 객체의 값도 변환되게 된다. 물론 반대일 경우도 마찬가지다.
                  f1.grp=9;                                   
                 
                  q1=f1.ap+f1.str+f1.grp;
                  q2=f2.ap+f2.str+f2.grp;
  
                    System.out.println("f1의 변경된 과일 수 : " + q1);
                    System.out.println("f2의 변경된  과일 수 : " + q2);
           } 
        }


class Box{
       int width, height, depth;
       long idNum;
       static long boxID=0;            // 클래스 변수 선언
        
        public Box(){
           idNum=boxID++;           // 인수가 없는 Box  생성자를 만들어 생성자가 수행될 때 마다        
}                                                idNum에 boxID가 증가하도록 한다.

    }                                              
 class StaticDemo{
     public static void main(String args[]){
          Box mybox1=new Box();                                    
          Box mybox2=new Box();                  // 별로 어렵지 않은 부분이다.                            
          Box mybox3=new Box();                      객체 참조 변수 선언과 생성
          Box mybox4=new Box();

               System.out.println("mybox1의 id번호 : " + mybox1.idNum);           
               System.out.println("mybox2의 id번호 : " + mybox2.idNum);
               System.out.println("mybox3의 id번호 : " + mybox3.idNum);
               System.out.println("mybox4의 id번호 : " + mybox4.idNum);           
               System.out.println("전체 박스의 개수는 : " + Box.boxID);
     }
  }   

Think...
오늘 수업은 전체적으로 쉬운내용은 아니였다.
이해를 못하지는 않았지만... 이해하는데 시간이 좀 걸렸고...
무엇보다도 타이핑 오류가 자주 나서 에러를 고치는데 많은 시간이 들었던 것같다.
에러를 한참 고치고 있다보면 다음 진도로 넘어가고 있어서...
중간중간 듣지 못한 부분들도 있었다.
머 그건 내가 잘못한 탓이라... 영타 연습을 좀 해서 타이핑 오류를 좀 줄여야겠다.
그렇지 않으면 수업시간에 중요한 내용을 빠뜨릴것 같기 때문이다.

by Alchemist | 2008/10/07 15:44 | 트랙백 | 덧글(1)

CHAPTER4 예습(2)

생성자

    클래스로부터 객체가 생성될 때 객체의 초기화 과정을 기술하는 특수한 메소드이며 객체가 생성될 때
    무조건 수행된다.

      ** 생성자의 이름은 클래스의 이름과 동일해야 한다. **

    생성자 앞에는 접근 한정자가 쓰이는데...  우리가 잘아는 private과 public이 있다.
    이는 멤버 변수의 접근 한정자와 의미가 같은데... 다시 한번 말하자면...
    private을 쓸 경우에는 생성자가 클래스 내부에서만 사용이 되며...
    반대로 public은 모든 클래스에서 사용할수 있음을 뜻한다.

                   [public/private] 클래스 이름 (매개변수){
                    ............//초기화 문장들
                     }


생성자 오버로딩

    클래스는 여러개의 생성자를 가질수 있다. 여러개의 생성자를 가진다는 의미는 다시말해 같은 이름의 생성자를
    여러개 중첩하여 사용할수 있다는 말이다.

      ** 생성자의 이름은 같지만 생성자가 가지는 매개변수의 타입, 개수는 반드시 달라야 한다. **


예약어 this

    현재 사용 중인 객체를 의미한다.
    생성자나 메소드의 매개 변수가 객체 변수와 같은 이름을 사용하는 경우에 사용한다. 
   
        ** 생성자 내에서 this 구문은 반드시 첫 라인에 위치해야 한다. **
 


메소드


    클래스 내에서 객체가 할 수 있는 행동을 정의한 것으로 클래스의 핵심이라 할수 있다.

    메소드에 쓰이는 접근 한정자도 마찬가지로 멤버 변수에서 사용된 접근 한정자와 같은 의미를 같는다.
     
               static - 클래스 메소드            abstract - 추상 메소드     
               final - 종단 메소드                 synchronized - 스레드의 동기화

          [접근한정자]  [static/final/abstract/synchronized]
                               반환값타입 메소드 이름 ([매개변수들])
                    {
                       ...................// 지역변수 선언 및 메소드 행위 기술
                    }
      
      클래스의 핵심... 한마디로 이 보다 중요한건 없다는 뜻이기도 하다.
      자바는 클래스와 객체로 이루어져 있으며 또 클래스가 객체를 생성하는데 그 객체를 행동할수 있게 끔 
      정의해주는 메소드는 프로그램이 돌아가게 해주는 원동력이라고 해야 할 것 같다.


메소드 오버로딩

    앞서 공부한 생성자 오버로딩과 같은 개념을 가지고 있다.
    말 하자면 클래스에 같은 이름의 메소드를 중첩해서 사용할수 있는 것이다.

    결국 메소드 오버로딩과 생성자 오버로딩은 각각 같은 이름의 메소드와 생성자 명만 정의 해주고 
    다른건 타입과 개수 조절만 해주면 얼마든지 편안히 쓸수 있는 편리한 기능중 하나인것 같은데...
    왠지 이 기능을 자주 쓰는건 별로 좋지 않을것 같은 생각이 드는 이유는 무엇인지...


메소드에 값 전달 방법

    메소드 호출시 매개변수로 지정되는 실 매개변수는 기본 자료형과 참조 자료형으로 나뉜다.
    매개변수 전달 기법으로 값-전달 기법을 사용한다.

    기본 자료형 사용시 - 전달하고자 하는 변수값이 그대로 전달
    참조 자료형 사용시 - 전달하고자 하는 변수값의 주소를 전달

    이 기능은 고등학교  C 프로그래밍 시간에 배웠던 call-by-value(값의 의한 호출), 
    call-by-reference(참조에 의한 호출)과 같은것 같다. call-by-reference는 call-by-value보다
    기억용량이 적게 드는걸로 알고 있는데 자바에서도 그럴지는...

Think...
 
이번 예습에서는 그렇게 어려울 만한 내용은 없었지만... 예약어 this가 좀 생소하고 잘 이해 하지 못했다.
 this를 붙여 줌으로써 무엇이 어떻다는건지 이해 갈듯 말듯... 아무래도 이번 수업시간에 딴짓 하지 말고 
 제대로 들어야 할것 같다.
 

by Alchemist | 2008/10/05 22:45 | 트랙백 | 덧글(1)

CHAPTER3 복습(3)

교수님께서 말씀 아니 당부를 하셨다.
복습과 예습을 할때는 정리하는것도 좋지만...
그 내용을 내 것 으로 만들라고... 마치 친구에게 쉽게 설명해줄수 있게끔 하라고...
하지만 그게 말처럼 쉽지는 않을 것 같다. 누군가에게 설명을 해줘야 한다면... 그만큼의 지식이
필요할것이고 또 언변이 좀 받쳐줘야 할테니까 말이다. 그래도 교수님의 당부가 있었으니만큼
나름 노력을 해야하지 않겠는가....



선택문

    - 선택문은 선택을 한다의 의미를 두고 있다. 종류에는 if, switch 문이 있다.
    - if는 조건절의 따라 true나 false 값을 반환한다. 상황에 따라 else를 사용하게 된다.
    - switch는 다중 선택을 위해 사용한다. 
     
선택문의 예제를 살펴보면...

class DoUseMenu{
 public static void main(String args[]) throws java.io.IOException {
  char choice;
  do
  {
   System.out.println("        객체지향 용어 설명");
   System.out.println("   1.  객체");
   System.out.println("   2.  클래스");
   System.out.println("   3.  메시지");
   System.out.println("   4.  상속");
   System.out.println("원하는 번호를 입력하세요 :");
  
   choice = (char)System.in.read();        // read가 정수형으로 읽어 오기 때문에 char 형으로 형변환
   System.out.println();                               
     }while( choice < '1' || choice > '4');     // 조건절로 choice가 1보다 작거나 4보다 클때까지 반복 

   switch(choice){           // 수식 자리에는 반드시 정수 값으로 떨어지는 것이 와야한다.
   case '1' : System.out.println("*****객체*****");           
     System.out.print("객체는 정보를 관리하기 위한 논리적인 단위이다.");
     break;
   case '2' : System.out.println("*****클래스*****");         // choice 값이 2로 평가된 경우 실행
     System.out.print("클래스는 객체를 생성하는 형판(template)이다.");
     break;
         case '3' : System.out.println("*****메시지*****");
     System.out.print("메시지는 객체에게 일을 시키는 행위이다.");
     break;
           case '4' : System.out.println("*****상속*****");
     System.out.print("상속은 상위 클래스로부터 모든 속성과 절차를 이어 받는다.");
     break;
  }
 }
}


반복문

    - 별 다른 뜻은 없다. 그냥 말 그대로 반복문이다. 지정된 조건에 만족할때까지 반복을 계속 하는 것을 뜻하며 종류
      에는 while, do-while, for가 존재한다.
    - 반복문에서 반복되어질 문장이 한 문장일 때는 중괄호를 써서 블록 지정을 하지 않아도 되지만 한 문장 이상이
      되면 블록 지정을 하여야 내가 원하는 값을 얻을수 있다.

반복문의 예제를 살펴 보면...

class DoWhile{                                                     // 이 코딩은 구구단 3단을 출력하기 위해 짜여진 것으로
 public static void main(String args[]){                        반복문인 do-while 문을 썼다.
  int n=1;
    System.out.println("구구단 3단 ");                         **do-while문은 while문과는 다르게 조건절을 나중에  
    do                                                                       평가하는 것으로 while블록이 적어도 한번은 수행한다.
  {
     System.out.println("  " + 3 + "*" + n + "=" + (3*n));
     n++;                                                         // 이 반복문에서는 n의 초기값 1을 주고 조건으로 10보다  
   }while(n<10);                                                  작을때까지 n을 증가 시켜면서 출력을 하는 역활을 한다.       
 }
}


class Netedfor{
  public static void main(String args[]){
  int i,j;
  for(i=1;i<10;i++){                          // for가 총 반복되는 수
    for(j=1;j<i;j++)                            // j가 i보다 작을때 까지 별을 찍는다.
    System.out.print("*");
  System.out.println();                    // 이 반복문은 다중 for문이라고 한다. for안에 또 다른 for가 내포된 것이다.

      }
    }
}


배열

    - 배열은 같은 Type에 데이터를 저장하기 위한 공간이라고 보면 된다.
    - Arrays 클래스의 객체로 취급한다.

배열의 예제를 보면...

class TwoArray{                                             
 public static void main(String args[]){                                                                                          
  int two_array[][]=new int[4][5];       // 2차원 배열 선언과 생성
  int i,j,k=0;
    for(i=0;i<4;i++){          
      for(j=0;j<5;j++){
      two_array[i][j]=k;       // 각 요소에 값 배정
     k++;                           // k값을 증가
     }
    }
     for(i=0;i<4;i++)
      for(j=0;j<5;j++){
    
     System.out.print(two_array[i][j]+" ");     // 각각 자리 출력할때마다 약간의 간격을 준다.
     System.out.println();      // 줄바꿈의 역활을 하고 있다.
   }

  }
}              

                                                                                                                     
Think... 
저번보다 코딩을 해석도 하고 내 것으로 만들려고 노력을 해보았지만 역시나 쉽지 않았다.
어딘가 많이 부족하고 어색한면이 없지않아 있는데 이런식으로 쓰다보면 차츰 나아지지 않을까? 싶다.

드디어 기나긴 3단원이 끝났다. 그만큼 내용이 많았다는 뜻과 동시에 공부해야할 분량이 많다는...
오늘 배운 선택문, 반복문, 배열은 앞으로 자바시간에 자주 쓰일것으로 생각 되어진다. C언어에서도 그랬듯이...
자주가 아니라 거의 대부분이 차지 할 것으로 생각한다. 그렇기 때문에 쓰임새와 사용방법 등을 잊어버리지 
않도록 꾸준히 공부하고 연습해보면서 앞으로의 수업에 대비를 해야 겠다. 

by Alchemist | 2008/09/30 15:14 | 트랙백 | 덧글(1)

CHAPTER4 예습(1)

1. 클래스의 일반구조
    
    클래스
      - 클래스 헤더
      - 클래스 멤버
          -> 멤버변수 (클래스가 가지는 속성 정의)
          -> 생성자 ( 객체의 초기화를 담당)
          -> 메소드 ( 클래스가 가지는 데이터를 조작*변환)


2. 클래스 선언

     - 클래스 선언 시 클래스의 특징을 나타내는 한정자를 지정하여 선언할수 있다.
        (모든 클래스의 한정자를 지정하지 않으면 main() 메소드가 있는 클래스를 public으로 취급)

     - main() 메소드가 있는 클래스가 아닌 다른 클래스에 public한정자를 사용한다면 자바 컴파일러가 오류를 발생

         @ 한정자
         - public : 모든 클래스에서 접근 가능    // 현재 우리가 수업시간에 이용하고 있는 클래스
         - final : 서브 클래스를 가질수 없는 클래스 
         - abstract : 추상 클래스를 의미

                ** 자바에서 하나의 프로그램에는 하나의 클래스만을 정의하는 것이 원칙 **

                 
3. 객체의 생성

     - 객체를 생성하기 위해서는 우선 객체를 선언
  
        객체 선언 형식
         클래스명 객체참조변수;    // 객체의 선언 
         객체참조변수 = new 클래스명  // 객체를 생성
                                                    
         클래스명 객체참조변수 = new 클래스명();   //객체의 선언과 생성


4. 맴버 변수
 
     - 메소드 밖에서 선언된 변수
     - 객체가 가질수 있는 속성을 나타내는데 사용

     멤버 변수
        - 객체 변수 
            -> 객체 속성 변수
            -> 객체 참조 변수
        - 클래스 변수
        - 종단(final) 변수
            
                   ** 자바 프로그래밍을 하기 위해서는 각 변수의 의미를 정확하게 파악하고 사용해야 함 **


5. 멤버 변수 접근 한정자

    - 클래스내의 멤버 변수 접근을 제한할 수 있는 방법
    - 객체지향 언어의 중요 특성 중에 하나인 캡슐화와 정보 은폐를 제공
    - 접근 한정자로 public, private를 제공


6. 변수의 유효범위
    
    - 멤버변수
    - 메소드 매개변수와 지역변수
    - 예외 처리기 매개변수

 

Think...
여태까지는 클래스가 객체를 생성하는 틀로만 알고있었지만...
이번 챕터에서는 클래스의 대해 좀더 세부적으로 배우는 것같다.
예습으로 이론과 예제들을 해보긴 했는데 대충 큼직큼직 하게는 이해를 했다.
그렇지만 이렇게 점점 심오하게 들어가면 어려워 질거 같다...
앞으로 좀더 좀더 아니 많이 분발해야 할것 같다.

by Alchemist | 2008/09/28 21:21 | 트랙백 | 덧글(1)

◀ 이전 페이지          다음 페이지 ▶