728x90
반응형

c:\jwork\inheritance\src\inheritance\test  [윈도우]

                                      inheritance.test [Java]

 

ChileClassEX.java
package inheritance.test.other;

import inheritance.VIPCustomer;

public class ChileClassEX {
	public static void main(String[] args) {
		//객체생성문 형식
		ChileClass cc = new ChileClass(); //지역 생성자호출문 public ChileClass
		cc.md(); //객체를 통한 메소드 호출문
		
		VIPCustomer vc = new VIPCustomer();
		//vc.saleRatio = 0.5; //saleRatio 접근제어자가 (default)라 접근불가 public변경시 접근가능
		//상속받지 않은 자식한테 접근불가
		//접근제어자 접근 후 static접근가능
	}
}​
package inheritance.test.other;

import inheritance.test.SameClass;


public class ChileClass extends SameClass { //public 같은project내 모든 클래스
	// public ChileClass(){} 숨어있음
	public void md() {
		ChileClass sp = new ChileClass();

		//다른 패키지에 속하는 자식 클래스까지 허용
		System.out.println(sp.sameVar); //sp. 자식객체 상속 후 접근 //
	}
}
다른 패키지에 속하는 자식 클래스까지 허용
Customer() 생성자 호출

추상클래스 (Abstract Class)

 : 구현부(몸체)가 없는 메소드를 하나 이상 가지고 있는 abstarct키워드가 있는 클래스  
<필수>
1. abstract키워드가 붙어있는 클래스(추상클래스)는
2. abstract메소드를 한 개 이상은 꼭 가지고 있어야 한다.
abstract메소드 반드시 상속받은 자식 클래스에서 재정의(Override)가 이루어져야 한다. (재정의되는 부분에서는 몸체구현을 해야하며, abstract키워드가 제거된다.)
3. 객체생성을 할 수 없다. (생성자, 메소드, 멤버필드 모두 가질 수는 있다.)
자식클래스를 통해서 객체생성 할 수 있다.
[접근제어자] abstract class 클래스명{
     public abstract 리턴타입 메소드명([매개변수들...]) ; //{ }중괄호가 없음
}
@Override

추상클래스 P {}
P p = new A();  // A ->B로 변경가능
p.oy();
p.oy();
p.oy();

키워드로는 프로젝트명 생성x

 

어노테이션(Annotation)

: 특수한 기능을 가진 주석.

형식 @명령이름

 

AbstractEx01.java
package abstractex;

abstract class Animal {
	private String astr = "추상클래스";
	abstract void cry(); //메소드 호출문에 기타제어자나, {}중괄호가 없고 ;만
//	public Animal() {} //일반 생성자 기술은 가능하나 무의미하기에 생략
	public String getAstr() {
		return astr;
	}
}

class Cat extends Animal {
	public void cry() {
		System.out.println("냐옹냐옹!");
	}
}

class Dog extends Animal {
	void cry() { //실체화,재정의가 되는 곳에는 abstract 키워드가 붙지 않는다.
		System.out.println("멍멍!");
	} 
}


public class AbstractEx01 {
	public static void main(String[] args) {
		//Animal a = new Animal(); //추상 클래스는 일반생성자를 기술하더라도 인스턴스를 생성할 수 없음.
//		Cat c = new Cat(); 
		Dog d = new Dog();
		Animal c = new Cat();
		c.cry();
//		d.cry();
		c = new Dog(); //비어져있는 c공간에 Dog가 들어감
		c.cry();

		System.out.println(c.getAstr());
	}
}​
냐옹냐옹!
멍멍!
추상클래스
AbstractEx02.java
package abstractex;

abstract class Shape {
	public abstract void draw();
}

class Circle extends Shape {
	@Override
	public void draw() { //부모의 메소드 재정의 //public 부모의 접근제어자 이상이어야
		System.out.println("원을 그리다.");
	}
}

public class AbstractEx02 {
	public static void main(String[] args) {
		Shape ref; //추상클래스는 객체생성을 할 수 없다.
		ref = new Circle();
		ref.draw();
	}

}​
원을 그리다.​
AbstractEx03.java
package abstractex;

abstract class Shape1 {
	public double res = 0;
	public abstract double area(); //Hide
	public void printArea() {
		System.out.println("면적은 " + res);
	}
}

class Circle1 extends Shape1 {
	public int r = 5;
	
	@Override
	public double area() {//@Override
		System.out.println("Circle1 area()메소드");
		res = r * r * Math.PI; //Math클래스내 static
		return res;
	}
}

class Rectangle extends Shape1 {
	public int w = 10, h = 10;
	
	@Override
	public double area() {
		System.out.println("Rectangle area()메소드");
		res = w * h;
		return res;
	}
}

public class AbstractEx03 {
	public static void main(String[] args) {
//		Shape1 ref; //선언 다형성(자료형-클래스) :메모리절약, 
		Shape1 ref = new Circle1(); //Circle1 area()메소드
		ref.area();
		ref.printArea(); //면적은 
		ref = new Rectangle(); //ref에 Rectangle 값이 들어감.
		ref.area(); //
		ref.printArea();//면적은 
	}

}​
Circle1 area()메소드
면적은 78.53981633974483
Rectangle area()메소드
면적은 100.0​

인터페이스 (Interface)

상수
Abstract Method만 가지고 있는
집합체(묶음)
<목적>
- 코드수정용이(가독성이 좋다)
- 보안을 위해(직접 접근, 값 바로 출력)
- 다중상속을 위해

<조건>
1. 멤버필드는 반드시 public static final 상수만 선언 가능.
2. (권장) Method는 반드시 public abstract만 가능
3. 생성자를 가질 수 없다. (객체생성불가)
4. 객체생성시 자식클래스로 생성해야 한다.
5. <필수> abstract메소드는 자식클래스에서 Override되어야한다.

- 상속받는 자식은 public만 가능
[접근제어자] interface 인터페이스명{
      [public static final] 자료형 필드명;
      [public abstract] 리턴타입 메소드명([매개변수들...]) 
}
[public static final] int a = 5;
//선언 및 초기화까지

[public abstract] void setA(int a);

package interfaceex;

public interface Drawable {
	public abstract void draw(); 
	//interface내에서는 생략된 접근제어자가 기본적으로 public abstract. {}중괄호 몸체
}
package interfaceex;

class Circle implements Drawable { //implements 다른 급을 상속.
	@Override
	public void draw() { //부모 이상의 접근제어자 사용해야 
		System.out.println("원을 그리다.");
	}
}

public class InterEx01 {
	public static void main(String[] args) {
		Drawable ref; //인터페이스 객체생성 할 수 없지만, 선언은 가능.
		ref = new Circle(); //자식클래스를 통해 객체생성 및 재정의
		ref.draw();
		//형변환(캐스팅) 후, Circle 클래스의 draw 메소드 호출
	}
}
원을 그리다.
상속    
extends
: 같은 급인 경우 사용하는 키워드
1. 자식클래스  extends 부모클래스
2. 자식클래스  extends 부모추상클래스
3. 자식인터페이스 extends 부모인터페이스
1) Chc [extends] PaC
2) Chc [extends] PaAC
3) Chc [implements] PaI
4) ChI [extends] PaI
5) ChAC [ implements ] PaI
implements
: 다른 급인 경우 사용하는 키워드
1. 자식클래스 implements 부모인터페이스
2. 자식추상클래스   implements 부모인터페이스

**인터페이스는 클래스를 상속받을 수 없다.

 

728x90
반응형

'[JAVA]' 카테고리의 다른 글

[14일차 오전]  (0) 2023.12.29
아스테리스크 Wraper 상속 오버라이딩 this super 추상클래스 어노테이션  (0) 2023.12.28
[13일차 오전]  (0) 2023.12.28
상속, 오버라이딩  (0) 2023.12.27
[12일차 오후]  (0) 2023.12.27

+ Recent posts