Polymorphism(다형성)

  • 객체다형성 - is a 관계
  • method 다형성
    - Overload : 클래스 하나에서 같은 이름의 method를 여러개 작성.
    - Override : 상속관계의 클래스에서 같은 이름의 method를 작성.

Override(Overriding)

: 상속관계에서 같은 이름의 method를 자식클래스에서 재정의.

  • 부모가 제공하는 기능이 자식에게 맞지 않을 때, 자식이 자신에 맞게 바꿔 사용.
    final이 있는 method는 Override가 되지 않는다. (부모 기능 변경말고 사용.)

문법

접근지정자 달라고 된다.
=> (광의의 접근지정자로만 변경가능.)
==> default -> protected -> public
=> (부모보다 더 넓은 범위의 접근지정자로 변경.)

반환형, method명, 매개변수 같아야 함.


is a 관계

부모클래스명 객체명 = new 자식클래스의 생성자();
ex) Test t = new TestSub();

is 관계의 객체화

  • 객체 다형성
    is 관계로 객체화를 하면 자식클래스를 사용하여 생성하고, 부모클래스를 사용한 객체에 할당하는 것.

  • 객체명으로는 부모클래스의 자원(변수, method) 사용가능.
    overrride된 method는 사용가능.

  • 자식클래스로 객체화
    TestSub ts = new TestSub();
    // 부모의 변수와 자식의 변수 다 사용 가능
    // 자식의 method 호출가능

  • is a 관계의 객체화
    Test t = new TestSub();
    // Test의 변수 사용가능
    // Test에 없고, 자식에만 있는 변수는 사용불가
    // 자식에만 있는 method도 사용불가
    // overriding한 method가 존재하면 무조건 자식 method호출(자식 최우선)


annotation(주석달기)

  • 컴파일러에게 컴파일시에 명령을 전달하는 기능을 하는 주석.
    작성 위치는 class위, method위, 지역변수 위

문법

@annotation명
@Deprecated : method위 설정, 비추천 method로 표현(정상동작하지만, 아닐 때도 있을 때)
@SuppressWarnings : 지역변수위, method위 설정. 경고를 무시
@SafeVargs : V.A의 데이터 형을 제한
@FuncationalInterface : abstract method가 하나인 인터페이스를 만들 때.
(Lamda식을 사용할 목적으로 인터페이스를 만들 때.)
@Override // override 잘 되고 있는지 확인

System.out.println();에 객체를 넣으면, 그 안에서 입력된 객체의 toString()를 호출해준다.
=> 주소가 아닌 메시지 출력이 가능.


특정 클래스만 상속을 받아야 할 때

: 자식클래스가 존재하지 않으면 error 발생

문법

부모클래스)
public sealed class 클래스명 permit 자식클래스,,,,,{

}

자식클래스)
public non-sealed class 클래스명 extends 부모클래스명{

}


Java class의 형태

  1. 일반클래스 : 변수 + method
  2. 추상(abstract)클래스 : 변수 + method + abstract method
  3. 인터페이스 : 상수 + abstract method + default method(잘 안만듬)
  4. Inner 클래스 : 변수 + method + [ 안의 클래스명 + 변수 + method ]
  5. nested 클래스 : 변수 + method + [ 안의 static 클래스명 + 변수 + method ]
  6. local 클래스 : 변수 + method + method [ 안의 클래스명 + 변수 + method ]
  7. anonymouse inner class method명( new 생성자(){ }; <= 새로운 class)

abstract class(추상클래스)

상속을 위해 만드는 부모클래스.
abstract method를 가진다.
직접 객체화가 되지 않는다. 자식클래스가 객체화 되면 그때 객체화가 가능.

문법

접근지정자 abstract class 클래스명 extends 부모클래스명 implments 구현인터페이스,,,{}


abstract method

method body를 가지지 않는 method

public void method(){ <= method header
일X <= method body 가지지 않음.
}

  • method의 정보만 가지고 있는 method로 일을 할 수 없다.
  • 자식 클래스가 반드시 구현해야 할(override) 일의 목록을 정의할 때 사용.
  • Overload가 된다.(같은 이름의 추상 method를 여러개 만들 수 있다.)
  • 추상 method는 직접 호출할 수 없다.(직접 객체화 안됨. body가 없음.)

abstract method 작성법

접근 지정자 abstract 반환형 method명(매개변수,,,,);
ex) public abstract String msg();

  • 모든 자식클래스가 method를 반드시 가져야하지만, 부모가 제공하는 기능을 사용하지 않고, override해서 사용해야하는 경우.

  • 추상 클래스의 자식클래스는 부모클래스의 모든 abstract method를 override해야한다.
    abstract method는 자식클래스가 해야할 일의 목록.


final

  • 변수, method, class에 사용할 수 있다.
  1. 변수 final - 선언 시에만 값 할당 가능. 변경안됨.
    ex) public final int i = 30;

  2. method final - override 막을 때 사용.
    ex)
    public class Test{
    public final void test(){
    }
    }

    public class TestSub extends Test{
    public void test(){
    ^^ 오버라이딩 불가 < 부모가 주는대로 써야 함.
    }
    }

  3. class final - 상속을 막을 때
    - 클래스가 제공하는 기능을 변경없이 사용해야 할 때
    - abstract과 함께 사용불가.(abstract은 무조건 상속해야하니까.)
    public final class Test(){

}
public class Sub extends Test(){ <== 상속불가. 부모클래스 있는 그대로 사용.

}

0개의 댓글