6/23

HMS·2022년 6월 27일
0

객체지향

전날 정리

클래스는 틀 객체는 제품
클래스는 설계도 객체는 tv

참조변수를 통해 객체를 실행

켑슐화 : 변수를 private처리하여 외부에서 접근못하도록 구성. 외부에서 바로 사용이 안되기때문에 getter setter를 통해 사용

상속 : 상속을 쓰지 않으면 그냥 클래스를 나열할뿐. 상속을 사용하면 구조화가 가능. 코드의 변경이나 수정이 가능 . 공통클래스에서 수정하면 상속받는 클래스에서도 수정됨으로 유지보수 용이
has a /is a/extends

super()
부모객체의 생성자를 호출하는 메소드

다향성 : 업케스팅을 해서 사용하면 부모객체는 사용가능하나 자식객체는 사용불가 다운캐스팅을 통해 사용 가능하게 만듦
Car[] carr = new Car[5]; //Car 부모클래스

carr[0] = new Sonata(); //자식클래스
carr[1] = new Avante(); //자식클래스
carr[2] = new Spark();
carr[3] = new Morning();
carr[4] = new Grandure();

코딩을 간결하게 해 줄 수 있음

angryCar (new Sonata()); //자식클래스
angryCar (new Avante());
angryCar (new Grandure());

public void angryCar (Car c){ //Car 부모클래스
}

instanceof
-> if ( c instanceof sonata){ // 이러면 소나타로 동작
}else if(c instanceof Avante){ //이러면 아반뗴로 동작
객체가 각각 다른 코드를 실행하게 해주는 명령어

오버 라이딩 vs 오버로딩

오버라이딩은 메소드를 하위클래스에서 새로 정의하며 메소드 이름 매개변수(데이터타입) 리턴타입이 동일해야 가능 중괄호 안 내용만 변경하여 사용{}
오버로딩은 같은 클래스내 같은 이름인 메소드에서만 작동 매개변수(데이터타입)이 달라야함 리턴타입이 다를 수 있음

바인딩?

실행할 메소드 코드와 호
실제 실행할 메소드 코드와 호출하는 코드를 연결시키는 것을 바인딩이라 함
상속 관계로 이루어져 다향성이 적용된경우 메소드 오버라이딩이 되어있으면 정적바인딩된 메소드 코드보다 오버라이딩된 메소드 코드를 우선수행하게되는게 동적바인딩

-> paint / draw 모두 오버라이딩 되어있음

  1. 오버라이딩 되어있으므로 자식의 paint를 실행함
  2. 슈퍼페인트를 호출하였으므로 부모 paint 실행
  3. 부모 페인트에서 오버라이딩된 자식 draw를 출력 "super Obkect"
  4. 다시 자식 paint로 와서 슈퍼 draw를 실행
  5. 부모 draw를 출력 "Sub Object"

내생각정리

상속이란

  • 상속받는 클래스에서 상속하는 클래스를 상속받아 상속하는 클래스의 메소드를 사용하는것
  • child extends Parent
    상속받는 상속하는
  • praents는 child의 영향을 받지않음
    child는 parent의 영향을 받음
  • parent의 메소드를 내식대로 고쳐쓰고 싶으면
    오버라이딩을 하면됨 오버라이딩은 이름/매개변수/리턴타입이 같아야하고 private는 오버라이딩불가

다형성이란

  • 여러개의 형태를 갖는다는 의미로 상속을 이용하여 자식객체를 부모클래스타입 변수로 다루는것

  • 상위 클래스에는 그보다 더 상위 클래스를 넣을수없음
    public class Child1 extends Parent {

    • up casting
      parent p = new Child1(); 상위에 접근하겠다 부모꺼를 쓰겠다 근데 오버라이딩이 되어있으면 child도 쓸수있다.
      Parent p = new Parenr는 안되는데 아마도 이미 차일드에 페어런츠가 상속되어있어 차일드를 다뤄야하기 때문에 못쓰는듯
      Child1 c = new Parent 는 페어런츠안에는 차일드를 만들지 않기때문에 없는걸 담을수없음
  • up casting
    상속관계에 있는 부모 자식 클래스간 부모타입의 참조형 변수가 모든 자식 타입의 객체의 주소를 받을수 있다. 일단은 부모가 우선이란거임
    자식객체의 주소를 전달받은 부모타입의 참조변수는 원래 부모타입의 멤버만 참조 가능
    예시) //Sonata클래스가 Car클래스의 후손임
    Car c = new Sonata();
    Sonata 클래스형 -> Car 클래스 형으로 바뀜

  • down casting
    자식객체의 주소를 받은 부모참조변수를 가지고 자식의 멤버를 참조해야하는경우 후손클래스 타입으로 형변환해야함
    예시) //Sonata클래스가 Car클래스의 후손임
    Car c = new Sonata();
    ((Sonata)c).moveSonata(); //참조변수 c를 Sonata 클래스로 형변환 후 sonata클래스 내부 메소드 사용
    ↓ 같은의미임
    Sonata sonata = (Sonata)car; // = new Sonata();
    sonata.moveSonata();
    Car car = new Sonata();

추상클래스

몸체{} 중괄호가 없는 메소드
몸체에 있는 내용을 상속받은곳에서 사용할 수 있게 씀

특징
1. 미완성클래스
자체적으로 객체생성불가
->반드시 상속하여 객체생성
extends Parent{} 로 상속하고
사용
2. abstracr 메소드가 포함된 클래스면 반드시 abstract 클래스
-> abstract가 없어도 되는데 있으면 무조건 추상클래스
3. 일반적으로 메소드 변수도 포함불가
public abstract class Car{}
1) new car(): X
2) Car car = new Spnata();
-> 업캐스팅용으론 쓸수있다

접근제한자 abstract 리턴타입 메소드명();
public acstract class Car{
public Sting carName;
abstract void move(int x);

인터페이스

상수형 필드와 추상 메소드만을 작성할 수 있는 추상 클래스의 변형체이다.
메소드의 통일성을 부여하기 위해서 추상 메소드만 따로 모아 놓은것으로, 상속시 인터페이스
내에 정의된 모든 추상 메소드를 구현해야 한다

특징

  • 모든 인터페이스의 메소드는 묵시적으로 public이고 abstract이다.
  • 변수는 묵시적으로 public static final이다.
    -> 따라서 인터페이스 변수의 값 변경 시도는 컴파일시 에러를 발생
  • 객체 생성은 안되나, 참조형 변수로서는 가능하다 -> new InterfaceCar(); X

장점

  • 공통 기능상의 일관성 제공
  • 공동 작업을 위한 인터페이스 제공

인터페이스는 implements
추상클래스는 extends

공통중요

  • 객체 생성 불가
  • 참조변수타입으로 쓸수있다
profile
안녕하세요

0개의 댓글