Class 클래스
//2011-3-2  Class 클래스

class ClassSCB
{
  public static void main(String[] args)
  {
    ClassSCB A = new ClassSCB();    
    Class aClass = A.getClass();
    System.out.println(aClass.getName());
    return;
  }
}

Object 클래스의 getClass() 메소드 - 객체의 클래스를 돌려준다. 
객체의 클래스는 프로그램 실행중 Class 클래스의 객체로 나타난다. 
Class 클래스  
프로그램 실행중 각 객체의 클래스나 interface를 나타내기 위한 클래스 
객체가 속한 클래스의 이름을 출력하기 위한 getName() 메소드 Person 클래스에서의 사용예      

   ClassSCB A = new ClassSCB();    
  Class aClass = A.getClass();
  System.out.println(aClass.getName());
   
 
 실행결과의 출력문은 의 클래스 이름인 ClassSCB를 출력한다.
다형성 : 다형성이란 같은 종류이지만 여러가지 형태나 모양을 가지는 것을 의미한다.
/* print() 메소드를 서브클래스에서 재정의하고, 객체의 클래스를 서브클래스에서 수퍼클래스로 변환시켰을 경우 수퍼클래스의 print() 메소드가 호출되는 다형성을 보여주는 프로그램 */

class Generation
{
  public static void main(String[] args)
  {
    Father manF = new Father("Kennedy"87);
    Son manS = new Son("Nixon"45);
    manF.print();
    manS.print();
    manF = manS;
    manF.print();
  }
}

class Father
{
  String name;
  int age;

  public Father(String aName, int anAge)
  {
    name = aName;
    age = anAge;
  }

  protected void print()
  {
    System.out.println("\n I am Father : ");
    System.out.println(" Name : " + name);
    System.out.println(" Age : " + age);
  }
}

class Son extends Father
{
  public Son(String aName, int anAge)
  {
    super(aName, anAge);
  }

  protected void print()
  {  
    System.out.println("\n I am Son : ");
    System.out.println(" Name : " + name);
    System.out.println(" Age : " + age);
  }
}
 

▶ Father manF = new Father ("Kennedy", 87);  
   Son manS = new Son ("Nixon", 45);   
   객체 참조변수 manF와 manS선언과 객체생성   
 
▶ manF.print(); // Father 클래스의 메소드를 호출하고    
   manS.print(); // Son 클래스에 재정의된 print() 메소드를 호출   

▶ manF = manS;    manF는 Father 클래스의 객체에서 Son 클래스의 객체로 변환되었다.   
   manF가 처음에 가리키던 Father 클래스의 객체 Kennedy는 자동적으로 소멸된다 
  
▶ manF.print(); //다형성   객체변수 manF는 Father 클래스의 객체 참조변수로 선언되었지만, 
   이제 Son 클래스의 객체 Nixon를 가리킴으로    Son 클래스의 print() 메소드가 호출된다. 
  
이 경우에 manF가 어느 메소드를 호출할 것인지는 컴파일 과정에서 결정되지 않고, 프로그램 실행시에 결정된다. 동적 바인딩(dynamic binding) 또는 후기 바인딩(late binding) 일반적인 경우 호출되는 메소드는 컴파일 과정에서 결정 (정적 바인딩(static binding) 또는 조기 바인딩(early binding)이라고 한다

'Java > 강의' 카테고리의 다른 글

Object 클래스  (0) 2011.02.25
매소드 재정의 (Method Overriding)  (0) 2011.02.23
상속 (Inheritance)  (0) 2011.02.21
Random 클래스  (0) 2011.02.21
vector 클래스  (0) 2011.02.16
Object 클래스의 public 메소드 
String toString() ☞ 객체를 나타내는 String 객체를 돌려준다.
Class getClass()  ☞ 객체가 속한 클래스를 돌려준다. 
boolean equals (Object arg)  ☞ 객체가 arg와 같으면 true를 돌려준다. 
int hashCode()  ☞ 객체의 hash code를 돌려준다.
void notify()   ☞ 쓰레드를 깨운다 
void notifyAll()   ☞   연관된 모든 쓰레드를 깨운다
void wait()   ☞   쓰레드의 실행을 일시 중지시킨다.

toString() 메소드
toString()은 모든 객체를 String 객체로 바꾸는 메소드 
toString() 메소드는 모든 클래스에서 재정의될 수 있으며, 
많은 클래스에서 객체를 표현하는 문자열을 만들기 위해서 재정의한다. 
toString() 메소드는 public이므로, 재정의할 때는 public으로 해야한다. 
 
toString() 메소드를 재정의하지 않은 클래스에서 toString() 메소드를 호출하면, 
Object 클래스에서 정의된 toString() 메소드가 호출된다. 
 
이때 객체는 클래스의 이름과 '@' 문자뒤에 객체 해쉬코드가 16진수로 출력된다. 
/* toString() 메소드를 재정의한 경우와 재정의하지 않은 경우의 실행을 보여주는 프로그램 */

class CLASStoStringA {
    public static void main (String[] args) {
        Integer number = new Integer (38);
        OverridetoStringClass objectA = new OverridetoStringClass();
        NotOverridetoStringClass objectB = new NotOverridetoStringClass();

        String numberString = number.toString();
        String objectAString = objectA.toString();
        String objectBString = objectB.toString();
    
        System.out.println (numberString);
        System.out.println (objectAString);
        System.out.println (objectBString);
    }
}

class OverridetoStringClass {
    public String toString() {
        return ("This is to show overriding toString method");
    }
}  

class NotOverridetoStringClass {}

Object 클래스 = 최상위 클래스로 모든 타입의 객체를 가리킬수 있음[Object A = new String();]
(C의 void 포인터와 비슷)






'Java > 강의' 카테고리의 다른 글

Class 클래스와 다형성  (0) 2011.03.02
매소드 재정의 (Method Overriding)  (0) 2011.02.23
상속 (Inheritance)  (0) 2011.02.21
Random 클래스  (0) 2011.02.21
vector 클래스  (0) 2011.02.16
메소드의 재정의
// Person 클래스에서 정의한 print() 메소드를 서브클래스에서 재정의한 프로그램

class Person
{
  protected String name;

  public Person(String aName)
  {
    name = aName;
  }

  protected void print()
  {
    System.out.println(< Person >");
    System.out.println(" Name : " + name);
    System.out.println();
  }
}

class Professor extends Person
{
  private String major;

  public Professor(String aName, String aMajor)
  {
    super(aName);
    major = aMajor;
  }

  protected void print()
  {
    System.out.println(< Professor >");
    System.out.println(" Name : " + name);
    System.out.println(" Major : " + major);
    System.out.println();
  }
}

public class PersonInformation
{
  public static void main(String[] args)
  {
    Person aPerson=new Person("Lee");
    Professor aProf=new Professor("Kim""Computer Science");
    aPerson.print();
    aProf.print();
  }
}

print() 는 수퍼클래스 Person에서 정의되어 Professor 클래스에 상속되고,
Professor  클래스에서 다시 정의되었다. 
print() 메소드는 인수를 갖지 않으므로 시그니쳐가 같다. 

객체의 클래스에 따라 실행되는 print() 메소드가 결정된다. 
객체가 Person 클래스이면 Person 클래스의 print() 메소드가 실행되고, 
객체가 Prefessor 클래스이면 Prefessor 클래스의 print() 메소드가 실행된다. 

재정의 print()의 접근속성은 수퍼클래스의 protected보다 한정될 수 없다. 
인스턴스 변수의 경우도 재정의할 수 있으나, 사용하지 않는 것이 좋다. 

Professor 클래스에서 재정의된 print() 메소드는 super를 이용하여 다음과 같이 고쳐쓸 수 있다. 
이 방법으로 super를 이용하여 수퍼클래스의 메소드를 명시적으로 사용할 수 있다.       

protected void print() {        
   super.print();         
   System.out.println ("Major : " + major);

'Java > 강의' 카테고리의 다른 글

Class 클래스와 다형성  (0) 2011.03.02
Object 클래스  (0) 2011.02.25
상속 (Inheritance)  (0) 2011.02.21
Random 클래스  (0) 2011.02.21
vector 클래스  (0) 2011.02.16
상속의 개념
// Vehiecle 클래스로부터 서브클래스 Car를 정의한 프로그램

public class CarInformationClass
{
  public static void main(String[] args)
  {
    Car aCar = new Car("Car""Red"5);
    aCar.printType();
    aCar.printColor();
    aCar.printNumOfPerson();
  }
}

class Vehiecle
{
  private String type;
  protected String color;

  public Vehiecle(String aType, String aColor)
  {
    type=aType;
    color=aColor;
  }

  /*protected*/ void printColor()
  {
    System.out.println("< Color : " + color + >");
  }

  protected void printType()
  {
    System.out.println("< Type : " + type + >");
  }
}

class Car extends Vehiecle
{  // Car 는 Vehiecle을 상속 받았다.(C++ ☞ Car : Vehiecle) java 단일상속, C++ 다중상속 지원!

  private int numberOfPerson;

  public Car(String aType, String aColor, int num)
  {
    super(aType, aColor);  // 
    numberOfPerson = num;
  }

  public void printNumOfPerson()
  {
    System.out.println("< NumOfPerson : " + numberOfPerson + >");
  }
}

   체지향 프로그래밍에서의 상속이란 부모클래스로부터 애트리뷰트나 
   메소드를 물려받아서 새로운 자식클래스를 만드는 것을 말한다. 
   이렇게 만들어지는 자식클래스는 기존에 만들어진 부모클래스가 가지는 애트리뷰트나 
   메소드를 상속받기때문에, 처음부터 새로운 클래스를 설계하여 코딩하는 것에 비해 
   시간과 노력을 절약할 수 있을 뿐만아니라 부모클래스의 메소드를 
   여러 자식 클래스가 공유하므로 프로그램 코드를 재사용할 수 있다.
   아래 그림을 참조 하길 바란다.

특정목적의 클라스 라이브라리 구축. 

▶ 자식클래스는 부모클래스로부터 상속받은 속성이나 메소드에 자식클래스가 필요한 요소를 추가할 수 있을 뿐만아니라, 
   상속받은 메소드를 자식클래스에서 적절하게 수정하거나 상세화할 수 있다. 

▶ 그러므로 클래스 라이브러리의 메소드를 응용 프로그램에 맞추어 수정가능, 
   또 클래스 라이브러리를 이용해서 특정 목적의 클래스 라이브러리를 구축가능. 

실사회의 모델링 

▶ 클래스- 동일한 속성을 가진 객체들의 집합 (객체들 
   사이의 관계) 상속은 비슷한 속성을 가진 클래스 사이의 관계를 나타낸다. 

▶ 실사회의 여러 객체들을 공통된 속성에 따라 클래스로 묶을 수 있으며, 
   여러 클래스 사이의 공통된 속성을 이용하여 상속체계를 만들 수 있다. 

▶ 자바같은 객체지향 언어에서는 클래스 사이의 상속 관계를 언어 자체에서 
   지원함으로서 프로그램 내에서 실사회를 보다 정확하게 모델링할 수 있다. 
   
수퍼클래스/서브클래스 

▶ 기본클래스, 수퍼클래스(superclass) 
   또는 부모클래스(parent class) 

▶ 파생클래스, 서브클래스(subclass) 또는 자식클래스(child class) 

▶ 직접 수퍼클래스(direct superclass) vs. 간접 수퍼클래스(indirect superclass) 
   
상속체계에서 상위에 위치하는 클래스일수록 보다 일반적(generic)이며, 
하위 클래스로 내려갈수록 특성화(specific)된다. 
▶ 서브클래스에 속한 모든 객체는 수퍼클래스의 객체에 속하기 때문에,
   서브클래스와 수퍼클래스는 is-a 관계를 형성한다.     
   (개는 포유류이다:The dog is a mammal).
 
▶ 하나의 객체는 여러 개의 애트리뷰트를 가질 수 있다.
   애트리뷰트는 기본자료형의 데이타나 다른 클래스의 객체가 될 수 있다. 
   객체와 애트리뷰트의 관계는 has-a 또는 component-of의 관계를 가진다.   

▶ 프로그램의 설계에 있어서 is-a관계와 has-a관계는 혼돈되기 쉬우므로,
   이 두 관계에 대한 명확한 개념을 가져야 한다.   

단일상속/다중상속 

▶ 자식 클래스가 하나의 수퍼클래스만을 가지는 단일상속(single nheritance)
   여러 개의 수퍼클래스를 가질 수 있는 다중상속(multiple inheritance)
▶ 자바에서는 단일 상속만을 허용한다. (interface를 두어 다중상속 지원)
   다중상속이 가지고 있는 여러가지 복잡한 문제점으로부터 벗어나면서,     
   다중상속의 장점을 취하기 위해서이다 

'Java > 강의' 카테고리의 다른 글

Object 클래스  (0) 2011.02.25
매소드 재정의 (Method Overriding)  (0) 2011.02.23
Random 클래스  (0) 2011.02.21
vector 클래스  (0) 2011.02.16
Character 클래스  (0) 2011.02.16
 Random 클래스의 메소드
int nextInt()   int형의 전 범위에서 균등하게 분포된 난수를 발생시킨다. 

long nextLong()    long형의 전 범위에서 균등하게 분포된 난수를 발생시킨다. 

double nextDouble()    0.0에서 1.0 범위내에서 균등하게 분포된 난수를 발생시킨다. 

float nextFloat()    0.0f에서 1.0f 범위에서 균등하게 분포된 난수를 발생시킨다. 

void setSeed (long seedNumber)    seedNumber를 종자값으로 재설정한다.  
// 1에서 15사이의 난수 10개를 발생시키는 프로그램

import java.util.Random;

class RandomNumberGenerator
{
    public static void main (String[] args)
  {
        System.out.println ("10 Random Number Generator from 1 to 15.");
        Random randomNumber = new Random();
        int value;
        for (int i = 0; i < 10; i++)
    {
            value = 1 + Math.abs (randomNumber.nextInt()) % 15;
            System.out.print ("[" + value + "] ");
        }
    System.out.println();
    }
}

Random 클래스는 두개의 생성자가 있으며 위와 같은 Random()이 있고, 다른 하나는 시드값을 넣을 수 있는 Random(long seedNum)이 있다. 디폴트 생성자의 경우 컴퓨터의 현재 시간을 기준으로 난수 발생을 하기 때문에 다른 값의 랜덤 값이 나오지만 시드값을 넣을 경우는 난수 발생은 하지만 리셋되고 난 후에 다음에 발생할 때 같은 난수가 나온다는 것을 기억해 두자!






'Java > 강의' 카테고리의 다른 글

매소드 재정의 (Method Overriding)  (0) 2011.02.23
상속 (Inheritance)  (0) 2011.02.21
vector 클래스  (0) 2011.02.16
Character 클래스  (0) 2011.02.16
StringTokenizer 클래스  (0) 2011.02.16

+ Recent posts