📜 제목으로 보기

java

  • 참고영상:얄코 유튜브

  • 학생들에게, 교실, 청소시키기

    • 청소시킬 때, 소모품들이 있다. 일정수치 이하로 떨어지거나, 용량이 일정수치로 꽉 차면, 비우는 행위를 해야함.
    • 타겟교실이 깨끗해졌으면 -> 다른 교실로 시켜야함.

절차적 프로그래밍: 반복되는 일을 메서드추출

사람마다 재료를 주고 일 시키는데, 종료될때까지 매번 재료 확인해주기
  • 영수에게는 새 _행주와 새 _ 윈덱스로 창문닦기()를

    • 행주 _ 깨끗함이 10이하면 빨아오기()
    • 윈덱스 _ 리터가 1이하면 리필해오기()
    • 101호 다 닦았으면 -> 103호로

    image-20220615215059142

  • 철권는 새 _ 쓰레받기로 바닥쓸기()를

    • 쓰레받기 _ 채움이 0.9이상이면 쓰레받기비우기()를

    image-20220615215120176

  • 변수는 새 _ 지우개로 칠판닦기()를

    • 지우개 _ 깨끗함이 10이하면, 털기()

    image-20220615215332154

  • 혁순이는 새 _ 행주와 새 _ 윈덱스로 (102호) 창문닦이()를

    • 행주 _ 깨끗함이 10이하면 빨아오기()
    • 윈덱스 _ 리터가 1이하면 리필해오기()

    image-20220615215438931

  • 새 청소도구를 지어보내놓고, 청소()를 시켰는데도, 하나하나 if문으로 신경써줘야한다.

    image-20220615215518983

일이 하나가 끝날때까지, 특정 조건마다 해주는 일을 반복문 + if로 처리

image-20220615215645383

반복되는 역할 + 재료을 메서드(재료)로 추출하여 재사용하기

image-20220615215928970

image-20220615220032774

  • 여기까지는 절자척 프로그래밍으로 가능하다.
    • 규모가 크지 않은 곳에서는 괜찮다.

객체지향 프로그래밍

  • 좀 프로페셔널하게 일하기 위해서
[기능과 재료만 존재 -> class로 재료(필드)와 주체(인스턴스변수) + 역할까지 하는 객체로 추출] 역할에 따른 주체를 게임처럼 class를 만들고, 같은 역할을 하는 개별 사람들은, 변수명만 다른 개별변수들로 사용하자. 역할은 그 class의 method로 수행한다. -> 캡슐화된 자원의 묶음 = 객체
  • 창문닦을 닦던 영수, 혁순 -> 창문닦이class로 뽑아서

    • 역할: 창문닦기() class내 method
    • 창문닦이 영수, 창문닦이 혁순
      • 같은 역할 = 같은 class = 같은 형 -> List에 add후 for문 안에서 한꺼번에 일시킬 수 있음.
    • 초기재료들
      • 상수(행주 _ 깨끗함, 윈덱스 _ 리터)-> 상수 필드
      • 달라지는 재료(교실) -> 생성자에서 받아 초기화하는 필드

    image-20220615220744487

    image-20220615220758343

    image-20220615220819861

  • my: class는 기능의 추출 뿐만 아니라 기능에 필요한 재료(필드) + 주체(인스턴스)도 정의할 수 있다.

[은닉성으로 외부오류X, 외부 깔 필요X] 재료(필드)들은 private하게 class안에서 운영되니, 공개된 public의 기능을 통해 내부 private재료들을 control시킨다.
  • 밖에서 선생님이 행주가 깨끗한지, 윈덱스가 떨어졌는지 직접 확인하지말고, 밖에서 명령만 내려주면 내부에서 컨트롤하게 한다.

    image-20220615221400542

    image-20220615221409844

  • 은닉성(private재료-상태값-필드 vs public으로 공개된 기능)

    • 바깥의 간섭으로 인해 오류가 발생할 수도 있다.
    • 바깥이 일일히 객체 내부를 뜯어볼 필요가 없다.
[interface로 추상화한 메서드명과 형을 통일로 -> 한번에 명령] 같은 class는 list에 넣어 for + 일괄명령 가능한데, 다른class의 기능까지 일괄 명령해야한다면? (전부 청소하는 기능이니)
  • 다른 class의 다른 기능(method)지만, 한번에 다 명령을 내리고 싶다면?

    • 비슷하여 일괄명령이 가능한, 서로 다른class기능들의 명칭(클래스명)을 추상화하여 인터페이스의 메소드로 정의하고, 인터페이스를 구현한 copy class(v2)들의 구혀넴소드에 -> 각자의 기능이 호출되게 한다.
  1. 서로 다른 class의 서로 다른 method지만, 묶여서 한번에 호출가능한 메서드들method명을 1개로 추상화한 뒤, 인터페이스내에 정의한다.

    • 생성자로 받던 외부재료의 주입도, setter역할을 시킨다면, 생성자 대신void 메서드로 공통 추상화 가능할 수 있음.

    image-20220615222725234

  2. 기존 class(직업)들은 그대로 두고 copy한 class(class_v2)를 만든 뒤, 추상화한 메서드명세를 가진 인터페이스를 구현하고, 그 추상화된 메서드 내부에는 비슷하지만, 명칭과 기능이 다른 자신의 메서드를 호출해준다.

    image-20220615222830012 image-20220615222846687

  3. 이제 서로다른class지만, 자신의 기능을 수행하는 동일한 메서드명(명세)로 호출 가능해지며, 인터페이스 구현으로 인해 동일한 list에 모을 수도 있어진다.

    image-20220615223024226

    image-20220615223039674

  • 메서드명만 통일한다고 해서, 한번에 묶을 순 없다.
    1. 메서드명을 추상화한 인터페이스
    2. 그 인터페이스를 변수로 사용하면 한번에 묶을 수 있다.
    3. 같은 메서드명 + 묶여진 상태 -> 한번에 일을 내릴 수 있다.
[인페구현 객체들을 모아 그룹을 만드는 class] 기존 재료를 모으고 주체를 나누던 class가, <같은 인터페이스를 구현하여, 모을 수 있고 + 한번에 일 시킬 수 있는 객체들>(인스턴스)을 모아 그룹을 만들때도 class로 모은다.
  • my) 동일한 객체들을 list로 모으는 일급컬렉션 뿐만 아니라 같은 카테고리 아래(구현, 상속)의 객체들을 모으는 group class도 뽑아낼 수 있다.
    • group으로 모으고 일을 한번에 시키려면, 같은 인터페이스 구현 class들의 객체들을 모아야할 것이다.
  • 개별 학생 -> 역할이 같은 학생 by list -> 전체 학생 by 인터페이스 -> 그룹별 학생들에게 한번에 일을 시킬 수 있다.

  • 각 청소인원들(class로 역할이 다를 지라도 인터페이스 구현 객체(변수)들)을 그룹을 지어보자.

    • 창문닦이들, 바닥쓸이들 객체들을 생성자에서 초기화해주고, 필드아래 배열로 묶어놓았음.
    • 외부에서 그룹인원 전체에 대한 청소완료를 물어볼 수 있음
    • 그외 묶어서 그룹 객체들에게 일을 한번에시킬 수 있다.

    image-20220615230659321

    image-20220615230824853

[상속을 통해 기존기능에 일부기능 추가하기] 새로운 재료와 역할이 추가된 class를 만들 때 상속을 이용한다.
  • 기존 재료(필드들)은 안보이지만 쓸 수 있다.

    • 대신, 자식생성자에서 super()로 안보이지만 부모생성자를 이용해서 초기화해줘야한다.
  • 새로운 재료는 필드로 선언해주고 생성자에서 추가해줘야한다.

    image-20220615231130512

[공통재료를 묶어 카테고리만 만드는 추상클래스] 추상클래스는 객체를 못만들기 때문에 카테고리만 만들어, 공통 재료 or 기능만 묶어준다.
  • my) 메서드 공통이 아니라 재료 위주의 공통일 때도 추상클래스로 뽑아서, 상위 카테고리를 만들 수 있다.
    • 인터페이스는 같은형 & 추상화한 메소드명으로 한번에 일 시키기기능method 위주의 목적이지만, 1개의 class에 대해 메소드명 추상화로 인터페이스 추출 후 -> 쉬운 class로 대체하여 test or 다른 class로 확장 가능성에 쓰이기도 한다.
  • 여기의 예에서는 창문닦이/바닥쓸이/칠판닦이의 객체class들이 이미 같은 인터페이스 구현으로 상위카테고리를 가진 것 같은데도, field(재료) = 청소할 ClassRoom의 공통으로 추상클래스 = 상위카테고리를 추출하고 있다.

  • 공통 인터페이스: 청소담당
    • 창문닦이/바닥쓸이/칠판닦이
  • 공통 필드로 추출한 추상클래스: 교실_청소당번
    • 창문닦이/바닥쓸이/칠판닦이

image-20220615231414106

image-20220615232052218

image-20220615232106252

  1. 공통 필드를 추상클래스로 옮겨야한다. image-20220615232211485

  2. 해당 필드 관련 기능들도 옮긴다.

    • 인터페이스에 있던 청소()와 교실_이동() 역시 옮겨야한다.

    image-20220615232255579

  3. 추상메서드로서 비워놓고, 상속class마다 서로 다른 자신의 기능을 구현하면 된다.

    image-20220615232346138

  4. 인터페이스처럼 한번에 일 시킬 수도 있다.

    image-20220615232426381

한번에 일 시키기 상속 vs 인터페이스 차이
  • 상속은 1부모 밖에 안된다.

    • 한번에 일시키는 놈들이 제한된다.

    image-20220615232558354

  • 인터페이스는 구현만 하면 어느클래스든지 같은형으로서 한번에 일시킬 수 있다.

    • 인터페이스는 해당class에 장착만 시키면, 부모여부, 상속여부 다 필요없이 어느 class든 같은형으로 묶여서 한번에 일시킬 수 있다.

    image-20220615232659564

느낀점

  • 인터페이스는 다른class를 메서드명만 통일시켜 구상체로 사용할 수 있게끔, 확장을 위해서 사용했다
    • test를 위한 쉬운 코드를 또다른 구상체의 기능으로 만들면 됬다.
  • 하지만, 인터페이스를 어느class든 장착하면 같은형으로 모아 한번에 일시키기 위한 목적으로도 사용된다.
    • 또한, 자신의 원래 메서드명을 통일시킬 필요없이 추상화된 메서드명을 구현한 뒤, 그 내부에서 자신의 메서드를 호출만해줘도 된다.
  • 추상클래스는 필드의 공통 -> 그 필드가 사용되는 기능들과 함께 카테고리를 만들 수 있다.
    • 그게 아니라면 인터페이스를 장착시키면 될 것 같다.