'C/Java'에 해당되는 글 59건

  1. 2007.11.05 다형성 by 청웨일
  2. 2007.11.05 오버라이드와 오버로딩 1 by 청웨일
  3. 2007.11.05 상속 by 청웨일
  4. 2007.11.05 자바 시작하기 by 청웨일

다형성

C/Java : 2007. 11. 5. 15:55

상속과 아주 밀접한 관계를 갖는다.

상위 클래스는 역참조변수(레퍼런스)를 사용하여 하위 클래스의 객체에 관여 할수 있다.

추상클래스로 객체를 생성할수 없다.(abstract로 생성불가 하도록 제한할수 있다.)

추상 클래스는 하위 클래스로 확장 되어야 한다.

더 이상 확장되지 않는 말단 클래스는 구상 클래스이다.

추상 클래스 안에는 추상 메소드와 일반 메소드가 공존할수 있다.

추상 메소드를 넣으려면 그 클래스는 추상클래스여야 한다.

추상 메소드는 메소드의 이름까지만 선언해 주면 된다.

추상 메소드의 내용은 구상 클래스에서 반드시 오버라이딩하여 정의(구현) 되어야만 한다.

추상메소드의 생성은 오버라이드하겠다는 의미와 같다.

상위 클래스유형을 메소드의 인자, 리턴유형, 배열유형으로 쓸수 있게 하는 것이 다형성이다.

상위클래스 유형에 속하는 하위클래스 유형에는 모든 상위 클래스의 메소드가 있어야 한다.(상속)



- 한 타입의 참조변수로 여러 타입의 객체를 참조 할 수 있도록 함.


참조변수의 형변환

- 캐스트연산자를 사용하여 상속관계에 있는 클래스 타입의 참조변수간 형변환을 자유롭게 수행할수 있다.

- 참조변수가 참조하는 인스턴스의 타입보다 자손타입으로의 형변환은 불가한다.


public class CastingTest1 {
 public static void main(String[] atgs) {
  Car car = null;
  FireEngine fe = new FireEngine();   //FireEngine타입참조변수 fe
  FireEngine fe2 = null;
 
  fe.water();
  car = fe;   //car=(car)fe;  형변환 생략   fe가 참조하는 인스턴스를 car이 참조하도록 한다
//  car.water();             //Car 타입의 참조변수로 water()를 호출할수 없다.
 
  fe2 = (FireEngine)car;         //형변환   car가 참조하는 인스턴스를 fe2가 참조한다.
  fe2.water();
  fe2.drive();
  fe.stop();
 }
}


class Car {
 String color;
 int door;
 void drive() {
  System.out.println("drive, Brrrr~");
 }

 void stop() {
  System.out.println("stop!!!");
 }
}


class FireEngine extends Car {
 void water() {
  System.out.println("water!!!");
 }
}


instenceof 연산자

- 참조변수가 참조하고 있는 인스턴수의 실제 타입을 알아보기 위해 사용된다.

- 조건문에서 사용되며 true, false를 결과값으로 한다.

- 결과값이 참일때 참조변수가 검사한 타입으로 형변환이 가능하다는 것을 뜻한다.


public class InstenceofTest {
 public static void main(String[] args) {
  FireEngine fe = new FireEngine();
 
  if(fe instanceof FireEngine) {
   System.out.println("This is a FireEngine instance.");
  }
  if(fe instanceof Car) {
   System.out.println("This is a Car instance.");
  }
  if(fe instanceof Object) {
   System.out.println("This is a Object instance.");
  }
 }
}


Posted by 청웨일

오버라이드

메소드는 계약서이다.

오버라이딩 하려면 인자는 같아야 하고 이턴 유형도 호환 가능해야 한다.

오버라이드하는 메소드에서는 인자를 변경할 수 없다.

메소드를 더 접근하기 어렵게 만들면 안된다.(private로 설정하면 안되)

다형성이 작동하려면 하위클래스에서 상위 클래스의 메소드를 쓸때 그 메소드가 제대로 실행되어야 한다.

컴파일러에서 메소드 호출을 허가한 후에도 오버라이드하는 메소드의 인자와 리턴 형식이 같을 때만 그 메소드가 제대로 작동한다.

상위 클래스와 하위클래스의 이름이 같다.

매개변수의 타입과 개수, 순서가 같다.

리턴 타입이 같다.

상속받은 메소드의 내용을 변경할수 있다.


================================================

class A {

        void Pmethod() { }

}

class a extends A {

        void Pmethod() { }          //오버라이딩

        void Pmethod(int i) { }   //오버로딩

        void Cmethod() { }          //오버로딩

        void Cmethod(int i) { }    //오버로딩

      // 메소드이름이 같아도 매개변수가 달라서 다른 메소드 취급

}

================================================

   



오버로딩


이름이 같고 인자 목록이 다른 메소드 두 개 만들기.

상속이나 다형성과는 관계가 전혀 없다.

호출하는 쪽의 편의를 위해 같은 메소드를 서로 다른 인자 목록을 가진 여러 버전으로 만들수 있다.

int형을 인자로 받는 메소드를 호출하는 코드에 double을 받으려면 double형을 인자로 받는 메소드를 호출하는 버전의 메소드를 만들면 된다.

오버로드된 메소드의 여러가지(조건들)을 이행할 필요가 없기 때문에 접근단계 설정이 자유롭다.

상위클래스와의 메소드와 이름이 같아도 매개변수의 타입 개수 순서가 다르면 오버로딩이다.

상속 받은것 외에 기존에 없는 새로운 메소드를 정의한다.



시그니처(메소드 이름, 매개변수 리스트)가 다르기 때문에 다음은 각기 다른 메소드이다.

public class SquareOverload {
 public static int square(int n) {
  System.out.println("Integer Square");
  return n*n;
 }
 
 public static long square(long l) {
  System.out.println("long Square");
  return l*l;
 }
 
 public static double square(double d) {
  System.out.println("double Square");
  return d*d;
 }
 
 public static void main(String[] args) {
  int n = 5;
  long l = 100;
  double d = 1000.0;
 
  System.out.println("n Square = " + square(n));
  System.out.println("l Square = " + square(l));
  System.out.println("d Square = " + square(d));
 }
}


반환값도 시그니처의 한 부분이지만 메소드를 구분하는 요소로 쓰이지는 않는다.

다음은 같은 클래스 안에서 정의 될수 없다.

long square(long d)

int square(long d)

Posted by 청웨일

상속

C/Java : 2007. 11. 5. 15:27
하위클래스는 상위클래스를 확장한다.

 하위클래스는 상위클래스의 모든 public으로 지정한 인스턴스변수와 메소드를 상속하지만 private로 지정한 인스턴스변수와 메소드는 상속할수 없다.

 메소드는 오버라이드 할수 있지만 인스턴스변수는 오버라이드 할수 없다.
 하위클래스에서 재정의 할수 있지만 오버라이드와는 다르다.

 'A는 B다' 테스트를 활용하여 상속 계층이 올바른지 확인한다.

 'A는 B다' 는 한방향으로만 작동한다.

 ex)하마는 동물이지만 모든 동물이 하마는 아니다.

 하위클래스에서 메소드를 오버라이드하면, 하위클래스의 인스턴스에 대해 그 메소드를 호출하면 오버라이드된 버전의 메소드가 호출된다.(맨 밑의 것)

 B가 A를 확장하고 C가 B를 확장하면 B는 A이고, C는 B이고, C는 A이다.(A→B→C)


 

상위 클래스의 확장(extends)


하위 클래스에서 별도의 메소드와 인스턴스 변수를 추가할 수 있고

상위클래스에서 상속받은 메소드를 오버라이드 할 수도 있다.


부모클래스 이름 / 하위클래스 이름 / 상속 예약어


//상위 클래스

public class Doctor {

        boolean worksAtHospital;

        void treatPatient() {   }

}


//하위클래스 1

public class FamilyDoctor extends Doctor {

}


//하위클래스 2

public class Surgeon extends Doctor{

}


Doctor를 상속(extends)하는 하위 클래스 FamilyDoctor, Surgeon


                 

               doctor

          ↗              ↖

                       

surgeon        familydoctor


 상속의 장점

 코드가 중복되는 것을 방지한다.
상위 클래스만 변경하면 하위클래스도 변경된다.
하지만 하위클래스에서 변경된다고 상위클래스의 것이 바뀌지 않는다.
 상위클래스에서 메소드를 정의하면 그 메소드는 하위클래스로 상속될수 있고, 다른 코드에 상위클래스 형식을 쓰는 모든 하위클래스에 메소드의 용도를 알려주는 일종의 규약
 어떤 클래스에 대한 상위 클래스를 만들면 그 상위 클래스 형식이 들어갈수 있는 모든 자리에 해당 상위 클래스와 임의 하위클래스에 속하는 객체를 마음대로 사용할 수 있다.

 상위클래스로 선언된 레퍼런스(역참조변수)를 이용하여 하위클래스 객체를 참조할수 있다.

 Dog myDog

 =

 new Dog();

 1. 레퍼런스 변수 선언

 3. 객체와

레퍼런스 연결

 2. 객체생성

 

 단일 상속


단일상속만을 허용하고 인터페이스를 이용한 보완된 형태의 다중상속을 지원한다.

자식은 둘 이상의 부모를 가질수 없지만(단일상속) 부모는 둘 이상의 자식을 가질수 있다.

자식은 부모가 되어 자식을 가질수 있다.(확장)

Posted by 청웨일

자바 시작하기

C/Java : 2007. 11. 5. 11:15
 

# 자바는 어떤 식으로 돌아갈까.


1. 소스 - 자바언어로 코드를 작성합니다.

2. 컴파일러 - 컴파일러로 오류를 확인하고 제대로 돌아가면 최종결과를 만들어줍니다.

3. 결과물(코드) - 바이트코드라는 코딩된 문서를 만들어줍니다.

                             비교적 컴퓨터가 알아들을수 있도록 번역된 것입니다.

4. 가상머신 - 가상 머신에서 바이트코드를 실행시킵니다. 결과물이 제대로 나왔는지 확인합니다.


# 실제 자바로 할수 있는 일


1. 소스 코드를 입력 - [.java]라는 확장자로 저장됩니다.

2. 컴파일러 - 타이핑한 소스를 컴파일합니다. 오류가 없으면 [.class]라는 확장자 파일이 만들어집니다.

3. 결과물(코드) - [.class]확장자의 파일

4. 가상머신 - 실제 이해 가능한 형태가 되어 실행시켜줍니다.


# 자바 코드의 구조 (소스파일>클래스>메소드>선언문)


1. 클래스 - 하나의 프로그램에는 하나이상의 클래스가 들어갑니다.

2. 메소드 - 일반적인 함수나 프로시저 비슷~~~ 자바에서는 메소드라고 합니다.  (클래스에는 하나이상의 메소드가 있다.)

3. 선언문 - 메소드안에서 처리할 일을 지시하는 내용.


# 문법


1. 모든 선언문은 세미콜론(;)으로 끝난다.

2. 주석문 쌍슬래쉬(//)로 시작한다.

3. 대부분의 공백은 큰 의미가 없다.

4. 변수선언은 다른 언어와 다르지 않다.

5. 클래스나 메소드를 정의하는 부분은 중괄호안에 들어간다.

6. 대입연산자는 등호 한개(=)로 구성.

7. 동치 연산자는 등호 두개(==)로 구성.

8. 반복문에 관하여  아직은 C언어와 충돌하는 곳은 없어보인다.


# print / println 의 차이.


println에는 줄바꿈 문자를 포함한다.


# 소스를 쳐보자.


//p.46

public class Loopy {
 public static void main(String[] args) {
  int x=1;
  System.out.println("순환문이전");
  while(x<4) {
   System.out.println("순환문내부");
   System.out.println("x의 값은 '+x+'입니다.");
 
   x++;
   
  }
  System.out.println("여기는 순환문 이후입니다.");
 }
}



//p.47_1

class IfTest {
 public static void main(String[] args) {
  int x=3;
  if(x==3) {
   System.out.println("x는 3이군요.");
  }
  System.out.println("이부분은 무조건 실행됩니다.");
 }
}



//p.47_2

class IfTest2 {
 public static void main(String[] args) {
  int x = 2;
  if(x==3) {
   System.out.println("x는 3이군요.");
  }
  else {
   System.out.println("x는 3이 아니군요.");
  }
  System.out.println("이부분은 무조건 실행됩니다.");
 }
}



//p.47

public class DooBee {
 public static void main(String[] args) {
  int x = 1;
  while (x<3) {
   System.out.print("Doo");
   System.out.print("Bee");
   x++;
  }
  if(x==3) {
   System.out.print("Do");
  }
 }
}



//p.48 (개선해보자)

public class BeerSong {
 public static void main(String[] args) {
  int beerNum = 99;
  String word = "bottles";
 
  while (beerNum > 0) {
   if(beerNum == 1) {
    word = "bottle";
   }
   
   System.out.println(beerNum + " " + word + " of beer on the wall");
   System.out.println(beerNum + " " + word + " of beer.");
   System.out.println("Take one down.");
   System.out.println("Pass it around.");
   
   beerNum--;
   
   if(beerNum > 0) {
    System.out.println(beerNum + " " + word + " of beer on the wall");
   }
   else {
    System.out.println("No more borrles of beer the wall");
   }
  }
 }
}



//p.50

public class PhraseOMatic {
 public static void main(String[] args) {
  String[] wordListOne = {"24/7","multi-Tier","30,000 foot","B-to-B", "win-win",
    "front-end","web-based","pervasive","smart","six-sigma","critical-path",
    "dynamic"};
 
  String[] wordListTwo = {"empowered","sticky","valued-added","oriented","centric","distributed",
    "clustered","branded","outside-the-box","positioned","networded","focused","leveraged",
    "aligned","targeted","shared","cooperative","accelerated"};
 
  String[] wordListThree = {"process","tipping-point","solution","architecture","core competency",
    "strategy","mindshare","portal","space","vision","paradigm","mission"};
 
  int oneLength = wordListOne.length;
  int twoLength = wordListTwo.length;
  int threeLength = wordListThree.length;
 
  int rand1 = (int) (Math.random() * oneLength);
  int rand2 = (int) (Math.random() * twoLength);
  int rand3 = (int) (Math.random() * threeLength);
 
  String phrase=wordListOne[rand1] + " " + wordListTwo[rand2] + " " + wordListThree[rand3];
 
  System.out.println("What we need is a " + phrase);
 }
}



//p.54

class Shuffle1 {
 public static void main(String[] args) {
  int x = 3;
 
  while (x>0) {
   if(x>2) {
    System.out.print("a");
   }

   x--;
   
   System.out.print("-");
   
   if(x==2) {
    System.out.print("b c");
   }
   
   if(x==1) {
    System.out.print("d");
    x--;
   }
  }
 }
}

Posted by 청웨일