Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

개발자입니다

[비트캠프] 50일차(10주차5일) - Java(상속, specialization, generalization, 추상 클래스, 추상 메서드) 본문

네이버클라우드 AIaaS 개발자 양성과정 1기/Java

[비트캠프] 50일차(10주차5일) - Java(상속, specialization, generalization, 추상 클래스, 추상 메서드)

끈기JK 2023. 1. 13. 10:36

 

기능 확장 - ① 기존 클래스를 변경

 

① 고객사 A

App 에서 Car를 사용한다.

 

② 고객사 B : 기능 추가 요구 → 기존 클래스에 코드 추가

App 에서 Car를 사용한다.

 

기존 클래스에 코드를 추가, 변경, 삭제하면 기존 클래스를 사용하는 코드에 영향을 끼친다.

- 없던 오류 발생

- 메서드 스펙 변경(파리미터 추가, 이름 변경, ...) → 실행이 안되는 문제

 

*결론

- 기존 코드를 변경하면 기존 코드를 사용해서 만든 프로그램에 영향을 끼친다.

 

 

 

기능 확장 - ② 기존 코드를 복제한 후 기능 추가

 

새로운 고객이 sunroof, auto 기능 추가를 요구하여 기존 Car 클래스를 복제하여 추가한 뒤 App1에서 사용한다.

또 다른 고객이 fixed, water 기능 추가를 요구하여 기존 Car 클래스를 복제하여 추가한 뒤 App2에서 사용한다.

이런식으로 복제 후 변경해서 사용한다. (온프레미스)

 

→ 기존 코드를 손대지 않기 대문에 이전에 작성한 프로그램은 아무런 영향을 받지 않는다.

 

하지만 Car 클래스에 버그 발견시 복제해서 만든 모든 프로그램에 똑같이 버그 수정 작업을 해야한다.

기능 추가시에도 복제해서 만든 모든 프로그램에 똑같이 기능을 추가해야 한다.

→ 유지보수가 힘들다.

 

 

 

기능 확장 - ③ 상속을 이용한 기능 확장

 

기존코드 손댄다, 복제  → 기존 코드의 소스가 있어야 한다.

extends 로 Car 클래스를 사용하겠다고 선언한다. → 복사해 오는것이 아니다!

여기서 Car를 super(parent) class, Sedan을 sub(child) class라 한다.

 

new Sedan() 하면 Car 클래스 설계도에 따라 만든 필드 mode, maker, capacity 가 생성되고,

                              Sedan 설계도에 따라 만든 필드 sunroof, auto 가 생성된다.

 

*결론

- 기존 코드 변경 없이 기능 확장

- 기존 코드의 소스가 없어도 된다. bytecode(.class) 파일만 있으면 된다. 다른 개발자가 만든 코드를 재사용 하기 쉽다.

 

 

 

상속과 메서드 호출

 

A ◁━ B ◁━ C ◁━ D 처럼 상속한다.

B obj = new B(); 하면 빈 클래스라도 클래스 정보가 Heap에 생성되고 주소 200이 JVM Stack의 obj에 들어간다.

obj.m2(), obj.m1()  // 가능하다

obj.m3()  // 불가하다

 

D obj = new D(); 

obj.m4(), obj.m3(), obj.m2(), obj.m1()  // 가능하다

 

B obj = new D();

obj.m4(), obj.m3()  // 불가하다.

obj.m2(), obj.m1()  // 가능하다

컴파일러는 변수(레퍼런스)의 타입에서 메서드를 찾아 올라간다. 레퍼런스가 실제 어떤 클래스의 인스턴스를 가리키는 것인지 따지지 않는다.

 

 

덤프트럭은 덤프트럭이라 할 수 있고, 자동차라 할 수 있고, 운송수단이라 할 수 있다.

자동차는 덤프트럭이라 할 수는 없고, 자동차라 할 수 있고, 운송수단이라 할 수 있다.

자전거는 덤프트럭이라 할 수는 없고, 자동차라 할 수는 없고, 운송수단이라 할 수 있다.

 

덤프트럭 레퍼런스 r1, 자동차 레퍼런스 r2, 운송수단 레퍼런스 r3 에 저장할 수 있다. ← new 덤프트럭()

덤프트럭 레퍼런스 r1, 자동차 레퍼런스 r2, 운송수단 레퍼런스 r3 에 저장할 수 있다. ← new 자동차()

덤프트럭 레퍼런스 r1, 자동차 레퍼런스 r2, 운송수단 레퍼런스 r3 에 저장할 수 있다. ← new 운송수단()

 

 

 

상속과 클래스 로딩

 

B obj = new B() 하면

① 수퍼 클래스부터 로딩

② 수퍼 클래스부터 인스턴스 필드 생성

A 클래스에 의해 v1 필드 생성, B 클래스에 의해 v2 필드 생성되고 주소 200이 obj에 저장된다.

 

 

 

생성자 호출 순서

 

C obj = new C(); 하면

① 인스턴스 필드 생성

    A클래스에 의해 v1, B클래스에 의해 v2, C클래스에 의해 v3 필드들 생성된다.

② 생성자 호출

    C() 에서 super()인 B() 를 호출하고, B()에서 super()인 A() 를 호출하고, A() 에서 super()인 Object() 를 호출한다.

    Object() 실행하고 리턴하고, A() 실행하고 v1에 값 100 넣고 리턴하고, B() 실행하고 v2에 값 200 넣고 리턴하고, C() 실행하고 v3에 값 400 넣는다. 그리고 obj에 주소 200 들어간다.

 

 

 

수퍼 클래스의 생성자 호출

 

B() 생성자에 super() 가 없으면 자동 삽입된다. 그러나 super 클래스에 기본 생성자가 없다. 그러면 명시적으로 super 생성자를 지정해줘야 한다.

 

 

 

다중 상속?

 

C 클래스에서 A, B 클래스 모두 상속받지 못한다. ← 자바는 다중 상속 불허!

 

(C++는 다중 상속 가능하나 이로 인해 혼란이 야기되었다.)

 

 

 

specialization

 

기능 확장 → 더 전문화

Sedan 클래스는 Car 클래스를 상속 받아 doSunroof() 를 추가, run() 을 재정의하였다.

Truck 클래스는 Car 클래스를 상속 받아 dump() 를 추가, run() 을 재정의하였다.

Exam01 에서 자동차의 종류에 따라 좀 더 구분해서 사용한다.

 

 

 

generalization

 

 

 

서브클래스들의 공통 필드/메서드를 추출해서 수퍼 클래스로 만드는 것!

수퍼 클래스의 메서드를 서브 클래스의 역할에 맞춰 재정의 "Overriding"

 

 

 

generalization : 추상 클래스

 

관리를 용이하게 하기위해 만든 클래스. 사용하려고 만든 클래스가 아니다.

 

일반용으로 쓰지 못하도록 막는 것이 관리에 좋다.

→ 추상클래스로 선언하라!

 

 

 

generalization : 추상 메서드

 

서브클래스마다 다르게 정의해야 하는 메서드라면 수퍼 클래스에서 정의하지 말고 서브 클래스에서 정의하도록 강제시키는 문법 : "추상 메서드"

 

이를 패키지 문법이라 한다.

 

 

 


 

 

조언

 

*스펙이 좋지 않으면 경력으로 채워야 한다. 지방 출장은 기피하는 분위기로 지방 출장이 괜찮다면 틈새시장이 될 수 있다.

 

 

 


 

과제

 

[해커톤] 관리 시스템 만들기(백엔드 + 프론트엔드)

 

내용:
- 자유 주제로 CRUD 기능이 구현된 관리 시스템을 만든다.
- 백엔드는 스프링부트 기반으로 구현한다.
- 프론트엔드는 HTML, CSS, JavaScript, AJAX, JSON 기술을 활용하여 구현한다.
- 백엔드 또는 프론트엔드를 구현할 때 외부 라이브러리를 이용할 수 있다.
- 최종적으로 프로젝트를 구현한 과정 및 결과를 발표한다.
- 팀 프로젝트를 관리를 위해 git 저장소를 이용해야 한다.
 
과제 제출 조건:
- zip 압축파일로 제출할 것.
- 백엔드, 프론트엔드 소스를 별도의 디렉토리로 분류할 것.
- 압축 파일을 풀었을 때 디렉토리 구조는 다음과 같아야 한다.
hackathon2-backend/
hackathon2-frontend/
- 팀원 각자가 팀 프로젝트 파일을 제출할 것
- 제출 내용에 다음과 같이 팀명 및 팀원을 명시할 것
   예) 1팀: 홍길동, 임꺽정, 유관순, 안중근, 윤봉길

제출 마감일:
- 개발 기간: 2023-01-13 16:00 ~ 2023-01-16 16:00 (토,일 포함)
- 발표: 2023-01-16 16:00 ~ 2023-01-16 18:00
- 제출: 2023-01-16 18:00

 

예)

도서 관리 시스템

가계부 관리 시스템