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
반응형