OOP1 객체지향프로그래밍(java)
얄코 유튜브 객체지향 예시 설명
📜 제목으로 보기
- java
- 절차적 프로그래밍: 반복되는 일을 메서드추출
- 객체지향 프로그래밍
- [기능과 재료만 존재 -> class로 재료(필드)와 주체(인스턴스변수) + 역할까지 하는 객체로 추출] 역할에 따른 주체를 게임처럼 class를 만들고, 같은 역할을 하는 개별 사람들은, 변수명만 다른 개별변수들로 사용하자. 역할은 그 class의 method로 수행한다. -> 캡슐화된 자원의 묶음 = 객체
- [은닉성으로 외부오류X, 외부 깔 필요X] 재료(필드)들은 private하게 class안에서 운영되니, 공개된 public의 기능을 통해 내부 private재료들을 control시킨다.
- [interface로 추상화한 메서드명과 형을 통일로 -> 한번에 명령] 같은 class는 list에 넣어 for + 일괄명령 가능한데, 다른class의 기능까지 일괄 명령해야한다면? (전부 청소하는 기능이니)
- [인페구현 객체들을 모아 그룹을 만드는 class] 기존 재료를 모으고 주체를 나누던 class가, <같은 인터페이스를 구현하여, 모을 수 있고 + 한번에 일 시킬 수 있는 객체들>(인스턴스)을 모아 그룹을 만들때도 class로 모은다.
- [상속을 통해 기존기능에 일부기능 추가하기] 새로운 재료와 역할이 추가된 class를 만들 때 상속을 이용한다.
- [공통재료를 묶어 카테고리만 만드는 추상클래스] 추상클래스는 객체를 못만들기 때문에 카테고리만 만들어, 공통 재료 or 기능만 묶어준다.
- 한번에 일 시키기 상속 vs 인터페이스 차이
- 느낀점
java
-
학생들에게, 교실, 청소시키기
- 청소시킬 때, 소모품들이 있다. 일정수치 이하로 떨어지거나, 용량이 일정수치로 꽉 차면, 비우는 행위를 해야함.
- 타겟교실이 깨끗해졌으면 -> 다른 교실로 시켜야함.
절차적 프로그래밍: 반복되는 일을 메서드추출
사람마다 재료를 주고 일 시키는데, 종료될때까지 매번 재료 확인해주기
-
영수에게는 새 _행주와 새 _ 윈덱스로 창문닦기()를
- 행주 _ 깨끗함이 10이하면 빨아오기()
- 윈덱스 _ 리터가 1이하면 리필해오기()
- 101호 다 닦았으면 -> 103호로
-
철권는 새 _ 쓰레받기로 바닥쓸기()를
- 쓰레받기 _ 채움이 0.9이상이면 쓰레받기비우기()를
-
변수는 새 _ 지우개로 칠판닦기()를
- 지우개 _ 깨끗함이 10이하면, 털기()
-
혁순이는 새 _ 행주와 새 _ 윈덱스로 (102호) 창문닦이()를
- 행주 _ 깨끗함이 10이하면 빨아오기()
- 윈덱스 _ 리터가 1이하면 리필해오기()
-
새 청소도구를 지어보내놓고, 청소()를 시켰는데도, 하나하나 if문으로 신경써줘야한다.
일이 하나가 끝날때까지, 특정 조건마다 해주는 일을 반복문 + if로 처리
반복되는 역할 + 재료을 메서드(재료)로 추출하여 재사용하기
- 여기까지는 절자척 프로그래밍으로 가능하다.
- 규모가 크지 않은 곳에서는 괜찮다.
객체지향 프로그래밍
- 좀 프로페셔널하게 일하기 위해서
[기능과 재료만 존재 -> class로 재료(필드)와 주체(인스턴스변수) + 역할까지 하는 객체로 추출] 역할에 따른 주체를 게임처럼 class를 만들고, 같은 역할을 하는 개별 사람들은, 변수명만 다른 개별변수들로 사용하자. 역할은 그 class의 method로 수행한다. -> 캡슐화된 자원의 묶음 = 객체
-
창문닦을 닦던 영수, 혁순 ->
창문닦이
class로 뽑아서- 역할: 창문닦기() class내 method
-
창문닦이 영수
,창문닦이 혁순
- 같은 역할 = 같은 class = 같은 형 -> List에 add후 for문 안에서 한꺼번에 일시킬 수 있음.
- 초기재료들
- 상수(행주 _ 깨끗함, 윈덱스 _ 리터)-> 상수 필드
- 달라지는 재료(교실) -> 생성자에서 받아 초기화하는 필드
-
my: class는
기능의 추출
뿐만 아니라 기능에 필요한재료(필드)
+주체(인스턴스)
도 정의할 수 있다.
[은닉성으로 외부오류X, 외부 깔 필요X] 재료(필드)들은 private하게 class안에서 운영되니, 공개된 public의 기능을 통해 내부 private재료들을 control시킨다.
-
밖에서 선생님이 행주가 깨끗한지, 윈덱스가 떨어졌는지 직접 확인하지말고, 밖에서 명령만 내려주면 내부에서 컨트롤하게 한다.
-
은닉성(private재료-상태값-필드 vs public으로 공개된 기능)
- 바깥의 간섭으로 인해 오류가 발생할 수도 있다.
- 바깥이 일일히 객체 내부를 뜯어볼 필요가 없다.
[interface로 추상화한 메서드명과 형을 통일로 -> 한번에 명령] 같은 class는 list에 넣어 for + 일괄명령 가능한데, 다른class의 기능까지 일괄 명령해야한다면? (전부 청소하는 기능이니)
-
다른 class의 다른 기능(method)지만, 한번에 다 명령을 내리고 싶다면?
- 비슷하여 일괄명령이 가능한,
서로 다른class기능들의 명칭(클래스명)을 추상화
하여 인터페이스의 메소드로 정의하고,인터페이스를 구현한 copy class(v2)들
의 구혀넴소드에 -> 각자의 기능이 호출되게 한다.
- 비슷하여 일괄명령이 가능한,
-
서로 다른 class
의 서로 다른 method지만,묶여서 한번에 호출가능한 메서드들
의 method명을 1개로 추상화한 뒤, 인터페이스내에 정의한다.- 생성자로 받던 외부재료의 주입도, setter역할을 시킨다면, 생성자 대신
void 메서드로 공통 추상화
가능할 수 있음.
- 생성자로 받던 외부재료의 주입도, setter역할을 시킨다면, 생성자 대신
-
기존 class(직업)들은 그대로 두고
copy한 class(class_v2)
를 만든 뒤,추상화한 메서드명세를 가진 인터페이스를 구현
하고, 그 추상화된 메서드 내부에는비슷하지만, 명칭과 기능이 다른 자신의 메서드를 호출
해준다. -
이제 서로다른class지만, 자신의 기능을 수행하는 동일한 메서드명(명세)로 호출 가능해지며, 인터페이스 구현으로 인해 동일한 list에 모을 수도 있어진다.
- 메서드명만 통일한다고 해서, 한번에 묶을 순 없다.
- 메서드명을 추상화한 인터페이스
- 그 인터페이스를 변수로 사용하면 한번에 묶을 수 있다.
- 같은 메서드명 + 묶여진 상태 -> 한번에 일을 내릴 수 있다.
[인페구현 객체들을 모아 그룹을 만드는 class] 기존 재료를 모으고 주체를 나누던 class가, <같은 인터페이스를 구현하여, 모을 수 있고 + 한번에 일 시킬 수 있는 객체들>(인스턴스)을 모아 그룹을 만들때도 class로 모은다.
- my) 동일한 객체들을 list로 모으는 일급컬렉션 뿐만 아니라 같은 카테고리 아래(구현, 상속)의 객체들을 모으는 group class도 뽑아낼 수 있다.
- group으로 모으고 일을 한번에 시키려면, 같은 인터페이스 구현 class들의 객체들을 모아야할 것이다.
-
개별 학생 -> 역할이 같은 학생 by list -> 전체 학생 by 인터페이스 -> 그룹별 학생들에게 한번에 일을 시킬 수 있다.
-
각 청소인원들(class로 역할이 다를 지라도 인터페이스 구현 객체(변수)들)을 그룹을 지어보자.
- 창문닦이들, 바닥쓸이들 객체들을 생성자에서 초기화해주고, 필드아래 배열로 묶어놓았음.
- 외부에서 그룹인원 전체에 대한 청소완료를 물어볼 수 있음
- 그외 묶어서 그룹 객체들에게 일을 한번에시킬 수 있다.
[상속을 통해 기존기능에 일부기능 추가하기] 새로운 재료와 역할이 추가된 class를 만들 때 상속을 이용한다.
-
기존 재료(필드들)은 안보이지만 쓸 수 있다.
- 대신, 자식생성자에서 super()로 안보이지만 부모생성자를 이용해서 초기화해줘야한다.
-
새로운 재료는 필드로 선언해주고 생성자에서 추가해줘야한다.
[공통재료를 묶어 카테고리만 만드는 추상클래스] 추상클래스는 객체를 못만들기 때문에 카테고리만 만들어, 공통 재료 or 기능만 묶어준다.
- my) 메서드 공통이 아니라
재료 위주
의 공통일 때도 추상클래스로 뽑아서, 상위 카테고리를 만들 수 있다.-
인터페이스는
같은형 & 추상화한 메소드명으로 한번에 일 시키기
의기능method 위주
의 목적이지만, 1개의 class에 대해 메소드명 추상화로 인터페이스 추출 후 ->쉬운 class로 대체하여 test
or다른 class로 확장 가능성
에 쓰이기도 한다.
-
인터페이스는
-
여기의 예에서는
창문닦이/바닥쓸이/칠판닦이
의 객체class들이 이미 같은 인터페이스 구현으로 상위카테고리를 가진 것 같은데도, field(재료) =청소할 ClassRoom
의 공통으로 추상클래스 = 상위카테고리를 추출하고 있다. - 공통 인터페이스:
청소담당
창문닦이/바닥쓸이/칠판닦이
- 공통 필드로 추출한 추상클래스:
교실_청소당번
창문닦이/바닥쓸이/칠판닦이
-
공통 필드를 추상클래스로 옮겨야한다.
-
해당 필드 관련 기능들도 옮긴다.
- 인터페이스에 있던 청소()와 교실_이동() 역시 옮겨야한다.
-
추상메서드로서 비워놓고, 상속class마다 서로 다른 자신의 기능을 구현하면 된다.
-
인터페이스처럼 한번에 일 시킬 수도 있다.
한번에 일 시키기 상속 vs 인터페이스 차이
-
상속은 1부모 밖에 안된다.
- 한번에 일시키는 놈들이 제한된다.
-
인터페이스는 구현만 하면 어느클래스든지 같은형으로서 한번에 일시킬 수 있다.
- 인터페이스는
해당class에 장착만 시키면
, 부모여부, 상속여부 다 필요없이어느 class든 같은형으로 묶여서 한번에 일시킬 수
있다.
- 인터페이스는
느낀점
- 인터페이스는 다른class를 메서드명만 통일시켜 구상체로 사용할 수 있게끔, 확장을 위해서 사용했다
- test를 위한 쉬운 코드를 또다른 구상체의 기능으로 만들면 됬다.
-
하지만, 인터페이스를
어느class든 장착하면 같은형으로 모아 한번에 일시키기 위한 목적
으로도 사용된다.- 또한, 자신의 원래 메서드명을 통일시킬 필요없이
추상화된 메서드명을 구현한 뒤, 그 내부에서 자신의 메서드를 호출만
해줘도 된다.
- 또한, 자신의 원래 메서드명을 통일시킬 필요없이
-
추상클래스는 필드의 공통 -> 그 필드가 사용되는 기능들과 함께 카테고리를 만들 수 있다.
- 그게 아니라면 인터페이스를 장착시키면 될 것 같다.