Java Programming [Chapter5] 상속

1.상속이란 ?
    - 상속은 객체지향 언어의 장점인 모듈의 재사용과 코드의 간결성을 제공하는 중요한 특성.
       앞서 상속의 개념을 설명하였고 이는 일반적인 클래스로부터 상속된 새로운 클래스를 쉽게 생성할수 있는 것이다.

* 상속을 할때 의 주요 용어 extends 를 기억하자

class A {                                //A클래스 생성
    int aa = 1;
}
class B extends A{                  // B클래스 생성과 함께 A를 상속받는다.
    int bb = 2;
}

class C extends B{                   // C클래스 생성과 함께 B를 상속받고 B에서 상속받은 A또한 상속받음.
    int cc = 3;
}
class Dabc{
public static void main(String args[]){
C t = new c();                                    // C 클래스의 객체를 생성
System.out.println("t객체의 객체속성변수 aa의 값은 " + t.aa);        // 출력 1
System.out.println("t객체의 객체속성변수 bb의 값은 " + t.bb);        // 출력 2        
System.out.println("t객체의 객체속성변수 cc의 값은 " + t.cc);        // 출력 3
}
}

C클래스의 객체를 생성하엿지만 상속을 받았기 떄문에 C클래스로 부터 생성된 객체라도 A클래스와 B클래스의 값등을 활용
할수 있다.

2. 예약어 super
  - 예약어 super는 두 가지 형태로 사용된다. 첫쨰는 하위 클래스에 의해 가려진 상위 클래스의 멤버변수나 메소드에 접근할 때
    사용한다. 둘째는 상위 클래스의 생성자를 호출하기 위해 사용된다.

사용 형식.

super.객체변수
super.메소드이름(매개변수)

예제코드

class D1{                        //클래스 D1 의 생성
int x = 1000;                    // 변수 생성
void display(){                // 메소드 생성.
System.out.println("상위클래스의 메소드입니다.") ;
    }
}
class D2 extends D1{        //클래스 D2의 생성 상속으로 D1클래스를 받고잇다.
int x = 2000;                        //변수생성
void display(){                    // 메소드생성
System.out.println("하위클래스의 메소드입니다.") ;
    }
void write(){                    // 메소드 생성
this.display();                    //this 를 사용하엿음으로 클래스 D2의 메소드를 사용한다.
display();                          //클래스 D2 내에서 사용된 메소드이므로 클래스 D2의 display메소드 사용. 
super.display();                // 상위 클래스의 메소드 사용
System.out.println("D2 클래스의 객체 x 값  = " + x);            //D2 클래스 객체값 출력
System.out.println("D1 클래스의 객체 x 값  = " + super. x); // 상위 클래스인 D1 객체값 출력
}
}
class Main{
public static void main(String args[]){
    D2 d = new D2();                    //D2의 객체생성
    d.write();                            //write 메소드 사용
    }
}

사실 위 코드에서 메인 클래스 부분이 살짝이해가 안갓지만 super 사용은 이해가한번에 됫다.


by blackCat | 2008/10/11 22:25 | 트랙백 | 덧글(2)

Java Programming [Chapter4] 클래스(1) 복습편

클래스란 ?

클래스는 객체를만드는 틀 , 설계도 같은 것이다.

그렇다면 클래스 뒤에는 반드시 객체를 생성하는 과정이 있어야 객체를 사용할수 있는 상태가 된다 .

 * static : 사용시 객체생성을 안하고 사용가능 .

    ex)public static void main(String args){}

클래스의 일반적인 구조 예

class Test{
    public static void main(String a[]){
        SampleClass sc = new SampleClass(5,7,9)
        // sc라는것은 SampleClass 형의 객체를 지시하는 이름.
        int i;
        i = sc.sum();
        System.out.println(i);
    }
}


완성형 코딩

class SampleClass{
int a;
int b;
int c;

public SampleClass(int x, int y, int z){
a = x;
b = y;
c = z;
}
public int sum(){
int d;
d = a + b + c;
return d;
 }
}

class Test{
    public static void main(String a[]){
        SampleClass sc = new SampleClass(5,7,9);
        // sc라는것은 SampleClass 형의 객체를 지시하는 이름.
        int i;
        i = sc.sum();
        System.out.println(i);
    }
}

* void 는 반환형이 없을때 쓰는 반황형 문자(?) 이다.

후후

Two 박스 예제를

코딩해 보앗다 ..

class Box{                                     // 박스 클래스의 매개변수 .
int width;
int height;
int depth;
public Box(int x, int y, int z){             // 변수에 값을 받는 부분.
width = x;
height = y;
depth = z;
}
public int sub(){                        // 계산 처리과정
int s;
s = width * height * depth;
return s;
}
}
class TwoBox{
public static void main(String args[]){
int o, t;
Box one = new Box(1,2,3);                // 객체생성 및 값 대입.
Box two = new Box(4,5,6);
o = one.sub();                    // 지정 변수에 결과 값 대입.
t = two.sub();
System.out.println(o);           // 출력
System.out.println(t);
 }
}

이런 구문 인것같다. 처음에 햇을 때는 매우 오류가 많앗지만 책의 도움을 살짝 받아서 .. 수정해 나갓지만 ;

여전히 어려웟다 .

다음의 연습 코딩은 이것이 었다 .!!!

class fruit{                            //맴버변수 선언
int a = 5;
int s = 10;
int g = 15;
}

class Buy{                                
public static void main(String args[]){
int su1,su2;
fruit f1 = new fruit();                    // f1 객체생성
fruit f2 = f1;                                // f2 객체에 f1객체의 주소 할당
su1 = f1.a + f1.s + f1.g;
su2 = f2.a + f2.s + f2.g;
System.out.println(su1);            // 결과값 30
System.out.println(su2);            // 결과값 30
f1.a = 10;                                // 수를 바꿔준다.
f1.s = 20;
f2.g = 20;
su1 = f1.a + f1.s + f1.g;            
su2 = f2.a + f2.s + f2.g;            
System.out.println(su1);        //출력 50
System.out.println(su2);        //출력 50
 }
}

아 정말 너무나 쉬운 코딩이엇다... 다만 활용한적이 별로 없엇고 써본적도 별로 없어서 ..ㅎ ㅏ는데 막막햇다..

하지만 코딩을 알고나선 ... 절망 나에대해 실망이 컷다..;;;;;;;

이런걸 막막해 했다니.. 열공이 필요한것같다.;

코딩 해석의 요점은 f1에 새로운 객체가 할당되고

f2에는 f1객체의 주소를 할당함으로서

수를 바꿔주는 부분에서도 같은 주소로 지정되잇는 f1 과 f2 는 결국 f1 =  f2 이고 f2 = f1 이라는 것이 되어서

결국 수를 다른 쪽에서 바꿔 합을 구하면 같은 출력이 나오게 된다는 것이다..

다음으로 하나의 객체가 생길때마다

그 객체의 수를 카운팅하는 프로그램을 하엿다.

class Box{                    //맴버변수 선언
int w;
int h;
int d;
long idNum;            // 객체의 개수 를 넣어두는 변수
static long boxID = 0;        // 카운터
public Box(){
idNum = boxID++;            // 박스의 개수를 넣어주고 다음 박스에대한 개수를 삽입
 }
}

class StaticDemo{            
public static void main(String args[]){
Box a = new Box();                    // 객체 생성. 객체생성시 박스의 idNum에 숫자가 생긴다.
Box b = new Box();
Box c = new Box();
Box d = new Box();

System.out.println(a.idNum);            // 0
System.out.println(b.idNum);            // 1
System.out.println(c.idNum);            // 2
System.out.println(d.idNum);            // 3
System.out.println(Box.boxID);         // 4 < 다음 객체의 갯수이자 여태까지 생성된 객체의 개수
 }
}

후 코딩은 거의 비슷하게 마쳐서 그나마 오늘은 소득이 있는것 같다.

시간이 쫌걸리더라도 책에 있는 예습코드를 보고 연습해 보는 편이 좋다고 생각햇다.

오늘 수업은 어려웟지만 좋앗다.

by blackCat | 2008/10/07 15:47 | Java Programming | 트랙백 | 덧글(1)

Java Programming [Chapter4] 클래스(2)

1.생성자
    - 생성자란 클래스로부터 객체가 생성될 때 객체의 초기화 과정을 담당하는 특수한 메소드(무조건수행)
    - 생성될때 한번만 수행됨, 자동실행으로 객체를 생성하는 메소드 new 에 의해 자동실행

생성자의 형식

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

개인적으로 이런 설명보다는 한번의 코딩이 더 효과적이라고 본다

p117코딩.

class Box {                                                    //박스 클래스생성
    private int width;                                         //사용할 변수들 선언
    private int height;
    private int depth;
    private int vol;
    public Box(int a, int b, int c){                       //박스 클래스에대한 생성자.
        width = a;
        height = b;
        depth = c;
    }
    public int volum(){                                      // 부피를 구하는 메소드
        vol = width * height * depth;
        return vol;                                              // 값의 반환
    }
}

class BoxTestDemo{                                       // 메인
    public static void main(String args[]){
    int vol;                                                        // vol 변수 선언
    Box mybox1 = new Box(10,20,30);                 // mybox1 생성과함 께 생성자를 거쳐 값이 초기화 및 삽입 된다.
    vol = mybox1.volum();                                 // mybox1에 있는 값을 부피를 구하는 메소드로 보낸뒤 리턴값을 받는다.
    System.out.println("mybox1 객체의 부피 : " +vol);        // 출력
    }
}

실행 결과  mybox1 객체의 부피 : 6000

나름대로 해석 해본것이다 . 맞는지는 모르겟지만 내가 보기엔 이렇게 생각되어져서 써보았다.

2. 생성자 오버로딩
    - 클래스는 여러개의 생성자를 가질수 있꼬 이는 중첩하여 여러개로 사용할 수 있는 것이다.

사용에 대한 내생각

간단히 생각하면 매우 복잡해지는 기술인것같다 .

같은 이름의 생성자지면 몇개를 사용하여도 모두 다른 매개 변수 또는 다른 타입이면 사용이 가능하다.

이는 프로그램 코딩한사람만이 알뿐 모르는 사람이 보면 햇갈릴수 잇게 해주는 부분이다 .. 따라서 주석을 부친뒤 설명이 필요

한것 같다.

이렇게 중첩으로 사용시. 이득은 많은것같다 하지만 초보자가 함부로 사용시는 어려움이 있을꺼같다 .

3. 예약어 this
    - this 예약어는 현재 사용 중인 객체를 의미한다. 일반적으로 생성자나 메소드의 매개 변수가 객체 변수와 같은
      이름을 사용하는 경우에 this를 사용하게 된다.
    - 설명만으로는 어렵다 하지만 내 생각으로 이해하는것은 클래스네에 같은이름의 객체가 잇다면 this를 이용해 현재 참조 변수
      를 사용한다는 것같다.

4. 메소드
    - 메소드는 클래스 내에서 객체가 할수 있는 행동을 정의한 것
    - 메소드에 사용되는 접근 한정자는 멤버 변수에서 사용된 접근 한정자와 같은 의미.

코딩.

public class SamePackage{
    Test1 t1 = new Test1();
    t1.a = 3;              //접근가능
    t1.b = 3;              //접근가능
    t1.c = 3;              //접근불가능
    t1.mothod1();      //접근가능
    t1.mothod1();      //접근가능
    t1.mothod1();      //접근불가능
}




이것을 보고 매우 이상햇다.. 도대체 어딜봐서 뭐가 불가능이고 가능인지 알수가없엇다 ..;

수업에서 자세한 설명이 필요한것 같다.

메소드에도 오버로딩 기능이 있고 이는 중첩사용을 가능케해준다.

또한 하나의 메소드 이름으로 다양한 연산을 수행할 수 있는 방법을 제공한다.

중첩된 메소드가 호출되면 매개변수의 형과 개수를 비교하여 적합한 메소드가 실행된다.

이기능은 참좋은 기능같다. 세상 참 좋아 진것같다 ..

5.메소드에 값전달 방법.
    - 메소드 호출 시 매개변수로 지정되는 실 매개변수는 기볹 자료형과 참조 자료형으로 나누어 볼 수 있다.
      매개 변수 전달 방법은 메소드 호출 시 실 매개변수의 값을 형식 매개변수에 복사 해주는 방식.
    - 하지만 자료형에따라 다르게 동작된다.
-------------------------------------------------------------------------------------------------------------------

점점 단원이 가면갈수록 어렵다..

그치만 좀더 전문적인 기술을 배우는것같아서 뭔가 하는것 같아서 기분이 좋다

하지만 군대를다녀오면........................

하아 ..

열심히 해야겟다.



by blackCat | 2008/10/04 23:56 | 트랙백 | 덧글(2)

Java Programming [Chapter3] 자바 기본 구조 복습편.(3)

오늘의 수업은 반복문에서 부터 시작하였다.

반복문은 기본적으로 while, do-while, for문을 제공 되어진다.

* 주의 : 선택문이나 반복문이 써진뒤 다음으로 실행해야할 문장이 여러문장인경우 '{}' 안에 써준다.

ex) 

    i = 1;
    if(i>2)
        System.out.println(i);   //이프문의 조건절이 참인경우 실행되는문장이며. 중괄호가 없기 떄문에. 이문장까지만-
    i++;                                // - 이프문이다.
        System.out.println(i);

하게 되면 출력은 2가 나오게된다 .

1. while 문
    - 조건절이 참인동안 while문안에 문장을 실행한다.

while(조건절)
    System.out.println("실행");

* 이때 조건절의 값은 참/거짓 의 값을 가지고 잇어야한다 .

2. do_While 문
    - 이 반복문은 무조건 한번은 조건절을 생각하지않고 한번은 돌고 나서 조건절을 활용한다.

ex 코드.

public class DoWhile{
 public static void main(String args[]){
  int n = 1;                                            // n 값선언
 do{                                                    // do_while문의 시작.
 System.out.println("3 * "+n+" = "+(3*n)); // 구구단 3단을 출력하기 위한 출력문
 n++;                                                  // n을 사용뒤 n값 증가
  }while(n<10);                                    // do_while문의 조건절
 }
}

3. do_while 문의 응용

public class DoWhile{
 public static void main(String args[]) throws java.io.IOException{
 char choice;                                                        //캐릭터 변수 선언
 do{                                                                    //do_while 문의 선언
  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();                        //키보드로부터 입력을받지만 입력시 키보드에 상응하는 숫자가 입력되서
  System.out.println();                                           // 형변환을 해준다.
  }while(choice < '1' || choice > '4');                    // 조건절
 switch (choice) {                                                // switch_case 문. Switch (x) , switch(o)
  case '1' : System.out.println("****객체****");
   System.out.print("객체는 정보를 관리하기 위한 논리적인 단위이다");
   break;
  case '2' : System.out.println("****클래스****");
   System.out.print("클래스는 객체를 생성하는 '판'이다.");
   break;
  case '3' : System.out.println("****메시지****");
   System.out.print("메시지는 객체에게 일을 시키는 것.");
   break;
  case '4' : System.out.println("****상속****");
   System.out.print("상속은 상위 클래스로부터 모든 속성과 절차를 받는다.");
   break;
     }
 }      
}

4. for 문.
    - for문도 초기 값부터 조건까지 증가,감소하면서 반복하는 것이다.

구조
    for (초기값 : 조건 : 증가,감소값){
    반복문;
}

이러한 구조를 가지고 있다.

5.for 문의 응용(별찍기)

public class DoWhile{
 public static void main(String args[]){
 int i, j;
 for(i=1;i<10;i++){                                // i 값이 1부터 10전까지 i값을 증가시키면서 반복
  for(j=1;j<i;j++){                                // j값이 1부터 i 값까지 j값을 증가시키면서 반복
   System.out.print("*");                    // for(j=1;j<i;j++)의 반복문.
   }
  System.out.println();                        // 줄바꿈
  }
  
 }
}

출력결과는

*
**
***
****
*****
******
*******
********
*********

6. 배열

배열에는 1차원 배열이 기본적으로 있고

이는 여러 기억장소를 한번에 지정하는곳에 쓰이며 .

보편적으로는

for문과 if 문 그리고 2차원배열이 많이 사용된다.

2차원 배열 활용 .

public class DoWhile{
 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 ;        //각각 I,j의 값 에 의한 행열에 k값을 넣어주고 k값증가
  k++;
 }
 for(i = 0; i<4 ; i++){            // 2차원 배열의 출력.
  for(j=0;j<5;j++)        
  System.out.print(two_array[i][j] + " "); 
  System.out.println();

  }

 }
}

by blackCat | 2008/09/30 15:43 | Java Programming | 트랙백 | 덧글(0)

Java Programming [Chapter4] 클래스(1)

1.클래스의구조

4장의 첫장에는 클래스의 정의, 클래스의 구조가 나와있다 .

일단 첫장에서 가장 중요한 부분은 .

1. 자바 프로그램은 클래스의 인스턴스인 객체를 생성하여 프로그램이 작성된다.

2. 객체생성을 위해서는 클래스가 먼저 작성되어야한다.

3. 자바의 시작은 클래스의 생성부터이다.

4. 클래스는 객체를 생성하는 형판(붕어빵이 객체라면 붕어빵을 만드는 철판은 클래스이다.)

클래스의 구성 그림

클래스 - 클래스 헤더

          - 클래스 멤버 -맴버변수,생성자,메소드


단순히 이그림만 보면 이해하기 가 어렵다 . 실제적으로 사용해본적이 없고 피부로 느껴보지 않는이상 이해란 힘들다..

그래서 책에 있는 코딩을 봣다 .

* 코딩
    class SampleClass{     // 클래스 헤더부분
        int a;
        int b;                    // 멤버 변수 부분
        int c;
        public SampleClass(int x, int y, int z){  //생성자부분, 이름이 클래스 명과 같다.
            a = x;
            b = y;
            c = z;
            }
    public int sum(){   //메소드 부분
        int d;
        d = a + b + c;
        return d;
    }
}

위 코드를 보면 개인적인 생각으로 일단 SampleClass라는 객체의 틀 클래스가 생성되엇으며 클래스의 상속의 개념이 있는

맴버 변수가 생성되어 있다. 그후 생성자 부분부터 메소드 부분까지는 이해가 가질않는다..

메소드 부분은 일종의 함수 수를 구하는 명령과정으로 이해가 되어진다.

생성자 부분은 영이해가 안가지만 책속에서는 값을 초기화 해주는 부분이라고 되어있다.

이점은 교수님의 설명과 한번쯤의 코딩으로 이해가 될듯싶다..

그 후 책 102p 를 보면 여러 예가 있다.. 여기서 3번째 예

3번

class Box {
    int width;
    int height;
    int depth;
    public void Box(int w, int h, int d){
        width =w;
        height = h;
        depth = d;
    }
    puvlic void volum(){
        int vol;
        vol = width * height * depth;
        System.out.println("Volume is"+vol);
}
}

이 예제인데. 여기서도 위쪽 코딩과 동일한구조이다 하지만 차이점이있다.. 2번째 부분 에서 윗쪽 코딩은 public 이고 이번코딩은

public void 이다. 이차이점은 무엇인지 궁금하다 ..

그리고 결정적으로 이코딩이 어떠한 실행 순서를 가졋는지도 이해할수가 없었다..

아마 매번하던 코딩은 클래스 선언뒤 public static void main(String args[]) 가 있엇는데 이부분이 없어서 인거같다..

이부분은 배우는데있어서 C언어에 비해 어려움이 있는것같다. 그래도 이특성때문에 자바가 편리 한 것이라고 얼핏 책에서 본것같다..

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

객체의 생성

이부분은 상당히 알기 쉬웟다 . 객체를 사용하기위해선 당연히 먼저 선언을해야한다.

선언방법은 내생각으론 2가지로 나눠지는 것 같다.

첫번째 방법은

'클래스명 객체참조변수' 를 쓴뒤

'객체참조변수 = new 클래스명' 을 써서 생성하는것

두번째 방법은

'클래스명 객체참조변수 = new 클래스명()' 이 있다. 수업때 주로사용한방법이며 이편이 쫌더 코딩을 짧게해주는 좋은 방법인것 같다..

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

멤버 변수

이것또한 햇갈렷다..

자바를 이해하기위해 꼭필요하다고는 하지만 난 뭐지.. 무튼 일단 변수인건알겟지만

일단 구분은

멤버변수 - 객체변수 - 객체속성변수,객체참조변수

             - 클래스 변수
             - 종단 변수

이런구조이다 ..

간단한 정리는 static은 클래스 변수
final 종단변수

앞에 이둘이 아닌것이 붙은 변수는 모두 객체변수이다 ..

실제로 종단변수는 아직까진 사용해본적이없다..

객체변수 는 간단히 int 변수명. 이것이 속성 변수 - 데이터의 종류 와 값을 결정

클래스명 참조변수명 < 이것이 객체 참조변수 이다. - 객체에 참조하여서 사용하는 변수라고 일단 나는 생각하기로 했다.

이때 객체 참조변수는 값을 가지는것이아니라 참조를 위해 주소를 가지고 있다..

요점은 속성변수는 값을 가지고 있기때문에 서로 참조가 되지않지만 참조변수는 주소값을 저장하기때문에 서로 영향을 줄수있다.

일종의 포인터와 같은 원리다.

클래스변수 단 한마디로 이해할수 있엇다 static이 붙은게 클래스 변수이며 이는 전역변수의 개념을가진다.

즉 모든 지역에서 사용되는 변수이다.

종단변수는 final 을 사용하여 선언하고 변할수 없는 상수값을 가진다. 단한번초기화하고 그값을 변경할수 없다 관례상 변수명은  대문자를 사용한다고 한다.

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

맴버 변수의 접근방법

접근 방법은 매우간단하다

클래스이름.클래스변수  or 객체이름.클래스변수

이것만봐도 이미 수업시간에 한번씩은 사용해 봣고 충분히 이해가갓다.

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

멤버 변수 접근 한정자.

이는 교수님이 한번 설명해주신것같다 .

public / private 에 대한것인데

public 으로 선언된 객체변수는 소속된 클래스가 접근이 가능하면 항상접근 가능하다는것을 의미한다 일종의 공유 같은 의미이다.

반면 private 는 소속된 클래스 내에서만 사용할수잇고 외부접근시 오류가 발생한다.

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

변수의 유효범위

말그대로 변수가 사용될수 있는 범위를 뜻하며 3가지로 분류 된다고 한다.

멤버 변수, 매개변수와 지역변수

예외 처리기 매개변수

이는 설명보단 코딩이 설명이 빠를껏같다..

class My Class{                                             

    맴버변수

    public void aMethod(메소드 매개변수){

        메소드 지역변수 

        catch(예외처리기 매개변수){

        }
    }
}

맴버변수는  전역에 걸처사용가능하고 메소드 변수는 메소드 가 선언된부분부터 메소드가 끝나는 중가로 까지 사용가능

예외 처리기매개변수는  그블럭안에서만 사용이 가능하다..

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

자바가 좋다는 용어는 아직 까진 실감을 못하고 잇다 오히려 C언어가 아직까진 더 편하고 좋다고 느끼고잇다.

아마 이런 특성이 있는 많큼 배우기 까다로워서가 아닐까 한다..

배우게되면 활용이 쉬워지지만 아직은 안배웟으니 턱없이 부족하고 수업시간에도 코딩을 통한 심화학습? 어렵진않지만 재미나게

이해할수잇는 심화코딩이 있었으면 좋겟다고 생각한다..

by blackCat | 2008/09/25 21:51 | Java Programming | 트랙백 | 덧글(2)

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