Java_객체지향프로그래밍1

5w31892p·2022년 11월 17일
0

Java_실시간

목록 보기
1/7

📜 Java

:: ✍ 실시간 강의 | 객체지향 프로그래밍

  • 생성자가 중요
  • 생성자로 객체 존재 자체를 알 수 있게 됨
  • 코드는 글 ∴ 가독성이 중요 -> 협업을 할 때 소통이 가능하게끔
  • 코드는 남이 봤을 때 어떻까? 라고 생각하면서 짜기
  • 무언가를 배우거나 할 때 why? 라는 생각을 하며 거기에 답을 할 수 있게끔

:: 소프트웨어의 가치 == 변화

  • 낮은 비용으로 변화가 가능해야 함
    • 비용이란 분석, 수정 테스트 기능 추가에 대한 시간
  • 소프트웨어가 업데이트가 되지 않는다면 망한 소프트웨어
    • 업데이트가 되지 않는다는 것은 어떠한 피드백도 없다는 것이고 사용자가 없다는 뜻이기 때문
  • 기능 수정에 비용이 계속 든다면 해당 소프트웨어는 뒤쳐지고 결국 망하게 됨
  • 그러므로 앞으로의 변화에 대응할 수 있는지가 가장 중요!

:: 객체지향은 어떻게 비용을 낮춰주지?

캡슐화 + 다형성(+추상화)

  • Argument – 인자
    • 함수 호출 시 전달되는 값
  • Parameter – 매개변수
    • 전달되는 인자 받아들이는 변수
    • name (변수이름)
public class Test {
    public void test(String name) { ........}

    public static void main(String args[]) {
        new Test().test("argunment");
    }
// -----------------------------------------

    public class Person {
        private String name;

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

    public static void main(String args[]) {
        new Person("이순신");
    }
}


    // Argument 전달되는 값, 자료정보
    // Parameter 자동 생성되는 args도 Parameter, Argument 받아들이는 변수

:: 변수

클래스 변수

  • 클래스 영역
  • 클래스 내에 static 키워드로 선언 된 변수
  • 클래스가 메모리에 올라 갈때
  • 딱 한번만 생성 됨

인스턴스 변수

  • 클래스 영역
  • 인스턴스가 생성 될 때, new
  • 매번 새롭게 생성 됨

지역 변수

  • 메서드, 생성자, 초기화 블럭
  • 변수 선언 되었을 때

:: 접근제어자를 사용하는 이유

  • 객체지향 프로그래밍이란 객체들 간의 상호작용을 코드로 표현하는 것
  • 이때 객체들간의 관계에 따라서 접근 할 수 있는 것과 아닌 것, 권한을 구분할 필요가 생김

클래스 내부에 선언된 데이터의 부적절한 사용으로부터 보호하기 위해서 사용

  • 이것이 바로 캡슐화(encapsulation)
  • 접근 제어자는 캡슐화가 가능할 수 있도록 돕는 도구
접근제어자를 사용하지 않으면 조건이 바뀔시 캡슐화 안해놓으면 열군데 다 가서 변경해야함
캡슐화가 가능하게 하려고 접근제어자를 쓰는 것
클래스 안에 있는 것들은 프라이빗으로 막아놓고 생성할 때 어캐 생겨나는지 노출해주고 개꿀띠
import java.time.LocalDateTime;

class Phone {
    String model;
    String color;
    static int price;
}

public class Main {
    public static void main(String[] args) {
        Phone galaxy = new Phone();
        galaxy.model = "Galaxy10";
        galaxy.color = "Black";
        galaxy.price = 10000;

        Phone iPhone = new Phone();
        iPhone.model = "iPhone";
        iPhone.color = "Black";
        iPhone.price = 10000;

        String condition = "조건";

        // .....

        //할인 조건이 맞으면(2022년11월15일13시 이후부터 1000원 할인)
        LocalDateTime conditionDateTime = LocalDateTime.of(2022, 11, 15, 13, 00);
        if (conditionDateTime.isBefore(LocalDateTime.now())) {
            galaxy.price = galaxy.price - 1000;
        }

        // ..........

        //할인 조건이 맞으면(2022년11월15일13시 이후부터 1000원 할인)
        if (conditionDateTime.isAfter(LocalDateTime.now())) {
            iPhone.price = iPhone.price - 1000;

            // .............

            System.out.println("가격 : " + galaxy.price);

        }
    }
}

접근제어자 사용

import java.time.LocalDateTime;
import java.util.concurrent.locks.Condition;

public class Phone {
    private String model;
    private String color;
    private int price;

    public Phone(String model, String color, int price) {
        this.model = model;
        this.color = color;
        this.price = price;
    }

    // inv vs Integer, boolean vs Boolean
    public int getDiscountPrice(Condition condition) {
        if (condition.isValid()) {
            this.price = price - 1000;
        }
        return this.price;
    }
}
public class DateTimeCondition implements Condition {
    public boolean isValid() {
        //할인 조건이 맞으면(2022년11월15일13시 이후부터 1000원 할인)
        if(conditionDateTime.isAfter(LocalDateTime.now())) {
            return true;
        }
        // 조건이 무한 확장 가능
    }
}

public interface Conditon {
    public boolean isValud();
}

public class Main {
    public static void main(String[] args) {
        Phone phone = new Phone("model", "color", 10000);
        int price = phone.getDiscountPrice(new DateTimeCondition());
        System.out.println(price);
    }
}
위 코드에서 사용한 접근제어자

private String model;
private String color;
private int price;

:: 인터페이스 vs 추상클래스

인터페이스

  • 구현하려는 객체의 동작의 명세
  • 다중 상속 가능
  • implements를 이용하여 구현
  • 메소드 시그니처(이름, 파라미터, 리턴 타입)에 대한 선언만 가능
  • 생성자와 일반변수 모두 가질 수 없다.

추상클래스

  • 클래스를 상속받아 이용 및 확장을 위함
  • 부모의 기능을 확장하는 개념
  • 다중 상속 불가능 , 단일 상속
  • extends를 이용하여 구현
  • 추상메소드에 대한 구현 가능
  • 생성자와 일반변수 모두 가질 수 있다.

:: 인터페이스와 추상클래스의 차이점

목적성이 다른 차이가 있음

추상 클래스

  • 기본적으로 클래스
  • 상속, 확장하여 사용하기 위한 것
  • 여러 하위 클래스가 동일한 구현으로 로직을 수행 + 일부 로직이 다를 때 추상클래스 사용 고민 (Template Method 패턴)
  • 수직으로 확장하는 느낌
  • 강한 확신으로 명확할 때만 사용
  • 머리에 총 맞아도 이거는 된다 할 때 사용

인터페이스

  • 인터페이스를 구현한 객체들에 대한 동일한 동작을 보장하기 위해 사용

:: 캡슐화

  • 데이터와 관련 기능을 묶음
  • 객체가 어떻게 행동(기능)하는지 외부에 노출 X
  • 정보 은닉
  • 객체 내부 행동(기능)이 변경 되더라도, 외부에 영향 X
  • 할인 조건 일시가 바뀌면?
  • 할인 금액이 바뀌면?

:: 다형성(Polymorphsim)

  • 다양한 모습을 갖는 것
  • 한 객체가 다양한 타입을 갖는 것
  • 한 객체가 여러 타입의 기능을 제공
  • 타입 상속으로 다형성 구현
  • 특별한 비용없이 갈아끼우기 가능??
  • 스마트플러그를 그냥 플러그에 넣어 사용할 수 있고
  • 스마트 냉장고에 넣어 사용할 수 있고~~
public class Plug {
    public void on() {
        System.out.println("Plug on");
    }

    public void off() {
    }
}

public interface InternetOfThings {
    String status();
}

public class SmartPlug extends Plug implements InternetOfThings {
    @Override
     .....

    public String status() {
         ...
    }
}

public class Smart냉장고 extends Plug implements InternetOfThings {
    @Override
     .....

    public String status() {
         ...
    }
}


SmartPlug smartPlug = new SmartPlug();
smartPlug.on();
        smartPlug.off();

        Plug plug=smartPlug;
        plug.on();
        plug.stop();

        InternetOfThings iot=smartPlug;
        iot=smart냉장고;
//........

        iot=smartPlug;
        iot=smart냉장고;

// 비즈니스 로직
        ....
        iot.status(); // 냉장고
        ....

:: 추상화

  • 의미가 비슷한 개념이나 의미 있는 표현으로 정의하는 과정
  • 특정한 성질, 공통 성질을 뽑아내는 과정
  • 예) 갤럭시, 아이폰 ⇒ 핸드폰

:: 타입 추상화

  • 요구 사항
  • 주문이 완료 되면, 주문한 고객에게 주문 내역을 이메일을 전송한다.
  • 이메일 전송 기능 구현
  • sendEmail(String content, String to, String from);
    • 카톡 추가해주세요 -> ??????? -> 사방팔방에 있는거 언제 고침? 사망
notifier = new KakaoMessage();
        notifier = new SMSMessage();
        notifier = new EmailMessage();
        notifier.sendMessage()
  • notifier
    • interface sendMessage()
    • 저 안에 문자, 메일, 카톡 등 다 구현 해놓고
    • 1억개라고 치고 1억개 하나하나 고치는게 아니라 구현 되고 적용한 것만 고치면 됨
  • 추상화
    • 카카오톡 전송 - 상세 구현
    • 문자 전송 - 상세 구현
    • 이메일 - 상세구현

0개의 댓글