2020.10.28 생활코딩 유투브 공부 ( 모든 출처 : 유투버 생활코딩 ) 2 부 : 108 회 abstract , interface

 

추상 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 마다 다르게 동작할 수 있는 다형성을 구현할 수 있다. 










댓글