추상 abstract
-abstract 클래스나 메소드를 사용하기 위해서는 반드시 상속해서 사용하도록 강제하는 것이 abstract 다 .
-추상메소드는 끝남 {} 없음
abstract class A{
public abstract int b () ;
-> 메소드의 실질적인 로직이 들어가는 본체가 존재하지 않고 메소드에 대한 시그니처만을 가지고 있는 추상적인 모습 메소드 . abstract 메소드 -> 반드시 오버라이딩해서 구체적인 로직을 사용하는 쪽에서 정의해야 한다.
}
class B extends A {
public int b () {
return 1 ; 요렇게..
}
}
-> A클래스안에 있는 메소드 b 는 바로 사용할 수 없기 때문에 A클래스를 상속받은 B클래스에 A클래스 안에 있는 abstract 메소드인 b의 본체를 오버라이딩해줘야한다. : 상속을 강제
-abstract 구체적인 로직을 담고 있지 않고 로직을 사용하기 위한 형식(시그니처) 만을 가지고있다. -> 구체적인 구현의 책임은 그것을 사용하는 쪽에 넘긴다.
-abstract 메소드는 {} 안에 내용을 가지고 있으면 안된다.
-메소드(맴버)중에 1개라도 abstract 메소드라면 그 멤버를 담고 있는 클래스도 abstract 가 된다.
-abstract 클래스는 구체적인 내용 (로직) 을 품고 있는 일반 메서드도 가질 수 있다.
public class AbstractDemo {
public static void main(String[] args) {
//A arg = new A() -> 얘는 추상 클래스라서 오류
B brg = new B() -> 이렇게 상속한 애를 사용해야함
abstract(상속을 강제하는 ) 사용 이유
상위 클래스에는 공통적인 것
상속받은 하위클래스에는 사용자가 직접 만들 수 있도록
110 회 : 디자인패턴
111 회 final
한번 셋팅된 값을 변경불가
final 메소드
class A {
final void b () {}
}
class B extends A {
void b () {} -> 에러 final 로 상수로 정해서 오버라이딩 불가능
}
112 인터페이스
어떤 클래스가 있고 그 클래스가 특정한 인터페이스를 사용한다면 반드시 그 인터페이스에 강제하고 있는 메소드를 구현하도록 한다. 메소드를 구현하지 않으면 그 어플리케이션은 컴파일도 되지 않는다.
interface I {
public void z () ;
}
class A implements I { 구현한것
public void z() { //인터페이스 I 안에 있는 메소드를 구현하도록 강제 * 반드시
}
}
interface 사용하는 이유
모조클래스를 만들어놓을 수 있다.
계산기 만드는 동안 사용하는 쪽 개발도 같이 할 수 있다.
interface(3/3) : 규칙들
- 하나의 클래스가 복수개의의 인터페이스를 가져와서 구현 할 수 있다.
( i1, i2 안에 있는 모든 것들을 구현해야 한다 반드시 )
class A implements I1, I2 {
public void x() {} // i1의 메소드
public void z() {} // i2의 메소드
}
-인터페이스도 상속이 가능하다.
(부모 인터페이스가 가지고 있는 기능들을 자식들이 가지고 간다.
-인터페이스의 멤버는 반드시 public 이어야 한다.
interface I3 {
public void x() ;
}
interface I4 extends I3 {
public void z();
}
class B implements I4 {
public void x() {} i4가 상속받고 있는 i3의 메소드도 반드시 구현해야한다.
public void z() {} 반드시 구현해야하고
}
부모인터페이스가 가지고 있느 ㄴ기능들을 자식들이 가지고 간다.
-interface 멤버는 반드시 전부 public 이어야 한다.
abstract vs interface
abstract 메소드 -> 반드시 오버라이딩해서 구체적인 로직을 사용하는 쪽에서 정의해야 한다.
하위클래스가 상속받아서 사용을 강제한다.
오버라이딩하도록 기대하도록 기어있는
다형성
- 오버로딩을 통한 다형성
오버로딩( 메소드는 이름이 같아도 리턴타입이나 매개변수에 따라서 다른 메소드가 된다. )
을 통해서
1. a (int param) {System.out.println("int") }
2. a (String param) {System.out.println("String") }
내가 a 메소드를 호출해도 a(20) 인지 a("라면" ) 인지에 따라서 컴퓨터가 비교해서 1번인지 2번인지를 선택한다.
- 클래스와 다형성
class A {
public String x() { return "x";}
}
class B extends A {
public String y() { return "y"; }
} // B 는 A를 상속받고 있음
public class polymorphismDemo1 {
public static void main (String [] args ) {
A obj = new B ()' 클래스 A의 데이터타입을 하고 있다.
obj.x(); --> class A에 있는것 -> 정상적으로 실행이 된다.
obj.y(); --> class B 에 있는것 ( A를 상속받은 B )
obj 는 클래스 A행세를 하고 있기 때문에 method y() 가 A에 존재하지 않는다고 간주한다.
obj 변수 실제로는 B이지만 클래스 A행세
obj 변수는 실제로 데이트 타입이 클래스 A이기 때문에
}
}
-오버라이딩했을때 부모클래스 자식클래스 중 어디있는 메소드를 호출할까 ?
class A {
public String x() { return "A.x";}
}
class B extends A {
public String x() { return "B.x";}
-> x() 메소드는 class A 에도 있기 때문에 여기서는 오버라이딩을 해줌 ->
오버라이딩 해준 메소드가 더 우선이다.
public String y() { return "y"; }
}
public class polymorphismDemo1 {
public static void main (String [] args ) {
A obj = new B() ; // 클래스 A타입인 obj 에대해 담아 주었다. B () 라는 것을 인스 턴스화해주고
System.out.pritnln(obj.x() ) ;
원래 클래스는 B() 지만
wow 클래스 A 행세를 하고 있지만 x() 는 B() 에 소속되어 있는 (정의되어 있는 x() 가 실행된다. A가 아니라
*******-- 위에 굵은 글자 3개의 결론
Class A는 부모, Class B 는 자식 . B extends A .
A obj = new B(); 라고 했을때 obj 에서는 A에 없는 메소드는 불러올 수 없다.
하지만 만약 B 클래스가 A클래스에 있는것을 오버라이딩을 했어 -> 그랬을 때 오버라이딩한 메소드를 호출하면 -> B 에 있는 메소드가 호출이 되는것 .
내 정리 : A obj = new B() 에서 obj 의 틀에서 벗어나는 B() 에만 정의되어 있는 메소드는 사용을 못하지만 A 몸이지만 안에 B() 가 A() 메소드를 변경을 했으니까.. ( 오버라이딩 )
그것은 B() 에 있는 메소드로 변경되서 사용되
다형성 ( 4/6 ) : 클래스와 다형성2
https://www.youtube.com/watch?v=nyV5akYR5A4&list=PLuHgQVnccGMCeAy-2-llhw3nWoQKUvQck&index=118
여러번봐..
재밌는데 어려워 !!
다형성 ( 5/6) : 인터페이스와 다형성 1
package ~~
interface I2 {
public String A () ;
}
interface I3 {
public String B () ;
}
class D implements I2, I3 {
public String A() {
return "A" ;
}
public String B() {
return "B";
}
}
public class PolymorphismDemo3 {
public static void main ( String[] args ) {
D obj = new D();
I2 obji2 = new D();
I3 obji3 = new D();
obj.A();
obj.B();
obji2.A() ;
// obji2.B(); --> B 메소드는 I3 인터페이스에서 정의하고 있기 때문에 I2 형식을 따라 야 하기 때문에 에러
//obji3.A(); ..> A() 는 I2 에만 들어가 있기 때문에 I3 라는 형식을 따라야 하는 obji3 에서는 없는애로 취급해서 오류가 난다.
obji3.B();
}
다형성과 인터페이스의 관계
interface K
class A class B class C
각각의 클래스를 인스턴스화시킬때
A, B, C는 interface K 를 모두 공통적으로 implements 즉 구현을 한 상태다. 데이터타입으로 해준다.
그러면 A,B,C 모두 interface K 의 형식을 모두 따르지만 각각 A, B, C 안에서는 모두 메서드든 뭐든 새로 안에 내용을 서로(A,B,C 모두 ) 다르게 부여해준 상태이다.
-------> 다형성 같은 모양이지만 다른 형태로 사용하고 있음.
같은 데이터타입(interface K) 을 가지고 있지만 클래스 안에 A,B,C 마다 다르게 동작할 수 있는 다형성을 구현할 수 있다.
댓글
댓글 쓰기