230228 굿모닝세션(복습,다형성,추상화)

허크·2023년 2월 28일
0

캡슐화 예제

  • 캡슐화 이전
package inheritance.checkpoint.car;

public class Car {

    private String name;
    private int fuelPercent;

    public Car(String name, int fuelPercent) {
        this.name = name;
        this.fuelPercent = fuelPercent;
    }

    public String getName() {
        return name;
    }

    public int getFuelPercent() {
        return fuelPercent;
    }

    public void setFuelPercent(int fuelPercent) {
        this.fuelPercent = fuelPercent;
    }

    public void on() {
        System.out.println(name + "에 시동을 겁니다.");
    }

    public void go() {
        System.out.println("부릉부릉");
    }

    public void off() {
        System.out.println("시동을 끕니다.");
    }
}
package inheritance.checkpoint.person;

import inheritance.checkpoint.car.Car;

public class Person {

    private String name;
    private Car car;

    public Person(String name, Car car) {
        this.name = name;
        this.car = car;
    }

    public String getName() {
        return name;
    }

    public Car getCar() {
        return car;
    }

    public void sleep() {
        System.out.printf("%s이(가) 잠을 잡니다.\n", name);
        System.out.println("쿨쿨쿨...zzZ");
    }

    public void eat() {
        System.out.printf("%s이(가) 밥을 먹습니다. \n", name);
        System.out.println("여유롭게 냠냠냠");
    }

    public void introduce() {
        System.out.printf("안녕하세요, 저는 %s입니다. \n", name);
    }

    public void drive() {
        if (getFuelPercent() <= 0) {
            System.out.println("연료가 부족하여 시동을 걸 수 없습니다.");
        }
        else {
            on();
            go();
            off();
    }
}
  • 캡슐화 적용
package inheritance.checkpoint.car;

public class Car {

    private String name;
    private int fuelPercent;

    public Car(String name, int fuelPercent) {
        this.name = name;
        this.fuelPercent = fuelPercent;
    }

    public String getName() {
        return name;
    }

    public int getFuelPercent() {
        return fuelPercent;
    }

    public void setFuelPercent(int fuelPercent) {
        this.fuelPercent = fuelPercent;
    }

    private void on() {
        System.out.println(name + "에 시동을 겁니다.");
    }

    private void go() {
        System.out.println("부릉부릉");
    }

    private void off() {
        System.out.println("시동을 끕니다.");
    }

    public void operate() {
        if (getFuelPercent() <= 0) {
            System.out.println("연료가 부족하여 시동을 걸 수 없습니다.");
        }
        else {
            on();
            go();
            off();
        }
    }
}
package inheritance.checkpoint.person;

import inheritance.checkpoint.car.Car;

public class Person {

    private String name;
    private Car car;

    public Person(String name, Car car) {
        this.name = name;
        this.car = car;
    }

    public String getName() {
        return name;
    }

    public Car getCar() {
        return car;
    }

    public void sleep() {
        System.out.printf("%s이(가) 잠을 잡니다.\n", name);
        System.out.println("쿨쿨쿨...zzZ");
    }

    public void eat() {
        System.out.printf("%s이(가) 밥을 먹습니다. \n", name);
        System.out.println("여유롭게 냠냠냠");
    }

    public void introduce() {
        System.out.printf("안녕하세요, 저는 %s입니다. \n", name);
    }

    public void drive() {
        car.operate();
    }
}
  • Car 클래스의 자율성이 높아졌다
    -> 관련된 기능을 스스로 하는가에 대한 척도

추상화

추상클래스

public abstract class Person{
	public static void main(String[] args) {
    	public abstract void hyodo();
    }
}

public class Programmer extends Person {
	
    @Override // 컴파일러한테 알려주는 어노테이션
	public void hyodo() {
    	System.out.println("부모님께 노래 불러드리기");
    }
}
  • 인스턴스 생성할일 없이 오직 상속만을 위한 클래스

  • import는 상위클래스 입력시 자동으로 패키지 밑에 import문으로 삽입됨

  • 하위클래스에서 추상메서드가 없을 경우 경고문이 뜬다

  • '추상메서드를 구현한다'라고 표현한다

인터페이스

  • 거의 오직 추상클래스를 정의하기 위해 만들어진 것

  • 인터페이스는 추상메서드만 보유할 수 있다

  • 인터페이스는 구현이라는 용어를 사용한다

  • 인터페이스는 다중 구현이 가능하다

    • 상속 : 오직 단일상속만 가능 => A extends B, C, D 불가
    • 인터페이스 : 다중 적용이 가능 => A implements B, C, D, ... 가능
public interface Hyodoable{
	void hyodo();
}
public class Musician extends Person implements Hyodoable {

	@Override
    public void hyodo() {
    	System.out.println("부모님 컴퓨터 관리해드리기);
    }
};
  • 메서드 앞에 public abstract를 안붙여도 메서드로 인식된다

다형성(Polymorphism)

  • 상위타입의 참조변수에 하위타입의 인스턴스를 할당할 수 있다
		Person person = new Programmer ("허크", true);
		Hyodoable person1 = new Programmer ("허크", true);
        Hyodoable person2 = new PersonalTrainer ("김계란", 10);
        Hyodoable person3 = new Musician ("아이유", false);
        
        person1.hyodo();
        person2.hyodo();
        person3.hyodo();
  • 동일한 참조타입 변수에서도 다양한 형태의 결과가 나올 수 있음

DI (Dependency Injection, 의존성 주입)

  • 추상화와 다형성을 연관시켜 적용되는 개념
profile
codestates seb 44th // 다크모드로 보는걸 추천드립니다

0개의 댓글