반응형
*상속
*오버라이드
*슈퍼
*상속(inheritance)
-
OOP특징중 하나(캡슐화-접근제어(접근지정자), 다형성-메소드다형성(오버로딩),객체다형성)
-
상속을 하는 이유: 코드의 재사용성 향상.
-
상속받은 자식클래스는 부모의 자원을 모두 사용가능하다.(private 제외)
-
자바는 단일상속만 가능해 부모를 뚜렷하게 알수있다. 단, 다양한 기능의 사용이 어렵다.
-
부모(슈퍼)클래스는 모든 자식이 사용할 공통특징을 정의
-
자식은 자식만의 기능을 정의
+Person |
-int eye, nose,mouth
-String name |
+Person()
+Person(int, int, int) <생성자의 오버로딩
+setter
+getter
+eat() :String
+eat(String, int ) : String |
↑
+HongGilDong |
-int level |
+HongGilDong()
+fight(int) : Sgring |
↑
+final Clack |
+int power |
+Clark()
+power(String) : String |
+UsePerson |
|
+static main(String[]) : void |
홍길동의 생성자가 부모없이는 생성될수 없어 부모클래스의 생성자를 부른다. 그리고 부모는 Object클래스를 부른다.
오브젝은 인스턴스 변수가 하나도 존재하지 않는다..(그래서 클래스의 크기로 선정되지 않는다?)
Object클래스찍고 다시 자신클래스 부르러 옴.
HongGilDong gd=new(heap) HongGilDong();
//홍길동클래스 안에 있음
public void test(){
this(인스턴스주소, heap의 주소).level =>o
this.eye(부모클래스의 자원) =>o
}
//시대가 다르고 나라가 다른데 공통특징이 어떻게 밥...일수 있겠냐..
주막에서 국밥 1냥
제육볶음 7000원
레스토랑에서 스테이크10불
======>오버라이드 "오버라이딩" =>다형성
*다형성(Polymerplism)
-
<오버라이드는 annotation까지 함께본다.
-
method 다형성, 객체 다형성 두가지가 존재.
-
method 다형성
-
Overload(overloading) : 하나의 클래스에서 같은이름의 메소드를 여러개 만들수 있는 방법(편의성_이름고민을 덜어준다.)
-
같은이름의 메소드도 다른 결과.
-
규칙 : 접근지정자, 반환형, method명 같고, 매개변수를 다르게 만드는것.
-
Override(Overriding) : 상속관계의 클래스에서 부모클래스가 제공하는 기능이 자식한테 맞지 않을때 그, method를 재정의하여
-
(나한테 맞게 바꾸어) 사용하는것. =>최우선적으로 라는 뜻을 가짐.
-
Override된 method 를 최우선적으로 호출된다.
-
규칙 : 접근지정자, 반환형, method명, 매개변수까지 같고 하는일을 다르게 주어야한다.
-
=>접근지정자는 사실 달라도 된다.(접근이 원활한쪽,광의의 접근지정자로)
-
부모의 method의 접근지정자가 default 일 경우 자식은 default, protected, public
-
부모의 method의 접근지정자가 protected일 경우 자식은 protected, public
-
부모의 method의 접근지정자가 public일 경우 자식은 public
-
규칙을 지키지 않으면 Error
-
JDK1.5에서는 Compile time 에 Override를 체크할 수 있는 annotation 제공.
-
Override의 대표적인 예가 toString
-객체를 출력하면
-
그객체의 heap의 주소가 나온다.(this)
-
객체를 출력하면 주소가 출력. 왜 주소가 출력 되냐하면,
-
Test t = new Test();
-
system.out.println(t);
-
String s =new String("안녕");
-
system.out.Println(s); =>문자열!! 왜 얘는 주소가 아니라 문자열?!
-
주소가 출력되는 이유는? Object에서 제공하는 toString()이라고 하는 method를 호출하여 반환되는 값을 출력했기(찍었기) 때문이다.
-
객체가 불려지면 object의 toString의 메소드가 불려 객체의 주소를 출력,
-
String 은 왜일까? : 오버라이딩 되어서 문자열은 문자열로 보여주는것.
-
(부모가 제공하는 주소의 출력기능)주소가 나오기 싫으면 이 싫으면 오버라이딩~!~!~!!!
class Object{
public String toString() {
return 주소;
}
}
class Test(){
public String toString(){//대소문자를 가려 규칙에 맞게 사용해야 한다...!
return "내가가진값" ;
}
*annotation
-
JDK1.5에서부터 제공하는 문법
-
Compiler에게 Compile시 명령을 부여할 때 사용.(수정한게 반영되지 않는다?)
-
문법) @ annotation 명 //때에따라 클래스위 메소드위 변수위에 달기도 한다.
-
class위, method위, 변수위에 설정
-
되게 많이 쓴다.(프레임워크를 더 손쉽게 잘쓰기위해서)
-
@Override =>오버라이딩을 잘했는지 컴파일에게 체크하라고 시키는것.
-
method위에 선언
-
method가 overrride를 제대로 했는지 체크.
-
@Depercated
-
method위에 선언
-
비추천 메소드로 변환 할때,
-
<줄이 그어져있으면 실행 될수도 안될수도 있으니 알아서 결정
-
@SuppressWarnings
-
method위, 클래스 위, 변수 위에 선언
-
<워닝(숨킬때)사용하는데, 권장ㄴㄴ
-
경고를 무시
*슈퍼(Super)
-
<this랑 비슷(인스턴스 주소와 메소드주소..?)
-
<생성자 호출관계====>2명....
-
method 형식과 keyword형식 2가지로 사용가능하다.
-
method 형식
-
모든 생성자에는 super가 다 숨어있고, (없으면 Object이 불리지않는다.)생성자를 호출한다.
-
keyword 형식
-
부모클래스의 변수, mehtod를 지정하여 사용할 때.
-keyword 형식
-
부모클래스의 자원(변수, method) 이 자식클래스와 같은 이름을 가질때 부모클래스의 자원을 사용하기 위한 예약어
-
<리소스는 어디에 붙였느냐에 따라 대상이 달라진다.
-
<this는 주소로 출력되는데, super는 Error가 난다.
-
super는 생성된 객체의 부모객체주소
-
출력하면 Error//toString();//Error, 부모의 toString 라고 콕찝어 이야기하지않으면 재귀호출되어 계속 나를 부르기 때문에 Error난다. 콬찝어 super.toString()라고 해야 부모의 주소가 나온다.
-
클래스의 인스턴스영역에서만 사용할수 있다. (static은 객체가 생성될지 안될지 모르기때문에)
-
<<이름이 같지않다면 이렇게 접근할 필요가 없긴하다.
-
사용법)
super.변수명
super.method명() <같았을때.
-method 형식
-
<생성자 호출할때 사용 <생성자 :객체가 생성될때 기본적으로 가지고있어야 할 값, 또는 실행되어야할 코드
-
부모클래스의 생성자를 호출할 때 사용
-
생성자의 첫번째 줄에서만 사용가능.
-
모든 생성자의 첫번째 줄에 숨어있다. (부모클래스의 기본생성자를 호출하는 super가) <object에만 생성자가 없고 다~~~있다.
-
문법)
super(); //기본생성자 호출
super(값,,,); //인자있는 생성자 호출
반응형