package ch06;

import ch05.sub.*;

public class ColorCar extends Car
{
 /*
  * 메서드 오버라이딩 : 오버로딩과 다르다
  * 계승에서 상위클래스의 멤버함수의 이름,인자의 수까지
  * 완벽히 똑같은 이름을 하위클래스에서 구현할 경우
  * 상위클래스의 멤버함수는 은닉화되어 힘을 읽어버리며,
  * 하위클래스의 멤버함수가 그 함수를 대신하게 된다.
  * (상위클래스의 멤버함수의 재정의)
  * */
 
 public ColorCar()
 {
  // TODO 자동 생성된 생성자 스텁
  //super();
 }
 
 //아래의 print는 상위클래스의 print와 이름은 같지만,
 //인자의 수가 다르므로 멤버함수의 오버로딩에 해당.
 public void print(String message)
 {
  System.out.println(message);
 }
 
 //상위클래스의 print메서드의 오버라이딩
 public void print()
 {
  // TODO 자동 생성된 메소드 스텁
  //super는 상위클래스를 가르키는 지시어이다.
  //따라서 아래와 같이 super.print()를 지정하면,
  //상위 클ㄹ래스의 print()가 호출된다.
  //super는 보통 지금처럼 오버라이딩시
  //하위에서 상위클래스의 오버라이딩된 원본 메서드를 호출할때 사용.
  super.print();
  System.out.println("Hello Color Car()");
 }
 
 public static void main(String[] args)
 {
  ColorCar colorCar = new ColorCar();
  colorCar.print("aa");
  colorCar.print();  
 }
}

사용자 삽입 이미지

Posted by 말없제이
,

**** Ch0605.java ****
package ch06;

//public은 자료 참조할수 있게 노출..
//private은 내부에서만 노출
import ch05.sub.*;

public class Ch0605
{
 public static void main(String[] args)
 {
  Car car = new Car("a","b");
  //car.name = "b";
 
  /*
   * 접근제어자 : 외부의 클래스에서 직접 접근할 수 있는
   * 권한을 부여하는 지시어로
   *
   * public은 외부에서 어떠한 상황이라도 모두
   * 접근이 가능하도록하는 지시어이다.
   * 계승시에도 public접근권한을 지정한 멤버변수, 멤버함수는
   * 하위 클래스에 자연스레 모든것이 계승된다.
   *
   * private는 해당클래스에만 멤버변수, 멤버함수를 조작하거나,
   * 참조할 수 있으며, 외부클래스에서는 참조 및 호출이 불가능하다.
   * 계승의 경우에는 private으로 지정된 멤버변수, 멤버함수는
   * 계승의 사용이 불가능하다.
   *
   * protected는 패키지가 서로 다를경우,
   * new로 생성된 개체의 멤버변수 접근은 금지되지만,
   * 계승의 경우 멤버변수,멤버함수의 접근이 허용된다.
   *
   * */
 
 }
}

**** 0606.java *****
package ch06;

import ch05.sub.*;

public class Ch0606 extends Car
{
 public Ch0606()
 {
  // TODO 자동 생성된 생성자 스텁
 
 }
 public static void main(String[] args)
 {
  new Ch0606();
 }
}

**** ch05.sub.Car.java ******
package ch05.sub;

public class Car
{
 //Java는 file당 한 class만 존재.(c는 여러개 가능.)
 
 //현재는 public 용어 신경쓰지 말고...
 //Car클래스의 멤버변수 owner
 //private String owner;
 protected String owner;
 
 //Car클래스의 벰버변수 name
 //private String name;
 protected String name;
 
 //Car클래스의 멤버함수 print() 정의
 public void print()
 {
   System.out.println("Owner : "+owner+", name : "+name );
 
 }
 
 //반환형 없는 함수이며 클래스이름과 같은 이름을
 //같은 함수를 생성자함수라고 부른다.
 //아래와 같은 이자없는 생성자는 프로그래머가
 //지정하지 않앙도 자여스레 컴파일러가 생상자함수를
 //강제로 만들어준다.
 
 //public void Car() // 생성자 함수가 아니라 일반함수로 인식.
 public Car(String name, String owner)
 {
  // TODO 자동 생성된 생성자 스텁
  System.out.println("Car생성자 실행");
  //매개변수와 멤버변수 이름이 같을때, 매개변수로 인식됨.
  //name = name;
  //반드시 클래스의 멤버변수를 가르킬때에는
  //this.멤버변수명을 사용하여야 한다.
  this.name = name;
  this.owner = owner;
  //생성자를 이용하여 멤버변수 조작하는 방법...이였음.
 
  //생성후 new Mission() 객체 일일이 생성해야하므로, 미리 호출될때 생성.
  mission = new Mission();


 }
 
 // Mission 클래스 추가후
 //멤버변수에 사용자 정의 클래스 레퍼런스를 지정할경우
 //Car클래스는 Mission클래스에 대해 소유관계를 맺는다고 한다.(집합)
 public Mission mission;
 
 public Car()
 {
  /*
   * 기본생성자의 첫줄에 컴파일러가
   * 상위클래스의 생성자를 자동으로 호출한다.
   * super() : 상위클래스의 생성자함수를 의미
   * this() : 현재클래스의 생성자 함수를 의미.
   * */
  // TODO 자동 생성된 생성자 스텁
  System.out.println("Car()~~~");
 }
}

Posted by 말없제이
,

package ch06;

//1.ch03패키기 work5029a.java 사용위해 import
import ch03.Work0529a;

//public class Ch0604  // work5029a.java 클래스 계승
public class Ch0604 extends Work0529a
{
 public Ch0604()
 {
  // TODO 자동 생성된 생성자 스텁
  //상위클래스의 Work0529a()클래스의 run(8,8)메서드를 호출할것.
  //소유 -> 계승
  super.run(9, 9);
 }
 
 public static void main(String[] args)
 {
  new Ch0604();
 }
}

Posted by 말없제이
,

package ch06;

//클래스의 계승은 아래 클래스이름 뒤에
//extends 클래스 이름을 쓰면 계승이 이루어 진다.
public class Ch0603 // extends Ch0601
{
 public Ch0603()
 {
  // 만약 계승 안받는다면, 개체변수 생성해서 받을수 있다.(소유)
  Ch0601 ch0601 = new Ch0601();
 
  // TODO 자동 생성된 생성자 스텁
  ch0601.x = 1;
  ch0601.y = 2;
  int z = ch0601.calc();
  System.out.println(z);
  ch0601.print();
 
 }
 
 public static void main(String[] args)
 {
  new Ch0603();
 }
 
}

Posted by 말없제이
,

**** Ch0601.java ****
package ch06;

public class Ch0601
{
 //계승관련 코딩으로 보고나서 .설명
 public String message;
 public int x,y;
 
 public Ch0601()
 {
  // TODO 자동 생성된 생성자 스텁
  System.out.println("Ch0601() 생성자");
 }
 
 public int calc()
 {
  return x+y;
 }
 
 public void print()
 {
  System.out.println("x : "+x+", y : "+y);
 }
 
 public static void main(String[] args)
 {
 
 }
}

**** Ch0602.java ****
package ch06;

//클래스의 계승은 아래 클래스이름 뒤에
//extends 클래스 이름을 쓰면 계승이 이루어 진다.
//C++과 다른점 : 클래스 다중계승이 자바는 원칙적으로 허용되지 않는다.
//ex) public class Ch0602 extends Ch0601,Ch0603... 안됨.(다중계승이 루프로 될가능성 있음)
public class Ch0602 extends Ch0601
{
 public Ch0602()
 {
  // TODO 자동 생성된 생성자 스텁
  //super()는 자바컴파일러가 알아서 생성자의 첫줄에 자동으로 붙여 실행한다.
  super(); //상위클래스의 생성자함수를 가르킨다.
  //super지시어 : 상위클래스를 가르키는 지시어
  //this지시어 : 현재클래스를 가르키는 지시어
 
  //super.x = 1;
  x = 1;
  y = 2;
  int z = calc();
  System.out.println(z);
  print();
 
 }
 
 public static void main(String[] args)
 {
  new Ch0602();
 }
 
}


Posted by 말없제이
,
패키지를 ch05.sub를 생성했을경우...
사용자 삽입 이미지
실제경로는 ch05 폴더 및 sub폴더에 있다.
필요한 파일 복사../붙여넣기..
사용자 삽입 이미지

Posted by 말없제이
,

package ch05_1;

//import는 다른 영역의 클래스를 참조할 수 있도록
//패기지명, 클래스의 형태로 선언함으로써,
//다른 패키지 영역의 클래스를 자유롭게 사용할수 있도록 해준다.

//다른 클래스를 import로 지정하면... 생략해 쓸수 있다.
//import ch05.sub.Car;
//import ch05.sub.Mission;
//아래와 같이 *를 사용하면 해당패키지의 모든 클래스를 자유로이 참조할 수 있다.
import ch05.sub.*;

//JDK컴파일러가 java.lang안의 클래스들은
//컴파일러가 컴파일시 알아서 아래의 구문을
//붙여서 컴파일하므로 자동인식이 되었던 것이다.
//import java.lang.*;

public class Ch0511
{
 public static void main(String[] args)
 {
  /*ch05.Car car = new ch05.Car("소나타","쥔장");
  ch05.Mission m = new ch05.Mission();*/
 
  /*ch05.sub.Car car = new ch05.sub.Car("a","b");
  ch05.sub.Mission m = new ch05.sub.Mission();*/
  //import쓰는 이유 . 긴 패키기지명을 단축시키기 위해 사용.
 
  Car car = new Car("소타타","쥔장");
  Mission m = new Mission();
 
  System.out.println("Hello");
 }
}

Posted by 말없제이
,

package ch05;

public class Ch0508
{
 //멤버함수 오버로딩 : 멤버함수를 선언할 경우
 //인자의 갯수가 다르면 별개의 함수로 취급하는
 //이 특성을 오버로딩이라 부른다.
 public Ch0508()
 {
  // TODO 자동 생성된 생성자 스텁
  hello();
  hello("비가 오는 날");
  int z = hello(1,2);
  System.out.println(z);
 
 }

 public void hello()
 {
  System.out.println("Hello");
 }
 
 public void hello(String s)
 {
  System.out.println(s);
 }
 
 public int hello(int a, int b)
 {
  return a+b;
 }
 
 public Ch0508(String s)
 {
  System.out.println("생성자메시지 : "+s);
 }
 
 public static void main(String[] args)
 {
  //생성자도 오버로딩가능.
  //new Ch0508();
  new Ch0508("hello");
 }
}

Posted by 말없제이
,

package ch05;

public class Ch0506
{
 public Ch0506()
 {
  // TODO 자동 생성된 생성자 스텁
  int x=1, y=1;
  //기본자료형을 매개변수로 전달할 경우
  //사본을 전달하게 되므로 원본은 아무런 변화가 없다.
  valuechange(x,y);
  System.out.println("x : "+x+", y : "+y);
  Car  car = new Car("xxx","yyy");
  referenceChange(car);
  car.print();
 }
 public static void main(String[] args)
 {
  new Ch0506();
 }
 
 //클래스 자료형을 매개변수로 전달할 경우
 //원본이 전달되어 넘어오며 이의 멤버변수값을
 //바꿀 경우 원본을 바꾸는 것과 같다.
 public void referenceChange(Car carA)
 {
  carA.name="용대리";
  carA.owner="장하다";
 }
 
 public void valuechange(int a, int b)
 {
  a=10;
  b=11;
 }
}


****** Ch0507.java *****
package ch05;

public class Ch0507
{
 
 public static void main(String[] args)
 {
  //c는 2차원패턴, java는 3차원 패턴
  Car carA = new Car("소나타","주인장");
  //개체변수이므로 null이 되므로.. 먼저 할당해줘야 함.
  //Car내에 mission = new Mission();호출시.
  //carA.mission = new Mission();
  carA.mission.type = "오토";
  carA.mission.level = 5;
  carA.mission.print();
 
  Car carB = new Car("그랜져","홍길동");
  //Car내에 mission = new Mission();호출시.
  //carB.mission = new Mission();
  carB.mission.type = "스틱";
  carB.mission.level = 6;
  carB.mission.print();
 
  //속해있지 않는 Mission.
  Mission m = new Mission();
  m.level = 7;
  m.type = "세미스틱";
  m.print();
 }
}

Posted by 말없제이
,

package ch05;

public class Ch0505
{
 public static void main(String[] args)
 {
  //기본자료형의 경우 변수값을 대입하면
  //값의 사본이 복사되어 대입되며,
  //사본을 바꾼다고 해서 원본이 바뀌는것이 아니다.
  //고로 아래변수의 값은 1이된다.
  int a=1;
  int b=a;
  b=5;
  System.out.println(a);
 
  //★ 개체변수와 개체변수간의 대입은
  //대상의 원본이 전달되므로 아래의 경우
  //carB를 조작하면 원본 carA의 원본이 바뀌게 된다.
  //(개체변수를 레퍼런스라 부르는 이유가 바로 이거때문이다.)
  Car carA = new Car("주인장","뽀르세");
  Car carB = carA;
  carB.name="무대리";
  carB.owner="대포차";
  System.out.println(carA.name+":"+carA.owner);
 }
}

Posted by 말없제이
,